diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4afb8ba --- /dev/null +++ b/.gitignore @@ -0,0 +1,41 @@ +lib-cov +*.seed +*.log +*.csv +*.dat +*.out +*.pid +*.gz +*.swp + +pids +logs +results +tmp + +# Build +public/css/main.css + +# Coverage reports +coverage + +# API keys and secrets +.env + +# Dependency directory +node_modules +bower_components + +# Editors +.idea +*.iml + +# OS metadata +.DS_Store +Thumbs.db + +# Ignore built ts files +dist/**/* + +# ignore yarn.lock +yarn.lock \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..782ca07 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,72 @@ +{ + "editor.tabSize": 2, + "editor.wordWrap": "on", + "javascript.format.insertSpaceBeforeFunctionParenthesis": true, + "eslint.validate": ["javascript", "html", "vue", "typescript"], + "eslint.format.enable": true, + "eslint.options": { + "overrideConfig": { + "env": { + "browser": true, + "node": true, + "es2021": true + }, + "parserOptions": { + "ecmaFeatures": { + "jsx": true + }, + "ecmaVersion": "latest", + "sourceType": "module" + }, + "rules": { + "no-debugger": "off" + } + } + }, + "editor.formatOnSave": true, + "html.format.indentHandlebars": true, + "html.format.preserveNewLines": true, + "editor.codeActionsOnSave": { + "source.organizeImports": true, + "source.fixAll": true, + "source.fixAll.eslint": false + }, + "emmet.includeLanguages": { + "vue": "html", + "javascript": "html" + }, + "[vue]": { + "editor.defaultFormatter": "octref.vetur" + }, + "[html]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "editor.defaultFormatter": "esbenp.prettier-vscode", + "[javascript]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[jsonc]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[css]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[typescript]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[json]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + // vue backup + "vetur.format.defaultFormatterOptions": { + "prettier": { + "semi": true, + "printWidth": 120, + "singleQuote": false, + "trailingComma": "aways", + "arrowParens": "aways" + } + }, + "vetur.format.defaultFormatter.js": "prettier-eslint", + "vetur.format.defaultFormatter.html": "js-beautify-html" +} diff --git a/ES6-10/.gitignore b/ES6-10/.gitignore new file mode 100644 index 0000000..6ec9476 --- /dev/null +++ b/ES6-10/.gitignore @@ -0,0 +1,42 @@ +# Numerous always-ignore extensions +*.bak +*.patch +*.diff +*.err + +# temp file for git conflict merging +*.orig +*.log +*.rej +*.swo +*.swp +# *.zip +*.vi +*~ +*.sass-cache +*.tmp.html +*.dump + +# OS or Editor folders +.DS_Store +._* +.cache +# .project +# .settings +.tmproj +*.esproj +*.sublime-project +*.sublime-workspace +nbproject +thumbs.db +*.iml + +# Folders to ignore +.hg +.svn +.CVS +.idea +node_modules/ +jscoverage_lib/ +bower_components/ +# dist/ diff --git a/ES6-10/ES2019/.babelrc b/ES6-10/ES2019/.babelrc new file mode 100644 index 0000000..67fc288 --- /dev/null +++ b/ES6-10/ES2019/.babelrc @@ -0,0 +1,7 @@ +{ + "presets": [ + [ + "@babel/preset-env" + ] + ] +} diff --git a/ES6-10/ES2019/.eslintrc.js b/ES6-10/ES2019/.eslintrc.js new file mode 100644 index 0000000..a872a97 --- /dev/null +++ b/ES6-10/ES2019/.eslintrc.js @@ -0,0 +1,17 @@ +module.exports = { + "env": { + "browser": true, + "es6": true + }, + "extends": "standard", + "globals": { + "Atomics": "readonly", + "SharedArrayBuffer": "readonly", + 'BigInt':true + }, + "parserOptions": { + "ecmaVersion": 2019 + }, + "rules": { + } +}; diff --git a/ES6-10/ES2019/.gitignore b/ES6-10/ES2019/.gitignore new file mode 100644 index 0000000..3c3629e --- /dev/null +++ b/ES6-10/ES2019/.gitignore @@ -0,0 +1 @@ +node_modules diff --git a/ES6-10/ES2019/.vscode/launch.json b/ES6-10/ES2019/.vscode/launch.json new file mode 100644 index 0000000..6c8115e --- /dev/null +++ b/ES6-10/ES2019/.vscode/launch.json @@ -0,0 +1,15 @@ +{ + // 使用 IntelliSense 了解相关属性。 + // 悬停以查看现有属性的描述。 + // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "type": "pwa-chrome", + "request": "launch", + "name": "Launch Chrome against localhost", + "url": "http://localhost:8080", + "webRoot": "${workspaceFolder}" + } + ] +} \ No newline at end of file diff --git a/ES6-10/ES2019/app.js b/ES6-10/ES2019/app.js new file mode 100644 index 0000000..5ceab15 --- /dev/null +++ b/ES6-10/ES2019/app.js @@ -0,0 +1,36 @@ +import Koa from 'koa' +import path from 'path' +import BodyParser from 'koa-bodyparser' +import Views from 'koa-ejs' +import Static from 'koa-static' +import webpackConfig from './webpack.config.babel.js' +import webpack from 'webpack' +import webpackDevMiddleware from 'koa-webpack-dev-middleware' +import webpackHotMiddleware from 'koa-webpack-hot-middleware' +import Users from './routes/user.js' + +const app = new Koa() + +Views(app, { + root: path.join(__dirname, 'views'), + layout: 'layout', + viewExt: 'ejs', + cache: false, + debug: false +}) + +const compiler = webpack(webpackConfig) + +const wdm = webpackDevMiddleware(compiler, { + noInfo: true + // publicPath: config.output.publicPath +}) +app.use(wdm) +app.use(webpackHotMiddleware(compiler)) +app.use(Static(path.join(__dirname, 'static'))) +app.use(BodyParser()) + +app.use(Users.routes()).use(Users.allowedMethods()) +app.listen(8080) + +global.console.log(`server is listen, http://localhost:8080`) \ No newline at end of file diff --git a/ES6-10/ES2019/js/1.module.js b/ES6-10/ES2019/js/1.module.js new file mode 100644 index 0000000..bc45a5d --- /dev/null +++ b/ES6-10/ES2019/js/1.module.js @@ -0,0 +1,17 @@ +export function hi() { + console.log(`Hello`); +} + +export function bye() { + console.log(`Bye`); +} + +export default function () { + console.log("Module loaded (export default)!"); +} + +export { + run, + say +} +from "./lesson2-14-mod"; \ No newline at end of file diff --git a/ES6-10/ES2019/js/FileSaver.js b/ES6-10/ES2019/js/FileSaver.js new file mode 100644 index 0000000..7bfd2e4 --- /dev/null +++ b/ES6-10/ES2019/js/FileSaver.js @@ -0,0 +1,194 @@ +(function (global, factory) { + if (typeof define === "function" && define.amd) { + define([], factory); + } else if (typeof exports !== "undefined") { + factory(); + } else { + var mod = { + exports: {} + }; + factory(); + global.FileSaver = mod.exports; + } +})(this, function () { + "use strict"; + + /* + * FileSaver.js + * A saveAs() FileSaver implementation. + * + * By Eli Grey, http://eligrey.com + * + * License : https://github.com/eligrey/FileSaver.js/blob/master/LICENSE.md (MIT) + * source : http://purl.eligrey.com/github/FileSaver.js + */ + // The one and only way of getting global scope in all environments + // https://stackoverflow.com/q/3277182/1008999 + var _global = typeof window === 'object' && window.window === window ? window : typeof self === 'object' && self.self === self ? self : typeof global === 'object' && global.global === global ? global : void 0; + + function bom(blob, opts) { + if (typeof opts === 'undefined') opts = { + autoBom: false + }; + else if (typeof opts !== 'object') { + console.warn('Deprecated: Expected third argument to be a object'); + opts = { + autoBom: !opts + }; + } // prepend BOM for UTF-8 XML and text/* types (including HTML) + // note: your browser will automatically convert UTF-16 U+FEFF to EF BB BF + + if (opts.autoBom && /^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(blob.type)) { + return new Blob([String.fromCharCode(0xFEFF), blob], { + type: blob.type + }); + } + + return blob; + } + + function download(url, name, opts) { + var xhr = new XMLHttpRequest(); + xhr.open('GET', url); + xhr.responseType = 'blob'; + + xhr.onload = function () { + saveAs(xhr.response, name, opts); + }; + + xhr.onerror = function () { + console.error('could not download file'); + }; + + xhr.send(); + } + + function corsEnabled(url) { + var xhr = new XMLHttpRequest(); // use sync to avoid popup blocker + + xhr.open('HEAD', url, false); + + try { + xhr.send(); + } catch (e) {} + + return xhr.status >= 200 && xhr.status <= 299; + } // `a.click()` doesn't work for all browsers (#465) + + + function click(node) { + try { + node.dispatchEvent(new MouseEvent('click')); + } catch (e) { + var evt = document.createEvent('MouseEvents'); + evt.initMouseEvent('click', true, true, window, 0, 0, 0, 80, 20, false, false, false, false, 0, null); + node.dispatchEvent(evt); + } + } // Detect WebView inside a native macOS app by ruling out all browsers + // We just need to check for 'Safari' because all other browsers (besides Firefox) include that too + // https://www.whatismybrowser.com/guides/the-latest-user-agent/macos + + + var isMacOSWebView = /Macintosh/.test(navigator.userAgent) && /AppleWebKit/.test(navigator.userAgent) && !/Safari/.test(navigator.userAgent); + var saveAs = _global.saveAs || ( // probably in some web worker + typeof window !== 'object' || window !== _global ? function saveAs() {} + /* noop */ + // Use download attribute first if possible (#193 Lumia mobile) unless this is a macOS WebView + : + 'download' in HTMLAnchorElement.prototype && !isMacOSWebView ? function saveAs(blob, name, opts) { + var URL = _global.URL || _global.webkitURL; + var a = document.createElement('a'); + name = name || blob.name || 'download'; + a.download = name; + a.rel = 'noopener'; // tabnabbing + // TODO: detect chrome extensions & packaged apps + // a.target = '_blank' + + if (typeof blob === 'string') { + // Support regular links + a.href = blob; + + if (a.origin !== location.origin) { + corsEnabled(a.href) ? download(blob, name, opts) : click(a, a.target = '_blank'); + } else { + click(a); + } + } else { + // Support blobs + a.href = URL.createObjectURL(blob); + setTimeout(function () { + URL.revokeObjectURL(a.href); + }, 4E4); // 40s + + setTimeout(function () { + click(a); + }, 0); + } + } // Use msSaveOrOpenBlob as a second approach + : + 'msSaveOrOpenBlob' in navigator ? function saveAs(blob, name, opts) { + name = name || blob.name || 'download'; + + if (typeof blob === 'string') { + if (corsEnabled(blob)) { + download(blob, name, opts); + } else { + var a = document.createElement('a'); + a.href = blob; + a.target = '_blank'; + setTimeout(function () { + click(a); + }); + } + } else { + navigator.msSaveOrOpenBlob(bom(blob, opts), name); + } + } // Fallback to using FileReader and a popup + : + function saveAs(blob, name, opts, popup) { + // Open a popup immediately do go around popup blocker + // Mostly only available on user interaction and the fileReader is async so... + popup = popup || open('', '_blank'); + + if (popup) { + popup.document.title = popup.document.body.innerText = 'downloading...'; + } + + if (typeof blob === 'string') return download(blob, name, opts); + var force = blob.type === 'application/octet-stream'; + + var isSafari = /constructor/i.test(_global.HTMLElement) || _global.safari; + + var isChromeIOS = /CriOS\/[\d]+/.test(navigator.userAgent); + + if ((isChromeIOS || force && isSafari || isMacOSWebView) && typeof FileReader !== 'undefined') { + // Safari doesn't allow downloading of blob URLs + var reader = new FileReader(); + + reader.onloadend = function () { + var url = reader.result; + url = isChromeIOS ? url : url.replace(/^data:[^;]*;/, 'data:attachment/file;'); + if (popup) popup.location.href = url; + else location = url; + popup = null; // reverse-tabnabbing #460 + }; + + reader.readAsDataURL(blob); + } else { + var URL = _global.URL || _global.webkitURL; + var url = URL.createObjectURL(blob); + if (popup) popup.location = url; + else location.href = url; + popup = null; // reverse-tabnabbing #460 + + setTimeout(function () { + URL.revokeObjectURL(url); + }, 4E4); // 40s + } + }); + _global.saveAs = saveAs.saveAs = saveAs; + + if (typeof module !== 'undefined') { + module.exports = saveAs; + } +}); \ No newline at end of file diff --git a/ES6-10/ES2019/js/index.js b/ES6-10/ES2019/js/index.js new file mode 100644 index 0000000..7063fbc --- /dev/null +++ b/ES6-10/ES2019/js/index.js @@ -0,0 +1 @@ +import './test0731' \ No newline at end of file diff --git a/ES6-10/ES2019/js/jszip.js b/ES6-10/ES2019/js/jszip.js new file mode 100644 index 0000000..a46c3a0 --- /dev/null +++ b/ES6-10/ES2019/js/jszip.js @@ -0,0 +1,30 @@ +/*! + +JSZip v3.6.0 - A JavaScript class for generating and reading zip files + + +(c) 2009-2016 Stuart Knightley +Dual licenced under the MIT license or GPLv3. See https://raw.github.com/Stuk/jszip/master/LICENSE.markdown. + +JSZip uses the library pako released under the MIT license : +https://github.com/nodeca/pako/blob/master/LICENSE +*/ + +(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.JSZip = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o + +(c) 2009-2016 Stuart Knightley +Dual licenced under the MIT license or GPLv3. See https://raw.github.com/Stuk/jszip/master/LICENSE.markdown. + +JSZip uses the library pako released under the MIT license : +https://github.com/nodeca/pako/blob/master/LICENSE +*/ + +!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).JSZip=e()}}(function(){return function s(a,o,u){function h(r,e){if(!o[r]){if(!a[r]){var t="function"==typeof require&&require;if(!e&&t)return t(r,!0);if(f)return f(r,!0);var n=new Error("Cannot find module '"+r+"'");throw n.code="MODULE_NOT_FOUND",n}var i=o[r]={exports:{}};a[r][0].call(i.exports,function(e){var t=a[r][1][e];return h(t||e)},i,i.exports,s,a,o,u)}return o[r].exports}for(var f="function"==typeof require&&require,e=0;e>2,s=(3&t)<<4|r>>4,a=1>6:64,o=2>4,r=(15&i)<<4|(s=p.indexOf(e.charAt(o++)))>>2,n=(3&s)<<6|(a=p.indexOf(e.charAt(o++))),h[u++]=t,64!==s&&(h[u++]=r),64!==a&&(h[u++]=n);return h}},{"./support":30,"./utils":32}],2:[function(e,t,r){"use strict";var n=e("./external"),i=e("./stream/DataWorker"),s=e("./stream/Crc32Probe"),a=e("./stream/DataLengthProbe");function o(e,t,r,n,i){this.compressedSize=e,this.uncompressedSize=t,this.crc32=r,this.compression=n,this.compressedContent=i}o.prototype={getContentWorker:function(){var e=new i(n.Promise.resolve(this.compressedContent)).pipe(this.compression.uncompressWorker()).pipe(new a("data_length")),t=this;return e.on("end",function(){if(this.streamInfo.data_length!==t.uncompressedSize)throw new Error("Bug : uncompressed data size mismatch")}),e},getCompressedWorker:function(){return new i(n.Promise.resolve(this.compressedContent)).withStreamInfo("compressedSize",this.compressedSize).withStreamInfo("uncompressedSize",this.uncompressedSize).withStreamInfo("crc32",this.crc32).withStreamInfo("compression",this.compression)}},o.createWorkerFrom=function(e,t,r){return e.pipe(new s).pipe(new a("uncompressedSize")).pipe(t.compressWorker(r)).pipe(new a("compressedSize")).withStreamInfo("compression",t)},t.exports=o},{"./external":6,"./stream/Crc32Probe":25,"./stream/DataLengthProbe":26,"./stream/DataWorker":27}],3:[function(e,t,r){"use strict";var n=e("./stream/GenericWorker");r.STORE={magic:"\0\0",compressWorker:function(e){return new n("STORE compression")},uncompressWorker:function(){return new n("STORE decompression")}},r.DEFLATE=e("./flate")},{"./flate":7,"./stream/GenericWorker":28}],4:[function(e,t,r){"use strict";var n=e("./utils"),a=function(){for(var e,t=[],r=0;r<256;r++){e=r;for(var n=0;n<8;n++)e=1&e?3988292384^e>>>1:e>>>1;t[r]=e}return t}();t.exports=function(e,t){return void 0!==e&&e.length?"string"!==n.getTypeOf(e)?function(e,t,r){var n=a,i=0+r;e^=-1;for(var s=0;s>>8^n[255&(e^t[s])];return-1^e}(0|t,e,e.length):function(e,t,r){var n=a,i=0+r;e^=-1;for(var s=0;s>>8^n[255&(e^t.charCodeAt(s))];return-1^e}(0|t,e,e.length):0}},{"./utils":32}],5:[function(e,t,r){"use strict";r.base64=!1,r.binary=!1,r.dir=!1,r.createFolders=!0,r.date=null,r.compression=null,r.compressionOptions=null,r.comment=null,r.unixPermissions=null,r.dosPermissions=null},{}],6:[function(e,t,r){"use strict";var n;n="undefined"!=typeof Promise?Promise:e("lie"),t.exports={Promise:n}},{lie:37}],7:[function(e,t,r){"use strict";var n="undefined"!=typeof Uint8Array&&"undefined"!=typeof Uint16Array&&"undefined"!=typeof Uint32Array,i=e("pako"),s=e("./utils"),a=e("./stream/GenericWorker"),o=n?"uint8array":"array";function u(e,t){a.call(this,"FlateWorker/"+e),this._pako=null,this._pakoAction=e,this._pakoOptions=t,this.meta={}}r.magic="\b\0",s.inherits(u,a),u.prototype.processChunk=function(e){this.meta=e.meta,null===this._pako&&this._createPako(),this._pako.push(s.transformTo(o,e.data),!1)},u.prototype.flush=function(){a.prototype.flush.call(this),null===this._pako&&this._createPako(),this._pako.push([],!0)},u.prototype.cleanUp=function(){a.prototype.cleanUp.call(this),this._pako=null},u.prototype._createPako=function(){this._pako=new i[this._pakoAction]({raw:!0,level:this._pakoOptions.level||-1});var t=this;this._pako.onData=function(e){t.push({data:e,meta:t.meta})}},r.compressWorker=function(e){return new u("Deflate",e)},r.uncompressWorker=function(){return new u("Inflate",{})}},{"./stream/GenericWorker":28,"./utils":32,pako:38}],8:[function(e,t,r){"use strict";function I(e,t){var r,n="";for(r=0;r>>=8;return n}function i(e,t,r,n,i,s){var a,o,u=e.file,h=e.compression,f=s!==B.utf8encode,l=O.transformTo("string",s(u.name)),d=O.transformTo("string",B.utf8encode(u.name)),c=u.comment,p=O.transformTo("string",s(c)),m=O.transformTo("string",B.utf8encode(c)),_=d.length!==u.name.length,g=m.length!==c.length,v="",b="",w="",y=u.dir,k=u.date,x={crc32:0,compressedSize:0,uncompressedSize:0};t&&!r||(x.crc32=e.crc32,x.compressedSize=e.compressedSize,x.uncompressedSize=e.uncompressedSize);var S=0;t&&(S|=8),f||!_&&!g||(S|=2048);var z,C=0,E=0;y&&(C|=16),"UNIX"===i?(E=798,C|=((z=u.unixPermissions)||(z=y?16893:33204),(65535&z)<<16)):(E=20,C|=63&(u.dosPermissions||0)),a=k.getUTCHours(),a<<=6,a|=k.getUTCMinutes(),a<<=5,a|=k.getUTCSeconds()/2,o=k.getUTCFullYear()-1980,o<<=4,o|=k.getUTCMonth()+1,o<<=5,o|=k.getUTCDate(),_&&(v+="up"+I((b=I(1,1)+I(R(l),4)+d).length,2)+b),g&&(v+="uc"+I((w=I(1,1)+I(R(p),4)+m).length,2)+w);var A="";return A+="\n\0",A+=I(S,2),A+=h.magic,A+=I(a,2),A+=I(o,2),A+=I(x.crc32,4),A+=I(x.compressedSize,4),A+=I(x.uncompressedSize,4),A+=I(l.length,2),A+=I(v.length,2),{fileRecord:T.LOCAL_FILE_HEADER+A+l+v,dirRecord:T.CENTRAL_FILE_HEADER+I(E,2)+A+I(p.length,2)+"\0\0\0\0"+I(C,4)+I(n,4)+l+v+p}}var O=e("../utils"),s=e("../stream/GenericWorker"),B=e("../utf8"),R=e("../crc32"),T=e("../signature");function n(e,t,r,n){s.call(this,"ZipFileWorker"),this.bytesWritten=0,this.zipComment=t,this.zipPlatform=r,this.encodeFileName=n,this.streamFiles=e,this.accumulate=!1,this.contentBuffer=[],this.dirRecords=[],this.currentSourceOffset=0,this.entriesCount=0,this.currentFile=null,this._sources=[]}O.inherits(n,s),n.prototype.push=function(e){var t=e.meta.percent||0,r=this.entriesCount,n=this._sources.length;this.accumulate?this.contentBuffer.push(e):(this.bytesWritten+=e.data.length,s.prototype.push.call(this,{data:e.data,meta:{currentFile:this.currentFile,percent:r?(t+100*(r-n-1))/r:100}}))},n.prototype.openedSource=function(e){this.currentSourceOffset=this.bytesWritten,this.currentFile=e.file.name;var t=this.streamFiles&&!e.file.dir;if(t){var r=i(e,t,!1,this.currentSourceOffset,this.zipPlatform,this.encodeFileName);this.push({data:r.fileRecord,meta:{percent:0}})}else this.accumulate=!0},n.prototype.closedSource=function(e){this.accumulate=!1;var t,r=this.streamFiles&&!e.file.dir,n=i(e,r,!0,this.currentSourceOffset,this.zipPlatform,this.encodeFileName);if(this.dirRecords.push(n.dirRecord),r)this.push({data:(t=e,T.DATA_DESCRIPTOR+I(t.crc32,4)+I(t.compressedSize,4)+I(t.uncompressedSize,4)),meta:{percent:100}});else for(this.push({data:n.fileRecord,meta:{percent:0}});this.contentBuffer.length;)this.push(this.contentBuffer.shift());this.currentFile=null},n.prototype.flush=function(){for(var e=this.bytesWritten,t=0;t=this.index;t--)r=(r<<8)+this.byteAt(t);return this.index+=e,r},readString:function(e){return n.transformTo("string",this.readData(e))},readData:function(e){},lastIndexOfSignature:function(e){},readAndCheckSignature:function(e){},readDate:function(){var e=this.readInt(4);return new Date(Date.UTC(1980+(e>>25&127),(e>>21&15)-1,e>>16&31,e>>11&31,e>>5&63,(31&e)<<1))}},t.exports=i},{"../utils":32}],19:[function(e,t,r){"use strict";var n=e("./Uint8ArrayReader");function i(e){n.call(this,e)}e("../utils").inherits(i,n),i.prototype.readData=function(e){this.checkOffset(e);var t=this.data.slice(this.zero+this.index,this.zero+this.index+e);return this.index+=e,t},t.exports=i},{"../utils":32,"./Uint8ArrayReader":21}],20:[function(e,t,r){"use strict";var n=e("./DataReader");function i(e){n.call(this,e)}e("../utils").inherits(i,n),i.prototype.byteAt=function(e){return this.data.charCodeAt(this.zero+e)},i.prototype.lastIndexOfSignature=function(e){return this.data.lastIndexOf(e)-this.zero},i.prototype.readAndCheckSignature=function(e){return e===this.readData(4)},i.prototype.readData=function(e){this.checkOffset(e);var t=this.data.slice(this.zero+this.index,this.zero+this.index+e);return this.index+=e,t},t.exports=i},{"../utils":32,"./DataReader":18}],21:[function(e,t,r){"use strict";var n=e("./ArrayReader");function i(e){n.call(this,e)}e("../utils").inherits(i,n),i.prototype.readData=function(e){if(this.checkOffset(e),0===e)return new Uint8Array(0);var t=this.data.subarray(this.zero+this.index,this.zero+this.index+e);return this.index+=e,t},t.exports=i},{"../utils":32,"./ArrayReader":17}],22:[function(e,t,r){"use strict";var n=e("../utils"),i=e("../support"),s=e("./ArrayReader"),a=e("./StringReader"),o=e("./NodeBufferReader"),u=e("./Uint8ArrayReader");t.exports=function(e){var t=n.getTypeOf(e);return n.checkSupport(t),"string"!==t||i.uint8array?"nodebuffer"===t?new o(e):i.uint8array?new u(n.transformTo("uint8array",e)):new s(n.transformTo("array",e)):new a(e)}},{"../support":30,"../utils":32,"./ArrayReader":17,"./NodeBufferReader":19,"./StringReader":20,"./Uint8ArrayReader":21}],23:[function(e,t,r){"use strict";r.LOCAL_FILE_HEADER="PK",r.CENTRAL_FILE_HEADER="PK",r.CENTRAL_DIRECTORY_END="PK",r.ZIP64_CENTRAL_DIRECTORY_LOCATOR="PK",r.ZIP64_CENTRAL_DIRECTORY_END="PK",r.DATA_DESCRIPTOR="PK\b"},{}],24:[function(e,t,r){"use strict";var n=e("./GenericWorker"),i=e("../utils");function s(e){n.call(this,"ConvertWorker to "+e),this.destType=e}i.inherits(s,n),s.prototype.processChunk=function(e){this.push({data:i.transformTo(this.destType,e.data),meta:e.meta})},t.exports=s},{"../utils":32,"./GenericWorker":28}],25:[function(e,t,r){"use strict";var n=e("./GenericWorker"),i=e("../crc32");function s(){n.call(this,"Crc32Probe"),this.withStreamInfo("crc32",0)}e("../utils").inherits(s,n),s.prototype.processChunk=function(e){this.streamInfo.crc32=i(e.data,this.streamInfo.crc32||0),this.push(e)},t.exports=s},{"../crc32":4,"../utils":32,"./GenericWorker":28}],26:[function(e,t,r){"use strict";var n=e("../utils"),i=e("./GenericWorker");function s(e){i.call(this,"DataLengthProbe for "+e),this.propName=e,this.withStreamInfo(e,0)}n.inherits(s,i),s.prototype.processChunk=function(e){if(e){var t=this.streamInfo[this.propName]||0;this.streamInfo[this.propName]=t+e.data.length}i.prototype.processChunk.call(this,e)},t.exports=s},{"../utils":32,"./GenericWorker":28}],27:[function(e,t,r){"use strict";var n=e("../utils"),i=e("./GenericWorker");function s(e){i.call(this,"DataWorker");var t=this;this.dataIsReady=!1,this.index=0,this.max=0,this.data=null,this.type="",this._tickScheduled=!1,e.then(function(e){t.dataIsReady=!0,t.data=e,t.max=e&&e.length||0,t.type=n.getTypeOf(e),t.isPaused||t._tickAndRepeat()},function(e){t.error(e)})}n.inherits(s,i),s.prototype.cleanUp=function(){i.prototype.cleanUp.call(this),this.data=null},s.prototype.resume=function(){return!!i.prototype.resume.call(this)&&(!this._tickScheduled&&this.dataIsReady&&(this._tickScheduled=!0,n.delay(this._tickAndRepeat,[],this)),!0)},s.prototype._tickAndRepeat=function(){this._tickScheduled=!1,this.isPaused||this.isFinished||(this._tick(),this.isFinished||(n.delay(this._tickAndRepeat,[],this),this._tickScheduled=!0))},s.prototype._tick=function(){if(this.isPaused||this.isFinished)return!1;var e=null,t=Math.min(this.max,this.index+16384);if(this.index>=this.max)return this.end();switch(this.type){case"string":e=this.data.substring(this.index,t);break;case"uint8array":e=this.data.subarray(this.index,t);break;case"array":case"nodebuffer":e=this.data.slice(this.index,t)}return this.index=t,this.push({data:e,meta:{percent:this.max?this.index/this.max*100:0}})},t.exports=s},{"../utils":32,"./GenericWorker":28}],28:[function(e,t,r){"use strict";function n(e){this.name=e||"default",this.streamInfo={},this.generatedError=null,this.extraStreamInfo={},this.isPaused=!0,this.isFinished=!1,this.isLocked=!1,this._listeners={data:[],end:[],error:[]},this.previous=null}n.prototype={push:function(e){this.emit("data",e)},end:function(){if(this.isFinished)return!1;this.flush();try{this.emit("end"),this.cleanUp(),this.isFinished=!0}catch(e){this.emit("error",e)}return!0},error:function(e){return!this.isFinished&&(this.isPaused?this.generatedError=e:(this.isFinished=!0,this.emit("error",e),this.previous&&this.previous.error(e),this.cleanUp()),!0)},on:function(e,t){return this._listeners[e].push(t),this},cleanUp:function(){this.streamInfo=this.generatedError=this.extraStreamInfo=null,this._listeners=[]},emit:function(e,t){if(this._listeners[e])for(var r=0;r "+e:e}},t.exports=n},{}],29:[function(e,t,r){"use strict";var h=e("../utils"),i=e("./ConvertWorker"),s=e("./GenericWorker"),f=e("../base64"),n=e("../support"),a=e("../external"),o=null;if(n.nodestream)try{o=e("../nodejs/NodejsStreamOutputAdapter")}catch(e){}function u(e,t,r){var n=t;switch(t){case"blob":case"arraybuffer":n="uint8array";break;case"base64":n="string"}try{this._internalType=n,this._outputType=t,this._mimeType=r,h.checkSupport(n),this._worker=e.pipe(new i(n)),e.lock()}catch(e){this._worker=new s("error"),this._worker.error(e)}}u.prototype={accumulate:function(e){return o=this,u=e,new a.Promise(function(t,r){var n=[],i=o._internalType,s=o._outputType,a=o._mimeType;o.on("data",function(e,t){n.push(e),u&&u(t)}).on("error",function(e){n=[],r(e)}).on("end",function(){try{var e=function(e,t,r){switch(e){case"blob":return h.newBlob(h.transformTo("arraybuffer",t),r);case"base64":return f.encode(t);default:return h.transformTo(e,t)}}(s,function(e,t){var r,n=0,i=null,s=0;for(r=0;r>>6:(r<65536?t[s++]=224|r>>>12:(t[s++]=240|r>>>18,t[s++]=128|r>>>12&63),t[s++]=128|r>>>6&63),t[s++]=128|63&r);return t}(e)},s.utf8decode=function(e){return u.nodebuffer?o.transformTo("nodebuffer",e).toString("utf-8"):function(e){var t,r,n,i,s=e.length,a=new Array(2*s);for(t=r=0;t>10&1023,a[r++]=56320|1023&n)}return a.length!==r&&(a.subarray?a=a.subarray(0,r):a.length=r),o.applyFromCharCode(a)}(e=o.transformTo(u.uint8array?"uint8array":"array",e))},o.inherits(a,n),a.prototype.processChunk=function(e){var t=o.transformTo(u.uint8array?"uint8array":"array",e.data);if(this.leftOver&&this.leftOver.length){if(u.uint8array){var r=t;(t=new Uint8Array(r.length+this.leftOver.length)).set(this.leftOver,0),t.set(r,this.leftOver.length)}else t=this.leftOver.concat(t);this.leftOver=null}var n=function(e,t){var r;for((t=t||e.length)>e.length&&(t=e.length),r=t-1;0<=r&&128==(192&e[r]);)r--;return r<0?t:0===r?t:r+h[e[r]]>t?r:t}(t),i=t;n!==t.length&&(u.uint8array?(i=t.subarray(0,n),this.leftOver=t.subarray(n,t.length)):(i=t.slice(0,n),this.leftOver=t.slice(n,t.length))),this.push({data:s.utf8decode(i),meta:e.meta})},a.prototype.flush=function(){this.leftOver&&this.leftOver.length&&(this.push({data:s.utf8decode(this.leftOver),meta:{}}),this.leftOver=null)},s.Utf8DecodeWorker=a,o.inherits(f,n),f.prototype.processChunk=function(e){this.push({data:s.utf8encode(e.data),meta:e.meta})},s.Utf8EncodeWorker=f},{"./nodejsUtils":14,"./stream/GenericWorker":28,"./support":30,"./utils":32}],32:[function(e,t,o){"use strict";var u=e("./support"),h=e("./base64"),r=e("./nodejsUtils"),n=e("set-immediate-shim"),f=e("./external");function i(e){return e}function l(e,t){for(var r=0;r>8;this.dir=!!(16&this.externalFileAttributes),0==e&&(this.dosPermissions=63&this.externalFileAttributes),3==e&&(this.unixPermissions=this.externalFileAttributes>>16&65535),this.dir||"/"!==this.fileNameStr.slice(-1)||(this.dir=!0)},parseZIP64ExtraField:function(e){if(this.extraFields[1]){var t=n(this.extraFields[1].value);this.uncompressedSize===s.MAX_VALUE_32BITS&&(this.uncompressedSize=t.readInt(8)),this.compressedSize===s.MAX_VALUE_32BITS&&(this.compressedSize=t.readInt(8)),this.localHeaderOffset===s.MAX_VALUE_32BITS&&(this.localHeaderOffset=t.readInt(8)),this.diskNumberStart===s.MAX_VALUE_32BITS&&(this.diskNumberStart=t.readInt(4))}},readExtraFields:function(e){var t,r,n,i=e.index+this.extraFieldsLength;for(this.extraFields||(this.extraFields={});e.index+4>>6:(r<65536?t[s++]=224|r>>>12:(t[s++]=240|r>>>18,t[s++]=128|r>>>12&63),t[s++]=128|r>>>6&63),t[s++]=128|63&r);return t},r.buf2binstring=function(e){return f(e,e.length)},r.binstring2buf=function(e){for(var t=new u.Buf8(e.length),r=0,n=t.length;r>10&1023,o[n++]=56320|1023&i)}return f(o,n)},r.utf8border=function(e,t){var r;for((t=t||e.length)>e.length&&(t=e.length),r=t-1;0<=r&&128==(192&e[r]);)r--;return r<0?t:0===r?t:r+h[e[r]]>t?r:t}},{"./common":41}],43:[function(e,t,r){"use strict";t.exports=function(e,t,r,n){for(var i=65535&e|0,s=e>>>16&65535|0,a=0;0!==r;){for(r-=a=2e3>>1:e>>>1;t[r]=e}return t}();t.exports=function(e,t,r,n){var i=o,s=n+r;e^=-1;for(var a=n;a>>8^i[255&(e^t[a])];return-1^e}},{}],46:[function(e,t,r){"use strict";var u,d=e("../utils/common"),h=e("./trees"),c=e("./adler32"),p=e("./crc32"),n=e("./messages"),f=0,l=0,m=-2,i=2,_=8,s=286,a=30,o=19,g=2*s+1,v=15,b=3,w=258,y=w+b+1,k=42,x=113;function S(e,t){return e.msg=n[t],t}function z(e){return(e<<1)-(4e.avail_out&&(r=e.avail_out),0!==r&&(d.arraySet(e.output,t.pending_buf,t.pending_out,r,e.next_out),e.next_out+=r,t.pending_out+=r,e.total_out+=r,e.avail_out-=r,t.pending-=r,0===t.pending&&(t.pending_out=0))}function A(e,t){h._tr_flush_block(e,0<=e.block_start?e.block_start:-1,e.strstart-e.block_start,t),e.block_start=e.strstart,E(e.strm)}function I(e,t){e.pending_buf[e.pending++]=t}function O(e,t){e.pending_buf[e.pending++]=t>>>8&255,e.pending_buf[e.pending++]=255&t}function B(e,t){var r,n,i=e.max_chain_length,s=e.strstart,a=e.prev_length,o=e.nice_match,u=e.strstart>e.w_size-y?e.strstart-(e.w_size-y):0,h=e.window,f=e.w_mask,l=e.prev,d=e.strstart+w,c=h[s+a-1],p=h[s+a];e.prev_length>=e.good_match&&(i>>=2),o>e.lookahead&&(o=e.lookahead);do{if(h[(r=t)+a]===p&&h[r+a-1]===c&&h[r]===h[s]&&h[++r]===h[s+1]){s+=2,r++;do{}while(h[++s]===h[++r]&&h[++s]===h[++r]&&h[++s]===h[++r]&&h[++s]===h[++r]&&h[++s]===h[++r]&&h[++s]===h[++r]&&h[++s]===h[++r]&&h[++s]===h[++r]&&su&&0!=--i);return a<=e.lookahead?a:e.lookahead}function R(e){var t,r,n,i,s,a,o,u,h,f,l=e.w_size;do{if(i=e.window_size-e.lookahead-e.strstart,e.strstart>=l+(l-y)){for(d.arraySet(e.window,e.window,l,l,0),e.match_start-=l,e.strstart-=l,e.block_start-=l,t=r=e.hash_size;n=e.head[--t],e.head[t]=l<=n?n-l:0,--r;);for(t=r=l;n=e.prev[--t],e.prev[t]=l<=n?n-l:0,--r;);i+=l}if(0===e.strm.avail_in)break;if(a=e.strm,o=e.window,u=e.strstart+e.lookahead,f=void 0,(h=i)<(f=a.avail_in)&&(f=h),r=0===f?0:(a.avail_in-=f,d.arraySet(o,a.input,a.next_in,f,u),1===a.state.wrap?a.adler=c(a.adler,o,f,u):2===a.state.wrap&&(a.adler=p(a.adler,o,f,u)),a.next_in+=f,a.total_in+=f,f),e.lookahead+=r,e.lookahead+e.insert>=b)for(s=e.strstart-e.insert,e.ins_h=e.window[s],e.ins_h=(e.ins_h<=b&&(e.ins_h=(e.ins_h<=b)if(n=h._tr_tally(e,e.strstart-e.match_start,e.match_length-b),e.lookahead-=e.match_length,e.match_length<=e.max_lazy_match&&e.lookahead>=b){for(e.match_length--;e.strstart++,e.ins_h=(e.ins_h<=b&&(e.ins_h=(e.ins_h<=b&&e.match_length<=e.prev_length){for(i=e.strstart+e.lookahead-b,n=h._tr_tally(e,e.strstart-1-e.prev_match,e.prev_length-b),e.lookahead-=e.prev_length-1,e.prev_length-=2;++e.strstart<=i&&(e.ins_h=(e.ins_h<e.pending_buf_size-5&&(r=e.pending_buf_size-5);;){if(e.lookahead<=1){if(R(e),0===e.lookahead&&t===f)return 1;if(0===e.lookahead)break}e.strstart+=e.lookahead,e.lookahead=0;var n=e.block_start+r;if((0===e.strstart||e.strstart>=n)&&(e.lookahead=e.strstart-n,e.strstart=n,A(e,!1),0===e.strm.avail_out))return 1;if(e.strstart-e.block_start>=e.w_size-y&&(A(e,!1),0===e.strm.avail_out))return 1}return e.insert=0,4===t?(A(e,!0),0===e.strm.avail_out?3:4):(e.strstart>e.block_start&&(A(e,!1),e.strm.avail_out),1)}),new F(4,4,8,4,T),new F(4,5,16,8,T),new F(4,6,32,32,T),new F(4,4,16,16,D),new F(8,16,32,32,D),new F(8,16,128,128,D),new F(8,32,128,256,D),new F(32,128,258,1024,D),new F(32,258,258,4096,D)],r.deflateInit=function(e,t){return L(e,t,_,15,8,0)},r.deflateInit2=L,r.deflateReset=P,r.deflateResetKeep=U,r.deflateSetHeader=function(e,t){return e&&e.state?2!==e.state.wrap?m:(e.state.gzhead=t,l):m},r.deflate=function(e,t){var r,n,i,s;if(!e||!e.state||5>8&255),I(n,n.gzhead.time>>16&255),I(n,n.gzhead.time>>24&255),I(n,9===n.level?2:2<=n.strategy||n.level<2?4:0),I(n,255&n.gzhead.os),n.gzhead.extra&&n.gzhead.extra.length&&(I(n,255&n.gzhead.extra.length),I(n,n.gzhead.extra.length>>8&255)),n.gzhead.hcrc&&(e.adler=p(e.adler,n.pending_buf,n.pending,0)),n.gzindex=0,n.status=69):(I(n,0),I(n,0),I(n,0),I(n,0),I(n,0),I(n,9===n.level?2:2<=n.strategy||n.level<2?4:0),I(n,3),n.status=x);else{var a=_+(n.w_bits-8<<4)<<8;a|=(2<=n.strategy||n.level<2?0:n.level<6?1:6===n.level?2:3)<<6,0!==n.strstart&&(a|=32),a+=31-a%31,n.status=x,O(n,a),0!==n.strstart&&(O(n,e.adler>>>16),O(n,65535&e.adler)),e.adler=1}if(69===n.status)if(n.gzhead.extra){for(i=n.pending;n.gzindex<(65535&n.gzhead.extra.length)&&(n.pending!==n.pending_buf_size||(n.gzhead.hcrc&&n.pending>i&&(e.adler=p(e.adler,n.pending_buf,n.pending-i,i)),E(e),i=n.pending,n.pending!==n.pending_buf_size));)I(n,255&n.gzhead.extra[n.gzindex]),n.gzindex++;n.gzhead.hcrc&&n.pending>i&&(e.adler=p(e.adler,n.pending_buf,n.pending-i,i)),n.gzindex===n.gzhead.extra.length&&(n.gzindex=0,n.status=73)}else n.status=73;if(73===n.status)if(n.gzhead.name){i=n.pending;do{if(n.pending===n.pending_buf_size&&(n.gzhead.hcrc&&n.pending>i&&(e.adler=p(e.adler,n.pending_buf,n.pending-i,i)),E(e),i=n.pending,n.pending===n.pending_buf_size)){s=1;break}s=n.gzindexi&&(e.adler=p(e.adler,n.pending_buf,n.pending-i,i)),0===s&&(n.gzindex=0,n.status=91)}else n.status=91;if(91===n.status)if(n.gzhead.comment){i=n.pending;do{if(n.pending===n.pending_buf_size&&(n.gzhead.hcrc&&n.pending>i&&(e.adler=p(e.adler,n.pending_buf,n.pending-i,i)),E(e),i=n.pending,n.pending===n.pending_buf_size)){s=1;break}s=n.gzindexi&&(e.adler=p(e.adler,n.pending_buf,n.pending-i,i)),0===s&&(n.status=103)}else n.status=103;if(103===n.status&&(n.gzhead.hcrc?(n.pending+2>n.pending_buf_size&&E(e),n.pending+2<=n.pending_buf_size&&(I(n,255&e.adler),I(n,e.adler>>8&255),e.adler=0,n.status=x)):n.status=x),0!==n.pending){if(E(e),0===e.avail_out)return n.last_flush=-1,l}else if(0===e.avail_in&&z(t)<=z(r)&&4!==t)return S(e,-5);if(666===n.status&&0!==e.avail_in)return S(e,-5);if(0!==e.avail_in||0!==n.lookahead||t!==f&&666!==n.status){var o=2===n.strategy?function(e,t){for(var r;;){if(0===e.lookahead&&(R(e),0===e.lookahead)){if(t===f)return 1;break}if(e.match_length=0,r=h._tr_tally(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++,r&&(A(e,!1),0===e.strm.avail_out))return 1}return e.insert=0,4===t?(A(e,!0),0===e.strm.avail_out?3:4):e.last_lit&&(A(e,!1),0===e.strm.avail_out)?1:2}(n,t):3===n.strategy?function(e,t){for(var r,n,i,s,a=e.window;;){if(e.lookahead<=w){if(R(e),e.lookahead<=w&&t===f)return 1;if(0===e.lookahead)break}if(e.match_length=0,e.lookahead>=b&&0e.lookahead&&(e.match_length=e.lookahead)}if(e.match_length>=b?(r=h._tr_tally(e,1,e.match_length-b),e.lookahead-=e.match_length,e.strstart+=e.match_length,e.match_length=0):(r=h._tr_tally(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++),r&&(A(e,!1),0===e.strm.avail_out))return 1}return e.insert=0,4===t?(A(e,!0),0===e.strm.avail_out?3:4):e.last_lit&&(A(e,!1),0===e.strm.avail_out)?1:2}(n,t):u[n.level].func(n,t);if(3!==o&&4!==o||(n.status=666),1===o||3===o)return 0===e.avail_out&&(n.last_flush=-1),l;if(2===o&&(1===t?h._tr_align(n):5!==t&&(h._tr_stored_block(n,0,0,!1),3===t&&(C(n.head),0===n.lookahead&&(n.strstart=0,n.block_start=0,n.insert=0))),E(e),0===e.avail_out))return n.last_flush=-1,l}return 4!==t?l:n.wrap<=0?1:(2===n.wrap?(I(n,255&e.adler),I(n,e.adler>>8&255),I(n,e.adler>>16&255),I(n,e.adler>>24&255),I(n,255&e.total_in),I(n,e.total_in>>8&255),I(n,e.total_in>>16&255),I(n,e.total_in>>24&255)):(O(n,e.adler>>>16),O(n,65535&e.adler)),E(e),0=r.w_size&&(0===s&&(C(r.head),r.strstart=0,r.block_start=0,r.insert=0),h=new d.Buf8(r.w_size),d.arraySet(h,t,f-r.w_size,r.w_size,0),t=h,f=r.w_size),a=e.avail_in,o=e.next_in,u=e.input,e.avail_in=f,e.next_in=0,e.input=t,R(r);r.lookahead>=b;){for(n=r.strstart,i=r.lookahead-(b-1);r.ins_h=(r.ins_h<>>=w=b>>>24,p-=w,0==(w=b>>>16&255))C[s++]=65535&b;else{if(!(16&w)){if(0==(64&w)){b=m[(65535&b)+(c&(1<>>=w,p-=w),p<15&&(c+=z[n++]<>>=w=b>>>24,p-=w,!(16&(w=b>>>16&255))){if(0==(64&w)){b=_[(65535&b)+(c&(1<>>=w,p-=w,(w=s-a)>3,c&=(1<<(p-=y<<3))-1,e.next_in=n,e.next_out=s,e.avail_in=n>>24&255)+(e>>>8&65280)+((65280&e)<<8)+((255&e)<<24)}function s(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new I.Buf16(320),this.work=new I.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function a(e){var t;return e&&e.state?(t=e.state,e.total_in=e.total_out=t.total=0,e.msg="",t.wrap&&(e.adler=1&t.wrap),t.mode=P,t.last=0,t.havedict=0,t.dmax=32768,t.head=null,t.hold=0,t.bits=0,t.lencode=t.lendyn=new I.Buf32(n),t.distcode=t.distdyn=new I.Buf32(i),t.sane=1,t.back=-1,N):U}function o(e){var t;return e&&e.state?((t=e.state).wsize=0,t.whave=0,t.wnext=0,a(e)):U}function u(e,t){var r,n;return e&&e.state?(n=e.state,t<0?(r=0,t=-t):(r=1+(t>>4),t<48&&(t&=15)),t&&(t<8||15=s.wsize?(I.arraySet(s.window,t,r-s.wsize,s.wsize,0),s.wnext=0,s.whave=s.wsize):(n<(i=s.wsize-s.wnext)&&(i=n),I.arraySet(s.window,t,r-n,i,s.wnext),(n-=i)?(I.arraySet(s.window,t,r-n,n,0),s.wnext=n,s.whave=s.wsize):(s.wnext+=i,s.wnext===s.wsize&&(s.wnext=0),s.whave>>8&255,r.check=B(r.check,E,2,0),f=h=0,r.mode=2;break}if(r.flags=0,r.head&&(r.head.done=!1),!(1&r.wrap)||(((255&h)<<8)+(h>>8))%31){e.msg="incorrect header check",r.mode=30;break}if(8!=(15&h)){e.msg="unknown compression method",r.mode=30;break}if(f-=4,k=8+(15&(h>>>=4)),0===r.wbits)r.wbits=k;else if(k>r.wbits){e.msg="invalid window size",r.mode=30;break}r.dmax=1<>8&1),512&r.flags&&(E[0]=255&h,E[1]=h>>>8&255,r.check=B(r.check,E,2,0)),f=h=0,r.mode=3;case 3:for(;f<32;){if(0===o)break e;o--,h+=n[s++]<>>8&255,E[2]=h>>>16&255,E[3]=h>>>24&255,r.check=B(r.check,E,4,0)),f=h=0,r.mode=4;case 4:for(;f<16;){if(0===o)break e;o--,h+=n[s++]<>8),512&r.flags&&(E[0]=255&h,E[1]=h>>>8&255,r.check=B(r.check,E,2,0)),f=h=0,r.mode=5;case 5:if(1024&r.flags){for(;f<16;){if(0===o)break e;o--,h+=n[s++]<>>8&255,r.check=B(r.check,E,2,0)),f=h=0}else r.head&&(r.head.extra=null);r.mode=6;case 6:if(1024&r.flags&&(o<(c=r.length)&&(c=o),c&&(r.head&&(k=r.head.extra_len-r.length,r.head.extra||(r.head.extra=new Array(r.head.extra_len)),I.arraySet(r.head.extra,n,s,c,k)),512&r.flags&&(r.check=B(r.check,n,c,s)),o-=c,s+=c,r.length-=c),r.length))break e;r.length=0,r.mode=7;case 7:if(2048&r.flags){if(0===o)break e;for(c=0;k=n[s+c++],r.head&&k&&r.length<65536&&(r.head.name+=String.fromCharCode(k)),k&&c>9&1,r.head.done=!0),e.adler=r.check=0,r.mode=12;break;case 10:for(;f<32;){if(0===o)break e;o--,h+=n[s++]<>>=7&f,f-=7&f,r.mode=27;break}for(;f<3;){if(0===o)break e;o--,h+=n[s++]<>>=1)){case 0:r.mode=14;break;case 1:if(j(r),r.mode=20,6!==t)break;h>>>=2,f-=2;break e;case 2:r.mode=17;break;case 3:e.msg="invalid block type",r.mode=30}h>>>=2,f-=2;break;case 14:for(h>>>=7&f,f-=7&f;f<32;){if(0===o)break e;o--,h+=n[s++]<>>16^65535)){e.msg="invalid stored block lengths",r.mode=30;break}if(r.length=65535&h,f=h=0,r.mode=15,6===t)break e;case 15:r.mode=16;case 16:if(c=r.length){if(o>>=5,f-=5,r.ndist=1+(31&h),h>>>=5,f-=5,r.ncode=4+(15&h),h>>>=4,f-=4,286>>=3,f-=3}for(;r.have<19;)r.lens[A[r.have++]]=0;if(r.lencode=r.lendyn,r.lenbits=7,S={bits:r.lenbits},x=T(0,r.lens,0,19,r.lencode,0,r.work,S),r.lenbits=S.bits,x){e.msg="invalid code lengths set",r.mode=30;break}r.have=0,r.mode=19;case 19:for(;r.have>>16&255,v=65535&C,!((_=C>>>24)<=f);){if(0===o)break e;o--,h+=n[s++]<>>=_,f-=_,r.lens[r.have++]=v;else{if(16===v){for(z=_+2;f>>=_,f-=_,0===r.have){e.msg="invalid bit length repeat",r.mode=30;break}k=r.lens[r.have-1],c=3+(3&h),h>>>=2,f-=2}else if(17===v){for(z=_+3;f>>=_)),h>>>=3,f-=3}else{for(z=_+7;f>>=_)),h>>>=7,f-=7}if(r.have+c>r.nlen+r.ndist){e.msg="invalid bit length repeat",r.mode=30;break}for(;c--;)r.lens[r.have++]=k}}if(30===r.mode)break;if(0===r.lens[256]){e.msg="invalid code -- missing end-of-block",r.mode=30;break}if(r.lenbits=9,S={bits:r.lenbits},x=T(D,r.lens,0,r.nlen,r.lencode,0,r.work,S),r.lenbits=S.bits,x){e.msg="invalid literal/lengths set",r.mode=30;break}if(r.distbits=6,r.distcode=r.distdyn,S={bits:r.distbits},x=T(F,r.lens,r.nlen,r.ndist,r.distcode,0,r.work,S),r.distbits=S.bits,x){e.msg="invalid distances set",r.mode=30;break}if(r.mode=20,6===t)break e;case 20:r.mode=21;case 21:if(6<=o&&258<=u){e.next_out=a,e.avail_out=u,e.next_in=s,e.avail_in=o,r.hold=h,r.bits=f,R(e,d),a=e.next_out,i=e.output,u=e.avail_out,s=e.next_in,n=e.input,o=e.avail_in,h=r.hold,f=r.bits,12===r.mode&&(r.back=-1);break}for(r.back=0;g=(C=r.lencode[h&(1<>>16&255,v=65535&C,!((_=C>>>24)<=f);){if(0===o)break e;o--,h+=n[s++]<>b)])>>>16&255,v=65535&C,!(b+(_=C>>>24)<=f);){if(0===o)break e;o--,h+=n[s++]<>>=b,f-=b,r.back+=b}if(h>>>=_,f-=_,r.back+=_,r.length=v,0===g){r.mode=26;break}if(32&g){r.back=-1,r.mode=12;break}if(64&g){e.msg="invalid literal/length code",r.mode=30;break}r.extra=15&g,r.mode=22;case 22:if(r.extra){for(z=r.extra;f>>=r.extra,f-=r.extra,r.back+=r.extra}r.was=r.length,r.mode=23;case 23:for(;g=(C=r.distcode[h&(1<>>16&255,v=65535&C,!((_=C>>>24)<=f);){if(0===o)break e;o--,h+=n[s++]<>b)])>>>16&255,v=65535&C,!(b+(_=C>>>24)<=f);){if(0===o)break e;o--,h+=n[s++]<>>=b,f-=b,r.back+=b}if(h>>>=_,f-=_,r.back+=_,64&g){e.msg="invalid distance code",r.mode=30;break}r.offset=v,r.extra=15&g,r.mode=24;case 24:if(r.extra){for(z=r.extra;f>>=r.extra,f-=r.extra,r.back+=r.extra}if(r.offset>r.dmax){e.msg="invalid distance too far back",r.mode=30;break}r.mode=25;case 25:if(0===u)break e;if(c=d-u,r.offset>c){if((c=r.offset-c)>r.whave&&r.sane){e.msg="invalid distance too far back",r.mode=30;break}p=c>r.wnext?(c-=r.wnext,r.wsize-c):r.wnext-c,c>r.length&&(c=r.length),m=r.window}else m=i,p=a-r.offset,c=r.length;for(uc?(m=R[T+a[b]],A[I+a[b]]):(m=96,0),u=1<>S)+(h-=u)]=p<<24|m<<16|_|0,0!==h;);for(u=1<>=1;if(0!==u?(E&=u-1,E+=u):E=0,b++,0==--O[v]){if(v===y)break;v=t[r+a[b]]}if(k>>7)]}function x(e,t){e.pending_buf[e.pending++]=255&t,e.pending_buf[e.pending++]=t>>>8&255}function S(e,t,r){e.bi_valid>i-r?(e.bi_buf|=t<>i-e.bi_valid,e.bi_valid+=r-i):(e.bi_buf|=t<>>=1,r<<=1,0<--t;);return r>>>1}function E(e,t,r){var n,i,s=new Array(_+1),a=0;for(n=1;n<=_;n++)s[n]=a=a+r[n-1]<<1;for(i=0;i<=t;i++){var o=e[2*i+1];0!==o&&(e[2*i]=C(s[o]++,o))}}function A(e){var t;for(t=0;t<286;t++)e.dyn_ltree[2*t]=0;for(t=0;t<30;t++)e.dyn_dtree[2*t]=0;for(t=0;t<19;t++)e.bl_tree[2*t]=0;e.dyn_ltree[512]=1,e.opt_len=e.static_len=0,e.last_lit=e.matches=0}function I(e){8>1;1<=r;r--)B(e,s,r);for(i=u;r=e.heap[1],e.heap[1]=e.heap[e.heap_len--],B(e,s,1),n=e.heap[1],e.heap[--e.heap_max]=r,e.heap[--e.heap_max]=n,s[2*i]=s[2*r]+s[2*n],e.depth[i]=(e.depth[r]>=e.depth[n]?e.depth[r]:e.depth[n])+1,s[2*r+1]=s[2*n+1]=i,e.heap[1]=i++,B(e,s,1),2<=e.heap_len;);e.heap[--e.heap_max]=e.heap[1],function(e,t){var r,n,i,s,a,o,u=t.dyn_tree,h=t.max_code,f=t.stat_desc.static_tree,l=t.stat_desc.has_stree,d=t.stat_desc.extra_bits,c=t.stat_desc.extra_base,p=t.stat_desc.max_length,m=0;for(s=0;s<=_;s++)e.bl_count[s]=0;for(u[2*e.heap[e.heap_max]+1]=0,r=e.heap_max+1;r<573;r++)p<(s=u[2*u[2*(n=e.heap[r])+1]+1]+1)&&(s=p,m++),u[2*n+1]=s,h>=7;n<30;n++)for(w[n]=i<<7,e=0;e<1<>>=1)if(1&r&&0!==e.dyn_ltree[2*t])return 0;if(0!==e.dyn_ltree[18]||0!==e.dyn_ltree[20]||0!==e.dyn_ltree[26])return 1;for(t=32;t<256;t++)if(0!==e.dyn_ltree[2*t])return 1;return 0}(e)),T(e,e.l_desc),T(e,e.d_desc),a=function(e){var t;for(D(e,e.dyn_ltree,e.l_desc.max_code),D(e,e.dyn_dtree,e.d_desc.max_code),T(e,e.bl_desc),t=18;3<=t&&0===e.bl_tree[2*f[t]+1];t--);return e.opt_len+=3*(t+1)+5+5+4,t}(e),i=e.opt_len+3+7>>>3,(s=e.static_len+3+7>>>3)<=i&&(i=s)):i=s=r+5,r+4<=i&&-1!==t?U(e,t,r,n):4===e.strategy||s===i?(S(e,2+(n?1:0),3),R(e,l,d)):(S(e,4+(n?1:0),3),function(e,t,r,n){var i;for(S(e,t-257,5),S(e,r-1,5),S(e,n-4,4),i=0;i>>8&255,e.pending_buf[e.d_buf+2*e.last_lit+1]=255&t,e.pending_buf[e.l_buf+e.last_lit]=255&r,e.last_lit++,0===t?e.dyn_ltree[2*r]++:(e.matches++,t--,e.dyn_ltree[2*(p[r]+256+1)]++,e.dyn_dtree[2*k(t)]++),e.last_lit===e.lit_bufsize-1},r._tr_align=function(e){var t;S(e,2,3),z(e,256,l),16===(t=e).bi_valid?(x(t,t.bi_buf),t.bi_buf=0,t.bi_valid=0):8<=t.bi_valid&&(t.pending_buf[t.pending++]=255&t.bi_buf,t.bi_buf>>=8,t.bi_valid-=8)}},{"../utils/common":41}],53:[function(e,t,r){"use strict";t.exports=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0}},{}],54:[function(e,t,r){"use strict";t.exports="function"==typeof setImmediate?setImmediate:function(){var e=[].slice.apply(arguments);e.splice(1,0,0),setTimeout.apply(null,e)}},{}]},{},[10])(10)})}).call(this,void 0!==r?r:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}]},{},[1])(1)})}).call(this,void 0!==r?r:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}]},{},[1])(1)})}).call(this,void 0!==r?r:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}]},{},[1])(1)})}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}]},{},[1])(1)}); +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{}]},{},[1])(1) +}); \ No newline at end of file diff --git a/ES6-10/ES2019/js/lesson2-1.js b/ES6-10/ES2019/js/lesson2-1.js new file mode 100644 index 0000000..413dda4 --- /dev/null +++ b/ES6-10/ES2019/js/lesson2-1.js @@ -0,0 +1,6 @@ +const arr = [{ 'a': 1 }, { 'b': 3 }, { 'c': 4 }] +for (let item of arr) { + console.log(item.a) + console.log(item.b) + console.log(item.c) +} diff --git a/ES6-10/ES2019/js/lesson2-10.js b/ES6-10/ES2019/js/lesson2-10.js new file mode 100644 index 0000000..1d55cff --- /dev/null +++ b/ES6-10/ES2019/js/lesson2-10.js @@ -0,0 +1,54 @@ +// console.log(Math.floor.apply(null, [3.111])) + +// console.log(Reflect.apply(Math.floor, null, [2.33])) + +// let price = 90.12 +// console.log(Reflect.apply(price > 100 ? Math.floor : Math.ceil, null, [price])) + +// let d = Reflect.construct(Date, []) +// console.log(d.getTime(), d instanceof Date) + +// const student = {} +// const r2 = Object.defineProperty(student, 'name', { value: 'Mike' }) +// // console.log(student) +// const r = Reflect.defineProperty(student, 'name', { value: 'Mike2' }) +// console.log(student, r, r2) + +// const obj = { x: 1, y: 2 } +// Reflect.deleteProperty(obj, 'x') +// console.log(obj) +// console.log(Reflect.get(obj, 'y')) +// console.log(Reflect.get([3, 4], 1)) + +const obj = { + x: 1, + y: 2 +} +// console.log(Reflect.getOwnPropertyDescriptor(obj, 'x')) +// console.log(Object.getOwnPropertyDescriptor(obj, 'y')) + +// let d = new Date() +// console.log(Reflect.getPrototypeOf(d)) +// console.log(Object.getPrototypeOf(obj)) + +// console.log(Reflect.has(obj, 'y')) +// Object.freeze(obj) +// obj.z = 3 + +// console.log(Reflect.isExtensible(obj), obj) +// console.log(Reflect.ownKeys(obj)) +// console.log(Reflect.ownKeys([1, 2, 3])) +// Symbol + +// Reflect.preventExtensions(obj) // 效果和 freeze 相同 +// console.log(Reflect.isExtensible(obj)) + +Reflect.set(obj, 'z', 1) +console.log(obj) +const arr = ['a', 'w', 's'] +Reflect.set(arr, 3, 'oioo') +console.log(arr) + +console.log(Reflect.getPrototypeOf(arr)) +Reflect.setPrototypeOf(arr, String.prototype) +console.log(Reflect.getPrototypeOf(arr)) \ No newline at end of file diff --git a/ES6-10/ES2019/js/lesson2-11.js b/ES6-10/ES2019/js/lesson2-11.js new file mode 100644 index 0000000..f903453 --- /dev/null +++ b/ES6-10/ES2019/js/lesson2-11.js @@ -0,0 +1,119 @@ +// let o = { +// name: 'xiaoming', +// price: 190 +// } +// let d = new Proxy(o, { +// get (target, key) { +// if (key === 'price') { +// return target[key] + 20 +// } else { +// return target[key] +// } +// } +// }) +// console.log(d.price, d.name) + +// let o = { +// name: 'xiaoming', +// price: 190 +// } +// let d = new Proxy(o, { +// get (target, key) { +// return target[key] +// }, +// set (target, key, value) { +// return false +// } +// }) +// d.price = 700 +// console.log('拦截赋值操作:', d.price, d.name) + +// ES5 中完全禁止修改元素属性 +// for (let [key] of Object.entries(o)) { +// Object.defineProperty(o, key, { +// writable: false +// }) +// } +// o.price = 300 +// console.log(o.name, o.price) + +// // 拦截 校验 +// let o = { +// name: 'xiaoming', +// price: 190 +// } +// // 监听错误 +// window.addEventListener('error', (e) => { +// console.log(e.message) +// // report('./') +// }, true) +// // 按功能模块化 +// let validator = (target, key, value) => { +// if (Reflect.has(target, key)) { +// if (key === 'price') { +// if (value > 300) { +// // 不满足条件触发错误 +// throw new TypeError('price exceed 300') +// } else { +// target[key] = value +// } +// } else { +// target[key] = value +// } +// } else { +// return false +// } +// } +// let d = new Proxy(o, { +// get (target, key) { +// return target[key] || '' +// }, +// set: validator +// }) +// d.price = 320 +// d.name = 'lisi' +// d.age = 123 +// console.log(d.price, d.name, d.age) + +// // 代理生成ID, 随机\唯一\只读 +// class Component { +// constructor () { +// this.proxy = new Proxy({ +// id: Math.random().toString(36).slice(-8) +// }, {}) +// } +// get id () { +// return this.proxy.id +// } +// } +// let com = new Component() +// let com2 = new Component() +// for (let i = 0; i < 10; i++) { +// console.log(com.id, com2.id) +// } +// com.id = 'abc' +// console.log(com.id, com2.id) + +// 可撤销代理 +let o = { + name: 'xiaoming', + price: 190 +} +let d = Proxy.revocable(o, { + get (target, key) { + if (key === 'price') { + return target[key] + 20 + } else { + return target[key] + } + } +}) +console.log(d) +console.log(d.proxy.price) +console.log(d.revoke) +setTimeout(function () { + d.revoke() + setTimeout(function () { + console.log(d.proxy.price) + }, 100) +}, 1000) diff --git a/ES6-10/ES2019/js/lesson2-12.js b/ES6-10/ES2019/js/lesson2-12.js new file mode 100644 index 0000000..0e3d3f5 --- /dev/null +++ b/ES6-10/ES2019/js/lesson2-12.js @@ -0,0 +1,165 @@ +// ES5 +// function loop () { +// for (let i = 0; i < 5; i++) { +// console.log(i) +// } +// } +// loop() + +// // ES6 +// function * loop () { +// for (let i = 0; i < 5; i++) { +// yield console.log(i) +// } +// } +// const l = loop() +// l.next() +// l.next() +// l.next() +// l.next() +// l.next() +// l.next() + +// 语法 yeild 本身没有返回值 +// function * gen () { +// let val +// val = yield 1 +// console.log(val) +// } +// const l = gen() +// l.next() +// l.next() + +// next() 的返回值 +// function * gen () { +// let val +// val = (yield [3, 2, 1]) + 9 +// console.log(val) +// } +// const l = gen() +// console.log(l.next(10)) +// console.log(l.return()) +// console.log(l.next(20)) + +// 使用 new Error() 终止循环 +// function * gen () { +// while (true) { +// try { +// yield 1 +// } catch (e) { +// console.log(e.message) +// } +// } +// } +// const g = gen() +// console.log(g.next()) +// console.log(g.next()) +// console.log(g.next()) +// console.log(g.next()) +// g.throw(new Error('ss')) +// console.log(g.next()) + +// // 练习-抽奖函数-ES5 +// function draw (first = 1, second = 3, third = 5) { +// let firstPrice = ['1A', '1B', '1C', '1D', '1E'] +// let secondPrice = ['3A', '2B', '2C', '2D', '2E', '2F', '2G', '2H', '2I', '2J', '2K'] +// let thirdPrice = ['3A', '3B', '3C', '3D', '3E', '3F', '3G', '3H', '3I', '3J', '3K', '3L', '3M', '3N'] +// let random +// let result = [] + +// // 抽一等奖 +// for (let i = 0; i < first; i++) { +// random = Math.floor(Math.random() * firstPrice.length) +// result = result.concat(firstPrice.splice(random, 1)) +// } +// // 抽二等奖 +// for (let i = 0; i < second; i++) { +// random = Math.floor(Math.random() * secondPrice.length) +// result = result.concat(secondPrice.splice(random, 1)) +// } +// // 抽三等奖 +// for (let i = 0; i < third; i++) { +// random = Math.floor(Math.random() * thirdPrice.length) +// result = result.concat(thirdPrice.splice(random, 1)) +// } +// return result +// } + +// let t = draw() +// for (let value of t) { +// console.log(value) +// } + +// // 练习-抽奖函数-ES6 +// function * draw (first = 1, second = 3, third = 5) { +// let firstPrice = ['1A', '1B', '1C', '1D', '1E'] +// let secondPrice = ['3A', '2B', '2C', '2D', '2E', '2F', '2G', '2H', '2I', '2J', '2K'] +// let thirdPrice = ['3A', '3B', '3C', '3D', '3E', '3F', '3G', '3H', '3I', '3J', '3K', '3L', '3M', '3N'] +// let count = 0 +// let random + +// while (true) { +// if (count < first) { +// random = Math.floor(Math.random() * firstPrice.length) +// yield firstPrice[random] +// count++ +// firstPrice.splice(random, 1) +// } else if (count < first + second) { +// random = Math.floor(Math.random() * secondPrice.length) +// yield secondPrice[random] +// count++ +// secondPrice.splice(random, 1) +// } else if (count < first + second + third) { +// random = Math.floor(Math.random() * thirdPrice.length) +// yield thirdPrice[random] +// count++ +// thirdPrice.splice(random, 1) +// } else { +// return false +// } +// } +// } +// const d = draw() +// console.log(d.next().value) +// console.log(d.next().value) +// console.log(d.next().value) +// console.log(d.next().value) +// console.log(d.next().value) +// console.log(d.next().value) +// console.log(d.next().value) +// console.log(d.next().value) +// console.log(d.next().value) +// console.log(d.next().value) + +// // 练习-数到三的人喝酒 +// function * count (x = 1) { +// while (true) { +// if (x % 3 === 0) { +// yield x +// } +// x++ +// } +// } +// let num = count() +// console.log(num.next().value) +// console.log(num.next().value) +// console.log(num.next().value) + +// 用 Generator 实现一个斐波那契数列 1,1,2,3,5,8,13... +function * draw () { + let n1 = 1 + let n2 = 1 + let n3 = 0 + while (true) { + yield n3 = n1 + n2 + n1 = n2 + n2 = n3 + } +} +let d = draw() +console.log(d.next().value) +console.log(d.next().value) +console.log(d.next().value) +console.log(d.next().value) +console.log(d.next().value) +console.log(d.next().value) diff --git a/ES6-10/ES2019/js/lesson2-13.js b/ES6-10/ES2019/js/lesson2-13.js new file mode 100644 index 0000000..0be2be8 --- /dev/null +++ b/ES6-10/ES2019/js/lesson2-13.js @@ -0,0 +1,64 @@ +let authors = { + allAuthors: { + fiction: ['Agla', 'Skks', 'Lp'], + scienceFiction: ['Neal', 'Arthru', 'Ribert'], + fantasy: ['J.R.Tole', 'J.M.R', 'Terry P.K'] + }, + Addres: [] +} + +// // ES5 +// let r = [] +// for (let [k, v] of Object.entries(authors.allAuthors)) { +// r = r.concat(v) +// } +// console.log(r) + +// authors is not iterable(迭代) +// ES6 +// authors[Symbol.iterator] = function () { +// let allAuthors = this.allAuthors +// let keys = Reflect.ownKeys(allAuthors) +// let values = [] +// return { +// next () { +// if (!values.length) { +// if (keys.length) { +// values = allAuthors[keys[0]] +// keys.shift() +// console.log(values, keys) +// } +// } +// return { +// done: !values.length, +// value: values.shift() +// } +// } +// } +// } + +// 使用 Generator 给自定义数据结构写个遍历器 +authors[Symbol.iterator] = function * () { + let allAuthors = this.allAuthors + let keys = Reflect.ownKeys(allAuthors) + let values = [] + while (true) { + if (!values.length) { + if (keys.length) { + values = allAuthors[keys[0]] + keys.shift() + yield values.shift() + } else { + return false + } + } else { + yield values.shift() + } + } +} + +let r = [] +for (let v of authors) { + r.push(v) +} +console.log(r) diff --git a/ES6-10/ES2019/js/lesson2-14-mod.js b/ES6-10/ES2019/js/lesson2-14-mod.js new file mode 100644 index 0000000..5a5bd6a --- /dev/null +++ b/ES6-10/ES2019/js/lesson2-14-mod.js @@ -0,0 +1,100 @@ +// export const name = 'hello' +// export let addr = 'beijing' +// export let arr = [1, 2, 3] + +// const name = 'hello3' +// let addr = 'Beijing' +// let arr = [1, 2, 3] + +// export default name +// export { +// addr, +// arr +// } + +// 导出函数 +export function say(content) { + console.log(content) +} + +export function run() { + console.log('I am running') +} + +// const say = (content) => { +// console.log(content) +// } +// const run = () => { +// console.log('I am running') +// } +// export default say +// export { +// run +// } + +// 导出对象 +// export default { +// code: 0, +// message: 'success' +// } + +// const data = { +// code: 1, +// message: 'success' +// } +// const des = { +// age: 20, +// addr: 'Beijing' +// } + +// export default { +// data, +// des +// } + +// 导出类 +// class Test { +// constructor () { +// this.id = 2 +// } +// } +// export default Test +// export { +// Test +// } + +// export default class Test { +// constructor () { +// this.id = 2 +// } +// } + +// export default class { +// constructor () { +// this.id = 5 +// } +// } + +// export class Test { +// constructor () { +// this.id = 2 +// } +// } + +// 导出多个类,批量导入 +// export class Test { +// constructor () { +// this.id = 6 +// } +// } +// export class Animal { +// constructor () { +// this.name = 'dog' +// } +// } + +// export default class Peiple { +// constructor () { +// this.id = 123 +// } +// } \ No newline at end of file diff --git a/ES6-10/ES2019/js/lesson2-14.js b/ES6-10/ES2019/js/lesson2-14.js new file mode 100644 index 0000000..7c031c4 --- /dev/null +++ b/ES6-10/ES2019/js/lesson2-14.js @@ -0,0 +1,30 @@ +// import name, { addr as addr2, arr } from './lesson2-14-mod' +// console.log(name, addr2, arr) + +// import name2 from './lesson2-14-mod' +// console.log(name2) + +// 导入函数 +import { say, run } from './lesson2-14-mod' +say('hello world') +run() + +// 导入对象 +// import obj from './lesson2-14-mod' +// let { data, des } = obj +// console.log(data, des) + +// 导入类 +// // import { Test } from './lesson2-14-mod' +// import Test from './lesson2-14-mod' +// let test = new Test() +// console.log(test.id) + +// 批量导入 +// import * as Mod from './lesson2-14-mod' +// let test = new Mod.Test() +// console.log(test.id) +// let animal = new Mod.Animal() +// console.log(animal.name) +// let people = new Mod.default() +// console.log(people.id) diff --git a/ES6-10/ES2019/js/lesson2-2.js b/ES6-10/ES2019/js/lesson2-2.js new file mode 100644 index 0000000..07e9c4a --- /dev/null +++ b/ES6-10/ES2019/js/lesson2-2.js @@ -0,0 +1,24 @@ +for (var i = 0; i < 3; i++) { + setTimeout(function () { + // console.log(i) + }, 1000) +} + +// console.log(a) +// let a = 9 +// console.log(a) +// let array = Array.from({ length: 5}, function () { return 1}) +// console.log(array) +// let array = Array.of(1, 4, 5, 2, 67) +// console.log(array) +// let array = Array(10).fill(1) +// console.log(array.fill(9, 5, 8)) + +let array = Array.of(1, 4, 5, 2, 67) +// let find = array.filter(function (item) { +// return item % 2 === 0 +// }) +let find = array.findIndex(function (item) { + return item === 0 +}) +console.log(find); \ No newline at end of file diff --git a/ES6-10/ES2019/js/lesson2-3.js b/ES6-10/ES2019/js/lesson2-3.js new file mode 100644 index 0000000..9928f0e --- /dev/null +++ b/ES6-10/ES2019/js/lesson2-3.js @@ -0,0 +1,145 @@ +// let Animal = function (type) { +// this.type = type +// } + +// Animal.prototype.eat = function () { +// console.log('you are eatting food hello'); +// } +// let dog = new Animal('food') +// let cat = new Animal('fish') + +// console.log(dog) +// console.log(cat) + +// // 修改实例对象原型链上的方法 +// cat.constructor.prototype.eat = function () { +// console.log('error') +// } +// dog.eat() +// cat.eat() + +// class Animal { +// constructor(type) { +// this.type = type +// } +// eat() { +// console.log('i am food') +// } +// } + +// let dog = new Animal('food') +// let cat = new Animal('fish') + +// console.log(dog) +// console.log(cat) + +// // 修改实例对象原型链上的方法 +// cat.constructor.prototype.eat = function () { +// console.log('error') +// } +// dog.eat() +// cat.eat() + +// console.log(typeof Animal) + +// let _age = 4 +// class Animal { +// constructor(type) { +// this.type = type +// } +// get age() { +// return _age +// } +// set age(val) { +// if (val < 7 && val > 4) { +// _age = val +// } else { +// console.log("err") +// } +// } +// eat() { +// console.log('i am food') +// } +// } +// let dog = new Animal +// dog.age = 52 +// console.log(dog.age) + +// ES5 +// let Animal2 = function (type) { +// this.type = type +// } +// Animal2.prototype.eat = function () { +// Animal2.walk() +// console.log('you are eatting food hello'); +// } +// Animal2.walk = function () { +// console.log('i am walking'); +// } +// let dog = new Animal2('dog') +// dog.eat() + +// ES6 专有语法定义静态方法 +// class Animal { +// constructor(type) { +// this.type = type +// } +// eat() { +// Animal.walk() +// console.log('i am food') +// } +// static walk() { +// console.log('i am flying'); +// } +// } +// let dog = new Animal('dog') +// dog.eat() + +// 继承类 +// ES5 +// let Animal = function (type) { +// this.type = type +// } +// Animal.prototype.eat = function () { +// Animal.walk() +// console.log('you are eatting food hello'); +// } +// Animal.walk = function () { +// console.log('i am walking'); +// } + +// let Dog = function (type) { +// // 初始化父类的构造函数 +// Animal.call(this, type) +// this.run = function () { +// console.log('runnig'); +// } +// } +// Dog.prototype = Animal.prototype + +// let dog = new Dog('dog') +// dog.run() +// dog.eat() +// console.log(dog.type); + +// ES6 +class Animal { + constructor(type) { + this.type = type + } + eat() { + Animal.walk() + console.log('i am food') + } + static walk() { + console.log('i am flying'); + } +} +class Dog extends Animal { + constructor(type) { + super(type) + this.age = 2 + } +} +let dog = new Dog('dog') +dog.eat() \ No newline at end of file diff --git a/ES6-10/ES2019/js/lesson2-4.js b/ES6-10/ES2019/js/lesson2-4.js new file mode 100644 index 0000000..88c0392 --- /dev/null +++ b/ES6-10/ES2019/js/lesson2-4.js @@ -0,0 +1,89 @@ +// function fn(x, y, z) { +// if (y === undefined) { +// y = 3 +// } +// if (z === undefined) { +// z = 4 +// } +// return x + y + z +// } +// console.log(fn(2, 10, 30)) + +// 没有参数的往前写,否则默认没参数的为字符串类型 +// function fn(x, y, z = x + y) { +// // ES6中废弃arguments +// // console.log(Array.from(arguments)) +// // fn.length 可以获取到定义过的没有默认值的参数个数 +// console.log(fn.length) + +// return x + y + z +// } +// console.log(fn(10, 10, 10)) +// console.log(fn(10, 10, undefined), 4, 12) + +// 怎么处理不确定参数? +// ES5 +// function sum() { +// let num = 0 +// Array.prototype.forEach.call(arguments, function (item) { +// num += item * 1 +// }) +// return num +// } +// console.log(sum(1, 2, 3, 4)) + +// ES6 +// function sum(base, ...nums) { +// // "...nums" Rest parameter 用来获取所有参数:函数执行时的参数,是数组,参数可以分别使用 +// let num = 0 +// nums.forEach(function (item) { +// num += item * 1 +// }) +// return num + base * 2 +// } +// console.log(sum(1, 2, 3, 4)) + +// rest参数的逆运算 +// ES5 +// function sum (x = 1, y = 2, z = 3) { +// return x + y + z +// } +// let data = [1, 2, 3] +// console.log(sum.apply(this, data)) +// ES6 +// spread +// console.log(sum(...data)) + +// let hello = (name, city) => { +// console.log(name, 'hello', city) +// } +// hello('zhangsan', 'imooc') +// // 只有一个参数省略括号 +// let hi = name => { +// console.log(name) +// } +// hi('zhangsan') +// // 后面是表达式,省略花括号 +// let sum = (x, y, z) => x + y + z +// console.log(sum(1, 2, 3)) +// // 以对象返回数据,小括号相当于表达式,花括号是对象的 +// let sum2 = (x, y, z) => ({ +// x: x, +// y: y, +// z: z +// }) +// console.log(sum2(1, 2, 3)) +// // webpack eval 让 this 指向了空对象 +// // ES6 中this 指向写函数时的对象 +// let test = { +// name: 'test', +// say: () => { +// console.log(this.name) +// } +// } +// test.say() + +let arr = Array.of(1, 2, 3, 4) +arr.forEach((item) => { + console.log(item) +}) diff --git a/ES6-10/ES2019/js/lesson2-5.js b/ES6-10/ES2019/js/lesson2-5.js new file mode 100644 index 0000000..c0e63d7 --- /dev/null +++ b/ES6-10/ES2019/js/lesson2-5.js @@ -0,0 +1,90 @@ +// let x = 1 +// let y = 2 +// let z = 8 +// let obj = { +// x: x, +// y: y, +// hello: function () { +// console.log('hello ES5') +// } +// } +// obj[z] = 3 +// obj.hello() +// console.log(obj) + +// let obj2 = { +// x, +// y, +// [z + y]: 6, +// hello () { +// 只能用常规函数 +// 异步函数名称前加 * +// console.log('hello ES6') +// } +// } +// obj2.hello() +// console.log(obj2) + +// let s = new Set([1, '2', 4]) +// s.add('hellos').add('hellos').add('hellos2') +// s.delete('hellos') +// s.clear() +// console.log(s.has('hellos2'), s.size) +// console.log(s.values()) +// console.log(s.keys()) +// console.log(s.entries()) +// s.forEach(item => { +// console.log(item) +// }) +// for (let item of s) { +// console.log(item) +// } + +// map +// let map = new Map([[1, 2], [2, 3]]) +// // 添加 +// map.set(3, 4) +// // 修改 +// map.set(1, 5) +// // 删除 +// map.delete(3) +// // console.log(map.size) +// // console.log(map.has(3)) +// // console.log(map.get(2)) +// // console.log(map.keys(), map.values(), map.entries()) +// // map.forEach((value, key) => { +// // console.log(value, key) +// // }) +// for (let [key, value] of map) { +// console.log(key, value) +// } +// let o = function () { +// console.log('o') +// } +// map.set(o, 9) +// console.log(map.get(o)) + +// object copy +const target = { + a: { + b: { + c: { + d: 4 + } + }, + e: 7 + }, + undefined: null +} +const source = { + a: { + b: { + c: { + null: null + } + } + }, + f: 2 +} +Object.assign(target, source) +console.log(target, 'source') diff --git a/ES6-10/ES2019/js/lesson2-6.js b/ES6-10/ES2019/js/lesson2-6.js new file mode 100644 index 0000000..3963a78 --- /dev/null +++ b/ES6-10/ES2019/js/lesson2-6.js @@ -0,0 +1,25 @@ +// const s = 'a_aa_aaa_aa_a' +// const r1 = /a+/g +// const r2 = /a+/y +// console.log(r1.exec(s)) +// console.log(r2.exec(s)) +// console.log(r1.exec(s)) +// console.log(r2.exec(s)) + +// unicode u修饰符 大于 \uffff +let s = '𠮷' +let s2 = '\uD842\uDF87' + +console.log(/^\uD842/.test(s2)) +console.log(/^\uD842/u.test(s2)) // 无法匹配 + +console.log(/^.$/.test(s)) // 无法匹配 +console.log(/^.$/u.test(s)) // 正确匹配, 使用 "." 大于两个字节要加 u + +console.log(/^\u{20BB7}$/u.test(s)) +console.log(/^\u{61}$/u.test('a')) // 使用码点时,加 u 才能匹配 \u + +console.log(/𠮷{2}/u.test('𠮷𠮷')) // 加 u 才能匹配,所有中文都加 u + +console.log(/[a-z]/i.test('\u212A')) +console.log(/[a-z]/iu.test('\u212A')) diff --git a/ES6-10/ES2019/js/lesson2-7.js b/ES6-10/ES2019/js/lesson2-7.js new file mode 100644 index 0000000..4536bb2 --- /dev/null +++ b/ES6-10/ES2019/js/lesson2-7.js @@ -0,0 +1,37 @@ +// const a = 20 +// const b = 10 +// const c = 'javascript' + +// // const str = 'my age is ' + (a + b) + ' i love' + c +// const str = `my age is ${a + b} i love ${c}` +// console.log(str) + +// const retailPrice = 20 +// const wholeSalePrice = 16 +// const type = 'retail' +// let showTxt = '' +// if (type === 'retail') { +// showTxt = '单价是:' + retailPrice +// } else { +// showTxt = '批发价是:' + wholeSalePrice +// } +// console.log(showTxt) + +function Price (strings, type) { + let s1 = strings[0] + const retailPrice = 20 + const wholeSalePrice = 16 + let showTxt = '' + if (type === 'retail') { + showTxt = '单价是:' + retailPrice + } else { + showTxt = '批发价是:' + wholeSalePrice + } + return `${s1}${showTxt}` +} +let showTxt = Price`您此次的${'retail'}` +console.log(showTxt) + +let s1 = `我是第一行 +我是第二行` +console.log(s1) diff --git a/ES6-10/ES2019/js/lesson2-8.js b/ES6-10/ES2019/js/lesson2-8.js new file mode 100644 index 0000000..4af25d4 --- /dev/null +++ b/ES6-10/ES2019/js/lesson2-8.js @@ -0,0 +1,51 @@ +// let arr = ['hello', 'world', 'three'] +// let [firstName, , surName] = arr +// console.log(firstName, surName) + +// let [firstName,, thirdName] = new Set([1, 2, 3, 4]) +// console.log(firstName, thirdName) + +// // 修改内容 +// let user = { +// name: 's', +// surname: 't' +// }; +// [user.name, user.surname] = [1, 2] +// console.log(user) +// for (let [k, v] of Object.entries(user)) { +// // 隐式赋值,显式索引 +// console.log(k, v) +// } + +// // 防止回收 +// let arr = [1, 2, 3, 3, 4, 5, 6, 7] +// let [firstName, curName, ...last] = arr +// console.log(firstName, curName, last) + +// // 无数据就是 未定义 +// let arr = [] +// // 解构赋值取决于里面有没有值 +// let [firstName, curName, ...last] = arr +// console.log(firstName, curName, last) + +// Object 的解构赋值 +let options = { + title: 'menu', + width: 100, + height: 200 +} +let { title: title2, width = 130, height } = options +let { title, ...last } = options +console.log(title, last) + +// 多层结构的解构赋值 +// let options = { +// size: { +// width: 100, +// height: 200 +// }, +// items: ['Cake', 'Donut'], +// extra: true +// } +// let { size: { width, height }, items: [, item2], extra } = options +// console.log(width, height, item2, extra) diff --git a/ES6-10/ES2019/js/lesson2-9.js b/ES6-10/ES2019/js/lesson2-9.js new file mode 100644 index 0000000..d0a2f06 --- /dev/null +++ b/ES6-10/ES2019/js/lesson2-9.js @@ -0,0 +1,119 @@ +// function loadScript (src, callback) { +// let script = document.createElement('script') +// script.src = src +// script.onload = () => { +// callback(src) +// } +// document.head.append(script) +// } + +// function test (name) { +// console.log(name) +// } +// loadScript('./1.js', function (script) { +// loadScript('./2.js', function (script) { +// loadScript('./3.js', function (script) { +// test('log') +// }) +// }) +// }) + +// function loadScript (src) { +// // penging, undefined +// return new Promise((resolve, reject) => { +// let script = document.createElement('script') +// script.src = src +// script.onload = () => resolve(src) // 状态:fullfilled, 结果: result +// script.onerror = (err) => reject(err) // 状态:rejected,结果: error +// document.head.appendChild(script) +// }) +// } + +// loadScript('./1.js') +// .then(() => { +// return loadScript('./4.js') +// }, (err) => { +// console.log(err) +// }) +// .then(() => { +// return loadScript('./3.js') +// }, (err) => { +// console.log(err) +// }) + +// // promise,then(onFullfilled,onRejected) // onFullfilled 必选 + +// function test (bool) { +// if (bool) { +// return new Promise(resolve => { +// resolve(20) +// }) +// } else { +// return Promise.reject(new Error('myError')) +// } +// } +// test(0).then((value) => { +// console.log(value) +// }, (err) => { +// console.log(err) +// }) + +// function loadScript (src) { +// // penging, undefined +// return new Promise((resolve, reject) => { +// let script = document.createElement('script') +// script.src = src +// script.onload = () => resolve(src) // 状态:fullfilled, 结果: result +// script.onerror = (err) => reject(err) // 状态:rejected,结果: error +// document.head.appendChild(script) +// }) +// } + +// loadScript('./1.js') +// .then(() => { +// return loadScript('./2.js') +// }) +// .then(() => { +// return loadScript('./30.js') +// }) +// .catch(err => { +// console.log(err) +// }) + +// All 操作 +// function loadScript (src) { +// // penging, undefined +// return new Promise((resolve, reject) => { +// let script = document.createElement('script') +// script.src = src +// script.onload = () => resolve(src) // 状态:fullfilled, 结果: result +// script.onerror = (err) => reject(err) // 状态:rejected,结果: error +// document.head.appendChild(script) +// }) +// } + +// const p1 = loadScript('./2.js') +// const p2 = loadScript('./1.js') +// const p3 = loadScript('./3.js') +// Promise.all([p2, p1, p3]).then((value) => { +// console.log(value, 'log') +// }) + +// race +const p1 = () => { + return new Promise((resolve, reject) => { + setTimeout(function () { + resolve(1) + }, 3000) + }) +} +const p2 = () => { + return new Promise((resolve, reject) => { + setTimeout(function () { + resolve(2) + }, 2000) + }) +} +Promise.race([p1(), p2()]).then((value) => { + console.log(value) +}) diff --git a/ES6-10/ES2019/js/lesson3-1.js b/ES6-10/ES2019/js/lesson3-1.js new file mode 100644 index 0000000..318d8a2 --- /dev/null +++ b/ES6-10/ES2019/js/lesson3-1.js @@ -0,0 +1,5 @@ +// const arr = [1, 2, 3] +// console.log(arr.includes(4)) + +console.log(Math.pow(2, 5)) +console.log(2 ** 5) diff --git a/ES6-10/ES2019/js/lesson4-1.js b/ES6-10/ES2019/js/lesson4-1.js new file mode 100644 index 0000000..e29871c --- /dev/null +++ b/ES6-10/ES2019/js/lesson4-1.js @@ -0,0 +1,27 @@ +// async function firstAsync () { +// return 27 +// // return Promise.resolve(28) +// } + +// firstAsync().then(val => { +// console.log(val) +// }) + +// console.log(firstAsync() instanceof Promise) + +// await 异步操作 +async function firstAsync () { + let promise = new Promise((resolve, reject) => { + setTimeout(function () { + resolve('now it is done') + }, 1000) + }) + console.log(await promise) + console.log(await Promise.resolve(48)) + console.log(2) + return Promise.resolve(28) +} + +firstAsync().then(val => { + console.log(val) +}) diff --git a/ES6-10/ES2019/js/lesson4-2.js b/ES6-10/ES2019/js/lesson4-2.js new file mode 100644 index 0000000..0693f0f --- /dev/null +++ b/ES6-10/ES2019/js/lesson4-2.js @@ -0,0 +1,45 @@ +let grade = { + 'lilei': 95, + 'hanmei': 97, + 'lisi': 99 +} + +// Iterator方式遍历 +// grade[Symbol.iterator] = function () { +// let All = this +// let keys = Reflect.ownKeys(grade) +// let values = [] +// console.log(All, keys, values.length, '内部数据') +// return { +// next () { +// if (!values.length) { +// if (keys.length - 1) { +// values.push(All[keys[0]]) +// keys.shift() +// // console.log(values, values.length, All[keys[0]], keys, '内部') +// } +// } +// return { +// done: !values.length, +// value: values.shift() +// } +// } +// } +// } +// let result = [] +// for (let v of grade) { +// result.push(v) +// } +// console.log(result) + +// ES6方式遍历 +// let r = [] +// for (let [, v] of Object.entries(grade)) { +// r.push(v) +// } +// console.log(r) + +// ES8方式 +console.log(Object.keys(grade)) +console.log(Object.values(grade)) +console.log(Object.entries(grade)) diff --git a/ES6-10/ES2019/js/lesson4-3.js b/ES6-10/ES2019/js/lesson4-3.js new file mode 100644 index 0000000..2958cc8 --- /dev/null +++ b/ES6-10/ES2019/js/lesson4-3.js @@ -0,0 +1,12 @@ +// for (let i = 1; i < 32; i++) { +// if (i < 10) { +// console.log(`0${i}`) +// } else { +// console.log(i) +// } +// } + +for (let i = 1; i < 32011; i += 100) { + // console.log(i.toString().padStart(5, '*#')) + console.log(i.toString().padEnd(5, '*#')) +} diff --git a/ES6-10/ES2019/js/lesson4-4.js b/ES6-10/ES2019/js/lesson4-4.js new file mode 100644 index 0000000..d12767b --- /dev/null +++ b/ES6-10/ES2019/js/lesson4-4.js @@ -0,0 +1,17 @@ +const data = { + PortLand: '78/50', + Dublin: '88/53', + Lima: '32/54' +} + +Object.defineProperty(data, 'Lima', { + // 描述符 + enumerable: false, + writable: false +}) + +data.Lima = '23/23' +console.log(Object.keys(data)) +// 查询属性描述符 +console.log(Object.getOwnPropertyDescriptors(data)) +console.log(Object.getOwnPropertyDescriptor(data, 'Lima')) diff --git a/ES6-10/ES2019/js/lesson5-1.js b/ES6-10/ES2019/js/lesson5-1.js new file mode 100644 index 0000000..b34a9cf --- /dev/null +++ b/ES6-10/ES2019/js/lesson5-1.js @@ -0,0 +1,66 @@ +// 异步函数生成 +// function Gen (time) { +// return new Promise((resolve, reject) => { +// setTimeout(function () { +// resolve(time) +// }, time) +// }) +// } + +// ES8 +// async function test () { +// let arr = [Gen(2000), Gen(100), Gen(3000)] +// for (let item of arr) { +// console.log(Date.now(), await item.then(console.log)) +// } +// } +// test() + +// ES9 +// async function test () { +// let arr = [Gen(2000), Gen(100), Gen(3000)] +// for await (let item of arr) { +// console.log(Date.now(), item) +// } +// } +// test() + +// 对异步自定义数据结构遍历 +const obj = { + count: 0, + // 生成器 + Gen (time) { + return new Promise((resolve, reject) => { + setTimeout(function () { + resolve({ + done: false, + value: time + }) + }, time) + }) + }, + // 声明遍历方式,迭代器 + [Symbol.asyncIterator] () { + let self = this + return { + next () { + self.count++ + if (self.count < 4) { + return self.Gen(Math.random() * 1000) + } else { + return Promise.resolve({ + done: true, + value: '' + }) + } + } + } + } +} + +async function test () { + for await (let item of obj) { + console.log(Date.now(), item) + } +} +test() diff --git a/ES6-10/ES2019/js/lesson5-2.js b/ES6-10/ES2019/js/lesson5-2.js new file mode 100644 index 0000000..926cac8 --- /dev/null +++ b/ES6-10/ES2019/js/lesson5-2.js @@ -0,0 +1,19 @@ +// Promise 生成器 +function Gen (time) { + return new Promise((resolve, reject) => { + setTimeout(function () { + if (time < 500) { + reject(time) + } else { + resolve(time) + } + }, time) + }) +} +// 异步调用函数 无论成功还是失败都会执行 finally 的内容 +Gen(Math.random() * 1000) + .then(val => console.log('resolve', val)) + .catch(err => console.log('reject', err)) + .finally(() => { + console.log('finish') + }) diff --git a/ES6-10/ES2019/js/lesson5-3.js b/ES6-10/ES2019/js/lesson5-3.js new file mode 100644 index 0000000..ed54750 --- /dev/null +++ b/ES6-10/ES2019/js/lesson5-3.js @@ -0,0 +1,31 @@ +// // spread +// const input = { +// a: 1, +// b: 2 +// } + +// const test = { +// d: 5 +// } + +// const output = { +// // spread 扩展, 是深拷贝, 不是引用 +// ...input, +// ...test, +// c: 3 +// } + +// console.log(input, output) +// input.a = 4 +// console.log(input, output) + +// rest +const input = { + a: 1, + b: 2, + c: 3, + d: 4 +} + +const { a, b, ...rest } = input +console.log(a, b, rest) diff --git a/ES6-10/ES2019/js/lesson5-4.js b/ES6-10/ES2019/js/lesson5-4.js new file mode 100644 index 0000000..8296a9d --- /dev/null +++ b/ES6-10/ES2019/js/lesson5-4.js @@ -0,0 +1,39 @@ +// 正则后面加 s 增强点的匹配能力 \ +// 四字节字符则加 u, ES6中已经讲过 +// console.log(/foo.bar/s.test('foo\nbar')) +// console.log(/foo.bar/.test('foo\nbar')) + +// // 是否启用 dotAll 模式 +// const re = /foo.bar/sgiu +// console.log(re.dotAll) +// // 查看修饰符 +// console.log(re.flags) + +// 命名分组捕获 +// // console.log('12-2019-06-07'.match(/(\d{4})-(\d{2})-(\d{2})/)) + +// const t = '12-2019-06-07'.match(/(?\d{4})-(?\d{2})-(?\d{2})/) +// // console.log(t[1]) +// // console.log(t[2]) +// // console.log(t[3]) +// console.log(t) +// console.log(t.groups.year, t.groups.mouth, t.groups.day) + +// 先行断言 +let test = 'hello world' +console.log(test.match(/hello(?=\sworld)/)) +// 后行断言 +console.log(test.match(/(?<=hello\s)world/)) + +// 1. 请把 `'$foo %foo foo'`字符串中前面是$符号的foo 替换成bar +const re = /(?<=\$)foo/ +let str = '$foo %foo foo' +// console.log(re.test(str)) +str = str.replace(re, 'bar') +console.log(str) + +// 2. 请提取 `'$1 is worth about ¥123'` +const re2 = /(?<=\$)\d/ +let str2 = '$1 is worth about ¥123' +str2 = str2.match(re2) +console.log(str2) diff --git a/ES6-10/ES2019/js/lesson6-1.js b/ES6-10/ES2019/js/lesson6-1.js new file mode 100644 index 0000000..352048b --- /dev/null +++ b/ES6-10/ES2019/js/lesson6-1.js @@ -0,0 +1,102 @@ +// 0xD800-0xDFFF 字符无法编码成UTF-8, 而显示错误, 现在以非编码形式转义存在 +// console.log((JSON.stringify('\u{D800}'))) + +// let arr = [1, [2, 3], [4, 5, [6, 7, [8, 9]]]] + +// flat扁平化, 按照指定深度递归遍历数组, 合并成一个新数组 +// console.log(arr.flat(3)) + +// // map 对每个元素进行遍历 arr.map(item => item * 2) +// arr.flatMap() +// let arr = [[1], [2], [3]] +// console.log(arr.map(item => item * 2).flat()) +// console.log(arr.flatMap(item => item * 2)) + +// // string 字符串 +// let str = ' foo ' +// // console.log(str.replace(/^\s+|\s+$/g, '_')) +// console.log(str.trimStart()) +// console.log(str.trimLeft()) +// console.log(str.trimRight()) +// console.log(str.trimEnd()) +// console.log(str.trim()) + +// // matchAll 匹配 +// let str = `"foo" and "bar" and "baz"` + +// // ES5 +// function select (reg, str) { +// const matches = [] +// while (true) { +// const match = reg.exec(str) +// if (match === null) { +// break +// } +// matches.push(match[1]) +// } +// return matches +// } + +// console.log(select(/"([^"]*)"/g, str)) +// console.log(str.match(/"([^"]*)"/g)) + +// // ES5 +// function select2 (reg, str) { +// const matches = [] +// // replace 传入函数 +// str.replace(reg, function (all, first) { +// matches.push(first) +// }) +// return matches +// } + +// console.log(select2(/"([^"]*)"/g, str)) + +// // ES10 +// function select3 (reg, str) { +// const matches = [] +// for (const match of str.matchAll(reg)) { +// // console.log(match) +// matches.push(match[1]) +// } +// return matches +// } +// console.log(select3(/"([^"]*)"/g, str)) + +// Object Array 转换 +const arr = [['foo', 1], ['bar', 2]] +console.log(arr[1][1]) + +const obj = Object.fromEntries(arr) +console.log(obj.bar) + +// 案例2 +const obj2 = { + a: 1, + b: 2, + g: 3 +} +// 对象使用数组方法: Object.entries转换成数组, 解构赋值并过滤, Object.fromEntries转换回对象 +let res = Object.fromEntries( + Object.entries(obj).filter(([key, val]) => key.length === 3) +) +console.log(res) + +// ES5 +try { + +} catch (e) { + +} + +// ES10 +try { + +} catch { + +} + +// BigInt 处理超过 2^53 的数字 +// const a=11n +// console.log(typeof a) +// "bigint" diff --git a/ES6-10/ES2019/js/test0620.js b/ES6-10/ES2019/js/test0620.js new file mode 100644 index 0000000..658cc1e --- /dev/null +++ b/ES6-10/ES2019/js/test0620.js @@ -0,0 +1,482 @@ +// for (const key in { +// a: 1, +// b: 2 +// }) { +// console.log(key); +// } +// // a, b + +// for (const value of [1, 2, 3, 4, 5]) { +// console.log(value); +// } +// // 1, 2, 3, 4, 5 + +// console.log( +// parseInt(), +// parseInt(''), +// parseInt('-123adsf'), +// parseInt('-a123'), +// parseInt('a123')); +// let num1 = parseInt("1234blue"); // 1234 +// let num2 = parseInt(""); // NaN +// let num3 = parseInt("0xA"); // 10,解释为十六进制整数 +// let num4 = parseInt(22.5); // 22 +// let num5 = parseInt("70"); // 70,解释为十进制值 +// let num6 = parseInt("0xf"); // 15,解释为十六进制整数 +// let num7 = parseInt("11", 8); // +// let num8 = parseFloat("11.11e11.11"); // ,解释为十进制整数 +// console.log(num8); +// console.log("He said, \"hey.\""); +// let text = "This is the letter sigma: \u03a3.\r\b\t\u03a5\n\x41\u03a5\f" +// console.log(text); +// console.log(typeof num7.toString()); +// console.log(String(num2)); +// console.log(`${num1}???${num2}|||${num7}`); +// let a = ''; +// let foo = { +// toString: () => 'toString', +// add: (a, b) => { +// return a + b +// }, +// append: () => a = a + `asc;` +// }; +// console.log(`${foo}|||${foo.add(1,2)}|||${foo.append()}|||${foo.append()}|||${foo.append()}`); + +// let a = 6; +// let b = 9; + +// function zipTag(strings, ...expressions) { +// let c = expressions.map((e, i) => { +// return `${e}${strings[i + 1]}`; +// }); +// //"" a + b = 15 "" +// return strings[0] + c.join(''); +// } + +// let untaggedResult = `${ a } + ${ b } = ${ a + b }`; +// let taggedResult = zipTag `${ a } + ${ b } = ${ a + b }`; + +// console.log(untaggedResult); // "6 + 9 = 15" +// console.log(taggedResult); // "6 + 9 = 15" + +// let arr = [1, 2, 3, 4]; +// arr.map((e, i) => { +// console.log(++e, i); +// }) + +// // Unicode 示例 +// // \u00A9 是版权符号 +// console.log(`\u00A9`); // © +// console.log(String.raw `\u00A9`); // \u00A9 +// // 换行符示例 +// console.log(`first line\nsecond line`); +// // first line +// // second line +// console.log(String.raw `first line\nsecond line`); // "first line\nsecond line" +// // 对实际的换行符来说是不行的 +// // 它们不会被转换成转义序列的形式 +// console.log(`first line +// second line`); +// // first line +// // second line +// console.log(String.raw `first line +// second line`); +// // first line +// // second line + +// // 另外,也可以通过标签函数的第一个参数,即字符串数组的.raw 属性取得每个字符串的原始内容: +// function printRaw(strings) { +// console.log('Actual characters:'); +// for (const string of strings) { +// console.log(string); +// } +// console.log('Escaped characters;'); +// for (const rawString of strings.raw) { +// console.log(rawString); +// } +// } +// printRaw `\u00A9${ 'and' }\n`; +// // Actual characters: +// // © +// //(换行符) +// // Escaped characters: +// // \u00A9 +// // \n + +// let s1 = Symbol('foo'), +// s2 = Symbol('bar'), +// s3 = Symbol('baz'), +// s4 = Symbol('qux'); +// let o = { +// [s1]: 'foo val' +// }; +// // 这样也可以: o[s1] = 'foo val'; +// console.log(o); +// // {Symbol(foo): foo val} +// Object.defineProperty(o, s2, { +// value: 'bar val' +// }); +// console.log(o); +// // {Symbol(foo): foo val, Symbol(bar): bar val} +// Object.defineProperties(o, { +// [s3]: { +// value: 'baz val' +// }, +// [s4]: { +// value: 'qux val' +// } +// }); +// console.log(o); +// // {Symbol(foo): foo val, Symbol(bar): bar val, +// // Symbol(baz): baz val, Symbol(qux): qux val} + +// // 创建对象: +// var person = { +// firstName: "Bill", +// lastName: "Gates", +// id: 12345, +// fullName() { +// return this.firstName + " " + this.lastName; +// } +// } + +// // 显示对象中的数据: +// console.log(person.fullName()); + +// console.log((0 > -1 ? 2 : 9)); + +// const obj = { +// formhash: 999, +// signday: 222, +// reply: "感謝大大分享", +// replyPage: "555-1-1", +// func() { +// console.log('function') +// } +// }; +// obj.formhash = '24134'; +// Object.defineProperty(obj, 'age', { +// value: '199', +// writable: true, +// enumerable: false, +// configurable: true +// }); +// console.log(obj); +// GM_setValue('obj', obj); +// console.log(GM_getValue('obj')); + + +// let array = [1, 2, 3, 4]; +// console.log(a.forEach((value, index, arr) => console.log(value, index, arr))); //多出 undefined +// for (const key in a) { +// const element = a[key]; +// console.log(key, element); +// } + +// a.forEach(myFunction); + +// function myFunction(value, index) { +// console.log(value, index); +// } +// [1, 2, 3, 4, 5].forEach(function (i) { +// if (i === 2) { +// return; +// } else { +// console.log(i) +// } +// }) +// array.forEach(callback(currentVal, index, array) { +// // do something +// console.log('1'); +// }, thisArg) +// let new_array = arr.map(function (v, i, arr) { +// // Return element for new_array +// } [, thisArg]) + +// let obj = { +// x: 1, +// y: 1, +// hello: 1, +// a: 0, +// b: 0, +// } +// let obj4 = { +// x: 1, +// hello: 1, +// y: 1, +// b: 0, +// a: 0, +// } +// let obj2 = { +// x: 2, +// hello: 3, +// y: 2, +// hello2: 3, +// y4: 2, +// } +// let obj3 = { +// x: 2, +// y: 2, +// } +// console.log(compaObjKey(obj, obj4)); + +// function compaObjKey(a, b) { +// let count = 0; +// Object.keys(a).forEach(ea => { +// Object.keys(b).forEach(eb => { +// if (ea === eb) { +// count++; +// } +// }) +// }); +// if (count == Object.keys(a).length) { +// return true; +// } else { +// return false; +// } +// } + +// function copyObj(target, source) { +// Object.keys(source).forEach((key) => { +// target[key] = source[key]; +// }); +// } +// copyObj(obj, obj2) +// console.log(obj, compaObjKey(obj, obj2)); + +// let a = Object.keys(obj); +// const b = Object.keys(obj2); +// if (JSON.stringify(a) != JSON.stringify(b)) { +// for (let i = 0; i < b.length; i++) { +// if (a[i] == b[i]) { +// obj[b[i]] = obj2[b[i]]; +// console.log(obj); +// } else if (JSON.stringify(a).match(b[i])) { +// obj[b[i]] = obj2[b[i]]; +// } +// } +// } + + + + + +// import JSZip from './jszip'; + +// const getFile = url => { +// return new Promise((resolve, reject) => { +// axios.get(url, { +// responseType: "arraybuffer" +// }).then(res => { +// resolve(res.data); +// }). +// catch(err => { +// reject(err.toString()); +// }); +// }); +// }; + +// FileSaver.saveAs(blob, "hello world.txt"); + + +// GM_xmlhttpRequest({ +// method: "GET", +// url: "http://www.example.net/", +// headers: { +// "User-Agent": "Mozilla/5.0", // If not specified, navigator.userAgent will be used. +// "Accept": "text/html" // If not specified, browser defaults will be used. +// }, +// responseType: "document", +// onload: function (response) { +// // Attempt to create responseXML, if absent, in supported browsers +// var responseXML = response.responseXML; +// if (!responseXML) { +// try { +// responseXML = new DOMParser().parseFromString(response.responseText, "text/html"); +// } catch (err) {} +// } +// } +// }); + +// GM_xmlhttpRequest({ +// method: "POST", +// url: "http://www.example.net/login", +// data: "username=johndoe&password=xyz123", +// headers: { +// "Content-Type": "application/x-www-form-urlencoded" +// }, +// onload: function (response) { +// if (response.responseText.indexOf("Logged in as") > -1) +// location.href = "http://www.example.net/dashboard"; +// } +// }); + +// GM_download(url, name); + +// 文件夹测试 +// zip.file("Hello.txt", "Hello World\n"); +// zip.folder("nested").file("hello.jpg", getFile(url)); +// zip.folder("nested").file("hello2.jpg", getFile(url)); +// zip.folder("nested").file("hello3.jpg", getFile(url)); +// zip.generateAsync({ +// type: "blob" +// }).then(async (data) => { +// FileSaver.saveAs(data, 'data') +// }) + + +// var img = zip.folder("images"); +// img.file("smile.gif", '../static/es2019.jpg', { +// base64: true +// }); + +// zip.generateAsync({ +// type: "blob" +// }).then(function (content) { +// // see FileSaver.js +// saveAs(content, "example.zip"); +// }); + +// getFile(url).then((fileData) => { +// // 下载文件 +// const arrName = url.split('/'); +// let fileName = arrName[arrName.length - 1]; // 获取文件名 +// // 转码文件名, 上传的文件用decodeURIComponent转汉字 +// const endIndex = fileName.lastIndexOf('.'); +// const format = fileName.slice(endIndex); +// const startName = fileName.slice(0, endIndex); +// const newFileName = decodeURIComponent(startName) + format; +// zip.file(newFileName, fileData, { +// binary: true +// }); // 逐个添加文件 +// // cache[newFileName] = fileData; +// zip.generateAsync({ +// type: 'blob' +// }) +// .then(async (content) => { +// // 生成二进制流;利用file-saver保存文件 +// FileSaver.saveAs( +// content, +// `压缩文件.zip` +// ); +// }); +// }); + +// 批量下载 +// import axios from 'axios' +// import JSZip from 'jszip' +// import FileSaver from 'file-saver' +// getFile = (url) => { +// return new Promise((resolve, reject) => { +// axios({ +// method: 'get', +// url, +// responseType: 'arraybuffer' +// }).then(data => { +// resolve(data.data) +// }).catch(error => { +// reject(error.toString()) +// }) +// }) +// }; + +var FileSaver = require('./FileSaver'); +var JSZip = require('./jszip'); +const zip = new JSZip(); + +const getFile = (url) => { + return new Promise(resolve => { + const xhr = new XMLHttpRequest(); + // 避免 200 from disk cache + url = url + `?r=${Math.random()}`; + xhr.open('GET', url, true); + xhr.responseType = 'blob'; + xhr.onload = () => { + if (xhr.status === 200) { + resolve(xhr.response); + } else { + resolve(); // 避免图片下载失败,导致批量导出失败 + } + }; + xhr.send(); + }); +} +const url = 'https://sf3-scmcdn2-tos.pstatp.com/xitu_juejin_web/img/default.640d9a7.png'; + +// function makeGetRequest(url) { +// return new Promise((resolve, reject) => { +// GM_xmlhttpRequest({ +// method: "GET", +// url: url, +// onload: function(response) { +// resolve(response.responseText); +// }, +// onerror: function(error) { +// reject(error); +// } +// }); +// }); +// } + +// 批量下载 +const handleBatchDownload = async (selectImgList, nameArray) => { + const data = selectImgList; + const zip = new JSZip() + const cache = {} + const promises = [] + await data.forEach((item, index) => { + const promise = getFile(item).then(data => { // 下载文件, 并存成ArrayBuffer对象 + const suffix = item.split("."); + let file_name = nameArray[index] + '.' + suffix[suffix.length - 1]; // 获取文件名 + zip.file(file_name, data, { + binary: true + }) // 逐个添加文件 + cache[file_name] = data; + console.log(data); + }) + console.log(promise); + promises.push(promise) + }) + Promise.all(promises).then(() => { + zip.generateAsync({ + type: "blob" + }).then(content => { // 生成二进制流 + FileSaver.saveAs(content, "photo.zip") // 利用file-saver保存文件 + }) + }) +}; + + +const selectImgList = [url, 'https://sf3-scmcdn2-tos.pstatp.com/xitu_juejin_web/img/article.acd26aa.png']; +const nameArray = ['掘金', '二维码']; +handleBatchDownload(selectImgList, nameArray); + + +// const zip = new JSZip(); + +// zip.file("Hello.txt", "Hello World\n"); +// zip.generateAsync({ +// type: "blob" +// }).then(async (data) => { +// saveAs(data, 'data') +// }) + + +// function makeGetRequest(url) { +// return new Promise((resolve, reject) => { +// GM_xmlhttpRequest({ +// method: "GET", +// url: url, +// responseType: 'blob', +// synchronous: true, +// onload: function (response) { +// resolve(response); +// }, +// onerror: function (error) { +// reject(error); +// } +// }); +// }); +// } + +// makeGetRequest(url) \ No newline at end of file diff --git a/ES6-10/ES2019/js/test0621.js b/ES6-10/ES2019/js/test0621.js new file mode 100644 index 0000000..09be315 --- /dev/null +++ b/ES6-10/ES2019/js/test0621.js @@ -0,0 +1,29 @@ +const waitFor = (ms) => new Promise(r => setTimeout(r, ms)); + +// function func() { +// [1, 2, 3].forEach(async (num) => { +// await waitFor(1000); +// console.log(num); +// }); +// console.log('Done'); +// } +// async function func() { +// const array = [1, 2, 3]; +// for (let index = 0; index < array.length; index++) { +// await waitFor(1000); +// console.log(index); +// } +// console.log('Done'); +// } +// func() + +// const waitFor = (ms) => new Promise(r => setTimeout(r, ms)); +// [1, 2, 3].forEach(async (num) => { +// await waitFor(1000); +// console.log(num); +// }); +// console.log('Done'); + +// function waitFor(foo, ms) { +// return new Promise((r, s) => setInterval(foo, ms)); +// } \ No newline at end of file diff --git a/ES6-10/ES2019/js/test0710.js b/ES6-10/ES2019/js/test0710.js new file mode 100644 index 0000000..f4a8ca4 --- /dev/null +++ b/ES6-10/ES2019/js/test0710.js @@ -0,0 +1,148 @@ +/* + 消息通知类: + 1.传参默认值:消息,持续时间,重要性 + 2.持续时间非数字时:为永久消息; + 3.初始化用 new messageBox() 参数为空时,调用 showMessage() 传参显示消息;用于增大作用域。 + 4.重要性:0 = log;1 = log+自定义弹窗;2 = log+自定义弹窗+GM;默认 = 自定义弹窗; + */ +class MessageBox { + constructor(text, setTime = 5000, important = 1) { + this._box = null; // 永久显示标记,和元素地址 + this._text = text; + this._setTime = setTime; + this._important = important; + this._timer = 0; // 计数器 + // 非空初始化,立即执行; + if (text != undefined) { + this.showMessage(); + } + } + + // 消息盒子 + static genMessageBox() { + // 添加 genBox 样式 + // GM_addStyle(`#messageBox {width: 222px;float: left;position: fixed;border-radius: 10px;left: auto;right: 5%;bottom: 20px;z-index:999}`); + // GM_addStyle(`#messageBox div {width:100%;background-color:#64ce83;float:left;padding:5px 10px;margin-top:10px;border-radius:10px;color:#fff;box-shadow: 0px 0px 1px 3px #ffffff;}`); + + const b = document.createElement('div'); //创建类型为div的DOM对象 + b.id = 'messageBox'; + document.querySelector('body').appendChild(b); // 消息盒子添加到body + }; + + _genBox(text) { + const box = document.createElement('div'); + box.textContent = text; + return box; + } + + // 显示消息 + showMessage(text = this._text, setTime = this._setTime, important = this._important) { + if (this._box != null) { + throw new Error("先移除上条消息,才可再次添加!"); + } + this._text = text; + this._setTime = setTime; + this._important = important; + + const messageBox = document.querySelector('#messageBox'); // 消息插入位置 + + switch (important) { + case 0: { + console.log(text); + break; + } + case 1: { + console.log(text); + this._box = this._genBox(text); // 元素标记,删除用 + messageBox.appendChild(this._box); // 显示消息 + break; + } + case 2: { + console.log(text); + this._box = this._genBox(text); // 元素标记,删除用 + messageBox.appendChild(this._box); // 显示消息 + GM_notification(text); + break; + } + + default: { + this._box = this._genBox(text); // 元素标记,删除用 + messageBox.appendChild(this._box); // 显示消息 + break; + } + } + + if (setTime && !isNaN(setTime) && important != 0) { // 默认5秒删掉消息,可设置时间,none一直显示 + setTimeout(() => { + this.removeMessage(); + }, setTime); + } + } + + refreshMessage(text) { + if (isNaN(this._setTime) && this._box != null) { + switch (this._important) { + case 0: { + console.log(text); + break; + } + case 1: { + console.log(text); + this._box.innerHTML = text; + break; + } + case 2: { + console.log(text); + this._box.innerHTML = text; + GM_notification(text); + break; + } + + default: { + this._box.innerHTML = text; + break; + } + } + } else { + throw new Error("只有弹窗永久消息支持刷新内容:" + this._setTime); + } + } + + // 移除方法,没有元素则等待setTime 5秒再试5次 + removeMessage() { + if (this._box != null) { + this._box.parentNode.removeChild(this._box); + this._box = null; // 清除标志位 + } else { + // 空初始化时,消息异步发送,导致先执行移除而获取不到元素,默认 setTime=5000 + // 消息发出后,box 非空,可以移除,不会执行 setTime="none" + if (this._timer == 4) { + throw new Error("移除的元素不存在:" + this._box); + } + this._timer++; + setTimeout(() => { + this.removeMessage(); + }, this._setTime); + } + } + + // 危险操作 + cleanMessage() { + document.querySelector('#messageBox').innerHTML = ""; + } +} + +MessageBox.genMessageBox(); +// console.log(new MessageBox("hello")); + +const ms = new MessageBox(); +ms.showMessage("world", "none"); +ms.showMessage("123", "none"); +// ms.removeMessage(); +// ms.removeMessage(); +// ms.cleanMessage(); +// 导致错误的清屏 +// new MessageBox().cleanMessage(); +// MessageBox.addMessage(); + +ms.refreshMessage("刷新内容"); \ No newline at end of file diff --git a/ES6-10/ES2019/js/test0722.js b/ES6-10/ES2019/js/test0722.js new file mode 100644 index 0000000..988f075 --- /dev/null +++ b/ES6-10/ES2019/js/test0722.js @@ -0,0 +1,24 @@ +function all(text) { + return new Promise((resolve) => { + run(text, resolve); + }) +} + +function run(text, resolve) { + setTimeout(() => { + i++; + console.log(i); + if (i == limit) { + resolve(text); + return; + } + run(text, resolve); + }, 1000) +} + +let i = 0; +let limit = 2; + +all("hello").then((d) => { + console.log(d); +}); \ No newline at end of file diff --git a/ES6-10/ES2019/js/test0728.js b/ES6-10/ES2019/js/test0728.js new file mode 100644 index 0000000..ad41de2 --- /dev/null +++ b/ES6-10/ES2019/js/test0728.js @@ -0,0 +1,15 @@ +import { + bye, + default as abc, + hi as Hi +} from "./1.module"; +import { + run, + say +} from "./lesson2-14-mod"; + +Hi(); +bye(); +abc(); +say("hello"); +run(); \ No newline at end of file diff --git a/ES6-10/ES2019/js/test0731.js b/ES6-10/ES2019/js/test0731.js new file mode 100644 index 0000000..26d6acf --- /dev/null +++ b/ES6-10/ES2019/js/test0731.js @@ -0,0 +1,11 @@ +const thrSet = new Map([ + ["tid", 1], + ["touseruid", 1], + ["touser", 1], + ["replyIndex", 1], + ["replyLen", 1], + ["randomTime", 1], +]); + +const jsonStr = JSON.stringify(thrSet); +console.log(jsonStr); \ No newline at end of file diff --git a/ES6-10/ES2019/package-lock.json b/ES6-10/ES2019/package-lock.json new file mode 100644 index 0000000..598afcb --- /dev/null +++ b/ES6-10/ES2019/package-lock.json @@ -0,0 +1,7428 @@ +{ + "name": "koa2-es10", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/code-frame": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", + "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/core": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.4.4.tgz", + "integrity": "sha512-lQgGX3FPRgbz2SKmhMtYgJvVzGZrmjaF4apZ2bLwofAKiSjxU0drPh4S/VasyYXwaTs+A1gvQ45BN8SQJzHsQQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/generator": "^7.4.4", + "@babel/helpers": "^7.4.4", + "@babel/parser": "^7.4.4", + "@babel/template": "^7.4.4", + "@babel/traverse": "^7.4.4", + "@babel/types": "^7.4.4", + "convert-source-map": "^1.1.0", + "debug": "^4.1.0", + "json5": "^2.1.0", + "lodash": "^4.17.11", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "json5": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz", + "integrity": "sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.4.tgz", + "integrity": "sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ==", + "dev": true, + "requires": { + "@babel/types": "^7.4.4", + "jsesc": "^2.5.1", + "lodash": "^4.17.11", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz", + "integrity": "sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz", + "integrity": "sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w==", + "dev": true, + "requires": { + "@babel/helper-explode-assignable-expression": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-call-delegate": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.4.4.tgz", + "integrity": "sha512-l79boDFJ8S1c5hvQvG+rc+wHw6IuH7YldmRKsYtpbawsxURu/paVy57FZMomGK22/JckepaikOkY0MoAmdyOlQ==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.4.4", + "@babel/traverse": "^7.4.4", + "@babel/types": "^7.4.4" + } + }, + "@babel/helper-define-map": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.4.4.tgz", + "integrity": "sha512-IX3Ln8gLhZpSuqHJSnTNBWGDE9kdkTEWl21A/K7PQ00tseBwbqCHTvNLHSBd9M0R5rER4h5Rsvj9vw0R5SieBg==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/types": "^7.4.4", + "lodash": "^4.17.11" + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz", + "integrity": "sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA==", + "dev": true, + "requires": { + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.4.tgz", + "integrity": "sha512-VYk2/H/BnYbZDDg39hr3t2kKyifAm1W6zHRfhx8jGjIHpQEBv9dry7oQ2f3+J703TLu69nYdxsovl0XYfcnK4w==", + "dev": true, + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0.tgz", + "integrity": "sha512-avo+lm/QmZlv27Zsi0xEor2fKcqWG56D5ae9dzklpIaY7cQMK5N8VSpaNVPPagiqmy7LrEjK1IWdGMOqPu5csg==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-module-imports": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz", + "integrity": "sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-module-transforms": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.4.4.tgz", + "integrity": "sha512-3Z1yp8TVQf+B4ynN7WoHPKS8EkdTbgAEy0nU0rs/1Kw4pDgmvYH3rz3aI11KgxKCba2cn7N+tqzV1mY2HMN96w==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-simple-access": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/template": "^7.4.4", + "@babel/types": "^7.4.4", + "lodash": "^4.17.11" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz", + "integrity": "sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz", + "integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==", + "dev": true + }, + "@babel/helper-regex": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.4.4.tgz", + "integrity": "sha512-Y5nuB/kESmR3tKjU8Nkn1wMGEx1tjJX076HBMeL3XLQCu6vA/YRzuTW0bbb+qRnXvQGn+d6Rx953yffl8vEy7Q==", + "dev": true, + "requires": { + "lodash": "^4.17.11" + } + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz", + "integrity": "sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-wrap-function": "^7.1.0", + "@babel/template": "^7.1.0", + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-replace-supers": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.4.4.tgz", + "integrity": "sha512-04xGEnd+s01nY1l15EuMS1rfKktNF+1CkKmHoErDppjAAZL+IUBZpzT748x262HF7fibaQPhbvWUl5HeSt1EXg==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.0.0", + "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/traverse": "^7.4.4", + "@babel/types": "^7.4.4" + } + }, + "@babel/helper-simple-access": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz", + "integrity": "sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w==", + "dev": true, + "requires": { + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", + "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "dev": true, + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@babel/helper-wrap-function": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz", + "integrity": "sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/template": "^7.1.0", + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.2.0" + } + }, + "@babel/helpers": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.4.4.tgz", + "integrity": "sha512-igczbR/0SeuPR8RFfC7tGrbdTbFL3QTvH6D+Z6zNxnTe//GyqmtHmDkzrqDmyZ3eSwPqB/LhyKoU5DXsp+Vp2A==", + "dev": true, + "requires": { + "@babel/template": "^7.4.4", + "@babel/traverse": "^7.4.4", + "@babel/types": "^7.4.4" + } + }, + "@babel/highlight": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", + "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/node": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@babel/node/-/node-7.2.2.tgz", + "integrity": "sha512-jPqgTycE26uFsuWpLika9Ohz9dmLQHWjOnMNxBOjYb1HXO+eLKxEr5FfKSXH/tBvFwwaw+pzke3gagnurGOfCA==", + "dev": true, + "requires": { + "@babel/polyfill": "^7.0.0", + "@babel/register": "^7.0.0", + "commander": "^2.8.1", + "lodash": "^4.17.10", + "v8flags": "^3.1.1" + } + }, + "@babel/parser": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.4.tgz", + "integrity": "sha512-5pCS4mOsL+ANsFZGdvNLybx4wtqAZJ0MJjMHxvzI3bvIsz6sQvzW8XX92EYIkiPtIvcfG3Aj+Ir5VNyjnZhP7w==", + "dev": true + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz", + "integrity": "sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-remap-async-to-generator": "^7.1.0", + "@babel/plugin-syntax-async-generators": "^7.2.0" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz", + "integrity": "sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-json-strings": "^7.2.0" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.4.4.tgz", + "integrity": "sha512-dMBG6cSPBbHeEBdFXeQ2QLc5gUpg4Vkaz8octD4aoW/ISO+jBOcsuxYL7bsb5WSu8RLP6boxrBIALEHgoHtO9g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-object-rest-spread": "^7.2.0" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz", + "integrity": "sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.2.0" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.4.4.tgz", + "integrity": "sha512-j1NwnOqMG9mFUOH58JTFsA/+ZYzQLUZ/drqWUqxCYLGeu2JFZL8YrNC9hBxKmWtAuOCHPcRpgv7fhap09Fb4kA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.4.4", + "regexpu-core": "^4.5.4" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz", + "integrity": "sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz", + "integrity": "sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz", + "integrity": "sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz", + "integrity": "sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz", + "integrity": "sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.4.4.tgz", + "integrity": "sha512-YiqW2Li8TXmzgbXw+STsSqPBPFnGviiaSp6CYOq55X8GQ2SGVLrXB6pNid8HkqkZAzOH6knbai3snhP7v0fNwA==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-remap-async-to-generator": "^7.1.0" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz", + "integrity": "sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.4.4.tgz", + "integrity": "sha512-jkTUyWZcTrwxu5DD4rWz6rDB5Cjdmgz6z7M7RLXOJyCUkFBawssDGcGh8M/0FTSB87avyJI1HsTwUXp9nKA1PA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "lodash": "^4.17.11" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.4.4.tgz", + "integrity": "sha512-/e44eFLImEGIpL9qPxSRat13I5QNRgBLu2hOQJCF7VLy/otSM/sypV1+XaIw5+502RX/+6YaSAPmldk+nhHDPw==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-define-map": "^7.4.4", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.4.4", + "@babel/helper-split-export-declaration": "^7.4.4", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz", + "integrity": "sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.4.4.tgz", + "integrity": "sha512-/aOx+nW0w8eHiEHm+BTERB2oJn5D127iye/SUQl7NjHy0lf+j7h4MKMMSOwdazGq9OxgiNADncE+SRJkCxjZpQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.4.4.tgz", + "integrity": "sha512-P05YEhRc2h53lZDjRPk/OektxCVevFzZs2Gfjd545Wde3k+yFDbXORgl2e0xpbq8mLcKJ7Idss4fAg0zORN/zg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.4.4", + "regexpu-core": "^4.5.4" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.2.0.tgz", + "integrity": "sha512-q+yuxW4DsTjNceUiTzK0L+AfQ0zD9rWaTLiUqHA8p0gxx7lu1EylenfzjeIWNkPy6e/0VG/Wjw9uf9LueQwLOw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz", + "integrity": "sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A==", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.4.tgz", + "integrity": "sha512-9T/5Dlr14Z9TIEXLXkt8T1DU7F24cbhwhMNUziN3hB1AXoZcdzPcTiKGRn/6iOymDqtTKWnr/BtRKN9JwbKtdQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.4.4.tgz", + "integrity": "sha512-iU9pv7U+2jC9ANQkKeNF6DrPy4GBa4NWQtl6dHB4Pb3izX2JOEvDTFarlNsBj/63ZEzNNIAMs3Qw4fNCcSOXJA==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz", + "integrity": "sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.2.0.tgz", + "integrity": "sha512-HiU3zKkSU6scTidmnFJ0bMX8hz5ixC93b4MHMiYebmk2lUVNGOboPsqQvx5LzooihijUoLR/v7Nc1rbBtnc7FA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.2.0.tgz", + "integrity": "sha512-mK2A8ucqz1qhrdqjS9VMIDfIvvT2thrEsIQzbaTdc5QFzhDjQv2CkJJ5f6BXIkgbmaoax3zBr2RyvV/8zeoUZw==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.4.4.tgz", + "integrity": "sha512-4sfBOJt58sEo9a2BQXnZq+Q3ZTSAUXyK3E30o36BOGnJ+tvJ6YSxF0PG6kERvbeISgProodWuI9UVG3/FMY6iw==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.4.4", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-simple-access": "^7.1.0" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.4.4.tgz", + "integrity": "sha512-MSiModfILQc3/oqnG7NrP1jHaSPryO6tA2kOMmAQApz5dayPxWiHqmq4sWH2xF5LcQK56LlbKByCd8Aah/OIkQ==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.4.4", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz", + "integrity": "sha512-BV3bw6MyUH1iIsGhXlOK6sXhmSarZjtJ/vMiD9dNmpY8QXFFQTj+6v92pcfy1iqa8DeAfJFwoxcrS/TUZda6sw==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.4.4.tgz", + "integrity": "sha512-Ki+Y9nXBlKfhD+LXaRS7v95TtTGYRAf9Y1rTDiE75zf8YQz4GDaWRXosMfJBXxnk88mGFjWdCRIeqDbon7spYA==", + "dev": true, + "requires": { + "regexp-tree": "^0.1.0" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.4.tgz", + "integrity": "sha512-r1z3T2DNGQwwe2vPGZMBNjioT2scgWzK9BCnDEh+46z8EEwXBq24uRzd65I7pjtugzPSj921aM15RpESgzsSuA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.2.0.tgz", + "integrity": "sha512-VMyhPYZISFZAqAPVkiYb7dUe2AsVi2/wCT5+wZdsNO31FojQJa9ns40hzZ6U9f50Jlq4w6qwzdBB2uwqZ00ebg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.1.0" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.4.tgz", + "integrity": "sha512-oMh5DUO1V63nZcu/ZVLQFqiihBGo4OpxJxR1otF50GMeCLiRx5nUdtokd+u9SuVJrvvuIh9OosRFPP4pIPnwmw==", + "dev": true, + "requires": { + "@babel/helper-call-delegate": "^7.4.4", + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.2.0.tgz", + "integrity": "sha512-9q7Dbk4RhgcLp8ebduOpCbtjh7C0itoLYHXd9ueASKAG/is5PQtMR5VJGka9NKqGhYEGn5ITahd4h9QeBMylWQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.4.tgz", + "integrity": "sha512-Zz3w+pX1SI0KMIiqshFZkwnVGUhDZzpX2vtPzfJBKQQq8WsP/Xy9DNdELWivxcKOCX/Pywge4SiEaPaLtoDT4g==", + "dev": true, + "requires": { + "regenerator-transform": "^0.13.4" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.2.0.tgz", + "integrity": "sha512-fz43fqW8E1tAB3DKF19/vxbpib1fuyCwSPE418ge5ZxILnBhWyhtPgz8eh1RCGGJlwvksHkyxMxh0eenFi+kFw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz", + "integrity": "sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.2.2.tgz", + "integrity": "sha512-KWfky/58vubwtS0hLqEnrWJjsMGaOeSBn90Ezn5Jeg9Z8KKHmELbP1yGylMlm5N6TPKeY9A2+UaSYLdxahg01w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz", + "integrity": "sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.0.0" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.4.4.tgz", + "integrity": "sha512-mQrEC4TWkhLN0z8ygIvEL9ZEToPhG5K7KDW3pzGqOfIGZ28Jb0POUkeWcoz8HnHvhFy6dwAT1j8OzqN8s804+g==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz", + "integrity": "sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.4.4.tgz", + "integrity": "sha512-il+/XdNw01i93+M9J9u4T7/e/Ue/vWfNZE4IRUQjplu2Mqb/AFTDimkw2tdEdSH50wuQXZAbXSql0UphQke+vA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.4.4", + "regexpu-core": "^4.5.4" + } + }, + "@babel/polyfill": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/polyfill/-/polyfill-7.4.4.tgz", + "integrity": "sha512-WlthFLfhQQhh+A2Gn5NSFl0Huxz36x86Jn+E9OW7ibK8edKPq+KLy4apM1yDpQ8kJOVi1OVjpP4vSDLdrI04dg==", + "dev": true, + "requires": { + "core-js": "^2.6.5", + "regenerator-runtime": "^0.13.2" + }, + "dependencies": { + "core-js": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.5.tgz", + "integrity": "sha512-klh/kDpwX8hryYL14M9w/xei6vrv6sE8gTHDG7/T/+SEovB/G4ejwcfE/CBzO6Edsu+OETZMZ3wcX/EjUkrl5A==", + "dev": true + } + } + }, + "@babel/preset-env": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.4.4.tgz", + "integrity": "sha512-FU1H+ACWqZZqfw1x2G1tgtSSYSfxJLkpaUQL37CenULFARDo+h4xJoVHzRoHbK+85ViLciuI7ME4WTIhFRBBlw==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-async-generator-functions": "^7.2.0", + "@babel/plugin-proposal-json-strings": "^7.2.0", + "@babel/plugin-proposal-object-rest-spread": "^7.4.4", + "@babel/plugin-proposal-optional-catch-binding": "^7.2.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-syntax-async-generators": "^7.2.0", + "@babel/plugin-syntax-json-strings": "^7.2.0", + "@babel/plugin-syntax-object-rest-spread": "^7.2.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.2.0", + "@babel/plugin-transform-arrow-functions": "^7.2.0", + "@babel/plugin-transform-async-to-generator": "^7.4.4", + "@babel/plugin-transform-block-scoped-functions": "^7.2.0", + "@babel/plugin-transform-block-scoping": "^7.4.4", + "@babel/plugin-transform-classes": "^7.4.4", + "@babel/plugin-transform-computed-properties": "^7.2.0", + "@babel/plugin-transform-destructuring": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/plugin-transform-duplicate-keys": "^7.2.0", + "@babel/plugin-transform-exponentiation-operator": "^7.2.0", + "@babel/plugin-transform-for-of": "^7.4.4", + "@babel/plugin-transform-function-name": "^7.4.4", + "@babel/plugin-transform-literals": "^7.2.0", + "@babel/plugin-transform-member-expression-literals": "^7.2.0", + "@babel/plugin-transform-modules-amd": "^7.2.0", + "@babel/plugin-transform-modules-commonjs": "^7.4.4", + "@babel/plugin-transform-modules-systemjs": "^7.4.4", + "@babel/plugin-transform-modules-umd": "^7.2.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.4.4", + "@babel/plugin-transform-new-target": "^7.4.4", + "@babel/plugin-transform-object-super": "^7.2.0", + "@babel/plugin-transform-parameters": "^7.4.4", + "@babel/plugin-transform-property-literals": "^7.2.0", + "@babel/plugin-transform-regenerator": "^7.4.4", + "@babel/plugin-transform-reserved-words": "^7.2.0", + "@babel/plugin-transform-shorthand-properties": "^7.2.0", + "@babel/plugin-transform-spread": "^7.2.0", + "@babel/plugin-transform-sticky-regex": "^7.2.0", + "@babel/plugin-transform-template-literals": "^7.4.4", + "@babel/plugin-transform-typeof-symbol": "^7.2.0", + "@babel/plugin-transform-unicode-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "browserslist": "^4.5.2", + "core-js-compat": "^3.0.0", + "invariant": "^2.2.2", + "js-levenshtein": "^1.1.3", + "semver": "^5.5.0" + } + }, + "@babel/register": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.4.4.tgz", + "integrity": "sha512-sn51H88GRa00+ZoMqCVgOphmswG4b7mhf9VOB0LUBAieykq2GnRFerlN+JQkO/ntT7wz4jaHNSRPg9IdMPEUkA==", + "dev": true, + "requires": { + "core-js": "^3.0.0", + "find-cache-dir": "^2.0.0", + "lodash": "^4.17.11", + "mkdirp": "^0.5.1", + "pirates": "^4.0.0", + "source-map-support": "^0.5.9" + } + }, + "@babel/template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", + "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.4.4", + "@babel/types": "^7.4.4" + } + }, + "@babel/traverse": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.4.tgz", + "integrity": "sha512-Gw6qqkw/e6AGzlyj9KnkabJX7VcubqPtkUQVAwkc0wUMldr3A/hezNB3Rc5eIvId95iSGkGIOe5hh1kMKf951A==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/generator": "^7.4.4", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/parser": "^7.4.4", + "@babel/types": "^7.4.4", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.11" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "@babel/types": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", + "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.11", + "to-fast-properties": "^2.0.0" + } + }, + "@webassemblyjs/ast": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", + "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz", + "integrity": "sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz", + "integrity": "sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz", + "integrity": "sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==", + "dev": true + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz", + "integrity": "sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==", + "dev": true, + "requires": { + "@webassemblyjs/wast-printer": "1.8.5" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz", + "integrity": "sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==", + "dev": true + }, + "@webassemblyjs/helper-module-context": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz", + "integrity": "sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "mamacro": "^0.0.3" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz", + "integrity": "sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz", + "integrity": "sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz", + "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz", + "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz", + "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz", + "integrity": "sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/helper-wasm-section": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-opt": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "@webassemblyjs/wast-printer": "1.8.5" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz", + "integrity": "sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz", + "integrity": "sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz", + "integrity": "sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz", + "integrity": "sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/floating-point-hex-parser": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-code-frame": "1.8.5", + "@webassemblyjs/helper-fsm": "1.8.5", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz", + "integrity": "sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5", + "@xtuc/long": "4.2.2" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "acorn": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz", + "integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==", + "dev": true + }, + "acorn-dynamic-import": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz", + "integrity": "sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==", + "dev": true + }, + "acorn-jsx": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.1.tgz", + "integrity": "sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg==", + "dev": true + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "dependencies": { + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + } + } + }, + "ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "dev": true + }, + "ajv-keywords": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.0.tgz", + "integrity": "sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw==", + "dev": true + }, + "ansi-align": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", + "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", + "dev": true, + "requires": { + "string-width": "^2.0.0" + } + }, + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "dev": true + }, + "ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "dev": true + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-includes": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", + "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.7.0" + } + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "dev": true, + "requires": { + "object-assign": "^4.1.1", + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "axios": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.18.0.tgz", + "integrity": "sha1-MtU+SFHv3AoRmTts0AB4nXDAUQI=", + "requires": { + "follow-redirects": "^1.3.0", + "is-buffer": "^1.1.5" + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "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.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "base64-js": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", + "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", + "dev": true + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true + }, + "bluebird": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.4.tgz", + "integrity": "sha512-FG+nFEZChJrbQ9tIccIfZJBz3J7mLrAhxakAbnrJWn8d7aKOC+LWifa0G+p4ZqKp4y13T7juYvdhq9NzKdsrjw==", + "dev": true + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "dev": true + }, + "boxen": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", + "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", + "dev": true, + "requires": { + "ansi-align": "^2.0.0", + "camelcase": "^4.0.0", + "chalk": "^2.0.1", + "cli-boxes": "^1.0.0", + "string-width": "^2.0.0", + "term-size": "^1.2.0", + "widest-line": "^2.0.0" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "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" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "dev": true, + "requires": { + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "version": "4.5.6", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.5.6.tgz", + "integrity": "sha512-o/hPOtbU9oX507lIqon+UvPYqpx3mHc8cV3QemSBTXwkG8gSQSK6UKvXcE/DcleU3+A59XTUHyCvZ5qGy8xVAg==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30000963", + "electron-to-chromium": "^1.3.127", + "node-releases": "^1.1.17" + } + }, + "buffer": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + } + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + }, + "cacache": { + "version": "11.3.2", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.2.tgz", + "integrity": "sha512-E0zP4EPGDOaT2chM08Als91eYnf8Z+eH1awwwVsngUmgppfM5jjJ8l3z5vO5p5w/I3LsiXawb1sW0VY65pQABg==", + "dev": true, + "requires": { + "bluebird": "^3.5.3", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.3", + "graceful-fs": "^4.1.15", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.2", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "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" + } + }, + "cache-content-type": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-content-type/-/cache-content-type-1.0.1.tgz", + "integrity": "sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==", + "requires": { + "mime-types": "^2.1.18", + "ylru": "^1.2.0" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30000967", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000967.tgz", + "integrity": "sha512-rUBIbap+VJfxTzrM4akJ00lkvVb5/n5v3EGXfWzSH5zT8aJmGzjA8HWhJ4U6kCpzxozUSnB+yvAYDRPY6mRpgQ==", + "dev": true + }, + "capture-stack-trace": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", + "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "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.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "chokidar": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.5.tgz", + "integrity": "sha512-i0TprVWp+Kj4WRPtInjexJ8Q+BqTE909VpH8xVhXrJkoc5QC8VO9TryGOqTr+2hljzc1sC62t22h5tZePodM/A==", + "dev": true, + "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" + } + }, + "chownr": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", + "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", + "dev": true + }, + "chrome-trace-event": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz", + "integrity": "sha512-xDbVgyfDTT2piup/h8dK/y4QZfJRSa73bw1WZ8b4XM1o7fsFubUVGYcE+1ANtOzJJELGpYoG2961z0Z6OAld9A==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "ci-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", + "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", + "dev": true + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "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.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "cli-boxes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", + "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", + "dev": true + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" + }, + "co-body": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/co-body/-/co-body-6.0.0.tgz", + "integrity": "sha512-9ZIcixguuuKIptnY8yemEOuhb71L/lLf+Rl5JfJEUiDNJk0e02MBt7BPxR2GEh5mw8dPthQYR4jPI/BnS1MQgw==", + "requires": { + "inflation": "^2.0.0", + "qs": "^6.5.2", + "raw-body": "^2.3.3", + "type-is": "^1.6.16" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "commander": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", + "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "configstore": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", + "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", + "dev": true, + "requires": { + "dot-prop": "^4.1.0", + "graceful-fs": "^4.1.2", + "make-dir": "^1.0.0", + "unique-string": "^1.0.0", + "write-file-atomic": "^2.0.0", + "xdg-basedir": "^3.0.0" + }, + "dependencies": { + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "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=", + "dev": true + } + } + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "dev": true, + "requires": { + "date-now": "^0.1.4" + } + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "requires": { + "safe-buffer": "5.1.2" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "convert-source-map": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", + "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cookies": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.7.3.tgz", + "integrity": "sha512-+gixgxYSgQLTaTIilDHAdlNPZDENDQernEMiIcZpYYP14zgHsCt4Ce1FEjFtcp6GefhozebB6orvhAAWx/IS0A==", + "requires": { + "depd": "~1.1.2", + "keygrip": "~1.0.3" + } + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "copy-to": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/copy-to/-/copy-to-2.0.1.tgz", + "integrity": "sha1-JoD7uAaKSNCGVrYJgJK9r8kG9KU=" + }, + "core-js": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.0.1.tgz", + "integrity": "sha512-sco40rF+2KlE0ROMvydjkrVMMG1vYilP2ALoRXcYR4obqbYIuV3Bg+51GEDW+HF8n7NRA+iaA4qD0nD9lo9mew==", + "dev": true + }, + "core-js-compat": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.0.1.tgz", + "integrity": "sha512-2pC3e+Ht/1/gD7Sim/sqzvRplMiRnFQVlPpDVaHtY9l7zZP7knamr3VRD6NyGfHd84MrDC0tAM9ulNxYMW0T3g==", + "dev": true, + "requires": { + "browserslist": "^4.5.4", + "core-js": "3.0.1", + "core-js-pure": "3.0.1", + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.0.0.tgz", + "integrity": "sha512-0UewU+9rFapKFnlbirLi3byoOuhrSsli/z/ihNnvM24vgF+8sNBiI1LZPBSH9wJKUwaUbw+s3hToDLCXkrghrQ==", + "dev": true + } + } + }, + "core-js-pure": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.0.1.tgz", + "integrity": "sha512-mSxeQ6IghKW3MoyF4cz19GJ1cMm7761ON+WObSyLfTu/Jn3x7w4NwNFnrZxgl4MTSvYYepVLNuRtlB4loMwJ5g==", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" + } + }, + "create-error-class": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", + "dev": true, + "requires": { + "capture-stack-trace": "^1.0.0" + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "dependencies": { + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", + "dev": true + }, + "cyclist": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", + "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", + "dev": true + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "deep-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", + "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "des.js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", + "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "dev": true + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, + "dot-prop": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", + "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", + "dev": true, + "requires": { + "is-obj": "^1.0.0" + } + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "ejs": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.6.1.tgz", + "integrity": "sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ==" + }, + "electron-to-chromium": { + "version": "1.3.133", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.133.tgz", + "integrity": "sha512-lyoC8aoqbbDqsprb6aPdt9n3DpOZZzdz/T4IZKsR0/dkZIxnJVUjjcpOSwA66jPRIOyDAamCTAUqweU05kKNSg==", + "dev": true + }, + "elliptic": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz", + "integrity": "sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==", + "dev": true, + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "enhanced-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", + "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "tapable": "^1.0.0" + } + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "dev": true, + "requires": { + "prr": "~1.0.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "error-inject": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/error-inject/-/error-inject-1.0.0.tgz", + "integrity": "sha1-4rPZG1Su1nLzCdlQ0VSFD6EdTzc=" + }, + "es-abstract": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", + "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.0", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "is-callable": "^1.1.4", + "is-regex": "^1.0.4", + "object-keys": "^1.0.12" + } + }, + "es-to-primitive": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", + "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "eslint": { + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz", + "integrity": "sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.9.1", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-scope": "^4.0.3", + "eslint-utils": "^1.3.1", + "eslint-visitor-keys": "^1.0.0", + "espree": "^5.0.1", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob": "^7.1.2", + "globals": "^11.7.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "inquirer": "^6.2.2", + "js-yaml": "^3.13.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.11", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "path-is-inside": "^1.0.2", + "progress": "^2.0.0", + "regexpp": "^2.0.1", + "semver": "^5.5.1", + "strip-ansi": "^4.0.0", + "strip-json-comments": "^2.0.1", + "table": "^5.2.3", + "text-table": "^0.2.0" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "eslint-config-standard": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-12.0.0.tgz", + "integrity": "sha512-COUz8FnXhqFitYj4DTqHzidjIL/t4mumGZto5c7DrBpvWoie+Sn3P4sLEzUGeYhRElWuFEf8K1S1EfvD1vixCQ==", + "dev": true + }, + "eslint-import-resolver-node": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz", + "integrity": "sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==", + "dev": true, + "requires": { + "debug": "^2.6.9", + "resolve": "^1.5.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "eslint-module-utils": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.4.0.tgz", + "integrity": "sha512-14tltLm38Eu3zS+mt0KvILC3q8jyIAH518MlG+HO0p+yK885Lb1UHTY/UgR91eOyGdmxAPb+OLoW4znqIT6Ndw==", + "dev": true, + "requires": { + "debug": "^2.6.8", + "pkg-dir": "^2.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^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=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + } + } + } + }, + "eslint-plugin-es": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-1.4.0.tgz", + "integrity": "sha512-XfFmgFdIUDgvaRAlaXUkxrRg5JSADoRC8IkKLc/cISeR3yHVMefFHQZpcyXXEUUPHfy5DwviBcrfqlyqEwlQVw==", + "dev": true, + "requires": { + "eslint-utils": "^1.3.0", + "regexpp": "^2.0.1" + } + }, + "eslint-plugin-import": { + "version": "2.17.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.17.2.tgz", + "integrity": "sha512-m+cSVxM7oLsIpmwNn2WXTJoReOF9f/CtLMo7qOVmKd1KntBy0hEcuNZ3erTmWjx+DxRO0Zcrm5KwAvI9wHcV5g==", + "dev": true, + "requires": { + "array-includes": "^3.0.3", + "contains-path": "^0.1.0", + "debug": "^2.6.9", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "^0.3.2", + "eslint-module-utils": "^2.4.0", + "has": "^1.0.3", + "lodash": "^4.17.11", + "minimatch": "^3.0.4", + "read-pkg-up": "^2.0.0", + "resolve": "^1.10.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "isarray": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + } + } + }, + "eslint-plugin-node": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-9.0.1.tgz", + "integrity": "sha512-fljT5Uyy3lkJzuqhxrYanLSsvaILs9I7CmQ31atTtZ0DoIzRbbvInBh4cQ1CrthFHInHYBQxfPmPt6KLHXNXdw==", + "dev": true, + "requires": { + "eslint-plugin-es": "^1.4.0", + "eslint-utils": "^1.3.1", + "ignore": "^5.1.1", + "minimatch": "^3.0.4", + "resolve": "^1.10.1", + "semver": "^6.0.0" + }, + "dependencies": { + "ignore": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.1.tgz", + "integrity": "sha512-DWjnQIFLenVrwyRCKZT+7a7/U4Cqgar4WG8V++K3hw+lrW1hc/SIwdiGmtxKCVACmHULTuGeBbHJmbwW7/sAvA==", + "dev": true + }, + "semver": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.0.0.tgz", + "integrity": "sha512-0UewU+9rFapKFnlbirLi3byoOuhrSsli/z/ihNnvM24vgF+8sNBiI1LZPBSH9wJKUwaUbw+s3hToDLCXkrghrQ==", + "dev": true + } + } + }, + "eslint-plugin-promise": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.1.1.tgz", + "integrity": "sha512-faAHw7uzlNPy7b45J1guyjazw28M+7gJokKUjC5JSFoYfUEyy6Gw/i7YQvmv2Yk00sUjWcmzXQLpU1Ki/C2IZQ==", + "dev": true + }, + "eslint-plugin-standard": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-4.0.0.tgz", + "integrity": "sha512-OwxJkR6TQiYMmt1EsNRMe5qG3GsbjlcOhbGUBY4LtavF9DsLaTcoR+j2Tdjqi23oUwKNUqX7qcn5fPStafMdlA==", + "dev": true + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.3.1.tgz", + "integrity": "sha512-Z7YjnIldX+2XMcjr7ZkgEsOj/bREONV60qYeB/bjMAqqqZ4zxKyWX+BOUkdmRmA9riiIPVvo5x86m5elviOk0Q==", + "dev": true + }, + "eslint-visitor-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", + "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", + "dev": true + }, + "espree": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz", + "integrity": "sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==", + "dev": true, + "requires": { + "acorn": "^6.0.7", + "acorn-jsx": "^5.0.0", + "eslint-visitor-keys": "^1.0.0" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esquery": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", + "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", + "dev": true, + "requires": { + "estraverse": "^4.0.0" + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "events": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz", + "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==", + "dev": true + }, + "eventsource-polyfill": { + "version": "0.9.6", + "resolved": "https://registry.npmjs.org/eventsource-polyfill/-/eventsource-polyfill-0.9.6.tgz", + "integrity": "sha1-EODRh/ERsWfyj9q5GIQ859gY8Tw=", + "dev": true + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "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.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "external-editor": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz", + "integrity": "sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "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.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "figgy-pudding": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", + "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==", + "dev": true + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "dev": true, + "requires": { + "flat-cache": "^2.0.1" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "findup-sync": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", + "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", + "dev": true, + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^3.1.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "dev": true, + "requires": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + } + }, + "flatted": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.0.tgz", + "integrity": "sha512-R+H8IZclI8AAkSBRQJLVOsxwAoHd6WC40b4QTNWIjzAa6BXOBfQcM587MXDTVPeYaopFNWHUFLx7eNmHDSxMWg==", + "dev": true + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "follow-redirects": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", + "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==" + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", + "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.12.1", + "node-pre-gyp": "^0.12.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.3", + "bundled": true, + "dev": true, + "optional": true, + "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" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true, + "optional": true + }, + "minipass": { + "version": "2.3.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.3.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^4.1.0", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.12.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "optional": true, + "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" + } + }, + "rimraf": { + "version": "2.6.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.7.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "yallist": { + "version": "3.0.3", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "dev": true, + "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.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "dev": true, + "requires": { + "ini": "^1.3.4" + } + }, + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "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.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "got": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", + "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", + "dev": true, + "requires": { + "create-error-class": "^3.0.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-redirect": "^1.0.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "lowercase-keys": "^1.0.0", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "unzip-response": "^2.0.1", + "url-parse-lax": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "hosted-git-info": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", + "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", + "dev": true + }, + "html-entities": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", + "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", + "dev": true + }, + "http-assert": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/http-assert/-/http-assert-1.4.1.tgz", + "integrity": "sha512-rdw7q6GTlibqVVbXr0CKelfV5iY8G2HqEUkhSk297BMbSpSL8crXC+9rjKoMcZZEsksX30le6f/4ul4E28gegw==", + "requires": { + "deep-equal": "~1.0.1", + "http-errors": "~1.7.2" + } + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "dev": true + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=", + "dev": true + }, + "import-fresh": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.0.0.tgz", + "integrity": "sha512-pOnA9tfM3Uwics+SaBLCNyZZZbK+4PTu0OPZtLlMIrv17EdBoC15S9Kn8ckJ9TZTyKb3ywNE5y1yeDxxGA7nTQ==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "dev": true + }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "dev": true + }, + "inflation": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/inflation/-/inflation-2.0.0.tgz", + "integrity": "sha1-i0F+R8KPklpFEz2RTKH9OJEH8w8=" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "inquirer": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.3.1.tgz", + "integrity": "sha512-MmL624rfkFt4TG9y/Jvmt8vdmOo836U7Y0Hxr2aFk3RelZEGX4Igk0KabWrcaaZaTv9uzglOqWh1Vly+FAWAXA==", + "dev": true, + "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.11", + "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.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "interpret": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", + "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", + "dev": true + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "is-callable": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", + "dev": true + }, + "is-ci": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", + "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", + "dev": true, + "requires": { + "ci-info": "^1.5.0" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "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.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-generator-function": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.7.tgz", + "integrity": "sha512-YZc5EwyO4f2kWCax7oegfuSr9mFz1ZvieNYBEjmukLxgXfBUbxAWGVF7GZf0zidYtoBl3WvC07YK0wT76a+Rtw==" + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-installed-globally": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", + "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", + "dev": true, + "requires": { + "global-dirs": "^0.1.0", + "is-path-inside": "^1.0.0" + } + }, + "is-npm": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", + "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "dev": true, + "requires": { + "path-is-inside": "^1.0.1" + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true + }, + "is-redirect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", + "dev": true + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "requires": { + "has": "^1.0.1" + } + }, + "is-retry-allowed": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", + "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-symbol": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", + "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "dev": true, + "requires": { + "has-symbols": "^1.0.0" + } + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "js-levenshtein": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", + "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "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==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "keygrip": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.0.3.tgz", + "integrity": "sha512-/PpesirAIfaklxUzp4Yb7xBper9MwP6hNRA6BGGUFCgbJ+BM5CKBtsoxinNXkLHAr+GXS1/lSlF2rP7cv5Fl+g==" + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "koa": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/koa/-/koa-2.7.0.tgz", + "integrity": "sha512-7ojD05s2Q+hFudF8tDLZ1CpCdVZw8JQELWSkcfG9bdtoTDzMmkRF6BQBU7JzIzCCOY3xd3tftiy/loHBUYaY2Q==", + "requires": { + "accepts": "^1.3.5", + "cache-content-type": "^1.0.0", + "content-disposition": "~0.5.2", + "content-type": "^1.0.4", + "cookies": "~0.7.1", + "debug": "~3.1.0", + "delegates": "^1.0.0", + "depd": "^1.1.2", + "destroy": "^1.0.4", + "error-inject": "^1.0.0", + "escape-html": "^1.0.3", + "fresh": "~0.5.2", + "http-assert": "^1.3.0", + "http-errors": "^1.6.3", + "is-generator-function": "^1.0.7", + "koa-compose": "^4.1.0", + "koa-convert": "^1.2.0", + "koa-is-json": "^1.0.0", + "on-finished": "^2.3.0", + "only": "~0.0.2", + "parseurl": "^1.3.2", + "statuses": "^1.5.0", + "type-is": "^1.6.16", + "vary": "^1.1.2" + } + }, + "koa-bodyparser": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/koa-bodyparser/-/koa-bodyparser-4.2.1.tgz", + "integrity": "sha512-UIjPAlMZfNYDDe+4zBaOAUKYqkwAGcIU6r2ARf1UOXPAlfennQys5IiShaVeNf7KkVBlf88f2LeLvBFvKylttw==", + "requires": { + "co-body": "^6.0.0", + "copy-to": "^2.0.1" + } + }, + "koa-compose": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-4.1.0.tgz", + "integrity": "sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==" + }, + "koa-convert": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/koa-convert/-/koa-convert-1.2.0.tgz", + "integrity": "sha1-2kCHXfSd4FOQmNFwC1CCDOvNIdA=", + "requires": { + "co": "^4.6.0", + "koa-compose": "^3.0.0" + }, + "dependencies": { + "koa-compose": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-3.2.1.tgz", + "integrity": "sha1-qFzLQLfZhtjlo0Wzoazo6rz1Tec=", + "requires": { + "any-promise": "^1.1.0" + } + } + } + }, + "koa-ejs": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/koa-ejs/-/koa-ejs-4.2.0.tgz", + "integrity": "sha512-qNcKySHW0gTPSp7++xP/RET2Vuxs36aV76ezp3DmJZNnTOlylXFMv7c62iutZFsiC5ejTS6y9gcj6DmF5WR82g==", + "requires": { + "debug": "^2.6.1", + "ejs": "^2.6.1", + "mz": "^2.6.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + } + } + }, + "koa-is-json": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/koa-is-json/-/koa-is-json-1.0.0.tgz", + "integrity": "sha1-JzwH7c3Ljfaiwat9We52SRRR7BQ=" + }, + "koa-router": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/koa-router/-/koa-router-7.4.0.tgz", + "integrity": "sha512-IWhaDXeAnfDBEpWS6hkGdZ1ablgr6Q6pGdXCyK38RbzuH4LkUOpPqPw+3f8l8aTDrQmBQ7xJc0bs2yV4dzcO+g==", + "requires": { + "debug": "^3.1.0", + "http-errors": "^1.3.1", + "koa-compose": "^3.0.0", + "methods": "^1.0.1", + "path-to-regexp": "^1.1.1", + "urijs": "^1.19.0" + }, + "dependencies": { + "koa-compose": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-3.2.1.tgz", + "integrity": "sha1-qFzLQLfZhtjlo0Wzoazo6rz1Tec=", + "requires": { + "any-promise": "^1.1.0" + } + } + } + }, + "koa-send": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/koa-send/-/koa-send-5.0.0.tgz", + "integrity": "sha512-90ZotV7t0p3uN9sRwW2D484rAaKIsD8tAVtypw/aBU+ryfV+fR2xrcAwhI8Wl6WRkojLUs/cB9SBSCuIb+IanQ==", + "requires": { + "debug": "^3.1.0", + "http-errors": "^1.6.3", + "mz": "^2.7.0", + "resolve-path": "^1.4.0" + } + }, + "koa-static": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/koa-static/-/koa-static-5.0.0.tgz", + "integrity": "sha512-UqyYyH5YEXaJrf9S8E23GoJFQZXkBVJ9zYYMPGz919MSX1KuvAcycIuS0ci150HCoPf4XQVhQ84Qf8xRPWxFaQ==", + "requires": { + "debug": "^3.1.0", + "koa-send": "^5.0.0" + } + }, + "koa-webpack-dev-middleware": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/koa-webpack-dev-middleware/-/koa-webpack-dev-middleware-2.0.2.tgz", + "integrity": "sha1-urYgcZi+tjRKBoi/m9Fc+q+onZE=", + "dev": true, + "requires": { + "webpack-dev-middleware": "^1.10.0" + } + }, + "koa-webpack-hot-middleware": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/koa-webpack-hot-middleware/-/koa-webpack-hot-middleware-1.0.3.tgz", + "integrity": "sha1-32qvvy13FTEB435qSucCNbRm+MA=", + "dev": true, + "requires": { + "webpack-hot-middleware": "2.x" + } + }, + "koa-webpack-middleware": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/koa-webpack-middleware/-/koa-webpack-middleware-1.0.7.tgz", + "integrity": "sha512-XWVtdsyvy1EHVkNXxGDjKm1T+L9OWJGLwFt1gOmrCdTy+/n34VxdRQr9PoArXd7QJGuFb3yOOL5Gd2BP8u0/nA==", + "dev": true, + "requires": { + "regenerator-runtime": "0.10.5", + "webpack-dev-middleware": "1.12.0", + "webpack-hot-middleware": "2.18.2" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "regenerator-runtime": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", + "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "webpack-dev-middleware": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-1.12.0.tgz", + "integrity": "sha1-007++y7dp+HTtdvgcolRMhllFwk=", + "dev": true, + "requires": { + "memory-fs": "~0.4.1", + "mime": "^1.3.4", + "path-is-absolute": "^1.0.0", + "range-parser": "^1.0.3", + "time-stamp": "^2.0.0" + } + }, + "webpack-hot-middleware": { + "version": "2.18.2", + "resolved": "https://registry.npmjs.org/webpack-hot-middleware/-/webpack-hot-middleware-2.18.2.tgz", + "integrity": "sha512-dB7uOnUWsojZIAC6Nwi5v3tuaQNd2i7p4vF5LsJRyoTOgr2fRYQdMKQxRZIZZaz0cTPBX8rvcWU1A6/n7JTITg==", + "dev": true, + "requires": { + "ansi-html": "0.0.7", + "html-entities": "^1.2.0", + "querystring": "^0.2.0", + "strip-ansi": "^3.0.0" + } + } + } + }, + "koa2-webpack4-dev-middleware": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/koa2-webpack4-dev-middleware/-/koa2-webpack4-dev-middleware-1.0.1.tgz", + "integrity": "sha512-Pc9Q3lJj9CvtL28l9f3FQ+ZCY9pTfU4JLtFYxMAgF6QOlHvtQUcJDeXa1qE7SsWofB3x7MkbTtmBwcvHC+J0ew==", + "dev": true + }, + "latest-version": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", + "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", + "dev": true, + "requires": { + "package-json": "^4.0.0" + } + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "dev": true, + "requires": { + "invert-kv": "^2.0.0" + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "dev": true + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "mamacro": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", + "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==", + "dev": true + }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "dev": true, + "requires": { + "p-defer": "^1.0.0" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "mem": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + }, + "dependencies": { + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + } + } + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "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" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "mime-db": { + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", + "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==" + }, + "mime-types": { + "version": "2.1.24", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", + "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", + "requires": { + "mime-db": "1.40.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dev": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "mixin-deep": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", + "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + } + } + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true + }, + "mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "requires": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "nan": { + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.13.2.tgz", + "integrity": "sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw==", + "dev": true, + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "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" + } + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + }, + "neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node-libs-browser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.0.tgz", + "integrity": "sha512-5MQunG/oyOaBdttrL40dA7bUfPORLRWMUJLQtMg7nluxUvk5XwnLdL9twQHFAjRx/y7mIMkLKT9++qPbbk6BZA==", + "dev": true, + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.0", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "0.0.4" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, + "node-modules-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", + "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", + "dev": true + }, + "node-releases": { + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.18.tgz", + "integrity": "sha512-/mnVgm6u/8OwlIsoyRXtTI0RfQcxZoAZbdwyXap0EeWwcOpDDymyCHM2/aR9XKmHXrvizHoPAOs0pcbiJ6RUaA==", + "dev": true, + "requires": { + "semver": "^5.3.0" + } + }, + "nodemon": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-1.19.0.tgz", + "integrity": "sha512-NHKpb/Je0Urmwi3QPDHlYuFY9m1vaVfTsRZG5X73rY46xPj0JpNe8WhUGQdkDXQDOxrBNIU3JrcflE9Y44EcuA==", + "dev": true, + "requires": { + "chokidar": "^2.1.5", + "debug": "^3.1.0", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.0.4", + "pstree.remy": "^1.1.6", + "semver": "^5.5.0", + "supports-color": "^5.2.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.2", + "update-notifier": "^2.5.0" + } + }, + "nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "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==", + "dev": true, + "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.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "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.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "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.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "only": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/only/-/only-0.0.2.tgz", + "integrity": "sha1-Kv3oTQPlC5qO3EROMGEKcCle37Q=" + }, + "optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.4", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "wordwrap": "~1.0.0" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "os-locale": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + } + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", + "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", + "dev": true + }, + "p-limit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", + "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.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==", + "dev": true + }, + "package-json": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", + "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", + "dev": true, + "requires": { + "got": "^6.7.1", + "registry-auth-token": "^3.0.1", + "registry-url": "^3.0.3", + "semver": "^5.1.0" + } + }, + "pako": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", + "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==", + "dev": true + }, + "parallel-transform": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", + "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", + "dev": true, + "requires": { + "cyclist": "~0.2.2", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-asn1": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.4.tgz", + "integrity": "sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw==", + "dev": true, + "requires": { + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", + "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-to-regexp": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", + "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", + "requires": { + "isarray": "0.0.1" + } + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "pbkdf2": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", + "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "dev": true, + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "pirates": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", + "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", + "dev": true, + "requires": { + "node-modules-regexp": "^1.0.0" + } + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "dev": true + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "pstree.remy": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.6.tgz", + "integrity": "sha512-NdF35+QsqD7EgNEI5mkI/X+UwaxVEbQaz9f4IooEmMUv6ZPmlTQYGjBPJGgrlzNdjSvIy4MWMg6Q6vCgBO2K+w==", + "dev": true + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + } + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^2.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=", + "dev": true, + "requires": { + "locate-path": "^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=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "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" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + } + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "regenerate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.0.2.tgz", + "integrity": "sha512-SbA/iNrBUf6Pv2zU8Ekv1Qbhv92yxL4hiDa2siuxs4KKn4oOoMDHXjAf7+Nz9qinUQ46B1LcWEi/PhJfPWpZWQ==", + "dev": true, + "requires": { + "regenerate": "^1.4.0" + } + }, + "regenerator-runtime": { + "version": "0.13.2", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz", + "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA==", + "dev": true + }, + "regenerator-transform": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.13.4.tgz", + "integrity": "sha512-T0QMBjK3J0MtxjPmdIMXm72Wvj2Abb0Bd4HADdfijwMdoIsyQZ6fWC7kDFhk2YinBBEMZDL7Y7wh0J1sGx3S4A==", + "dev": true, + "requires": { + "private": "^0.1.6" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regexp-tree": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.6.tgz", + "integrity": "sha512-LFrA98Dw/heXqDojz7qKFdygZmFoiVlvE1Zp7Cq2cvF+ZA+03Gmhy0k0PQlsC1jvHPiTUSs+pDHEuSWv6+6D7w==", + "dev": true + }, + "regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "dev": true + }, + "regexpu-core": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.5.4.tgz", + "integrity": "sha512-BtizvGtFQKGPUcTy56o3nk1bGRp4SZOTYrDtGNlqCQufptV5IkkLN6Emw+yunAJjzf+C9FQFtvq7IoA3+oMYHQ==", + "dev": true, + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.0.2", + "regjsgen": "^0.5.0", + "regjsparser": "^0.6.0", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.1.0" + } + }, + "registry-auth-token": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz", + "integrity": "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==", + "dev": true, + "requires": { + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" + } + }, + "registry-url": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", + "dev": true, + "requires": { + "rc": "^1.0.1" + } + }, + "regjsgen": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.0.tgz", + "integrity": "sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA==", + "dev": true + }, + "regjsparser": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.0.tgz", + "integrity": "sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "resolve": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.1.tgz", + "integrity": "sha512-KuIe4mf++td/eFb6wkaPbMDnP6kObCaEtIDuHOUED6MNUo4K670KZUHuuvYPZDxNF0WVLw49n06M2m2dXphEzA==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + } + } + }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "resolve-path": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/resolve-path/-/resolve-path-1.4.0.tgz", + "integrity": "sha1-xL2p9e+y/OZSR4c6s2u02DT+Fvc=", + "requires": { + "http-errors": "~1.6.2", + "path-is-absolute": "1.0.1" + }, + "dependencies": { + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + } + } + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "dev": true, + "requires": { + "is-promise": "^2.1.0" + } + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dev": true, + "requires": { + "aproba": "^1.1.1" + } + }, + "rxjs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.2.tgz", + "integrity": "sha512-HUb7j3kvb7p7eCUHE3FqjoDsC1xfZQ4AHFWfTKSpZ+sAhhz5X1WX0ZuUqWbzB2QhSLp3DoLUG+hMdEDKqWo2Zg==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true + }, + "semver-diff": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", + "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", + "dev": true, + "requires": { + "semver": "^5.0.3" + } + }, + "serialize-javascript": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.7.0.tgz", + "integrity": "sha512-ke8UG8ulpFOxO8f8gRYabHQe/ZntKlcig2Mp+8+URDP1D8vJZ0KUt7LYo07q25Z/+JVSgpr/cui9PIp5H6/+nA==", + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-value": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", + "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + } + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "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.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "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.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "dev": true, + "requires": { + "atob": "^2.1.1", + "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.12", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz", + "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.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==", + "dev": true + } + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "spdx-correct": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz", + "integrity": "sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA==", + "dev": true + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "ssri": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dev": true, + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "stream-shift": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "table": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/table/-/table-5.3.3.tgz", + "integrity": "sha512-3wUNCgdWX6PNpOe3amTTPWPuF6VGvgzjKCaO1snFj0z7Y3mUPWf5+zDtxUVGispJkDECPmR29wbzh6bVMOHbcw==", + "dev": true, + "requires": { + "ajv": "^6.9.1", + "lodash": "^4.17.11", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true + }, + "term-size": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", + "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", + "dev": true, + "requires": { + "execa": "^0.7.0" + } + }, + "terser": { + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-3.17.0.tgz", + "integrity": "sha512-/FQzzPJmCpjAH9Xvk2paiWrFq+5M6aVOf+2KRbwhByISDX/EujxsK+BAvrhb6H+2rtrLCHK9N01wO014vrIwVQ==", + "dev": true, + "requires": { + "commander": "^2.19.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.10" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "terser-webpack-plugin": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.2.3.tgz", + "integrity": "sha512-GOK7q85oAb/5kE12fMuLdn2btOS9OBZn4VsecpHDywoUC/jLhSAKOiYo0ezx7ss2EXPMzyEWFoE0s1WLE+4+oA==", + "dev": true, + "requires": { + "cacache": "^11.0.2", + "find-cache-dir": "^2.0.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^1.4.0", + "source-map": "^0.6.1", + "terser": "^3.16.1", + "webpack-sources": "^1.1.0", + "worker-farm": "^1.5.2" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "thenify": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.0.tgz", + "integrity": "sha1-5p44obq+lpsBCCB5eLn2K4hgSDk=", + "requires": { + "any-promise": "^1.0.0" + } + }, + "thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", + "requires": { + "thenify": ">= 3.1.0 < 4" + } + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "time-stamp": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-2.2.0.tgz", + "integrity": "sha512-zxke8goJQpBeEgD82CXABeMh0LSJcj7CXEd0OHOg45HgcofF7pxNwZm9+RknpxpDhwN4gFpySkApKfFYfRQnUA==", + "dev": true + }, + "timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", + "dev": true + }, + "timers-browserify": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", + "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", + "dev": true, + "requires": { + "setimmediate": "^1.0.4" + } + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + }, + "touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, + "requires": { + "nopt": "~1.0.10" + } + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, + "tslib": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", + "dev": true + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true + }, + "unicode-canonical-property-names-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "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.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz", + "integrity": "sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g==", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz", + "integrity": "sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw==", + "dev": true + }, + "union-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", + "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^0.4.3" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "set-value": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", + "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.1", + "to-object-path": "^0.3.0" + } + } + } + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.1.tgz", + "integrity": "sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "unique-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "dev": true, + "requires": { + "crypto-random-string": "^1.0.0" + } + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + } + } + }, + "unzip-response": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", + "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", + "dev": true + }, + "upath": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.2.tgz", + "integrity": "sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q==", + "dev": true + }, + "update-notifier": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", + "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", + "dev": true, + "requires": { + "boxen": "^1.2.1", + "chalk": "^2.0.1", + "configstore": "^3.0.0", + "import-lazy": "^2.1.0", + "is-ci": "^1.0.10", + "is-installed-globally": "^0.1.0", + "is-npm": "^1.0.0", + "latest-version": "^3.0.0", + "semver-diff": "^2.0.0", + "xdg-basedir": "^3.0.0" + } + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "urijs": { + "version": "1.19.11", + "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.11.tgz", + "integrity": "sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ==" + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "dev": true, + "requires": { + "prepend-http": "^1.0.1" + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dev": true, + "requires": { + "inherits": "2.0.3" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "v8-compile-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.2.tgz", + "integrity": "sha512-1wFuMUIM16MDJRCrpbpuEPTUGmM5QMUg0cr3KFwra2XgOgFcPGDQHDh3CszSCD2Zewc/dh/pamNEW8CbfDebUw==", + "dev": true + }, + "v8flags": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.2.tgz", + "integrity": "sha512-MtivA7GF24yMPte9Rp/BWGCYQNaUj86zeYxV/x2RRJMKagImbbv3u8iJC57lNhWLPcGLJmHcHmFWkNsplbbLWw==", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "vm-browserify": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", + "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", + "dev": true, + "requires": { + "indexof": "0.0.1" + } + }, + "watchpack": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", + "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", + "dev": true, + "requires": { + "chokidar": "^2.0.2", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + } + }, + "webpack": { + "version": "4.31.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.31.0.tgz", + "integrity": "sha512-n6RVO3X0LbbipoE62akME9K/JI7qYrwwufs20VvgNNpqUoH4860KkaxJTbGq5bgkVZF9FqyyTG/0WPLH3PVNJA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/wasm-edit": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "acorn": "^6.0.5", + "acorn-dynamic-import": "^4.0.0", + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0", + "chrome-trace-event": "^1.0.0", + "enhanced-resolve": "^4.1.0", + "eslint-scope": "^4.0.0", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.3.0", + "loader-utils": "^1.1.0", + "memory-fs": "~0.4.1", + "micromatch": "^3.1.8", + "mkdirp": "~0.5.0", + "neo-async": "^2.5.0", + "node-libs-browser": "^2.0.0", + "schema-utils": "^1.0.0", + "tapable": "^1.1.0", + "terser-webpack-plugin": "^1.1.0", + "watchpack": "^1.5.0", + "webpack-sources": "^1.3.0" + } + }, + "webpack-cli": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.2.tgz", + "integrity": "sha512-FLkobnaJJ+03j5eplxlI0TUxhGCOdfewspIGuvDVtpOlrAuKMFC57K42Ukxqs1tn8947/PM6tP95gQc0DCzRYA==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "cross-spawn": "^6.0.5", + "enhanced-resolve": "^4.1.0", + "findup-sync": "^2.0.0", + "global-modules": "^1.0.0", + "import-local": "^2.0.0", + "interpret": "^1.1.0", + "loader-utils": "^1.1.0", + "supports-color": "^5.5.0", + "v8-compile-cache": "^2.0.2", + "yargs": "^12.0.5" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + } + } + }, + "webpack-dev-middleware": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-1.12.2.tgz", + "integrity": "sha512-FCrqPy1yy/sN6U/SaEZcHKRXGlqU0DUaEBL45jkUYoB8foVb6wCnbIJ1HKIx+qUFTW+3JpVcCJCxZ8VATL4e+A==", + "dev": true, + "requires": { + "memory-fs": "~0.4.1", + "mime": "^1.5.0", + "path-is-absolute": "^1.0.0", + "range-parser": "^1.0.3", + "time-stamp": "^2.0.0" + } + }, + "webpack-hot-middleware": { + "version": "2.24.4", + "resolved": "https://registry.npmjs.org/webpack-hot-middleware/-/webpack-hot-middleware-2.24.4.tgz", + "integrity": "sha512-YFA4j2tg9WPkcQKcyHMZn6787QngWf/ahXvAJRZ1ripySa+4ihjzDcYBsfC4ihOucTd02IJ12v+VTGMsEGxq0w==", + "dev": true, + "requires": { + "ansi-html": "0.0.7", + "html-entities": "^1.2.0", + "querystring": "^0.2.0", + "strip-ansi": "^3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "webpack-sources": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz", + "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "widest-line": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", + "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", + "dev": true, + "requires": { + "string-width": "^2.1.1" + } + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, + "worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "dev": true, + "requires": { + "errno": "~0.1.7" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + } + }, + "write-file-atomic": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.2.tgz", + "integrity": "sha512-s0b6vB3xIVRLWywa6X9TOMA7k9zio0TMOsl9ZnDkliA/cfJlpHXAscj0gbHVJiTdIuAYpIyqS5GW91fqm6gG5g==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "xdg-basedir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", + "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", + "dev": true + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, + "yallist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", + "dev": true + }, + "yargs": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.1" + } + }, + "yargs-parser": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + } + } + }, + "ylru": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ylru/-/ylru-1.2.1.tgz", + "integrity": "sha512-faQrqNMzcPCHGVC2aaOINk13K+aaBDUPjGWl0teOXywElLjyVAB6Oe2jj62jHYtwsU49jXhScYbvPENK+6zAvQ==" + } + } +} diff --git a/ES6-10/ES2019/package.json b/ES6-10/ES2019/package.json new file mode 100644 index 0000000..b2e3ff1 --- /dev/null +++ b/ES6-10/ES2019/package.json @@ -0,0 +1,44 @@ +{ + "name": "koa2-es10", + "version": "1.0.0", + "description": "koa2-es development kit", + "main": "index.js", + "scripts": { + "babel": "babel-node app.js", + "start": "nodemon --exec npm run babel", + "webpack": "webpack -w" + }, + "repository": "git@github.com:cucygh/es-cli.git", + "keywords": [ + "cuc_ygh" + ], + "author": "cuc_ygh", + "license": "Apache-2.0", + "dependencies": { + "axios": "^0.18.0", + "koa": "2.7.0", + "koa-bodyparser": "4.2.1", + "koa-ejs": "4.2.0", + "koa-router": "7.4.0", + "koa-static": "5.0.0" + }, + "devDependencies": { + "@babel/core": "7.4.4", + "@babel/node": "7.2.2", + "@babel/preset-env": "7.4.4", + "eslint": "5.16.0", + "eslint-config-standard": "12.0.0", + "eslint-plugin-import": "2.17.2", + "eslint-plugin-node": "9.0.1", + "eslint-plugin-promise": "4.1.1", + "eslint-plugin-standard": "4.0.0", + "eventsource-polyfill": "0.9.6", + "koa-webpack-dev-middleware": "2.0.2", + "koa-webpack-hot-middleware": "1.0.3", + "koa-webpack-middleware": "1.0.7", + "koa2-webpack4-dev-middleware": "1.0.1", + "nodemon": "1.19.0", + "webpack": "4.31.0", + "webpack-cli": "3.3.2" + } +} diff --git a/ES6-10/ES2019/routes/user.js b/ES6-10/ES2019/routes/user.js new file mode 100644 index 0000000..bc01431 --- /dev/null +++ b/ES6-10/ES2019/routes/user.js @@ -0,0 +1,19 @@ +import Router from 'koa-router' + +const router = new Router() + +router.get('/', async ctx => { + await ctx.render('index') +}) + +router.get('/add', async ctx => { + await ctx.render('index') +}) + +router.get('/test', async ctx => { + ctx.body = { + code: 0 + } +}) + +export default router diff --git a/ES6-10/ES2019/static/1.js b/ES6-10/ES2019/static/1.js new file mode 100644 index 0000000..e14c4f2 --- /dev/null +++ b/ES6-10/ES2019/static/1.js @@ -0,0 +1 @@ +console.log(1) diff --git a/ES6-10/ES2019/static/2.js b/ES6-10/ES2019/static/2.js new file mode 100644 index 0000000..32926e2 --- /dev/null +++ b/ES6-10/ES2019/static/2.js @@ -0,0 +1 @@ +console.log(2) diff --git a/ES6-10/ES2019/static/3.js b/ES6-10/ES2019/static/3.js new file mode 100644 index 0000000..5c92023 --- /dev/null +++ b/ES6-10/ES2019/static/3.js @@ -0,0 +1 @@ +console.log(3) diff --git a/ES6-10/ES2019/static/es10.png b/ES6-10/ES2019/static/es10.png new file mode 100644 index 0000000..afba9c9 Binary files /dev/null and b/ES6-10/ES2019/static/es10.png differ diff --git a/ES6-10/ES2019/static/es2019.jpg b/ES6-10/ES2019/static/es2019.jpg new file mode 100644 index 0000000..d4ce40a Binary files /dev/null and b/ES6-10/ES2019/static/es2019.jpg differ diff --git a/ES6-10/ES2019/static/index.css b/ES6-10/ES2019/static/index.css new file mode 100644 index 0000000..c41388e --- /dev/null +++ b/ES6-10/ES2019/static/index.css @@ -0,0 +1,145 @@ +/* http://meyerweb.com/eric/tools/css/reset/ + v2.0 | 20110126 + License: none (public domain) +*/ +a, +abbr, +acronym, +address, +applet, +article, +aside, +audio, +b, +big, +blockquote, +body, +canvas, +caption, +center, +cite, +code, +dd, +del, +details, +dfn, +div, +dl, +dt, +em, +embed, +fieldset, +figcaption, +figure, +footer, +form, +h1, +h2, +h3, +h4, +h5, +h6, +header, +hgroup, +html, +i, +iframe, +img, +ins, +kbd, +label, +legend, +li, +mark, +menu, +nav, +object, +ol, +output, +p, +pre, +q, +ruby, +s, +samp, +section, +small, +span, +strike, +strong, +sub, +summary, +sup, +table, +tbody, +td, +tfoot, +th, +thead, +time, +tr, +tt, +u, +ul, +var, +video { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; +} +/* HTML5 display-role reset for older browsers */ +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +menu, +nav, +section { + display: block; +} + +body { + line-height: 1; +} + +ol, +ul { + list-style: none; +} + +blockquote, +q { + quotes: none; +} + +blockquote:after, +blockquote:before, +q:after, +q:before { + content: ''; + content: none; +} + +table { + border-collapse: collapse; + border-spacing: 0; +} + +body, +html { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; +} + +.inner { + text-align: center; +} \ No newline at end of file diff --git a/ES6-10/ES2019/static/index.min.js b/ES6-10/ES2019/static/index.min.js new file mode 100644 index 0000000..b04b05c --- /dev/null +++ b/ES6-10/ES2019/static/index.min.js @@ -0,0 +1,100 @@ +/******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // define getter function for harmony exports +/******/ __webpack_require__.d = function(exports, name, getter) { +/******/ if(!__webpack_require__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); +/******/ } +/******/ }; +/******/ +/******/ // define __esModule on exports +/******/ __webpack_require__.r = function(exports) { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ +/******/ // create a fake namespace object +/******/ // mode & 1: value is a module id, require it +/******/ // mode & 2: merge all properties of value into the ns +/******/ // mode & 4: return value when already ns object +/******/ // mode & 8|1: behave like require +/******/ __webpack_require__.t = function(value, mode) { +/******/ if(mode & 1) value = __webpack_require__(value); +/******/ if(mode & 8) return value; +/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; +/******/ var ns = Object.create(null); +/******/ __webpack_require__.r(ns); +/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); +/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); +/******/ return ns; +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __webpack_require__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(__webpack_require__.s = "./js/index.js"); +/******/ }) +/************************************************************************/ +/******/ ({ + +/***/ "./js/index.js": +/*!*********************!*\ + !*** ./js/index.js ***! + \*********************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +eval("window.console.log(false)\n\n\n//# sourceURL=webpack:///./js/index.js?"); + +/***/ }) + +/******/ }); \ No newline at end of file diff --git a/ES6-10/ES2019/static/koa.png b/ES6-10/ES2019/static/koa.png new file mode 100644 index 0000000..075e6a9 Binary files /dev/null and b/ES6-10/ES2019/static/koa.png differ diff --git a/ES6-10/ES2019/views/index.ejs b/ES6-10/ES2019/views/index.ejs new file mode 100644 index 0000000..5b724da --- /dev/null +++ b/ES6-10/ES2019/views/index.ejs @@ -0,0 +1,3 @@ +
+ +
diff --git a/ES6-10/ES2019/views/layout.ejs b/ES6-10/ES2019/views/layout.ejs new file mode 100644 index 0000000..65f77ea --- /dev/null +++ b/ES6-10/ES2019/views/layout.ejs @@ -0,0 +1,10 @@ + + + 脚手架-ES2019从入门到精通 + + + + <%- body %> + + + \ No newline at end of file diff --git a/ES6-10/ES2019/webpack.config.babel.js b/ES6-10/ES2019/webpack.config.babel.js new file mode 100644 index 0000000..746209e --- /dev/null +++ b/ES6-10/ES2019/webpack.config.babel.js @@ -0,0 +1,13 @@ +import path from 'path' +import webpack from 'webpack' +export default ({ + entry: ['webpack-hot-middleware/client?noInfo=true&reload=true&timeout=100', './js/index.js'], + output: { + path: path.join(__dirname, '/static/'), + filename: 'index.min.js' + }, + mode: 'development', + plugins: [ + new webpack.HotModuleReplacementPlugin() + ] +}) diff --git a/ES6-10/vue-lesson/.eslintrc.js b/ES6-10/vue-lesson/.eslintrc.js new file mode 100644 index 0000000..62e4d37 --- /dev/null +++ b/ES6-10/vue-lesson/.eslintrc.js @@ -0,0 +1,24 @@ +module.exports = { + env: { + browser: true, + es6: true + }, + extends: [ + 'plugin:vue/essential', + 'standard' + ], + globals: { + Atomics: 'readonly', + SharedArrayBuffer: 'readonly' + }, + parserOptions: { + ecmaVersion: 2018, + sourceType: 'module' + }, + plugins: [ + 'vue' + ], + rules: { + 'generator-star-spacing': 'off' + } +} \ No newline at end of file diff --git a/ES6-10/vue-lesson/.gitignore b/ES6-10/vue-lesson/.gitignore new file mode 100644 index 0000000..a0dddc6 --- /dev/null +++ b/ES6-10/vue-lesson/.gitignore @@ -0,0 +1,21 @@ +.DS_Store +node_modules +/dist + +# local env files +.env.local +.env.*.local + +# Log files +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Editor directories and files +.idea +.vscode +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/ES6-10/vue-lesson/README.md b/ES6-10/vue-lesson/README.md new file mode 100644 index 0000000..eea371c --- /dev/null +++ b/ES6-10/vue-lesson/README.md @@ -0,0 +1,29 @@ +# vue-lesson + +## Project setup +``` +npm install +``` + +### Compiles and hot-reloads for development +``` +npm run serve +``` + +### Compiles and minifies for production +``` +npm run build +``` + +### Run your tests +``` +npm run test +``` + +### Lints and fixes files +``` +npm run lint +``` + +### Customize configuration +See [Configuration Reference](https://cli.vuejs.org/config/). diff --git a/ES6-10/vue-lesson/babel.config.js b/ES6-10/vue-lesson/babel.config.js new file mode 100644 index 0000000..e955840 --- /dev/null +++ b/ES6-10/vue-lesson/babel.config.js @@ -0,0 +1,5 @@ +module.exports = { + presets: [ + '@vue/cli-plugin-babel/preset' + ] +} diff --git a/ES6-10/vue-lesson/package-lock.json b/ES6-10/vue-lesson/package-lock.json new file mode 100644 index 0000000..9b67839 --- /dev/null +++ b/ES6-10/vue-lesson/package-lock.json @@ -0,0 +1,11972 @@ +{ + "name": "vue-lesson", + "version": "0.1.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/code-frame": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/code-frame/download/@babel/code-frame-7.8.3.tgz", + "integrity": "sha1-M+JZA9dIEYFTThLsCiXxa2/PQZ4=", + "dev": true, + "requires": { + "@babel/highlight": "^7.8.3" + } + }, + "@babel/compat-data": { + "version": "7.8.1", + "resolved": "https://registry.npm.taobao.org/@babel/compat-data/download/@babel/compat-data-7.8.1.tgz?cache=0&sync_timestamp=1578836035025&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fcompat-data%2Fdownload%2F%40babel%2Fcompat-data-7.8.1.tgz", + "integrity": "sha1-/Au7t5keT7K0fhaOYPLMLEFoC+k=", + "dev": true, + "requires": { + "browserslist": "^4.8.2", + "invariant": "^2.2.4", + "semver": "^5.5.0" + } + }, + "@babel/core": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/core/download/@babel/core-7.8.3.tgz?cache=0&sync_timestamp=1578959778152&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fcore%2Fdownload%2F%40babel%2Fcore-7.8.3.tgz", + "integrity": "sha1-MLDrtN0Vhd5pI6C00XngufXYKUE=", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.8.3", + "@babel/helpers": "^7.8.3", + "@babel/parser": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.0", + "lodash": "^4.17.13", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + } + }, + "@babel/generator": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/generator/download/@babel/generator-7.8.3.tgz", + "integrity": "sha1-DiLABbCpTBx06v4Z73jOU6TUXAM=", + "dev": true, + "requires": { + "@babel/types": "^7.8.3", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/helper-annotate-as-pure/download/@babel/helper-annotate-as-pure-7.8.3.tgz?cache=0&sync_timestamp=1578958545043&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-annotate-as-pure%2Fdownload%2F%40babel%2Fhelper-annotate-as-pure-7.8.3.tgz", + "integrity": "sha1-YLwLxlf2Ogkk/5pLSgskoTz03u4=", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/helper-builder-binary-assignment-operator-visitor/download/@babel/helper-builder-binary-assignment-operator-visitor-7.8.3.tgz", + "integrity": "sha1-yECXpCegYaxWocMOv1S3si0kFQM=", + "dev": true, + "requires": { + "@babel/helper-explode-assignable-expression": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-call-delegate": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/helper-call-delegate/download/@babel/helper-call-delegate-7.8.3.tgz", + "integrity": "sha1-3oJhmJiqYF1AnEK+b/uNcgRXlpI=", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.8.3", + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/helper-compilation-targets/download/@babel/helper-compilation-targets-7.8.3.tgz", + "integrity": "sha1-Le7cgW/UHcpzVe85/UDJ6mnwcZo=", + "dev": true, + "requires": { + "@babel/compat-data": "^7.8.1", + "browserslist": "^4.8.2", + "invariant": "^2.2.4", + "levenary": "^1.1.0", + "semver": "^5.5.0" + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/helper-create-class-features-plugin/download/@babel/helper-create-class-features-plugin-7.8.3.tgz", + "integrity": "sha1-W5S+iMJV8UD9LBDdFR5/mPS/85c=", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-member-expression-to-functions": "^7.8.3", + "@babel/helper-optimise-call-expression": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-replace-supers": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3" + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/helper-create-regexp-features-plugin/download/@babel/helper-create-regexp-features-plugin-7.8.3.tgz", + "integrity": "sha1-x3QmjJXsB+6SR2o4YrdcwoOb63k=", + "dev": true, + "requires": { + "@babel/helper-regex": "^7.8.3", + "regexpu-core": "^4.6.0" + } + }, + "@babel/helper-define-map": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/helper-define-map/download/@babel/helper-define-map-7.8.3.tgz", + "integrity": "sha1-oGVcrVRRw3YLcm66h18c2PqgLBU=", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.8.3", + "@babel/types": "^7.8.3", + "lodash": "^4.17.13" + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/helper-explode-assignable-expression/download/@babel/helper-explode-assignable-expression-7.8.3.tgz", + "integrity": "sha1-pyjcW06J4w/C38fQT6KKkwZT+YI=", + "dev": true, + "requires": { + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-function-name": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/helper-function-name/download/@babel/helper-function-name-7.8.3.tgz", + "integrity": "sha1-7utmWgGx8RBo6fuGrVahyxqCTMo=", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/helper-get-function-arity/download/@babel/helper-get-function-arity-7.8.3.tgz", + "integrity": "sha1-uJS5R70AQ4HOY+odufCFR+kgq9U=", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/helper-hoist-variables/download/@babel/helper-hoist-variables-7.8.3.tgz", + "integrity": "sha1-Hb6ba1XXjJtBg/yM3G4wzrg7cTQ=", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/helper-member-expression-to-functions/download/@babel/helper-member-expression-to-functions-7.8.3.tgz", + "integrity": "sha1-ZZtxBJjqbB2ZB+DHPyBu7n2twkw=", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-module-imports": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/helper-module-imports/download/@babel/helper-module-imports-7.8.3.tgz", + "integrity": "sha1-f+OVibOcAWMxtrjD9EHo8LFBlJg=", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-module-transforms": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/helper-module-transforms/download/@babel/helper-module-transforms-7.8.3.tgz", + "integrity": "sha1-0wXjXQK+5yD7wsPDYjqgwxbAFZA=", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-simple-access": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3", + "lodash": "^4.17.13" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/helper-optimise-call-expression/download/@babel/helper-optimise-call-expression-7.8.3.tgz", + "integrity": "sha1-ftBxgT0Jx1KY708giVYAa2ER7Lk=", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/helper-plugin-utils/download/@babel/helper-plugin-utils-7.8.3.tgz", + "integrity": "sha1-nqKTvhm6vA9S/4yoizTDYRsghnA=", + "dev": true + }, + "@babel/helper-regex": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/helper-regex/download/@babel/helper-regex-7.8.3.tgz", + "integrity": "sha1-E5dyYH1RuT8j7/5yEFsxnSpMaWU=", + "dev": true, + "requires": { + "lodash": "^4.17.13" + } + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/helper-remap-async-to-generator/download/@babel/helper-remap-async-to-generator-7.8.3.tgz", + "integrity": "sha1-JzxgDYub9QBhQsHjWIfVVcEu3YY=", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.8.3", + "@babel/helper-wrap-function": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-replace-supers": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/helper-replace-supers/download/@babel/helper-replace-supers-7.8.3.tgz", + "integrity": "sha1-kRktJfarvNQdqKmJ1EkldPsVMLw=", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.8.3", + "@babel/helper-optimise-call-expression": "^7.8.3", + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-simple-access": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/helper-simple-access/download/@babel/helper-simple-access-7.8.3.tgz", + "integrity": "sha1-f4EJkotNq0ZUB2mGr1dSMd62Oa4=", + "dev": true, + "requires": { + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/helper-split-export-declaration/download/@babel/helper-split-export-declaration-7.8.3.tgz", + "integrity": "sha1-ManzAHD5E2inGCzwX4MXgQZfx6k=", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-wrap-function": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/helper-wrap-function/download/@babel/helper-wrap-function-7.8.3.tgz", + "integrity": "sha1-nb2yu1XvFKqgH+jJm2Kb1TUthhA=", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helpers": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/helpers/download/@babel/helpers-7.8.3.tgz", + "integrity": "sha1-OC+7A4LOfEzpBZRauWQdaIM2zoU=", + "dev": true, + "requires": { + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/highlight": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/highlight/download/@babel/highlight-7.8.3.tgz", + "integrity": "sha1-KPFz0EIj6qpZvB1Dmjg25tEmV5c=", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/parser/download/@babel/parser-7.8.3.tgz", + "integrity": "sha1-eQh0CR0gAcm+bsQmwu7Ue8dnkIE=", + "dev": true + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-async-generator-functions/download/@babel/plugin-proposal-async-generator-functions-7.8.3.tgz", + "integrity": "sha1-utMpxnCzgliXIbJ1QMfSiGAcbm8=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-remap-async-to-generator": "^7.8.3", + "@babel/plugin-syntax-async-generators": "^7.8.0" + } + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-class-properties/download/@babel/plugin-proposal-class-properties-7.8.3.tgz?cache=0&sync_timestamp=1578959786119&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-proposal-class-properties%2Fdownload%2F%40babel%2Fplugin-proposal-class-properties-7.8.3.tgz", + "integrity": "sha1-XgZlSvXNBLYIkVqtqbKmeIAERk4=", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-proposal-decorators": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-decorators/download/@babel/plugin-proposal-decorators-7.8.3.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-proposal-decorators%2Fdownload%2F%40babel%2Fplugin-proposal-decorators-7.8.3.tgz", + "integrity": "sha1-IVaGCrZcWr8GjD9nBCGEBBBmVD4=", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-decorators": "^7.8.3" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-dynamic-import/download/@babel/plugin-proposal-dynamic-import-7.8.3.tgz", + "integrity": "sha1-OMT+VVdEgm6X4q6TCw+0zAfmYFQ=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-dynamic-import": "^7.8.0" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-json-strings/download/@babel/plugin-proposal-json-strings-7.8.3.tgz", + "integrity": "sha1-2lIWsjipi1ih4F1oUhBLEPmnDWs=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.0" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-nullish-coalescing-operator/download/@babel/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha1-5FciU/3u1lzd7s/as/kor+sv1dI=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-object-rest-spread/download/@babel/plugin-proposal-object-rest-spread-7.8.3.tgz?cache=0&sync_timestamp=1578959778278&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.8.3.tgz", + "integrity": "sha1-61rjZhGN3KZ77Vg7U9dVTK2ZUbs=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-optional-catch-binding/download/@babel/plugin-proposal-optional-catch-binding-7.8.3.tgz", + "integrity": "sha1-ne6WqxZQ7tiGRq6XNMoWesSpxck=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-optional-chaining/download/@babel/plugin-proposal-optional-chaining-7.8.3.tgz", + "integrity": "sha1-rhCzIUyyX3rbHzvIe6QsoQt+JUM=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.0" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-unicode-property-regex/download/@babel/plugin-proposal-unicode-property-regex-7.8.3.tgz", + "integrity": "sha1-tkbDrepfmIAMmrRRBaw00GzUpH8=", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@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-decorators": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-decorators/download/@babel/plugin-syntax-decorators-7.8.3.tgz", + "integrity": "sha1-jSwVqfGvYksAJflhaCqdU9MAG9o=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@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=1578959786243&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-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-jsx": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-jsx/download/@babel/plugin-syntax-jsx-7.8.3.tgz", + "integrity": "sha1-UhsGyDxASA8eWLT9M7kuzrHW6pQ=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@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-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.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-top-level-await/download/@babel/plugin-syntax-top-level-await-7.8.3.tgz", + "integrity": "sha1-Os3s5pXmsTqvV/wpHRqACVDHE5E=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-arrow-functions/download/@babel/plugin-transform-arrow-functions-7.8.3.tgz", + "integrity": "sha1-gndsLtDNnhpJlW2uuJYCTJRzuLY=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-async-to-generator/download/@babel/plugin-transform-async-to-generator-7.8.3.tgz", + "integrity": "sha1-Qwj60NlAnXHq+5sabuNfnWS2QIY=", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-remap-async-to-generator": "^7.8.3" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-block-scoped-functions/download/@babel/plugin-transform-block-scoped-functions-7.8.3.tgz", + "integrity": "sha1-Q37sW3mbWFIHIISzrl72boNJ6KM=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-block-scoping/download/@babel/plugin-transform-block-scoping-7.8.3.tgz", + "integrity": "sha1-l9Ndq2aFekN8FmNYuR0JBQyGjzo=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "lodash": "^4.17.13" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-classes/download/@babel/plugin-transform-classes-7.8.3.tgz", + "integrity": "sha1-Rv16nSu56onOiHIEd5ef4NcbIbg=", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.8.3", + "@babel/helper-define-map": "^7.8.3", + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-optimise-call-expression": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-replace-supers": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-computed-properties/download/@babel/plugin-transform-computed-properties-7.8.3.tgz", + "integrity": "sha1-ltDSi3985OtbEguy4OlDNDyG+Bs=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-destructuring/download/@babel/plugin-transform-destructuring-7.8.3.tgz", + "integrity": "sha1-IN372eRnaQaxBW7mCviFkMx6qgs=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-dotall-regex/download/@babel/plugin-transform-dotall-regex-7.8.3.tgz", + "integrity": "sha1-w8bsXuYSXGmTxcvKINyGIanqem4=", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-duplicate-keys/download/@babel/plugin-transform-duplicate-keys-7.8.3.tgz", + "integrity": "sha1-jRLfMJqlN/JyiZxWXqF2jihuIfE=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-exponentiation-operator/download/@babel/plugin-transform-exponentiation-operator-7.8.3.tgz", + "integrity": "sha1-WBptf1aXDga/UVYM1k9elHtw17c=", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-for-of/download/@babel/plugin-transform-for-of-7.8.3.tgz", + "integrity": "sha1-FfF7zi/JXH1ZokspnoPoHO3CLhg=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-function-name/download/@babel/plugin-transform-function-name-7.8.3.tgz", + "integrity": "sha1-J5NzyycyKqrWfCaD53bfxHGW7Ys=", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-literals/download/@babel/plugin-transform-literals-7.8.3.tgz", + "integrity": "sha1-rvI5gj2RmU7Hto5VGTUl1229XcE=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-member-expression-literals/download/@babel/plugin-transform-member-expression-literals-7.8.3.tgz", + "integrity": "sha1-lj/tS2IKx8v2Apx1VCQCn6OkBBA=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-modules-amd/download/@babel/plugin-transform-modules-amd-7.8.3.tgz", + "integrity": "sha1-ZWBtRGFrUCJedvVXjzPFaKC4dqU=", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "babel-plugin-dynamic-import-node": "^2.3.0" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-modules-commonjs/download/@babel/plugin-transform-modules-commonjs-7.8.3.tgz?cache=0&sync_timestamp=1578959786367&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-modules-commonjs%2Fdownload%2F%40babel%2Fplugin-transform-modules-commonjs-7.8.3.tgz", + "integrity": "sha1-3yUXBuwzG9BYo0vdcmE5FfgpKKU=", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-simple-access": "^7.8.3", + "babel-plugin-dynamic-import-node": "^2.3.0" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-modules-systemjs/download/@babel/plugin-transform-modules-systemjs-7.8.3.tgz", + "integrity": "sha1-2LvyIsHb42YfRA8vAMFum7fQ1CA=", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.8.3", + "@babel/helper-module-transforms": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "babel-plugin-dynamic-import-node": "^2.3.0" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-modules-umd/download/@babel/plugin-transform-modules-umd-7.8.3.tgz", + "integrity": "sha1-WS1XjOBsUvW5iwL5E9ZT/+lyZho=", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-named-capturing-groups-regex/download/@babel/plugin-transform-named-capturing-groups-regex-7.8.3.tgz", + "integrity": "sha1-oqcr/6ICrA4tBQav0JOcXsvEjGw=", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.8.3" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-new-target/download/@babel/plugin-transform-new-target-7.8.3.tgz", + "integrity": "sha1-YMwq5m2FyVq1QOs0urtkNNTHDEM=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-object-super/download/@babel/plugin-transform-object-super-7.8.3.tgz?cache=0&sync_timestamp=1578960944103&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-object-super%2Fdownload%2F%40babel%2Fplugin-transform-object-super-7.8.3.tgz", + "integrity": "sha1-67ah56hv+paFi9asAQLWWUQmFyU=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-replace-supers": "^7.8.3" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-parameters/download/@babel/plugin-transform-parameters-7.8.3.tgz", + "integrity": "sha1-eJBXahOxcyXYt9RMs38h3Du92lk=", + "dev": true, + "requires": { + "@babel/helper-call-delegate": "^7.8.3", + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-property-literals/download/@babel/plugin-transform-property-literals-7.8.3.tgz", + "integrity": "sha1-MxlDANhTnB7SjGKtUIe6OAe5gmM=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-regenerator/download/@babel/plugin-transform-regenerator-7.8.3.tgz", + "integrity": "sha1-sxAx6AWcB0lb8jYUyX89lpi8bsg=", + "dev": true, + "requires": { + "regenerator-transform": "^0.14.0" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-reserved-words/download/@babel/plugin-transform-reserved-words-7.8.3.tgz", + "integrity": "sha1-mgY1rE5mXSmxYoN908xQdF398fU=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-runtime": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-runtime/download/@babel/plugin-transform-runtime-7.8.3.tgz?cache=0&sync_timestamp=1578959786504&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-runtime%2Fdownload%2F%40babel%2Fplugin-transform-runtime-7.8.3.tgz", + "integrity": "sha1-wBU7wKU3XrwfFZHLfuoiOt6p8Wk=", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "resolve": "^1.8.1", + "semver": "^5.5.1" + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-shorthand-properties/download/@babel/plugin-transform-shorthand-properties-7.8.3.tgz", + "integrity": "sha1-KFRSFuAjqDLU06EYXtSSvP6sCMg=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-spread/download/@babel/plugin-transform-spread-7.8.3.tgz", + "integrity": "sha1-nI/+gXD9+4ixFOy5ILgvtulf5eg=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-sticky-regex/download/@babel/plugin-transform-sticky-regex-7.8.3.tgz", + "integrity": "sha1-vnoSkPgdrnZ0dUUhmeH3bWF1sQA=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-regex": "^7.8.3" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-template-literals/download/@babel/plugin-transform-template-literals-7.8.3.tgz", + "integrity": "sha1-e/pHMrRV6mpDEwrcC6dn7A5AKoA=", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-typeof-symbol/download/@babel/plugin-transform-typeof-symbol-7.8.3.tgz", + "integrity": "sha1-XP+yFvslyMZLpr9fds5J06sHn00=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-unicode-regex/download/@babel/plugin-transform-unicode-regex-7.8.3.tgz", + "integrity": "sha1-DO8247pz5cVyc+/7GC9GuRoeyq0=", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/preset-env": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/preset-env/download/@babel/preset-env-7.8.3.tgz?cache=0&sync_timestamp=1578959778442&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fpreset-env%2Fdownload%2F%40babel%2Fpreset-env-7.8.3.tgz", + "integrity": "sha1-3A+yk49Su93XmzyGGks0J906bFQ=", + "dev": true, + "requires": { + "@babel/compat-data": "^7.8.0", + "@babel/helper-compilation-targets": "^7.8.3", + "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-proposal-async-generator-functions": "^7.8.3", + "@babel/plugin-proposal-dynamic-import": "^7.8.3", + "@babel/plugin-proposal-json-strings": "^7.8.3", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-proposal-object-rest-spread": "^7.8.3", + "@babel/plugin-proposal-optional-catch-binding": "^7.8.3", + "@babel/plugin-proposal-optional-chaining": "^7.8.3", + "@babel/plugin-proposal-unicode-property-regex": "^7.8.3", + "@babel/plugin-syntax-async-generators": "^7.8.0", + "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/plugin-syntax-json-strings": "^7.8.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", + "@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.8.3", + "@babel/plugin-transform-arrow-functions": "^7.8.3", + "@babel/plugin-transform-async-to-generator": "^7.8.3", + "@babel/plugin-transform-block-scoped-functions": "^7.8.3", + "@babel/plugin-transform-block-scoping": "^7.8.3", + "@babel/plugin-transform-classes": "^7.8.3", + "@babel/plugin-transform-computed-properties": "^7.8.3", + "@babel/plugin-transform-destructuring": "^7.8.3", + "@babel/plugin-transform-dotall-regex": "^7.8.3", + "@babel/plugin-transform-duplicate-keys": "^7.8.3", + "@babel/plugin-transform-exponentiation-operator": "^7.8.3", + "@babel/plugin-transform-for-of": "^7.8.3", + "@babel/plugin-transform-function-name": "^7.8.3", + "@babel/plugin-transform-literals": "^7.8.3", + "@babel/plugin-transform-member-expression-literals": "^7.8.3", + "@babel/plugin-transform-modules-amd": "^7.8.3", + "@babel/plugin-transform-modules-commonjs": "^7.8.3", + "@babel/plugin-transform-modules-systemjs": "^7.8.3", + "@babel/plugin-transform-modules-umd": "^7.8.3", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.8.3", + "@babel/plugin-transform-new-target": "^7.8.3", + "@babel/plugin-transform-object-super": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.8.3", + "@babel/plugin-transform-property-literals": "^7.8.3", + "@babel/plugin-transform-regenerator": "^7.8.3", + "@babel/plugin-transform-reserved-words": "^7.8.3", + "@babel/plugin-transform-shorthand-properties": "^7.8.3", + "@babel/plugin-transform-spread": "^7.8.3", + "@babel/plugin-transform-sticky-regex": "^7.8.3", + "@babel/plugin-transform-template-literals": "^7.8.3", + "@babel/plugin-transform-typeof-symbol": "^7.8.3", + "@babel/plugin-transform-unicode-regex": "^7.8.3", + "@babel/types": "^7.8.3", + "browserslist": "^4.8.2", + "core-js-compat": "^3.6.2", + "invariant": "^2.2.2", + "levenary": "^1.1.0", + "semver": "^5.5.0" + } + }, + "@babel/runtime": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/runtime/download/@babel/runtime-7.8.3.tgz?cache=0&sync_timestamp=1578959786754&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fruntime%2Fdownload%2F%40babel%2Fruntime-7.8.3.tgz", + "integrity": "sha1-CBGUT3OmySa7KtNekY3MG/qyefE=", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.2" + } + }, + "@babel/template": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/template/download/@babel/template-7.8.3.tgz", + "integrity": "sha1-4CrQT+JipleAkyf1eAVsoV/U0bg=", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/traverse": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/traverse/download/@babel/traverse-7.8.3.tgz", + "integrity": "sha1-qCYhWwEcm09z86iTr7wFFRNYv5o=", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.8.3", + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/parser": "^7.8.3", + "@babel/types": "^7.8.3", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/types/download/@babel/types-7.8.3.tgz", + "integrity": "sha1-Wjg9/6VBbbG3Pe3/0xH/0HiPsxw=", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "@hapi/address": { + "version": "2.1.4", + "resolved": "https://registry.npm.taobao.org/@hapi/address/download/@hapi/address-2.1.4.tgz", + "integrity": "sha1-XWftQ/P9QaadS5/3tW58DR0KgeU=", + "dev": true + }, + "@hapi/bourne": { + "version": "1.3.2", + "resolved": "https://registry.npm.taobao.org/@hapi/bourne/download/@hapi/bourne-1.3.2.tgz", + "integrity": "sha1-CnCVreoGckPOMoPhtWuKj0U7JCo=", + "dev": true + }, + "@hapi/hoek": { + "version": "8.5.0", + "resolved": "https://registry.npm.taobao.org/@hapi/hoek/download/@hapi/hoek-8.5.0.tgz", + "integrity": "sha1-L5zjAciJjhwySLCoVkaWsk0amlo=", + "dev": true + }, + "@hapi/joi": { + "version": "15.1.1", + "resolved": "https://registry.npm.taobao.org/@hapi/joi/download/@hapi/joi-15.1.1.tgz", + "integrity": "sha1-xnW4pxKW8Cgz+NbSQ7NMV7jOGdc=", + "dev": true, + "requires": { + "@hapi/address": "2.x.x", + "@hapi/bourne": "1.x.x", + "@hapi/hoek": "8.x.x", + "@hapi/topo": "3.x.x" + } + }, + "@hapi/topo": { + "version": "3.1.6", + "resolved": "https://registry.npm.taobao.org/@hapi/topo/download/@hapi/topo-3.1.6.tgz", + "integrity": "sha1-aNk1+j6uf91asNf5U/MgXYsr/Ck=", + "dev": true, + "requires": { + "@hapi/hoek": "^8.3.0" + } + }, + "@intervolga/optimize-cssnano-plugin": { + "version": "1.0.6", + "resolved": "https://registry.npm.taobao.org/@intervolga/optimize-cssnano-plugin/download/@intervolga/optimize-cssnano-plugin-1.0.6.tgz", + "integrity": "sha1-vnx4RhKLiPapsdEmGgrQbrXA/fg=", + "dev": true, + "requires": { + "cssnano": "^4.0.0", + "cssnano-preset-default": "^4.0.0", + "postcss": "^7.0.0" + } + }, + "@mrmlnc/readdir-enhanced": { + "version": "2.2.1", + "resolved": "https://registry.npm.taobao.org/@mrmlnc/readdir-enhanced/download/@mrmlnc/readdir-enhanced-2.2.1.tgz", + "integrity": "sha1-UkryQNGjYFJ7cwR17PoTRKpUDd4=", + "dev": true, + "requires": { + "call-me-maybe": "^1.0.1", + "glob-to-regexp": "^0.3.0" + } + }, + "@nodelib/fs.stat": { + "version": "1.1.3", + "resolved": "https://registry.npm.taobao.org/@nodelib/fs.stat/download/@nodelib/fs.stat-1.1.3.tgz?cache=0&sync_timestamp=1570173890448&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40nodelib%2Ffs.stat%2Fdownload%2F%40nodelib%2Ffs.stat-1.1.3.tgz", + "integrity": "sha1-K1o6s/kYzKSKjHVMCBaOPwPrphs=", + "dev": true + }, + "@soda/friendly-errors-webpack-plugin": { + "version": "1.7.1", + "resolved": "https://registry.npm.taobao.org/@soda/friendly-errors-webpack-plugin/download/@soda/friendly-errors-webpack-plugin-1.7.1.tgz", + "integrity": "sha1-cG9kvLSouWQrSK46zkRMcDNNYV0=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "error-stack-parser": "^2.0.0", + "string-width": "^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=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-3.0.1.tgz?cache=0&sync_timestamp=1573280518303&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/@types/color-name/download/@types/color-name-1.1.1.tgz", + "integrity": "sha1-HBJhu+qhCoBVu8XYq4S3sq/IRqA=", + "dev": true + }, + "@types/events": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/@types/events/download/@types/events-3.0.0.tgz", + "integrity": "sha1-KGLz9Yqaf3w+eNefEw3U1xwlwqc=", + "dev": true + }, + "@types/glob": { + "version": "7.1.1", + "resolved": "https://registry.npm.taobao.org/@types/glob/download/@types/glob-7.1.1.tgz", + "integrity": "sha1-qlmhxuP7xCHgfM0xqUTDDrpSFXU=", + "dev": true, + "requires": { + "@types/events": "*", + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npm.taobao.org/@types/minimatch/download/@types/minimatch-3.0.3.tgz", + "integrity": "sha1-PcoOPzOyAPx9ETnAzZbBJoyt/Z0=", + "dev": true + }, + "@types/node": { + "version": "13.5.0", + "resolved": "https://registry.npm.taobao.org/@types/node/download/@types/node-13.5.0.tgz", + "integrity": "sha1-TkmNvzVXlaYRqHrl74EahmDUJmI=", + "dev": true + }, + "@types/normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npm.taobao.org/@types/normalize-package-data/download/@types/normalize-package-data-2.4.0.tgz", + "integrity": "sha1-5IbQ2XOW15vu3QpuM/RTT/a0lz4=", + "dev": true + }, + "@types/q": { + "version": "1.5.2", + "resolved": "https://registry.npm.taobao.org/@types/q/download/@types/q-1.5.2.tgz", + "integrity": "sha1-aQoUdbhPKohP0HzXl8APXzE1bqg=", + "dev": true + }, + "@vue/babel-helper-vue-jsx-merge-props": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/@vue/babel-helper-vue-jsx-merge-props/download/@vue/babel-helper-vue-jsx-merge-props-1.0.0.tgz", + "integrity": "sha1-BI/leZWNpAj7eosqPsBQtQpmEEA=", + "dev": true + }, + "@vue/babel-plugin-transform-vue-jsx": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/@vue/babel-plugin-transform-vue-jsx/download/@vue/babel-plugin-transform-vue-jsx-1.1.2.tgz?cache=0&sync_timestamp=1573270688609&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40vue%2Fbabel-plugin-transform-vue-jsx%2Fdownload%2F%40vue%2Fbabel-plugin-transform-vue-jsx-1.1.2.tgz", + "integrity": "sha1-wKPm78Ai515CR7RIqPxrhvA+kcA=", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.2.0", + "@vue/babel-helper-vue-jsx-merge-props": "^1.0.0", + "html-tags": "^2.0.0", + "lodash.kebabcase": "^4.1.1", + "svg-tags": "^1.0.0" + } + }, + "@vue/babel-preset-app": { + "version": "4.1.2", + "resolved": "https://registry.npm.taobao.org/@vue/babel-preset-app/download/@vue/babel-preset-app-4.1.2.tgz", + "integrity": "sha1-3FJVmz/DTC9ETau447sKoDhA6Ns=", + "dev": true, + "requires": { + "@babel/core": "^7.7.4", + "@babel/helper-module-imports": "^7.7.4", + "@babel/plugin-proposal-class-properties": "^7.7.4", + "@babel/plugin-proposal-decorators": "^7.7.4", + "@babel/plugin-syntax-dynamic-import": "^7.7.4", + "@babel/plugin-syntax-jsx": "^7.7.4", + "@babel/plugin-transform-runtime": "^7.7.4", + "@babel/preset-env": "^7.7.4", + "@babel/runtime": "^7.7.4", + "@vue/babel-preset-jsx": "^1.1.2", + "babel-plugin-dynamic-import-node": "^2.2.0", + "core-js": "^3.4.4", + "core-js-compat": "^3.4.4" + } + }, + "@vue/babel-preset-jsx": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/@vue/babel-preset-jsx/download/@vue/babel-preset-jsx-1.1.2.tgz", + "integrity": "sha1-LhaetMIE6jfKZsLqhaiAv8mdTyA=", + "dev": true, + "requires": { + "@vue/babel-helper-vue-jsx-merge-props": "^1.0.0", + "@vue/babel-plugin-transform-vue-jsx": "^1.1.2", + "@vue/babel-sugar-functional-vue": "^1.1.2", + "@vue/babel-sugar-inject-h": "^1.1.2", + "@vue/babel-sugar-v-model": "^1.1.2", + "@vue/babel-sugar-v-on": "^1.1.2" + } + }, + "@vue/babel-sugar-functional-vue": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/@vue/babel-sugar-functional-vue/download/@vue/babel-sugar-functional-vue-1.1.2.tgz", + "integrity": "sha1-9+JPugnm8e5wEEVgqICAV1VfGpo=", + "dev": true, + "requires": { + "@babel/plugin-syntax-jsx": "^7.2.0" + } + }, + "@vue/babel-sugar-inject-h": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/@vue/babel-sugar-inject-h/download/@vue/babel-sugar-inject-h-1.1.2.tgz", + "integrity": "sha1-ilJ2ttji7Rb/yAeKrZQjYnTm7fA=", + "dev": true, + "requires": { + "@babel/plugin-syntax-jsx": "^7.2.0" + } + }, + "@vue/babel-sugar-v-model": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/@vue/babel-sugar-v-model/download/@vue/babel-sugar-v-model-1.1.2.tgz", + "integrity": "sha1-H/b9G4ACI/ycsehNzrXlLXN6gZI=", + "dev": true, + "requires": { + "@babel/plugin-syntax-jsx": "^7.2.0", + "@vue/babel-helper-vue-jsx-merge-props": "^1.0.0", + "@vue/babel-plugin-transform-vue-jsx": "^1.1.2", + "camelcase": "^5.0.0", + "html-tags": "^2.0.0", + "svg-tags": "^1.0.0" + } + }, + "@vue/babel-sugar-v-on": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/@vue/babel-sugar-v-on/download/@vue/babel-sugar-v-on-1.1.2.tgz", + "integrity": "sha1-su+ZuPL6sJ++rSWq1w70Lhz1sTs=", + "dev": true, + "requires": { + "@babel/plugin-syntax-jsx": "^7.2.0", + "@vue/babel-plugin-transform-vue-jsx": "^1.1.2", + "camelcase": "^5.0.0" + } + }, + "@vue/cli-overlay": { + "version": "4.1.2", + "resolved": "https://registry.npm.taobao.org/@vue/cli-overlay/download/@vue/cli-overlay-4.1.2.tgz", + "integrity": "sha1-1dqIE5pSLZimDtzG9hwKBs36l/E=", + "dev": true + }, + "@vue/cli-plugin-babel": { + "version": "4.1.2", + "resolved": "https://registry.npm.taobao.org/@vue/cli-plugin-babel/download/@vue/cli-plugin-babel-4.1.2.tgz", + "integrity": "sha1-sDiAYXcn/nhrKM70PvU9R7g7DCg=", + "dev": true, + "requires": { + "@babel/core": "^7.7.4", + "@vue/babel-preset-app": "^4.1.2", + "@vue/cli-shared-utils": "^4.1.2", + "babel-loader": "^8.0.6", + "cache-loader": "^4.1.0", + "thread-loader": "^2.1.3", + "webpack": "^4.0.0" + } + }, + "@vue/cli-plugin-eslint": { + "version": "4.1.2", + "resolved": "https://registry.npm.taobao.org/@vue/cli-plugin-eslint/download/@vue/cli-plugin-eslint-4.1.2.tgz?cache=0&sync_timestamp=1577539507730&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40vue%2Fcli-plugin-eslint%2Fdownload%2F%40vue%2Fcli-plugin-eslint-4.1.2.tgz", + "integrity": "sha1-Fz0qQL633rwDohfbO7TGfL8lW9Y=", + "dev": true, + "requires": { + "@vue/cli-shared-utils": "^4.1.2", + "eslint-loader": "^2.1.2", + "globby": "^9.2.0", + "webpack": "^4.0.0", + "yorkie": "^2.0.0" + } + }, + "@vue/cli-plugin-router": { + "version": "4.1.2", + "resolved": "https://registry.npm.taobao.org/@vue/cli-plugin-router/download/@vue/cli-plugin-router-4.1.2.tgz", + "integrity": "sha1-3A/d+kuIEvioF0asW+/7kWjcyB8=", + "dev": true, + "requires": { + "@vue/cli-shared-utils": "^4.1.2" + } + }, + "@vue/cli-plugin-vuex": { + "version": "4.1.2", + "resolved": "https://registry.npm.taobao.org/@vue/cli-plugin-vuex/download/@vue/cli-plugin-vuex-4.1.2.tgz", + "integrity": "sha1-XnKLVq2d4vBiqJRPg4r/oCl8y5k=", + "dev": true + }, + "@vue/cli-service": { + "version": "4.1.2", + "resolved": "https://registry.npm.taobao.org/@vue/cli-service/download/@vue/cli-service-4.1.2.tgz", + "integrity": "sha1-AF8dvUYmI37sebJW89koCBiEwyU=", + "dev": true, + "requires": { + "@intervolga/optimize-cssnano-plugin": "^1.0.5", + "@soda/friendly-errors-webpack-plugin": "^1.7.1", + "@vue/cli-overlay": "^4.1.2", + "@vue/cli-plugin-router": "^4.1.2", + "@vue/cli-plugin-vuex": "^4.1.2", + "@vue/cli-shared-utils": "^4.1.2", + "@vue/component-compiler-utils": "^3.0.2", + "@vue/preload-webpack-plugin": "^1.1.0", + "@vue/web-component-wrapper": "^1.2.0", + "acorn": "^6.1.1", + "acorn-walk": "^6.1.1", + "address": "^1.1.2", + "autoprefixer": "^9.7.2", + "browserslist": "^4.7.3", + "cache-loader": "^4.1.0", + "case-sensitive-paths-webpack-plugin": "^2.2.0", + "cli-highlight": "^2.1.4", + "clipboardy": "^2.0.0", + "cliui": "^5.0.0", + "copy-webpack-plugin": "^5.0.5", + "css-loader": "^3.1.0", + "cssnano": "^4.1.10", + "current-script-polyfill": "^1.0.0", + "debug": "^4.1.1", + "default-gateway": "^5.0.5", + "dotenv": "^8.2.0", + "dotenv-expand": "^5.1.0", + "file-loader": "^4.2.0", + "fs-extra": "^7.0.1", + "globby": "^9.2.0", + "hash-sum": "^1.0.2", + "html-webpack-plugin": "^3.2.0", + "launch-editor-middleware": "^2.2.1", + "lodash.defaultsdeep": "^4.6.1", + "lodash.mapvalues": "^4.6.0", + "lodash.transform": "^4.6.0", + "mini-css-extract-plugin": "^0.8.0", + "minimist": "^1.2.0", + "portfinder": "^1.0.25", + "postcss-loader": "^3.0.0", + "read-pkg": "^5.1.1", + "ssri": "^7.1.0", + "terser-webpack-plugin": "^2.2.1", + "thread-loader": "^2.1.3", + "url-loader": "^2.2.0", + "vue-loader": "^15.7.2", + "vue-style-loader": "^4.1.0", + "webpack": "^4.0.0", + "webpack-bundle-analyzer": "^3.6.0", + "webpack-chain": "^6.0.0", + "webpack-dev-server": "^3.9.0", + "webpack-merge": "^4.2.2" + }, + "dependencies": { + "cacache": { + "version": "13.0.1", + "resolved": "https://registry.npm.taobao.org/cacache/download/cacache-13.0.1.tgz", + "integrity": "sha1-qAAMIWlwiQgvhSh6GuxuOCAkpxw=", + "dev": true, + "requires": { + "chownr": "^1.1.2", + "figgy-pudding": "^3.5.1", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.2", + "infer-owner": "^1.0.4", + "lru-cache": "^5.1.1", + "minipass": "^3.0.0", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "p-map": "^3.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^2.7.1", + "ssri": "^7.0.0", + "unique-filename": "^1.1.1" + } + }, + "find-cache-dir": { + "version": "3.2.0", + "resolved": "https://registry.npm.taobao.org/find-cache-dir/download/find-cache-dir-3.2.0.tgz?cache=0&sync_timestamp=1576153981844&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffind-cache-dir%2Fdownload%2Ffind-cache-dir-3.2.0.tgz", + "integrity": "sha1-5/5EwavBKZ9RYUblYxCP0QBsGHQ=", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.0", + "pkg-dir": "^4.1.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npm.taobao.org/find-up/download/find-up-4.1.0.tgz", + "integrity": "sha1-l6/n1s3AvFkoWEt8jXsW6KmqXRk=", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npm.taobao.org/locate-path/download/locate-path-5.0.0.tgz", + "integrity": "sha1-Gvujlq/WdqbUJQTQpno6frn2KqA=", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "make-dir": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/make-dir/download/make-dir-3.0.0.tgz", + "integrity": "sha1-G1859rknDtM/nwVMXA+EMEmJ+AE=", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npm.taobao.org/p-locate/download/p-locate-4.1.0.tgz", + "integrity": "sha1-o0KLtwiLOmApL2aRkni3wpetTwc=", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/path-exists/download/path-exists-4.0.0.tgz", + "integrity": "sha1-UTvb4tO5XXdi6METfvoZXGxhtbM=", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npm.taobao.org/pkg-dir/download/pkg-dir-4.2.0.tgz", + "integrity": "sha1-8JkTPfft5CLoHR2ESCcO6z5CYfM=", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz", + "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + }, + "ssri": { + "version": "7.1.0", + "resolved": "https://registry.npm.taobao.org/ssri/download/ssri-7.1.0.tgz?cache=0&sync_timestamp=1571962511410&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fssri%2Fdownload%2Fssri-7.1.0.tgz", + "integrity": "sha1-ksJBv23oI2W1x/tL126XVSLhKU0=", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1", + "minipass": "^3.1.1" + } + }, + "terser-webpack-plugin": { + "version": "2.3.2", + "resolved": "https://registry.npm.taobao.org/terser-webpack-plugin/download/terser-webpack-plugin-2.3.2.tgz", + "integrity": "sha1-bT0bBZDI9ym/uut/slKLi2LbTHQ=", + "dev": true, + "requires": { + "cacache": "^13.0.1", + "find-cache-dir": "^3.2.0", + "jest-worker": "^24.9.0", + "schema-utils": "^2.6.1", + "serialize-javascript": "^2.1.2", + "source-map": "^0.6.1", + "terser": "^4.4.3", + "webpack-sources": "^1.4.3" + } + } + } + }, + "@vue/cli-shared-utils": { + "version": "4.1.2", + "resolved": "https://registry.npm.taobao.org/@vue/cli-shared-utils/download/@vue/cli-shared-utils-4.1.2.tgz", + "integrity": "sha1-0zmEyHkK2Gnvd/Uimr0+jlhP5Ys=", + "dev": true, + "requires": { + "@hapi/joi": "^15.0.1", + "chalk": "^2.4.2", + "execa": "^1.0.0", + "launch-editor": "^2.2.1", + "lru-cache": "^5.1.1", + "node-ipc": "^9.1.1", + "open": "^6.3.0", + "ora": "^3.4.0", + "request": "^2.87.0", + "request-promise-native": "^1.0.8", + "semver": "^6.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz", + "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=", + "dev": true + } + } + }, + "@vue/component-compiler-utils": { + "version": "3.1.1", + "resolved": "https://registry.npm.taobao.org/@vue/component-compiler-utils/download/@vue/component-compiler-utils-3.1.1.tgz?cache=0&sync_timestamp=1578324418694&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40vue%2Fcomponent-compiler-utils%2Fdownload%2F%40vue%2Fcomponent-compiler-utils-3.1.1.tgz", + "integrity": "sha1-1O+PgCkmdARK1iEeM2owLk0qZXU=", + "dev": true, + "requires": { + "consolidate": "^0.15.1", + "hash-sum": "^1.0.2", + "lru-cache": "^4.1.2", + "merge-source-map": "^1.1.0", + "postcss": "^7.0.14", + "postcss-selector-parser": "^6.0.2", + "prettier": "^1.18.2", + "source-map": "~0.6.1", + "vue-template-es2015-compiler": "^1.9.0" + }, + "dependencies": { + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/cssesc/download/cssesc-3.0.0.tgz", + "integrity": "sha1-N3QZGZA7hoVl4cCep0dEXNGJg+4=", + "dev": true + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npm.taobao.org/lru-cache/download/lru-cache-4.1.5.tgz", + "integrity": "sha1-i75Q6oW+1ZvJ4z3KuCNe6bz0Q80=", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "postcss-selector-parser": { + "version": "6.0.2", + "resolved": "https://registry.npm.taobao.org/postcss-selector-parser/download/postcss-selector-parser-6.0.2.tgz", + "integrity": "sha1-k0z3mdAWyDQRhZ4J3Oyt4BKG7Fw=", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.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=", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npm.taobao.org/yallist/download/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } + } + }, + "@vue/preload-webpack-plugin": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/@vue/preload-webpack-plugin/download/@vue/preload-webpack-plugin-1.1.1.tgz", + "integrity": "sha1-GHI1MNME9EMCHaIpLW7JUCgmEEo=", + "dev": true + }, + "@vue/web-component-wrapper": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/@vue/web-component-wrapper/download/@vue/web-component-wrapper-1.2.0.tgz", + "integrity": "sha1-uw5G8VhafiibTuYGfcxaauYvHdE=", + "dev": true + }, + "@webassemblyjs/ast": { + "version": "1.8.5", + "resolved": "https://registry.npm.taobao.org/@webassemblyjs/ast/download/@webassemblyjs/ast-1.8.5.tgz", + "integrity": "sha1-UbHF/mV2o0lTv0slPfnw1JDZ41k=", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.8.5", + "resolved": "https://registry.npm.taobao.org/@webassemblyjs/floating-point-hex-parser/download/@webassemblyjs/floating-point-hex-parser-1.8.5.tgz", + "integrity": "sha1-G6kmopI2E+3OSW/VsC6M6KX0lyE=", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.8.5", + "resolved": "https://registry.npm.taobao.org/@webassemblyjs/helper-api-error/download/@webassemblyjs/helper-api-error-1.8.5.tgz", + "integrity": "sha1-xJ2tIvZFInxe22EL25aX8aq3Ifc=", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.8.5", + "resolved": "https://registry.npm.taobao.org/@webassemblyjs/helper-buffer/download/@webassemblyjs/helper-buffer-1.8.5.tgz", + "integrity": "sha1-/qk+Qphj3V5DOFVfQikjhaZT8gQ=", + "dev": true + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.8.5", + "resolved": "https://registry.npm.taobao.org/@webassemblyjs/helper-code-frame/download/@webassemblyjs/helper-code-frame-1.8.5.tgz", + "integrity": "sha1-mnQP9I4/qjAisd/1RCPfmqKTwl4=", + "dev": true, + "requires": { + "@webassemblyjs/wast-printer": "1.8.5" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.8.5", + "resolved": "https://registry.npm.taobao.org/@webassemblyjs/helper-fsm/download/@webassemblyjs/helper-fsm-1.8.5.tgz", + "integrity": "sha1-ugt9Oz9+RzPaYFnJMyJ12GBwJFI=", + "dev": true + }, + "@webassemblyjs/helper-module-context": { + "version": "1.8.5", + "resolved": "https://registry.npm.taobao.org/@webassemblyjs/helper-module-context/download/@webassemblyjs/helper-module-context-1.8.5.tgz", + "integrity": "sha1-3vS5knsBAdyMu9jR7bW3ucguskU=", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "mamacro": "^0.0.3" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.8.5", + "resolved": "https://registry.npm.taobao.org/@webassemblyjs/helper-wasm-bytecode/download/@webassemblyjs/helper-wasm-bytecode-1.8.5.tgz", + "integrity": "sha1-U3p1Dt31weky83RCBlUckcG5PmE=", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.8.5", + "resolved": "https://registry.npm.taobao.org/@webassemblyjs/helper-wasm-section/download/@webassemblyjs/helper-wasm-section-1.8.5.tgz", + "integrity": "sha1-dMpqa8vhnlCjtrRihH5pUD5r/L8=", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.8.5", + "resolved": "https://registry.npm.taobao.org/@webassemblyjs/ieee754/download/@webassemblyjs/ieee754-1.8.5.tgz", + "integrity": "sha1-cSMp2+8kDza/V70ve4+5v0FUQh4=", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.8.5", + "resolved": "https://registry.npm.taobao.org/@webassemblyjs/leb128/download/@webassemblyjs/leb128-1.8.5.tgz", + "integrity": "sha1-BE7es06mefPgTNT9mCTV41dnrhA=", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.8.5", + "resolved": "https://registry.npm.taobao.org/@webassemblyjs/utf8/download/@webassemblyjs/utf8-1.8.5.tgz", + "integrity": "sha1-qL87XY/+mGx8Hjc8y9wqCRXwztw=", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.8.5", + "resolved": "https://registry.npm.taobao.org/@webassemblyjs/wasm-edit/download/@webassemblyjs/wasm-edit-1.8.5.tgz", + "integrity": "sha1-li2hKqWswcExyBxCMpkcgs5W4Bo=", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/helper-wasm-section": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-opt": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "@webassemblyjs/wast-printer": "1.8.5" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.8.5", + "resolved": "https://registry.npm.taobao.org/@webassemblyjs/wasm-gen/download/@webassemblyjs/wasm-gen-1.8.5.tgz", + "integrity": "sha1-VIQHZsLBAC62TtGr5yCt7XFPmLw=", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.8.5", + "resolved": "https://registry.npm.taobao.org/@webassemblyjs/wasm-opt/download/@webassemblyjs/wasm-opt-1.8.5.tgz", + "integrity": "sha1-sk2fa6UDlK8TSfUQr6j/y4pj0mQ=", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.8.5", + "resolved": "https://registry.npm.taobao.org/@webassemblyjs/wasm-parser/download/@webassemblyjs/wasm-parser-1.8.5.tgz", + "integrity": "sha1-IVdvDsiLkUJzV7hTY4NmjvfGa40=", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.8.5", + "resolved": "https://registry.npm.taobao.org/@webassemblyjs/wast-parser/download/@webassemblyjs/wast-parser-1.8.5.tgz", + "integrity": "sha1-4Q7s1ULQ5705T2gnxJ899tTu+4w=", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/floating-point-hex-parser": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-code-frame": "1.8.5", + "@webassemblyjs/helper-fsm": "1.8.5", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.8.5", + "resolved": "https://registry.npm.taobao.org/@webassemblyjs/wast-printer/download/@webassemblyjs/wast-printer-1.8.5.tgz", + "integrity": "sha1-EUu8SB/RDKDiOzVg+oEnSLC65bw=", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5", + "@xtuc/long": "4.2.2" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/@xtuc/ieee754/download/@xtuc/ieee754-1.2.0.tgz", + "integrity": "sha1-7vAUoxRa5Hehy8AM0eVSM23Ot5A=", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npm.taobao.org/@xtuc/long/download/@xtuc/long-4.2.2.tgz", + "integrity": "sha1-0pHGpOl5ibXGHZrPOWrk/hM6cY0=", + "dev": true + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npm.taobao.org/accepts/download/accepts-1.3.7.tgz", + "integrity": "sha1-UxvHJlF6OytB+FACHGzBXqq1B80=", + "dev": true, + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "acorn": { + "version": "6.4.0", + "resolved": "https://registry.npm.taobao.org/acorn/download/acorn-6.4.0.tgz", + "integrity": "sha1-tlnS/7r6JLr12xzbsslKmD7NJ4Q=", + "dev": true + }, + "acorn-jsx": { + "version": "5.1.0", + "resolved": "https://registry.npm.taobao.org/acorn-jsx/download/acorn-jsx-5.1.0.tgz", + "integrity": "sha1-KUrbcbVzmLBoABXwo4xWPuHbU4Q=", + "dev": true + }, + "acorn-walk": { + "version": "6.2.0", + "resolved": "https://registry.npm.taobao.org/acorn-walk/download/acorn-walk-6.2.0.tgz", + "integrity": "sha1-Ejy487hMIXHx9/slJhWxx4prGow=", + "dev": true + }, + "address": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/address/download/address-1.1.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Faddress%2Fdownload%2Faddress-1.1.2.tgz", + "integrity": "sha1-vxEWycdYxRt6kz0pa3LCIe2UKLY=", + "dev": true + }, + "aggregate-error": { + "version": "3.0.1", + "resolved": "https://registry.npm.taobao.org/aggregate-error/download/aggregate-error-3.0.1.tgz", + "integrity": "sha1-2y/nJG5Tb0DZtUQqOeEX191qJOA=", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/ajv-errors/download/ajv-errors-1.0.1.tgz", + "integrity": "sha1-81mGrOuRr63sQQL72FAUlQzvpk0=", + "dev": true + }, + "ajv-keywords": { + "version": "3.4.1", + "resolved": "https://registry.npm.taobao.org/ajv-keywords/download/ajv-keywords-3.4.1.tgz", + "integrity": "sha1-75FuJxxkrBIXH9g4TqrmsjRYVNo=", + "dev": true + }, + "alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/alphanum-sort/download/alphanum-sort-1.0.2.tgz", + "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", + "dev": true + }, + "ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npm.taobao.org/ansi-colors/download/ansi-colors-3.2.4.tgz", + "integrity": "sha1-46PaS/uubIapwoViXeEkojQCb78=", + "dev": true + }, + "ansi-escapes": { + "version": "4.3.0", + "resolved": "https://registry.npm.taobao.org/ansi-escapes/download/ansi-escapes-4.3.0.tgz?cache=0&sync_timestamp=1573923784843&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fansi-escapes%2Fdownload%2Fansi-escapes-4.3.0.tgz", + "integrity": "sha1-pM4rM9ayFLeVDYWVwhLxKsnMVp0=", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + }, + "dependencies": { + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npm.taobao.org/type-fest/download/type-fest-0.8.1.tgz", + "integrity": "sha1-CeJJ696FHTseSNJ8EFREZn8XuD0=", + "dev": true + } + } + }, + "ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npm.taobao.org/ansi-html/download/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "dev": true + }, + "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=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-3.2.1.tgz", + "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npm.taobao.org/any-promise/download/any-promise-1.3.0.tgz", + "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=", + "dev": true + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/anymatch/download/anymatch-2.0.0.tgz", + "integrity": "sha1-vLJLTzeTTZqnrBe0ra+J58du8us=", + "dev": true, + "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=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/aproba/download/aproba-1.2.0.tgz", + "integrity": "sha1-aALmJk79GMeQobDVF/DyYnvyyUo=", + "dev": true + }, + "arch": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/arch/download/arch-2.1.1.tgz", + "integrity": "sha1-j1wnMao1owkpIhuwZA7tZRdeyE4=", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npm.taobao.org/argparse/download/argparse-1.0.10.tgz", + "integrity": "sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE=", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "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=", + "dev": true + }, + "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=", + "dev": true + }, + "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=", + "dev": true + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/array-flatten/download/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "array-includes": { + "version": "3.1.1", + "resolved": "https://registry.npm.taobao.org/array-includes/download/array-includes-3.1.1.tgz?cache=0&sync_timestamp=1576947659303&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Farray-includes%2Fdownload%2Farray-includes-3.1.1.tgz", + "integrity": "sha1-zdZ+aFK9+cEhVGB4ZzIlXtJFk0g=", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0", + "is-string": "^1.0.5" + } + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/array-union/download/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npm.taobao.org/array-uniq/download/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "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=", + "dev": true + }, + "array.prototype.flat": { + "version": "1.2.3", + "resolved": "https://registry.npm.taobao.org/array.prototype.flat/download/array.prototype.flat-1.2.3.tgz", + "integrity": "sha1-DegrQmsDGNv9uUAInjiwQ9N/bHs=", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npm.taobao.org/asn1/download/asn1-0.2.4.tgz", + "integrity": "sha1-jSR136tVO7M+d7VOWeiAu4ziMTY=", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npm.taobao.org/asn1.js/download/asn1.js-4.10.1.tgz", + "integrity": "sha1-ucK/WAXx5kqt7tbfOiv6+1pz9aA=", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npm.taobao.org/assert/download/assert-1.5.0.tgz", + "integrity": "sha1-VcEJqvbgrv2z3EtxJAxwv1dLGOs=", + "dev": true, + "requires": { + "object-assign": "^4.1.1", + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/inherits/download/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npm.taobao.org/util/download/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/assert-plus/download/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "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=", + "dev": true + }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/astral-regex/download/astral-regex-1.0.0.tgz", + "integrity": "sha1-bIw/uCfdQ+45GPJ7gngqt2WKb9k=", + "dev": true + }, + "async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, + "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=", + "dev": true + }, + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/async-limiter/download/async-limiter-1.0.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fasync-limiter%2Fdownload%2Fasync-limiter-1.0.1.tgz", + "integrity": "sha1-3TeelPDbgxCwgpH51kwyCXZmF/0=", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npm.taobao.org/asynckit/download/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npm.taobao.org/atob/download/atob-2.1.2.tgz", + "integrity": "sha1-bZUX654DDSQ2ZmZR6GvZ9vE1M8k=", + "dev": true + }, + "autoprefixer": { + "version": "9.7.4", + "resolved": "https://registry.npm.taobao.org/autoprefixer/download/autoprefixer-9.7.4.tgz", + "integrity": "sha1-+L8+BnB9BH8GQdh67oz7F0sqU3g=", + "dev": true, + "requires": { + "browserslist": "^4.8.3", + "caniuse-lite": "^1.0.30001020", + "chalk": "^2.4.2", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.26", + "postcss-value-parser": "^4.0.2" + }, + "dependencies": { + "postcss-value-parser": { + "version": "4.0.2", + "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-4.0.2.tgz", + "integrity": "sha1-SCKCwJpCcG0fyaBptz9E7Ag5Hck=", + "dev": true + } + } + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npm.taobao.org/aws-sign2/download/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.9.1", + "resolved": "https://registry.npm.taobao.org/aws4/download/aws4-1.9.1.tgz", + "integrity": "sha1-fjPY99RJs/ZzzXLeuavcVS2+Uo4=", + "dev": true + }, + "axios": { + "version": "0.21.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.2.tgz", + "integrity": "sha512-87otirqUw3e8CzHTMO+/9kh/FSgXt/eVDvipijwDtEuwbkySWZ9SBm6VEubmJ/kLKEoLQV/POhxXFb66bfekfg==", + "requires": { + "follow-redirects": "^1.14.0" + }, + "dependencies": { + "follow-redirects": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", + "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==" + } + } + }, + "babel-eslint": { + "version": "10.0.3", + "resolved": "https://registry.npm.taobao.org/babel-eslint/download/babel-eslint-10.0.3.tgz", + "integrity": "sha1-gaLGab4PIF4ZRi/tJILTPkaHqIo=", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.0.0", + "@babel/traverse": "^7.0.0", + "@babel/types": "^7.0.0", + "eslint-visitor-keys": "^1.0.0", + "resolve": "^1.12.0" + } + }, + "babel-loader": { + "version": "8.0.6", + "resolved": "https://registry.npm.taobao.org/babel-loader/download/babel-loader-8.0.6.tgz", + "integrity": "sha1-4zvbbzYrA/S7FBoMIauHxQG3Dfs=", + "dev": true, + "requires": { + "find-cache-dir": "^2.0.0", + "loader-utils": "^1.0.2", + "mkdirp": "^0.5.1", + "pify": "^4.0.1" + } + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.0", + "resolved": "https://registry.npm.taobao.org/babel-plugin-dynamic-import-node/download/babel-plugin-dynamic-import-node-2.3.0.tgz?cache=0&sync_timestamp=1571753086816&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbabel-plugin-dynamic-import-node%2Fdownload%2Fbabel-plugin-dynamic-import-node-2.3.0.tgz", + "integrity": "sha1-8A9Qe9qjw+P/bn5emNkKesq5b38=", + "dev": true, + "requires": { + "object.assign": "^4.1.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=", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npm.taobao.org/base/download/base-0.11.2.tgz", + "integrity": "sha1-e95c7RRbbVUakNuH+DxVi060io8=", + "dev": true, + "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=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "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=", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "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=", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz", + "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npm.taobao.org/base64-js/download/base64-js-1.3.1.tgz", + "integrity": "sha1-WOzoy3XdB+ce0IxzarxfrE2/jfE=", + "dev": true + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/batch/download/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/bcrypt-pbkdf/download/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "bfj": { + "version": "6.1.2", + "resolved": "https://registry.npm.taobao.org/bfj/download/bfj-6.1.2.tgz", + "integrity": "sha1-MlyGGoIryzWKQceKM7jm4ght3n8=", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "check-types": "^8.0.3", + "hoopy": "^0.1.4", + "tryer": "^1.0.1" + } + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npm.taobao.org/big.js/download/big.js-5.2.2.tgz", + "integrity": "sha1-ZfCvOC9Xi83HQr2cKB6cstd2gyg=", + "dev": true + }, + "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=", + "dev": true + }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npm.taobao.org/bindings/download/bindings-1.5.0.tgz", + "integrity": "sha1-EDU8npRTNLwFEabZCzj7x8nFBN8=", + "dev": true, + "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=", + "dev": true + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npm.taobao.org/bn.js/download/bn.js-4.11.8.tgz", + "integrity": "sha1-LN4J617jQfSEdGuwMJsyU7GxRC8=", + "dev": true + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npm.taobao.org/body-parser/download/body-parser-1.19.0.tgz", + "integrity": "sha1-lrJwnlfJxOCab9Zqj9l5hE9p8Io=", + "dev": true, + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "dev": true, + "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=", + "dev": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npm.taobao.org/qs/download/qs-6.7.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fqs%2Fdownload%2Fqs-6.7.0.tgz", + "integrity": "sha1-QdwaAV49WB8WIXdr4xr7KHapsbw=", + "dev": true + } + } + }, + "bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npm.taobao.org/bonjour/download/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "dev": true, + "requires": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + }, + "dependencies": { + "array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npm.taobao.org/array-flatten/download/array-flatten-2.1.2.tgz", + "integrity": "sha1-JO+AoowaiTYX4hSbDG0NeIKTsJk=", + "dev": true + } + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/boolbase/download/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npm.taobao.org/brace-expansion/download/brace-expansion-1.1.11.tgz", + "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=", + "dev": true, + "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=", + "dev": true, + "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" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/brorand/download/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/browserify-aes/download/browserify-aes-1.2.0.tgz", + "integrity": "sha1-Mmc0ZC9APavDADIJhTu3CtQo70g=", + "dev": true, + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/browserify-cipher/download/browserify-cipher-1.0.1.tgz", + "integrity": "sha1-jWR0wbhwv9q807z8wZNKEOlPFfA=", + "dev": true, + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/browserify-des/download/browserify-des-1.0.2.tgz", + "integrity": "sha1-OvTx9Zg5QDVy8cZiBDdfen9wPpw=", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npm.taobao.org/browserify-rsa/download/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npm.taobao.org/browserify-sign/download/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "dev": true, + "requires": { + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npm.taobao.org/browserify-zlib/download/browserify-zlib-0.2.0.tgz", + "integrity": "sha1-KGlFnZqjviRf6P4sofRuLn9U1z8=", + "dev": true, + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "version": "4.8.5", + "resolved": "https://registry.npm.taobao.org/browserslist/download/browserslist-4.8.5.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbrowserslist%2Fdownload%2Fbrowserslist-4.8.5.tgz", + "integrity": "sha1-aRr04yesh3sl56P37oacTvNs3qM=", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001022", + "electron-to-chromium": "^1.3.338", + "node-releases": "^1.1.46" + } + }, + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npm.taobao.org/buffer/download/buffer-4.9.2.tgz?cache=0&sync_timestamp=1573257309520&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbuffer%2Fdownload%2Fbuffer-4.9.2.tgz", + "integrity": "sha1-Iw6tNEACmIZEhBqwJEr4xEu+Pvg=", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/buffer-from/download/buffer-from-1.1.1.tgz", + "integrity": "sha1-MnE7wCj3XAL9txDXx7zsHyxgcO8=", + "dev": true + }, + "buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/buffer-indexof/download/buffer-indexof-1.1.1.tgz", + "integrity": "sha1-Uvq8xqYG0aADAoAmSO9o9jnaJow=", + "dev": true + }, + "buffer-json": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/buffer-json/download/buffer-json-2.0.0.tgz", + "integrity": "sha1-9z4TseQvGW/i/WfQAcfXEH7dfCM=", + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npm.taobao.org/buffer-xor/download/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/builtin-status-codes/download/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/bytes/download/bytes-3.1.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbytes%2Fdownload%2Fbytes-3.1.0.tgz", + "integrity": "sha1-9s95M6Ng4FiPqf3oVlHNx/gF0fY=", + "dev": true + }, + "cacache": { + "version": "12.0.3", + "resolved": "https://registry.npm.taobao.org/cacache/download/cacache-12.0.3.tgz", + "integrity": "sha1-vpmruk4b9d9GHNWiwQcfxDJXM5A=", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "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=", + "dev": true, + "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" + } + }, + "cache-loader": { + "version": "4.1.0", + "resolved": "https://registry.npm.taobao.org/cache-loader/download/cache-loader-4.1.0.tgz", + "integrity": "sha1-mUjK41OuwKH8ser9ojAIFuyFOH4=", + "dev": true, + "requires": { + "buffer-json": "^2.0.0", + "find-cache-dir": "^3.0.0", + "loader-utils": "^1.2.3", + "mkdirp": "^0.5.1", + "neo-async": "^2.6.1", + "schema-utils": "^2.0.0" + }, + "dependencies": { + "find-cache-dir": { + "version": "3.2.0", + "resolved": "https://registry.npm.taobao.org/find-cache-dir/download/find-cache-dir-3.2.0.tgz?cache=0&sync_timestamp=1576153981844&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffind-cache-dir%2Fdownload%2Ffind-cache-dir-3.2.0.tgz", + "integrity": "sha1-5/5EwavBKZ9RYUblYxCP0QBsGHQ=", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.0", + "pkg-dir": "^4.1.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npm.taobao.org/find-up/download/find-up-4.1.0.tgz", + "integrity": "sha1-l6/n1s3AvFkoWEt8jXsW6KmqXRk=", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npm.taobao.org/locate-path/download/locate-path-5.0.0.tgz", + "integrity": "sha1-Gvujlq/WdqbUJQTQpno6frn2KqA=", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "make-dir": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/make-dir/download/make-dir-3.0.0.tgz", + "integrity": "sha1-G1859rknDtM/nwVMXA+EMEmJ+AE=", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npm.taobao.org/p-locate/download/p-locate-4.1.0.tgz", + "integrity": "sha1-o0KLtwiLOmApL2aRkni3wpetTwc=", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/path-exists/download/path-exists-4.0.0.tgz", + "integrity": "sha1-UTvb4tO5XXdi6METfvoZXGxhtbM=", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npm.taobao.org/pkg-dir/download/pkg-dir-4.2.0.tgz", + "integrity": "sha1-8JkTPfft5CLoHR2ESCcO6z5CYfM=", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz", + "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=", + "dev": true + } + } + }, + "call-me-maybe": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/call-me-maybe/download/call-me-maybe-1.0.1.tgz", + "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", + "dev": true + }, + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/caller-callsite/download/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "dev": true, + "requires": { + "callsites": "^2.0.0" + } + }, + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/caller-path/download/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "dev": true, + "requires": { + "caller-callsite": "^2.0.0" + } + }, + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/callsites/download/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + }, + "camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/camel-case/download/camel-case-3.0.0.tgz", + "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "dev": true, + "requires": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npm.taobao.org/camelcase/download/camelcase-5.3.1.tgz", + "integrity": "sha1-48mzFWnhBoEd8kL3FXJaH0xJQyA=", + "dev": true + }, + "caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/caniuse-api/download/caniuse-api-3.0.0.tgz", + "integrity": "sha1-Xk2Q4idJYdRikZl99Znj7QCO5MA=", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "caniuse-lite": { + "version": "1.0.30001023", + "resolved": "https://registry.npm.taobao.org/caniuse-lite/download/caniuse-lite-1.0.30001023.tgz?cache=0&sync_timestamp=1579937775290&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcaniuse-lite%2Fdownload%2Fcaniuse-lite-1.0.30001023.tgz", + "integrity": "sha1-uCFVgn8/UAkHe90t89iWi8vMb8Q=", + "dev": true + }, + "case-sensitive-paths-webpack-plugin": { + "version": "2.3.0", + "resolved": "https://registry.npm.taobao.org/case-sensitive-paths-webpack-plugin/download/case-sensitive-paths-webpack-plugin-2.3.0.tgz", + "integrity": "sha1-I6xhPMmoVuT4j/i7c7u16YmCXPc=", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npm.taobao.org/caseless/download/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-2.4.2.tgz", + "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=", + "dev": true, + "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", + "integrity": "sha1-kAlISfCTfy7twkJdDSip5fDLrZ4=", + "dev": true + }, + "check-types": { + "version": "8.0.3", + "resolved": "https://registry.npm.taobao.org/check-types/download/check-types-8.0.3.tgz?cache=0&sync_timestamp=1579454657323&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcheck-types%2Fdownload%2Fcheck-types-8.0.3.tgz", + "integrity": "sha1-M1bMoZyIlUTy16le1JzlCKDs9VI=", + "dev": true + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npm.taobao.org/chokidar/download/chokidar-2.1.8.tgz", + "integrity": "sha1-gEs6e2qZNYw8XGHnHYco8EHP+Rc=", + "dev": true, + "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" + } + }, + "chownr": { + "version": "1.1.3", + "resolved": "https://registry.npm.taobao.org/chownr/download/chownr-1.1.3.tgz?cache=0&sync_timestamp=1569391492311&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchownr%2Fdownload%2Fchownr-1.1.3.tgz", + "integrity": "sha1-Qtg31SOWiNVfMDADpQgjD6ZycUI=", + "dev": true + }, + "chrome-trace-event": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/chrome-trace-event/download/chrome-trace-event-1.0.2.tgz", + "integrity": "sha1-I0CQ7pfH1K0aLEvq4nUF3v/GCKQ=", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "ci-info": { + "version": "1.6.0", + "resolved": "https://registry.npm.taobao.org/ci-info/download/ci-info-1.6.0.tgz", + "integrity": "sha1-LKINu5zrMtRSSmgzAzE/AwSx5Jc=", + "dev": true + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npm.taobao.org/cipher-base/download/cipher-base-1.0.4.tgz", + "integrity": "sha1-h2Dk7MJy9MNjUy+SbYdKriwTl94=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.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=", + "dev": true, + "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=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "clean-css": { + "version": "4.2.1", + "resolved": "https://registry.npm.taobao.org/clean-css/download/clean-css-4.2.1.tgz", + "integrity": "sha1-LUEe92uFabbQyEBo2r6FsKpeXBc=", + "dev": true, + "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=", + "dev": true + } + } + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npm.taobao.org/clean-stack/download/clean-stack-2.2.0.tgz", + "integrity": "sha1-7oRy27Ep5yezHooQpCfe6d/kAIs=", + "dev": true + }, + "cli-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=", + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "cli-highlight": { + "version": "2.1.4", + "resolved": "https://registry.npm.taobao.org/cli-highlight/download/cli-highlight-2.1.4.tgz?cache=0&sync_timestamp=1573948662951&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcli-highlight%2Fdownload%2Fcli-highlight-2.1.4.tgz", + "integrity": "sha1-CYy2Qs8X9CrcHBFF4H+WDsTXUis=", + "dev": true, + "requires": { + "chalk": "^3.0.0", + "highlight.js": "^9.6.0", + "mz": "^2.4.0", + "parse5": "^5.1.1", + "parse5-htmlparser2-tree-adapter": "^5.1.1", + "yargs": "^15.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-4.2.1.tgz", + "integrity": "sha1-kK51xCTQCNJiTFvynq0xd+v881k=", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-3.0.0.tgz", + "integrity": "sha1-P3PCv1JlkfV0zEksUeJFY0n4ROQ=", + "dev": 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=", + "dev": 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=", + "dev": 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=", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-7.1.0.tgz", + "integrity": "sha1-aOMlkd9z4lrRxLSRCKLsUHliv9E=", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "cli-spinners": { + "version": "2.2.0", + "resolved": "https://registry.npm.taobao.org/cli-spinners/download/cli-spinners-2.2.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcli-spinners%2Fdownload%2Fcli-spinners-2.2.0.tgz", + "integrity": "sha1-6LmI2SBsaSMC2O6DTnqFwBRNj3c=", + "dev": true + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npm.taobao.org/cli-width/download/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, + "clipboardy": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/clipboardy/download/clipboardy-2.1.0.tgz", + "integrity": "sha1-ASOgyPrJLyVtxWM14LuL6XpJCaU=", + "dev": true, + "requires": { + "arch": "^2.1.1", + "execa": "^1.0.0" + } + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npm.taobao.org/cliui/download/cliui-5.0.0.tgz?cache=0&sync_timestamp=1573942301772&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcliui%2Fdownload%2Fcliui-5.0.0.tgz", + "integrity": "sha1-3u/P2y6AB4SqNPRvoI4GhRx7u8U=", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + }, + "dependencies": { + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npm.taobao.org/emoji-regex/download/emoji-regex-7.0.3.tgz", + "integrity": "sha1-kzoEBShgyF6DwSJHnEdIqOTHIVY=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/string-width/download/string-width-3.1.0.tgz", + "integrity": "sha1-InZ74htirxCBV0MG9prFG2IgOWE=", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-5.2.0.tgz?cache=0&sync_timestamp=1573280518303&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-5.2.0.tgz", + "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npm.taobao.org/wrap-ansi/download/wrap-ansi-5.1.0.tgz", + "integrity": "sha1-H9H2cjXVttD+54EFYAG/tpTAOwk=", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + } + } + }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npm.taobao.org/clone/download/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true + }, + "coa": { + "version": "2.0.2", + "resolved": "https://registry.npm.taobao.org/coa/download/coa-2.0.2.tgz", + "integrity": "sha1-Q/bCEVG07yv1cYfbDXPeIp4+fsM=", + "dev": true, + "requires": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + } + }, + "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=", + "dev": true + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/collection-visit/download/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color": { + "version": "3.1.2", + "resolved": "https://registry.npm.taobao.org/color/download/color-3.1.2.tgz", + "integrity": "sha1-aBSOf4XUGtdknF+oyBBvCY0inhA=", + "dev": true, + "requires": { + "color-convert": "^1.9.1", + "color-string": "^1.5.2" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-1.9.3.tgz", + "integrity": "sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg=", + "dev": true, + "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=", + "dev": true + }, + "color-string": { + "version": "1.5.3", + "resolved": "https://registry.npm.taobao.org/color-string/download/color-string-1.5.3.tgz", + "integrity": "sha1-ybvF8BtYtUkvPWhXRZy2WQziBMw=", + "dev": true, + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npm.taobao.org/combined-stream/download/combined-stream-1.0.8.tgz", + "integrity": "sha1-w9RaizT9cwYxoRCoolIGgrMdWn8=", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npm.taobao.org/commander/download/commander-2.20.3.tgz", + "integrity": "sha1-/UhehMA+tIgcIHIrpIA16FMa6zM=", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/commondir/download/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npm.taobao.org/component-emitter/download/component-emitter-1.3.0.tgz", + "integrity": "sha1-FuQHD7qK4ptnnyIVhT7hgasuq8A=", + "dev": true + }, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npm.taobao.org/compressible/download/compressible-2.0.18.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcompressible%2Fdownload%2Fcompressible-2.0.18.tgz", + "integrity": "sha1-r1PMprBw1MPAdQ+9dyhqbXzEb7o=", + "dev": true, + "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=", + "dev": true, + "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": { + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/bytes/download/bytes-3.0.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbytes%2Fdownload%2Fbytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "dev": true, + "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=", + "dev": true + } + } + }, + "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=", + "dev": true + }, + "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=", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npm.taobao.org/connect-history-api-fallback/download/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha1-izIIk1kwjRERFdgcrT/Oq4iPl7w=", + "dev": true + }, + "console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/console-browserify/download/console-browserify-1.2.0.tgz?cache=0&sync_timestamp=1572252781983&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fconsole-browserify%2Fdownload%2Fconsole-browserify-1.2.0.tgz", + "integrity": "sha1-ZwY871fOts9Jk6KrOlWECujEkzY=", + "dev": true + }, + "consolidate": { + "version": "0.15.1", + "resolved": "https://registry.npm.taobao.org/consolidate/download/consolidate-0.15.1.tgz", + "integrity": "sha1-IasEMjXHGgfUXZqtmFk7DbpWurc=", + "dev": true, + "requires": { + "bluebird": "^3.1.1" + } + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/constants-browserify/download/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npm.taobao.org/contains-path/download/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npm.taobao.org/content-disposition/download/content-disposition-0.5.3.tgz", + "integrity": "sha1-4TDK9+cnkIfFYWwgB9BIVpiYT70=", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npm.taobao.org/content-type/download/content-type-1.0.4.tgz", + "integrity": "sha1-4TjMdeBAxyexlm/l5fjJruJW/js=", + "dev": true + }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npm.taobao.org/convert-source-map/download/convert-source-map-1.7.0.tgz?cache=0&sync_timestamp=1573003828038&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fconvert-source-map%2Fdownload%2Fconvert-source-map-1.7.0.tgz", + "integrity": "sha1-F6LLiC1/d9NJBYXizmxSRCSjpEI=", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npm.taobao.org/cookie/download/cookie-0.4.0.tgz", + "integrity": "sha1-vrQ35wIrO21JAZ0IhmUwPr6cFLo=", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npm.taobao.org/cookie-signature/download/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npm.taobao.org/copy-concurrently/download/copy-concurrently-1.0.5.tgz", + "integrity": "sha1-kilzmMrjSTf8r9bsgTnBgFHwteA=", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npm.taobao.org/copy-descriptor/download/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "copy-webpack-plugin": { + "version": "5.1.1", + "resolved": "https://registry.npm.taobao.org/copy-webpack-plugin/download/copy-webpack-plugin-5.1.1.tgz", + "integrity": "sha1-VIGgPeoRI9iKmIxv+LeCRyFPC4g=", + "dev": true, + "requires": { + "cacache": "^12.0.3", + "find-cache-dir": "^2.1.0", + "glob-parent": "^3.1.0", + "globby": "^7.1.1", + "is-glob": "^4.0.1", + "loader-utils": "^1.2.3", + "minimatch": "^3.0.4", + "normalize-path": "^3.0.0", + "p-limit": "^2.2.1", + "schema-utils": "^1.0.0", + "serialize-javascript": "^2.1.2", + "webpack-log": "^2.0.0" + }, + "dependencies": { + "globby": { + "version": "7.1.1", + "resolved": "https://registry.npm.taobao.org/globby/download/globby-7.1.1.tgz", + "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "dir-glob": "^2.0.0", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + } + }, + "ignore": { + "version": "3.3.10", + "resolved": "https://registry.npm.taobao.org/ignore/download/ignore-3.3.10.tgz", + "integrity": "sha1-Cpf7h2mG6AgcYxFg+PnziRV/AEM=", + "dev": true + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/pify/download/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/schema-utils/download/schema-utils-1.0.0.tgz", + "integrity": "sha1-C3mpMgTXtgDUsoUNH2bCo0lRx3A=", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/slash/download/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + } + } + }, + "core-js": { + "version": "3.6.4", + "resolved": "https://registry.npm.taobao.org/core-js/download/core-js-3.6.4.tgz", + "integrity": "sha1-RAqDU2tFgRS5yyrBWAujd9xHBkc=" + }, + "core-js-compat": { + "version": "3.6.4", + "resolved": "https://registry.npm.taobao.org/core-js-compat/download/core-js-compat-3.6.4.tgz", + "integrity": "sha1-k4R2Vp67bNqA0zm88Zn65PFv/xc=", + "dev": true, + "requires": { + "browserslist": "^4.8.3", + "semver": "7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npm.taobao.org/semver/download/semver-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=", + "dev": true + }, + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npm.taobao.org/cosmiconfig/download/cosmiconfig-5.2.1.tgz", + "integrity": "sha1-BA9yaAnFked6F8CjYmykW08Wixo=", + "dev": true, + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + } + }, + "create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npm.taobao.org/create-ecdh/download/create-ecdh-4.0.3.tgz", + "integrity": "sha1-yREbbzMEXEaX8UR4f5JUzcd8Rf8=", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/create-hash/download/create-hash-1.2.0.tgz", + "integrity": "sha1-iJB4rxGmN1a8+1m9IhmWvjqe8ZY=", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npm.taobao.org/create-hmac/download/create-hmac-1.1.7.tgz", + "integrity": "sha1-aRcMeLOrlXFHsriwRXLkfq0iQ/8=", + "dev": true, + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npm.taobao.org/cross-spawn/download/cross-spawn-6.0.5.tgz", + "integrity": "sha1-Sl7Hxk364iw6FBJNus3uhG2Ay8Q=", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npm.taobao.org/crypto-browserify/download/crypto-browserify-3.12.0.tgz", + "integrity": "sha1-OWz58xN/A+S45TLFj2mCVOAPgOw=", + "dev": true, + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "css-color-names": { + "version": "0.0.4", + "resolved": "https://registry.npm.taobao.org/css-color-names/download/css-color-names-0.0.4.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcss-color-names%2Fdownload%2Fcss-color-names-0.0.4.tgz", + "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", + "dev": true + }, + "css-declaration-sorter": { + "version": "4.0.1", + "resolved": "https://registry.npm.taobao.org/css-declaration-sorter/download/css-declaration-sorter-4.0.1.tgz", + "integrity": "sha1-wZiUD2OnbX42wecQGLABchBUyyI=", + "dev": true, + "requires": { + "postcss": "^7.0.1", + "timsort": "^0.3.0" + } + }, + "css-loader": { + "version": "3.4.2", + "resolved": "https://registry.npm.taobao.org/css-loader/download/css-loader-3.4.2.tgz", + "integrity": "sha1-0/2zNYtD8jO3hQHF7XscbaYTMgI=", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "cssesc": "^3.0.0", + "icss-utils": "^4.1.1", + "loader-utils": "^1.2.3", + "normalize-path": "^3.0.0", + "postcss": "^7.0.23", + "postcss-modules-extract-imports": "^2.0.0", + "postcss-modules-local-by-default": "^3.0.2", + "postcss-modules-scope": "^2.1.1", + "postcss-modules-values": "^3.0.0", + "postcss-value-parser": "^4.0.2", + "schema-utils": "^2.6.0" + }, + "dependencies": { + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/cssesc/download/cssesc-3.0.0.tgz", + "integrity": "sha1-N3QZGZA7hoVl4cCep0dEXNGJg+4=", + "dev": true + }, + "postcss-value-parser": { + "version": "4.0.2", + "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-4.0.2.tgz", + "integrity": "sha1-SCKCwJpCcG0fyaBptz9E7Ag5Hck=", + "dev": true + } + } + }, + "css-select": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/css-select/download/css-select-2.1.0.tgz", + "integrity": "sha1-ajRlM1ZjWTSoG6ymjQJVQyEF2+8=", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npm.taobao.org/css-select-base-adapter/download/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha1-Oy/0lyzDYquIVhUHqVQIoUMhNdc=", + "dev": true + }, + "css-tree": { + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npm.taobao.org/css-tree/download/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha1-mL69YsTB2flg7DQM+fdSLjBwmiI=", + "dev": true, + "requires": { + "mdn-data": "2.0.4", + "source-map": "^0.6.1" + }, + "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=", + "dev": true + } + } + }, + "css-unit-converter": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/css-unit-converter/download/css-unit-converter-1.1.1.tgz", + "integrity": "sha1-2bkoGtz9jO2TW9urqDeGiX9k6ZY=", + "dev": true + }, + "css-what": { + "version": "3.2.1", + "resolved": "https://registry.npm.taobao.org/css-what/download/css-what-3.2.1.tgz", + "integrity": "sha1-9KjxJCEGRiG0VnVeNKA6LCLfXaE=", + "dev": true + }, + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/cssesc/download/cssesc-2.0.0.tgz", + "integrity": "sha1-OxO9G7HLNuG8taTc0n9UxdyzVwM=", + "dev": true + }, + "cssnano": { + "version": "4.1.10", + "resolved": "https://registry.npm.taobao.org/cssnano/download/cssnano-4.1.10.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcssnano%2Fdownload%2Fcssnano-4.1.10.tgz", + "integrity": "sha1-CsQfCxPRPUZUh+ERt3jULaYxuLI=", + "dev": true, + "requires": { + "cosmiconfig": "^5.0.0", + "cssnano-preset-default": "^4.0.7", + "is-resolvable": "^1.0.0", + "postcss": "^7.0.0" + } + }, + "cssnano-preset-default": { + "version": "4.0.7", + "resolved": "https://registry.npm.taobao.org/cssnano-preset-default/download/cssnano-preset-default-4.0.7.tgz", + "integrity": "sha1-UexmLM/KD4izltzZZ5zbkxvhf3Y=", + "dev": true, + "requires": { + "css-declaration-sorter": "^4.0.1", + "cssnano-util-raw-cache": "^4.0.1", + "postcss": "^7.0.0", + "postcss-calc": "^7.0.1", + "postcss-colormin": "^4.0.3", + "postcss-convert-values": "^4.0.1", + "postcss-discard-comments": "^4.0.2", + "postcss-discard-duplicates": "^4.0.2", + "postcss-discard-empty": "^4.0.1", + "postcss-discard-overridden": "^4.0.1", + "postcss-merge-longhand": "^4.0.11", + "postcss-merge-rules": "^4.0.3", + "postcss-minify-font-values": "^4.0.2", + "postcss-minify-gradients": "^4.0.2", + "postcss-minify-params": "^4.0.2", + "postcss-minify-selectors": "^4.0.2", + "postcss-normalize-charset": "^4.0.1", + "postcss-normalize-display-values": "^4.0.2", + "postcss-normalize-positions": "^4.0.2", + "postcss-normalize-repeat-style": "^4.0.2", + "postcss-normalize-string": "^4.0.2", + "postcss-normalize-timing-functions": "^4.0.2", + "postcss-normalize-unicode": "^4.0.1", + "postcss-normalize-url": "^4.0.1", + "postcss-normalize-whitespace": "^4.0.2", + "postcss-ordered-values": "^4.1.2", + "postcss-reduce-initial": "^4.0.3", + "postcss-reduce-transforms": "^4.0.2", + "postcss-svgo": "^4.0.2", + "postcss-unique-selectors": "^4.0.1" + } + }, + "cssnano-util-get-arguments": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/cssnano-util-get-arguments/download/cssnano-util-get-arguments-4.0.0.tgz", + "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=", + "dev": true + }, + "cssnano-util-get-match": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/cssnano-util-get-match/download/cssnano-util-get-match-4.0.0.tgz", + "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=", + "dev": true + }, + "cssnano-util-raw-cache": { + "version": "4.0.1", + "resolved": "https://registry.npm.taobao.org/cssnano-util-raw-cache/download/cssnano-util-raw-cache-4.0.1.tgz", + "integrity": "sha1-sm1f1fcqEd/np4RvtMZyYPlr8oI=", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "cssnano-util-same-parent": { + "version": "4.0.1", + "resolved": "https://registry.npm.taobao.org/cssnano-util-same-parent/download/cssnano-util-same-parent-4.0.1.tgz", + "integrity": "sha1-V0CC+yhZ0ttDOFWDXZqEVuoYu/M=", + "dev": true + }, + "csso": { + "version": "4.0.2", + "resolved": "https://registry.npm.taobao.org/csso/download/csso-4.0.2.tgz", + "integrity": "sha1-5fgas6Vrju+38Aks5yeTKfRU3j0=", + "dev": true, + "requires": { + "css-tree": "1.0.0-alpha.37" + } + }, + "current-script-polyfill": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/current-script-polyfill/download/current-script-polyfill-1.0.0.tgz", + "integrity": "sha1-8xz35PPiGLBybnOMqSoC00iO9hU=", + "dev": true + }, + "cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/cyclist/download/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", + "dev": true + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npm.taobao.org/dashdash/download/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/de-indent/download/de-indent-1.0.2.tgz", + "integrity": "sha1-sgOOhG3DO6pXlhKNCAS0VbjB4h0=", + "dev": true + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npm.taobao.org/debug/download/debug-4.1.1.tgz", + "integrity": "sha1-O3ImAlUQnGtYnO4FDx1RYTlmR5E=", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/decamelize/download/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "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=", + "dev": true + }, + "deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/deep-equal/download/deep-equal-1.1.1.tgz", + "integrity": "sha1-tcmMlCzv+vfLBR4k4UNKJaLmB2o=", + "dev": true, + "requires": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + } + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npm.taobao.org/deep-is/download/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "deepmerge": { + "version": "1.5.2", + "resolved": "https://registry.npm.taobao.org/deepmerge/download/deepmerge-1.5.2.tgz?cache=0&sync_timestamp=1572279774463&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdeepmerge%2Fdownload%2Fdeepmerge-1.5.2.tgz", + "integrity": "sha1-EEmdhohEza1P7ghC34x/bwyVp1M=", + "dev": true + }, + "default-gateway": { + "version": "5.0.5", + "resolved": "https://registry.npm.taobao.org/default-gateway/download/default-gateway-5.0.5.tgz", + "integrity": "sha1-T9a9XShV05s0zFpZUFSG6ar8mxA=", + "dev": true, + "requires": { + "execa": "^3.3.0" + }, + "dependencies": { + "cross-spawn": { + "version": "7.0.1", + "resolved": "https://registry.npm.taobao.org/cross-spawn/download/cross-spawn-7.0.1.tgz", + "integrity": "sha1-CrVihuD3wk4VPQTMKqAn5DqaXRQ=", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "execa": { + "version": "3.4.0", + "resolved": "https://registry.npm.taobao.org/execa/download/execa-3.4.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fexeca%2Fdownload%2Fexeca-3.4.0.tgz", + "integrity": "sha1-wI7UVQ72XYWPrCaf/IVyRG8364k=", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "p-finally": "^2.0.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + } + }, + "get-stream": { + "version": "5.1.0", + "resolved": "https://registry.npm.taobao.org/get-stream/download/get-stream-5.1.0.tgz", + "integrity": "sha1-ASA83JJZf5uQkGfD5lbMH008Tck=", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/is-stream/download/is-stream-2.0.0.tgz", + "integrity": "sha1-venDJoDW+uBBKdasnZIc54FfeOM=", + "dev": true + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/mimic-fn/download/mimic-fn-2.1.0.tgz", + "integrity": "sha1-ftLCzMyvhNP/y3pptXcR/CCDQBs=", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npm.taobao.org/npm-run-path/download/npm-run-path-4.0.1.tgz", + "integrity": "sha1-t+zR5e1T2o43pV4cImnguX7XSOo=", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "onetime": { + "version": "5.1.0", + "resolved": "https://registry.npm.taobao.org/onetime/download/onetime-5.1.0.tgz", + "integrity": "sha1-//DzyRYX/mK7UBiWNumayKbfe+U=", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "p-finally": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/p-finally/download/p-finally-2.0.1.tgz?cache=0&sync_timestamp=1560955759606&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fp-finally%2Fdownload%2Fp-finally-2.0.1.tgz", + "integrity": "sha1-vW/KqcVZoJa2gIBvTWV7Pw8kBWE=", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npm.taobao.org/path-key/download/path-key-3.1.1.tgz", + "integrity": "sha1-WB9q3mWMu6ZaDTOA3ndTKVBU83U=", + "dev": true + }, + "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=", + "dev": true, + "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=", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npm.taobao.org/which/download/which-2.0.2.tgz?cache=0&sync_timestamp=1574116230888&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fwhich%2Fdownload%2Fwhich-2.0.2.tgz", + "integrity": "sha1-fGqN0KY2oDJ+ELWckobu6T8/UbE=", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npm.taobao.org/defaults/download/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dev": true, + "requires": { + "clone": "^1.0.2" + } + }, + "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=", + "dev": true, + "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=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "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=", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "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=", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz", + "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "del": { + "version": "4.1.1", + "resolved": "https://registry.npm.taobao.org/del/download/del-4.1.1.tgz", + "integrity": "sha1-no8RciLqRKMf86FWwEm5kFKp8LQ=", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + }, + "dependencies": { + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npm.taobao.org/globby/download/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npm.taobao.org/pify/download/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/p-map/download/p-map-2.1.0.tgz", + "integrity": "sha1-MQko/u+cnsxltosXaTAYpmXOoXU=", + "dev": true + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/delayed-stream/download/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/depd/download/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "des.js": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/des.js/download/des.js-1.0.1.tgz", + "integrity": "sha1-U4IULhvcU/hdhtU+X0qn3rkeCEM=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npm.taobao.org/destroy/download/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "detect-node": { + "version": "2.0.4", + "resolved": "https://registry.npm.taobao.org/detect-node/download/detect-node-2.0.4.tgz", + "integrity": "sha1-AU7o+PZpxcWAI9pkuBecCDooxGw=", + "dev": true + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npm.taobao.org/diffie-hellman/download/diffie-hellman-5.0.3.tgz", + "integrity": "sha1-QOjumPVaIUlgcUaSHGPhrl89KHU=", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "dir-glob": { + "version": "2.2.2", + "resolved": "https://registry.npm.taobao.org/dir-glob/download/dir-glob-2.2.2.tgz", + "integrity": "sha1-+gnwaUFTyJGLGLoN6vrpR2n8UMQ=", + "dev": true, + "requires": { + "path-type": "^3.0.0" + } + }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/dns-equal/download/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "dev": true + }, + "dns-packet": { + "version": "1.3.1", + "resolved": "https://registry.npm.taobao.org/dns-packet/download/dns-packet-1.3.1.tgz", + "integrity": "sha1-EqpCaYEHW+UAuRDu3NC0fdfe2lo=", + "dev": true, + "requires": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npm.taobao.org/dns-txt/download/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "dev": true, + "requires": { + "buffer-indexof": "^1.0.0" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/doctrine/download/doctrine-3.0.0.tgz", + "integrity": "sha1-rd6+rXKmV023g2OdyHoSF3OXOWE=", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npm.taobao.org/dom-converter/download/dom-converter-0.2.0.tgz", + "integrity": "sha1-ZyGp2u4uKTaClVtq/kFncWJ7t2g=", + "dev": true, + "requires": { + "utila": "~0.4" + } + }, + "dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npm.taobao.org/dom-serializer/download/dom-serializer-0.2.2.tgz", + "integrity": "sha1-GvuB9TNxcXXUeGVd68XjMtn5u1E=", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/domelementtype/download/domelementtype-2.0.1.tgz", + "integrity": "sha1-H4vf6R9aeAYydOgDtL3O326U+U0=", + "dev": true + } + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/domain-browser/download/domain-browser-1.2.0.tgz?cache=0&sync_timestamp=1575879298649&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdomain-browser%2Fdownload%2Fdomain-browser-1.2.0.tgz", + "integrity": "sha1-PTH1AZGmdJ3RN1p/Ui6CPULlTto=", + "dev": true + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npm.taobao.org/domelementtype/download/domelementtype-1.3.1.tgz", + "integrity": "sha1-0EjESzew0Qp/Kj1f7j9DM9eQSB8=", + "dev": true + }, + "domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npm.taobao.org/domhandler/download/domhandler-2.4.2.tgz", + "integrity": "sha1-iAUJfpM9ZehVRvcm1g9euItE+AM=", + "dev": true, + "requires": { + "domelementtype": "1" + } + }, + "domutils": { + "version": "1.7.0", + "resolved": "https://registry.npm.taobao.org/domutils/download/domutils-1.7.0.tgz", + "integrity": "sha1-Vuo0HoNOBuZ0ivehyyXaZ+qfjCo=", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "dot-prop": { + "version": "4.2.0", + "resolved": "https://registry.npm.taobao.org/dot-prop/download/dot-prop-4.2.0.tgz?cache=0&sync_timestamp=1572621307586&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdot-prop%2Fdownload%2Fdot-prop-4.2.0.tgz", + "integrity": "sha1-HxngwuGqDjJ5fEl5nyg3rGr2nFc=", + "dev": true, + "requires": { + "is-obj": "^1.0.0" + } + }, + "dotenv": { + "version": "8.2.0", + "resolved": "https://registry.npm.taobao.org/dotenv/download/dotenv-8.2.0.tgz", + "integrity": "sha1-l+YZJZradQ7qPk6j4mvO6lQksWo=", + "dev": true + }, + "dotenv-expand": { + "version": "5.1.0", + "resolved": "https://registry.npm.taobao.org/dotenv-expand/download/dotenv-expand-5.1.0.tgz", + "integrity": "sha1-P7rwIL/XlIhAcuomsel5HUWmKfA=", + "dev": true + }, + "duplexer": { + "version": "0.1.1", + "resolved": "https://registry.npm.taobao.org/duplexer/download/duplexer-0.1.1.tgz", + "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", + "dev": true + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npm.taobao.org/duplexify/download/duplexify-3.7.1.tgz", + "integrity": "sha1-Kk31MX9sz9kfhtb9JdjYoQO4gwk=", + "dev": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "easy-stack": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/easy-stack/download/easy-stack-1.0.0.tgz", + "integrity": "sha1-EskbMIWjfwuqM26UhurEv5Tj54g=", + "dev": true + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npm.taobao.org/ecc-jsbn/download/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.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=", + "dev": true + }, + "ejs": { + "version": "2.7.4", + "resolved": "https://registry.npm.taobao.org/ejs/download/ejs-2.7.4.tgz", + "integrity": "sha1-SGYSh1c9zFPjZsehrlLDoSDuybo=", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.340", + "resolved": "https://registry.npm.taobao.org/electron-to-chromium/download/electron-to-chromium-1.3.340.tgz?cache=0&sync_timestamp=1579741585102&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Felectron-to-chromium%2Fdownload%2Felectron-to-chromium-1.3.340.tgz", + "integrity": "sha1-XU/njphNQhEZTPWlLggGlUPaFG8=", + "dev": true + }, + "elliptic": { + "version": "6.5.2", + "resolved": "https://registry.npm.taobao.org/elliptic/download/elliptic-6.5.2.tgz", + "integrity": "sha1-BcVnjXFzwEnYykM1UiJKSV0ON2I=", + "dev": true, + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npm.taobao.org/emoji-regex/download/emoji-regex-8.0.0.tgz", + "integrity": "sha1-6Bj9ac5cz8tARZT4QpY79TFkzDc=", + "dev": true + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/emojis-list/download/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/encodeurl/download/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npm.taobao.org/end-of-stream/download/end-of-stream-1.4.4.tgz?cache=0&sync_timestamp=1569416283279&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fend-of-stream%2Fdownload%2Fend-of-stream-1.4.4.tgz", + "integrity": "sha1-WuZKX0UFe682JuwU2gyl5LJDHrA=", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "enhanced-resolve": { + "version": "4.1.1", + "resolved": "https://registry.npm.taobao.org/enhanced-resolve/download/enhanced-resolve-4.1.1.tgz", + "integrity": "sha1-KTfiuAZs0P584JkKmPDXGjUYn2Y=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "dependencies": { + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npm.taobao.org/memory-fs/download/memory-fs-0.5.0.tgz?cache=0&sync_timestamp=1570537539012&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmemory-fs%2Fdownload%2Fmemory-fs-0.5.0.tgz", + "integrity": "sha1-MkwBKIuIZSlm0WHbd4OHIIRajjw=", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + } + } + }, + "entities": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/entities/download/entities-2.0.0.tgz", + "integrity": "sha1-aNYITKsbB5dnVA2A5Wo5tCPkq/Q=", + "dev": true + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npm.taobao.org/errno/download/errno-0.1.7.tgz", + "integrity": "sha1-RoTXF3mtOa8Xfj8AeZb3xnyFJhg=", + "dev": true, + "requires": { + "prr": "~1.0.1" + } + }, + "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=", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "error-stack-parser": { + "version": "2.0.6", + "resolved": "https://registry.npm.taobao.org/error-stack-parser/download/error-stack-parser-2.0.6.tgz", + "integrity": "sha1-WpmnB716TFinl5AtSNgoA+3mqtg=", + "dev": true, + "requires": { + "stackframe": "^1.1.1" + } + }, + "es-abstract": { + "version": "1.17.4", + "resolved": "https://registry.npm.taobao.org/es-abstract/download/es-abstract-1.17.4.tgz?cache=0&sync_timestamp=1579624493239&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fes-abstract%2Fdownload%2Fes-abstract-1.17.4.tgz", + "integrity": "sha1-467fGXBrIOfCWUw1/A1XYFp54YQ=", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npm.taobao.org/es-to-primitive/download/es-to-primitive-1.2.1.tgz", + "integrity": "sha1-5VzUyc3BiLzvsDs2bHNjI/xciYo=", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npm.taobao.org/escape-html/download/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "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=", + "dev": true + }, + "eslint": { + "version": "6.8.0", + "resolved": "https://registry.npm.taobao.org/eslint/download/eslint-6.8.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Feslint%2Fdownload%2Feslint-6.8.0.tgz", + "integrity": "sha1-YiYtZylzn5J1cjgkMC+yJ8jJP/s=", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.10.0", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^1.4.3", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.1.2", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "inquirer": "^7.0.0", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.14", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.3", + "progress": "^2.0.0", + "regexpp": "^2.0.1", + "semver": "^6.1.2", + "strip-ansi": "^5.2.0", + "strip-json-comments": "^3.0.1", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "eslint-scope": { + "version": "5.0.0", + "resolved": "https://registry.npm.taobao.org/eslint-scope/download/eslint-scope-5.0.0.tgz?cache=0&sync_timestamp=1566286635417&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Feslint-scope%2Fdownload%2Feslint-scope-5.0.0.tgz", + "integrity": "sha1-6HyIh8c+jR7ITxylkWRcNYv8j7k=", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "glob-parent": { + "version": "5.1.0", + "resolved": "https://registry.npm.taobao.org/glob-parent/download/glob-parent-5.1.0.tgz", + "integrity": "sha1-X0wdHnSNMM1zrSlEs1d6gbCB6MI=", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globals": { + "version": "12.3.0", + "resolved": "https://registry.npm.taobao.org/globals/download/globals-12.3.0.tgz?cache=0&sync_timestamp=1574143265609&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fglobals%2Fdownload%2Fglobals-12.3.0.tgz", + "integrity": "sha1-HlZO5cTd7SqwmLD4jyRwKjxWvhM=", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } + }, + "import-fresh": { + "version": "3.2.1", + "resolved": "https://registry.npm.taobao.org/import-fresh/download/import-fresh-3.2.1.tgz", + "integrity": "sha1-Yz/2GFBueTr1rJG/SLcmd+FcvmY=", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "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=", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz", + "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-5.2.0.tgz?cache=0&sync_timestamp=1573280518303&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-5.2.0.tgz", + "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npm.taobao.org/type-fest/download/type-fest-0.8.1.tgz", + "integrity": "sha1-CeJJ696FHTseSNJ8EFREZn8XuD0=", + "dev": true + } + } + }, + "eslint-config-standard": { + "version": "14.1.0", + "resolved": "https://registry.npm.taobao.org/eslint-config-standard/download/eslint-config-standard-14.1.0.tgz", + "integrity": "sha1-sj2it2/louumaDdPJGRU5wWPFdQ=", + "dev": true + }, + "eslint-import-resolver-node": { + "version": "0.3.3", + "resolved": "https://registry.npm.taobao.org/eslint-import-resolver-node/download/eslint-import-resolver-node-0.3.3.tgz", + "integrity": "sha1-26pStrKBa1C8ZxGvdUIt6AjphAQ=", + "dev": true, + "requires": { + "debug": "^2.6.9", + "resolve": "^1.13.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "dev": true, + "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=", + "dev": true + } + } + }, + "eslint-loader": { + "version": "2.2.1", + "resolved": "https://registry.npm.taobao.org/eslint-loader/download/eslint-loader-2.2.1.tgz?cache=0&sync_timestamp=1575636556905&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Feslint-loader%2Fdownload%2Feslint-loader-2.2.1.tgz", + "integrity": "sha1-KLnBLaVAV68IReKmEScBova/gzc=", + "dev": true, + "requires": { + "loader-fs-cache": "^1.0.0", + "loader-utils": "^1.0.2", + "object-assign": "^4.0.1", + "object-hash": "^1.1.4", + "rimraf": "^2.6.1" + } + }, + "eslint-module-utils": { + "version": "2.5.2", + "resolved": "https://registry.npm.taobao.org/eslint-module-utils/download/eslint-module-utils-2.5.2.tgz", + "integrity": "sha1-eHj3UEgk4bhX3SUFtZqOXtompwg=", + "dev": true, + "requires": { + "debug": "^2.6.9", + "pkg-dir": "^2.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/find-up/download/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/locate-path/download/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npm.taobao.org/p-limit/download/p-limit-1.3.0.tgz", + "integrity": "sha1-uGvV8MJWkJEcdZD8v8IBDVSzzLg=", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/p-locate/download/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/p-try/download/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/pkg-dir/download/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + } + } + } + }, + "eslint-plugin-es": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/eslint-plugin-es/download/eslint-plugin-es-3.0.0.tgz", + "integrity": "sha1-mMsbyKsKqAeXeFXhGtnRyUItAUs=", + "dev": true, + "requires": { + "eslint-utils": "^2.0.0", + "regexpp": "^3.0.0" + }, + "dependencies": { + "eslint-utils": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/eslint-utils/download/eslint-utils-2.0.0.tgz", + "integrity": "sha1-e+HMcPJ6cqds0UqmmLyr7WiQ4c0=", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "regexpp": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/regexpp/download/regexpp-3.0.0.tgz?cache=0&sync_timestamp=1567133271100&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fregexpp%2Fdownload%2Fregexpp-3.0.0.tgz", + "integrity": "sha1-3WOYLuMwDme0HBlW+FCqaA2dMw4=", + "dev": true + } + } + }, + "eslint-plugin-import": { + "version": "2.20.0", + "resolved": "https://registry.npm.taobao.org/eslint-plugin-import/download/eslint-plugin-import-2.20.0.tgz", + "integrity": "sha1-10mnJj+2wpmA3vjpYNOApqpq7Ko=", + "dev": true, + "requires": { + "array-includes": "^3.0.3", + "array.prototype.flat": "^1.2.1", + "contains-path": "^0.1.0", + "debug": "^2.6.9", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "^0.3.2", + "eslint-module-utils": "^2.4.1", + "has": "^1.0.3", + "minimatch": "^3.0.4", + "object.values": "^1.1.0", + "read-pkg-up": "^2.0.0", + "resolve": "^1.12.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npm.taobao.org/doctrine/download/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "isarray": "^1.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "eslint-plugin-node": { + "version": "11.0.0", + "resolved": "https://registry.npm.taobao.org/eslint-plugin-node/download/eslint-plugin-node-11.0.0.tgz", + "integrity": "sha1-NllEuwgExdHVARgqm8QaD/7+1yY=", + "dev": true, + "requires": { + "eslint-plugin-es": "^3.0.0", + "eslint-utils": "^2.0.0", + "ignore": "^5.1.1", + "minimatch": "^3.0.4", + "resolve": "^1.10.1", + "semver": "^6.1.0" + }, + "dependencies": { + "eslint-utils": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/eslint-utils/download/eslint-utils-2.0.0.tgz", + "integrity": "sha1-e+HMcPJ6cqds0UqmmLyr7WiQ4c0=", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "ignore": { + "version": "5.1.4", + "resolved": "https://registry.npm.taobao.org/ignore/download/ignore-5.1.4.tgz", + "integrity": "sha1-hLez2+ZFUrbvDsqZ9nQ9vsbZet8=", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz", + "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=", + "dev": true + } + } + }, + "eslint-plugin-promise": { + "version": "4.2.1", + "resolved": "https://registry.npm.taobao.org/eslint-plugin-promise/download/eslint-plugin-promise-4.2.1.tgz", + "integrity": "sha1-hF/YsiYK2PglZMEiL85ErXHZQYo=", + "dev": true + }, + "eslint-plugin-standard": { + "version": "4.0.1", + "resolved": "https://registry.npm.taobao.org/eslint-plugin-standard/download/eslint-plugin-standard-4.0.1.tgz", + "integrity": "sha1-/wUZ9/+v8RT3bRvXw5lu7w9uILQ=", + "dev": true + }, + "eslint-plugin-vue": { + "version": "6.1.2", + "resolved": "https://registry.npm.taobao.org/eslint-plugin-vue/download/eslint-plugin-vue-6.1.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Feslint-plugin-vue%2Fdownload%2Feslint-plugin-vue-6.1.2.tgz", + "integrity": "sha1-SwXCjIPA7JEmabZNvZmLuL9pLvY=", + "dev": true, + "requires": { + "semver": "^5.6.0", + "vue-eslint-parser": "^7.0.0" + } + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npm.taobao.org/eslint-scope/download/eslint-scope-4.0.3.tgz?cache=0&sync_timestamp=1566286635417&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Feslint-scope%2Fdownload%2Feslint-scope-4.0.3.tgz", + "integrity": "sha1-ygODMxD2iJoyZHgaqC5j65z+eEg=", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "1.4.3", + "resolved": "https://registry.npm.taobao.org/eslint-utils/download/eslint-utils-1.4.3.tgz", + "integrity": "sha1-dP7HxU0Hdrb2fgJRBAtYBlZOmB8=", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "eslint-visitor-keys": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/eslint-visitor-keys/download/eslint-visitor-keys-1.1.0.tgz?cache=0&sync_timestamp=1566286635194&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Feslint-visitor-keys%2Fdownload%2Feslint-visitor-keys-1.1.0.tgz", + "integrity": "sha1-4qgs6oT/JGrW+1f5veW0ZiFFnsI=", + "dev": true + }, + "espree": { + "version": "6.1.2", + "resolved": "https://registry.npm.taobao.org/espree/download/espree-6.1.2.tgz?cache=0&sync_timestamp=1571624368510&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fespree%2Fdownload%2Fespree-6.1.2.tgz", + "integrity": "sha1-bCcmUJMrT5HDcU5ee19eLs9HJi0=", + "dev": true, + "requires": { + "acorn": "^7.1.0", + "acorn-jsx": "^5.1.0", + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "acorn": { + "version": "7.1.0", + "resolved": "https://registry.npm.taobao.org/acorn/download/acorn-7.1.0.tgz", + "integrity": "sha1-lJ028sKSU12mAig1hsJHfFfrLWw=", + "dev": true + } + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npm.taobao.org/esprima/download/esprima-4.0.1.tgz", + "integrity": "sha1-E7BM2z5sXRnfkatph6hpVhmwqnE=", + "dev": true + }, + "esquery": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/esquery/download/esquery-1.0.1.tgz", + "integrity": "sha1-QGxRZYsfWZGl+bYrHcJbAOPlxwg=", + "dev": true, + "requires": { + "estraverse": "^4.0.0" + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npm.taobao.org/esrecurse/download/esrecurse-4.2.1.tgz", + "integrity": "sha1-AHo7n9vCs7uH5IeeoZyS/b05Qs8=", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npm.taobao.org/estraverse/download/estraverse-4.3.0.tgz", + "integrity": "sha1-OYrT88WiSUi+dyXoPRGn3ijNvR0=", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npm.taobao.org/esutils/download/esutils-2.0.3.tgz?cache=0&sync_timestamp=1564535520945&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fesutils%2Fdownload%2Fesutils-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=", + "dev": true + }, + "event-pubsub": { + "version": "4.3.0", + "resolved": "https://registry.npm.taobao.org/event-pubsub/download/event-pubsub-4.3.0.tgz", + "integrity": "sha1-9o2Ba8KfHsAsU53FjI3UDOcss24=", + "dev": true + }, + "eventemitter3": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/eventemitter3/download/eventemitter3-4.0.0.tgz", + "integrity": "sha1-1lF2FjiH7lnzhtZMgmELaWpKdOs=", + "dev": true + }, + "events": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/events/download/events-3.1.0.tgz", + "integrity": "sha1-hCea8bNMt1qoi/X/KR9tC9mzGlk=", + "dev": true + }, + "eventsource": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.1.1.tgz", + "integrity": "sha512-qV5ZC0h7jYIAOhArFJgSfdyz6rALJyb270714o7ZtNnw2WSJ+eexhKtE0O8LYPRsHZHf2osHKZBxGPvm3kPkCA==", + "dev": true, + "requires": { + "original": "^1.0.0" + } + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npm.taobao.org/evp_bytestokey/download/evp_bytestokey-1.0.3.tgz", + "integrity": "sha1-f8vbGY3HGVlDLv4ThCaE4FJaywI=", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/execa/download/execa-1.0.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fexeca%2Fdownload%2Fexeca-1.0.0.tgz", + "integrity": "sha1-xiNqW7TfbW8V6I5/AXeYIWdJ3dg=", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "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=", + "dev": true, + "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", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "dev": true, + "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=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npm.taobao.org/express/download/express-4.17.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fexpress%2Fdownload%2Fexpress-4.17.1.tgz", + "integrity": "sha1-RJH8OGBc9R+GKdOcK10Cb5ikwTQ=", + "dev": true, + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "dev": true, + "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=", + "dev": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npm.taobao.org/qs/download/qs-6.7.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fqs%2Fdownload%2Fqs-6.7.0.tgz", + "integrity": "sha1-QdwaAV49WB8WIXdr4xr7KHapsbw=", + "dev": true + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npm.taobao.org/extend/download/extend-3.0.2.tgz", + "integrity": "sha1-+LETa0Bx+9jrFAr/hYsQGewpFfo=", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "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=", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/external-editor/download/external-editor-3.1.0.tgz", + "integrity": "sha1-ywP3QL764D6k0oPK7SdBqD8zVJU=", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "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=", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "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=", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz", + "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npm.taobao.org/extsprintf/download/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.1", + "resolved": "https://registry.npm.taobao.org/fast-deep-equal/download/fast-deep-equal-3.1.1.tgz", + "integrity": "sha1-VFFFB3xQFJHjOxXsQIwpQ3bpSuQ=", + "dev": true + }, + "fast-glob": { + "version": "2.2.7", + "resolved": "https://registry.npm.taobao.org/fast-glob/download/fast-glob-2.2.7.tgz", + "integrity": "sha1-aVOFfDr6R1//ku5gFdUtpwpM050=", + "dev": true, + "requires": { + "@mrmlnc/readdir-enhanced": "^2.2.1", + "@nodelib/fs.stat": "^1.1.2", + "glob-parent": "^3.1.0", + "is-glob": "^4.0.0", + "merge2": "^1.2.3", + "micromatch": "^3.1.10" + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/fast-json-stable-stringify/download/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha1-h0v2nG9ATCtdmcSBNBOZ/VWJJjM=", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npm.taobao.org/fast-levenshtein/download/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "faye-websocket": { + "version": "0.10.0", + "resolved": "https://registry.npm.taobao.org/faye-websocket/download/faye-websocket-0.10.0.tgz", + "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "figgy-pudding": { + "version": "3.5.1", + "resolved": "https://registry.npm.taobao.org/figgy-pudding/download/figgy-pudding-3.5.1.tgz", + "integrity": "sha1-hiRwESkBxyeg5JWoB0S9W6odZ5A=", + "dev": true + }, + "figures": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/figures/download/figures-3.1.0.tgz", + "integrity": "sha1-SxmN0H2NcVMGQoZK8tRd2eRZxOw=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npm.taobao.org/file-entry-cache/download/file-entry-cache-5.0.1.tgz", + "integrity": "sha1-yg9u+m3T1WEzP7FFFQZcL6/fQ5w=", + "dev": true, + "requires": { + "flat-cache": "^2.0.1" + } + }, + "file-loader": { + "version": "4.3.0", + "resolved": "https://registry.npm.taobao.org/file-loader/download/file-loader-4.3.0.tgz", + "integrity": "sha1-eA8ED3KbPRgBnyBgX3I+hEuKWK8=", + "dev": true, + "requires": { + "loader-utils": "^1.2.3", + "schema-utils": "^2.5.0" + } + }, + "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=", + "dev": true, + "optional": true + }, + "filesize": { + "version": "3.6.1", + "resolved": "https://registry.npm.taobao.org/filesize/download/filesize-3.6.1.tgz", + "integrity": "sha1-CQuz7gG2+AGoqL6Z0xcQs0Irsxc=", + "dev": 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=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.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=", + "dev": true, + "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", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "dev": true, + "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=", + "dev": true + } + } + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/find-cache-dir/download/find-cache-dir-2.1.0.tgz?cache=0&sync_timestamp=1576153981844&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffind-cache-dir%2Fdownload%2Ffind-cache-dir-2.1.0.tgz", + "integrity": "sha1-jQ+UzRP+Q8bHwmGg2GEVypGMBfc=", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/find-up/download/find-up-3.0.0.tgz", + "integrity": "sha1-SRafHXmTQwZG2mHsxa41XCHJe3M=", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/flat-cache/download/flat-cache-2.0.1.tgz", + "integrity": "sha1-XSltbwS9pEpGMKMBQTvbwuwIXsA=", + "dev": true, + "requires": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + }, + "dependencies": { + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npm.taobao.org/rimraf/download/rimraf-2.6.3.tgz", + "integrity": "sha1-stEE/g2Psnz54KHNqCYt04M8bKs=", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "flatted": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/flatted/download/flatted-2.0.1.tgz", + "integrity": "sha1-aeV8qo8OrLwoHS4stFjUb9tEngg=", + "dev": true + }, + "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=", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "follow-redirects": { + "version": "1.9.0", + "resolved": "https://registry.npm.taobao.org/follow-redirects/download/follow-redirects-1.9.0.tgz", + "integrity": "sha1-jVvNxltxCP4VCGScecEtcy3O208=", + "dev": true, + "requires": { + "debug": "^3.0.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npm.taobao.org/debug/download/debug-3.2.6.tgz", + "integrity": "sha1-6D0X3hbYp++3cX7b5fsQE17uYps=", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/for-in/download/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/forever-agent/download/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npm.taobao.org/form-data/download/form-data-2.3.3.tgz", + "integrity": "sha1-3M5SwF9kTymManq5Nr1yTO/786Y=", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npm.taobao.org/forwarded/download/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "dev": true + }, + "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=", + "dev": true, + "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=", + "dev": true + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npm.taobao.org/from2/download/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npm.taobao.org/fs-extra/download/fs-extra-7.0.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffs-extra%2Fdownload%2Ffs-extra-7.0.1.tgz", + "integrity": "sha1-TxicRKoSO4lfcigE9V6iPq3DSOk=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/fs-minipass/download/fs-minipass-2.1.0.tgz?cache=0&sync_timestamp=1579629660514&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffs-minipass%2Fdownload%2Ffs-minipass-2.1.0.tgz", + "integrity": "sha1-f1A2/b8SxjwWkZDL5BmchSJx+fs=", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npm.taobao.org/fs-write-stream-atomic/download/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/fs.realpath/download/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "1.2.11", + "resolved": "https://registry.npm.taobao.org/fsevents/download/fsevents-1.2.11.tgz", + "integrity": "sha1-Z79X9HWPAu3oj7KhcS/vTRU1i+M=", + "dev": true, + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1", + "node-pre-gyp": "*" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "3.2.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.6.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.6", + "bundled": true, + "dev": true, + "optional": true, + "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" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "bundled": true, + "dev": true, + "optional": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true, + "optional": true + }, + "minipass": { + "version": "2.9.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.3.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.9.0" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.14.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4.4.2" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "optional": true, + "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" + } + }, + "rimraf": { + "version": "2.7.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.7.1", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.13", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "yallist": { + "version": "3.1.1", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "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=", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/functional-red-black-tree/download/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "gensync": { + "version": "1.0.0-beta.1", + "resolved": "https://registry.npm.taobao.org/gensync/download/gensync-1.0.0-beta.1.tgz", + "integrity": "sha1-WPQ2H/mH5f9uHnohCCeqNx6qwmk=", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npm.taobao.org/get-caller-file/download/get-caller-file-2.0.5.tgz", + "integrity": "sha1-T5RBKoLbMvNuOwuXQfipf+sDH34=", + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npm.taobao.org/get-stream/download/get-stream-4.1.0.tgz", + "integrity": "sha1-wbJVV189wh1Zv8ec09K0axw6VLU=", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npm.taobao.org/get-value/download/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npm.taobao.org/getpass/download/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npm.taobao.org/glob/download/glob-7.1.6.tgz", + "integrity": "sha1-FB8zuBp8JJLhJVlDB0gMRmeSeKY=", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "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=", + "dev": true, + "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=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "glob-to-regexp": { + "version": "0.3.0", + "resolved": "https://registry.npm.taobao.org/glob-to-regexp/download/glob-to-regexp-0.3.0.tgz", + "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", + "dev": true + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npm.taobao.org/globals/download/globals-11.12.0.tgz?cache=0&sync_timestamp=1574143265609&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fglobals%2Fdownload%2Fglobals-11.12.0.tgz", + "integrity": "sha1-q4eVM4hooLq9hSV1gBjCp+uVxC4=", + "dev": true + }, + "globby": { + "version": "9.2.0", + "resolved": "https://registry.npm.taobao.org/globby/download/globby-9.2.0.tgz", + "integrity": "sha1-/QKacGxwPSm90XD0tts6P3p8tj0=", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "array-union": "^1.0.2", + "dir-glob": "^2.2.2", + "fast-glob": "^2.2.6", + "glob": "^7.1.3", + "ignore": "^4.0.3", + "pify": "^4.0.1", + "slash": "^2.0.0" + } + }, + "graceful-fs": { + "version": "4.2.3", + "resolved": "https://registry.npm.taobao.org/graceful-fs/download/graceful-fs-4.2.3.tgz", + "integrity": "sha1-ShL/G2A3bvCYYsIJPt2Qgyi+hCM=", + "dev": true + }, + "gzip-size": { + "version": "5.1.1", + "resolved": "https://registry.npm.taobao.org/gzip-size/download/gzip-size-5.1.1.tgz", + "integrity": "sha1-y5vuaS+HwGErIyhAqHOQTkwTUnQ=", + "dev": true, + "requires": { + "duplexer": "^0.1.1", + "pify": "^4.0.1" + } + }, + "handle-thing": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/handle-thing/download/handle-thing-2.0.0.tgz", + "integrity": "sha1-DgOWlf9QyT/CiFV9aW88HcZ3Z1Q=", + "dev": true + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/har-schema/download/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npm.taobao.org/har-validator/download/har-validator-5.1.3.tgz", + "integrity": "sha1-HvievT5JllV2de7ZiTEQ3DUPoIA=", + "dev": true, + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npm.taobao.org/has/download/has-1.0.3.tgz", + "integrity": "sha1-ci18v8H2qoJB8W3YFOAR4fQeh5Y=", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/has-ansi/download/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "^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=", + "dev": true + } + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/has-flag/download/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/has-symbols/download/has-symbols-1.0.1.tgz", + "integrity": "sha1-n1IUdYpEGWxAbZvXbOv4HsLdMeg=", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/has-value/download/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "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=", + "dev": true, + "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?cache=0&sync_timestamp=1579194500634&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fkind-of%2Fdownload%2Fkind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npm.taobao.org/hash-base/download/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "hash-sum": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/hash-sum/download/hash-sum-1.0.2.tgz", + "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=", + "dev": true + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npm.taobao.org/hash.js/download/hash.js-1.1.7.tgz", + "integrity": "sha1-C6vKU46NTuSg+JiNaIZlN6ADz0I=", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/he/download/he-1.2.0.tgz", + "integrity": "sha1-hK5l+n6vsWX922FWauFLrwVmTw8=", + "dev": true + }, + "hex-color-regex": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/hex-color-regex/download/hex-color-regex-1.1.0.tgz", + "integrity": "sha1-TAb8y0YC/iYCs8k9+C1+fb8aio4=", + "dev": true + }, + "highlight.js": { + "version": "9.18.0", + "resolved": "https://registry.npm.taobao.org/highlight.js/download/highlight.js-9.18.0.tgz", + "integrity": "sha1-axdjz81TdEMTvT8x8SEPe+uWLHk=", + "dev": true + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/hmac-drbg/download/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "hoopy": { + "version": "0.1.4", + "resolved": "https://registry.npm.taobao.org/hoopy/download/hoopy-0.1.4.tgz", + "integrity": "sha1-YJIH1mEQADOpqUAq096mdzgcGx0=", + "dev": true + }, + "hosted-git-info": { + "version": "2.8.5", + "resolved": "https://registry.npm.taobao.org/hosted-git-info/download/hosted-git-info-2.8.5.tgz", + "integrity": "sha1-dZz88sTRVq3lmwst+r3cQqa5xww=", + "dev": true + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npm.taobao.org/hpack.js/download/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "hsl-regex": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/hsl-regex/download/hsl-regex-1.0.0.tgz", + "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=", + "dev": true + }, + "hsla-regex": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/hsla-regex/download/hsla-regex-1.0.0.tgz", + "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=", + "dev": true + }, + "html-comment-regex": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/html-comment-regex/download/html-comment-regex-1.1.2.tgz", + "integrity": "sha1-l9RoiutcgYhqNk+qDK0d2hTUM6c=", + "dev": true + }, + "html-entities": { + "version": "1.2.1", + "resolved": "https://registry.npm.taobao.org/html-entities/download/html-entities-1.2.1.tgz", + "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", + "dev": true + }, + "html-minifier": { + "version": "3.5.21", + "resolved": "https://registry.npm.taobao.org/html-minifier/download/html-minifier-3.5.21.tgz", + "integrity": "sha1-0AQOBUcw41TbAIRjWTGUAVIS0gw=", + "dev": true, + "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": { + "commander": { + "version": "2.17.1", + "resolved": "https://registry.npm.taobao.org/commander/download/commander-2.17.1.tgz", + "integrity": "sha1-vXerfebelCBc6sxy8XFtKfIKd78=", + "dev": true + } + } + }, + "html-tags": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/html-tags/download/html-tags-2.0.0.tgz", + "integrity": "sha1-ELMKOGCF9Dzt41PMj6fLDe7qZos=", + "dev": true + }, + "html-webpack-plugin": { + "version": "3.2.0", + "resolved": "https://registry.npm.taobao.org/html-webpack-plugin/download/html-webpack-plugin-3.2.0.tgz", + "integrity": "sha1-sBq71yOsqqeze2r0SS69oD2d03s=", + "dev": true, + "requires": { + "html-minifier": "^3.2.3", + "loader-utils": "^0.2.16", + "lodash": "^4.17.3", + "pretty-error": "^2.0.2", + "tapable": "^1.0.0", + "toposort": "^1.0.0", + "util.promisify": "1.0.0" + }, + "dependencies": { + "big.js": { + "version": "3.2.0", + "resolved": "https://registry.npm.taobao.org/big.js/download/big.js-3.2.0.tgz", + "integrity": "sha1-pfwpi4G54Nyi5FiCR4S2XFK6WI4=", + "dev": true + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npm.taobao.org/json5/download/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npm.taobao.org/loader-utils/download/loader-utils-0.2.17.tgz", + "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "dev": true, + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" + } + }, + "util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/util.promisify/download/util.promisify-1.0.0.tgz?cache=0&sync_timestamp=1579206994703&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Futil.promisify%2Fdownload%2Futil.promisify-1.0.0.tgz", + "integrity": "sha1-RA9xZaRZyaFtwUXrjnLzVocJcDA=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + } + } + }, + "htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npm.taobao.org/htmlparser2/download/htmlparser2-3.10.1.tgz", + "integrity": "sha1-vWedw/WYl7ajS7EHSchVu1OpOS8=", + "dev": true, + "requires": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + }, + "dependencies": { + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/entities/download/entities-1.1.2.tgz", + "integrity": "sha1-vfpzUplmTfr9NFKe1PhSKidf6lY=", + "dev": true + }, + "readable-stream": { + "version": "3.5.0", + "resolved": "https://registry.npm.taobao.org/readable-stream/download/readable-stream-3.5.0.tgz?cache=0&sync_timestamp=1579280462569&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Freadable-stream%2Fdownload%2Freadable-stream-3.5.0.tgz", + "integrity": "sha1-Rl1w5tEIf2Fi0HnNC123++v9FgY=", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npm.taobao.org/http-deceiver/download/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "dev": true + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npm.taobao.org/http-errors/download/http-errors-1.7.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhttp-errors%2Fdownload%2Fhttp-errors-1.7.2.tgz", + "integrity": "sha1-T1ApzxMjnzEDblsuVSkrz7zIXI8=", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npm.taobao.org/inherits/download/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "http-parser-js": { + "version": "0.4.10", + "resolved": "https://registry.npm.taobao.org/http-parser-js/download/http-parser-js-0.4.10.tgz?cache=0&sync_timestamp=1572715496014&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhttp-parser-js%2Fdownload%2Fhttp-parser-js-0.4.10.tgz", + "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=", + "dev": true + }, + "http-proxy": { + "version": "1.18.0", + "resolved": "https://registry.npm.taobao.org/http-proxy/download/http-proxy-1.18.0.tgz", + "integrity": "sha1-2+VfY+daNH2389mZdPJpKjFKajo=", + "dev": true, + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-middleware": { + "version": "0.19.1", + "resolved": "https://registry.npm.taobao.org/http-proxy-middleware/download/http-proxy-middleware-0.19.1.tgz?cache=0&sync_timestamp=1578244573724&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhttp-proxy-middleware%2Fdownload%2Fhttp-proxy-middleware-0.19.1.tgz", + "integrity": "sha1-GDx9xKoUeRUDBkmMIQza+WCApDo=", + "dev": true, + "requires": { + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/http-signature/download/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/https-browserify/download/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/human-signals/download/human-signals-1.1.1.tgz", + "integrity": "sha1-xbHNFPUK6uCatsWf5jujOV/k36M=", + "dev": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npm.taobao.org/iconv-lite/download/iconv-lite-0.4.24.tgz?cache=0&sync_timestamp=1579334008444&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ficonv-lite%2Fdownload%2Ficonv-lite-0.4.24.tgz", + "integrity": "sha1-ICK0sl+93CHS9SSXSkdKr+czkIs=", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "icss-utils": { + "version": "4.1.1", + "resolved": "https://registry.npm.taobao.org/icss-utils/download/icss-utils-4.1.1.tgz", + "integrity": "sha1-IRcLU3ie4nRHwvR91oMIFAP5pGc=", + "dev": true, + "requires": { + "postcss": "^7.0.14" + } + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npm.taobao.org/ieee754/download/ieee754-1.1.13.tgz", + "integrity": "sha1-7BaFWOlaoYH9h9N/VcMrvLZwi4Q=", + "dev": true + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npm.taobao.org/iferr/download/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npm.taobao.org/ignore/download/ignore-4.0.6.tgz", + "integrity": "sha1-dQ49tYYgh7RzfrrIIH/9HvJ7Jfw=", + "dev": true + }, + "import-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/import-cwd/download/import-cwd-2.1.0.tgz", + "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", + "dev": true, + "requires": { + "import-from": "^2.1.0" + } + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/import-fresh/download/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "dev": true, + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "import-from": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/import-from/download/import-from-2.1.0.tgz", + "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + } + }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/import-local/download/import-local-2.0.0.tgz", + "integrity": "sha1-VQcL44pZk88Y72236WH1vuXFoJ0=", + "dev": true, + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npm.taobao.org/imurmurhash/download/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/indent-string/download/indent-string-4.0.0.tgz", + "integrity": "sha1-Yk+PRJfWGbLZdoUx1Y9BIoVNclE=", + "dev": true + }, + "indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/indexes-of/download/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", + "dev": true + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npm.taobao.org/infer-owner/download/infer-owner-1.0.4.tgz", + "integrity": "sha1-xM78qo5RBRwqQLos6KPScpWvlGc=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npm.taobao.org/inflight/download/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "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=", + "dev": true + }, + "inquirer": { + "version": "7.0.4", + "resolved": "https://registry.npm.taobao.org/inquirer/download/inquirer-7.0.4.tgz", + "integrity": "sha1-ma9b3kcVOryiP1x/ww2yR/OdpwM=", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^2.4.2", + "cli-cursor": "^3.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.15", + "mute-stream": "0.0.8", + "run-async": "^2.2.0", + "rxjs": "^6.5.3", + "string-width": "^4.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + }, + "dependencies": { + "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=", + "dev": true + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/cli-cursor/download/cli-cursor-3.1.0.tgz", + "integrity": "sha1-JkMFp65JDR0Dvwybp8kl0XU68wc=", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha1-8Rb4Bk/pCz94RKOJl8C3UFEmnx0=", + "dev": true + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/mimic-fn/download/mimic-fn-2.1.0.tgz", + "integrity": "sha1-ftLCzMyvhNP/y3pptXcR/CCDQBs=", + "dev": true + }, + "onetime": { + "version": "5.1.0", + "resolved": "https://registry.npm.taobao.org/onetime/download/onetime-5.1.0.tgz", + "integrity": "sha1-//DzyRYX/mK7UBiWNumayKbfe+U=", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/restore-cursor/download/restore-cursor-3.1.0.tgz", + "integrity": "sha1-OfZ8VLOnpYzqUjbZXPADQjljH34=", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npm.taobao.org/string-width/download/string-width-4.2.0.tgz", + "integrity": "sha1-lSGCxGzHssMT0VluYjmSvRY7crU=", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-6.0.0.tgz?cache=0&sync_timestamp=1573280518303&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-6.0.0.tgz", + "integrity": "sha1-CxVx3XZpzNTz4G4U7x7tJiJa5TI=", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-5.2.0.tgz?cache=0&sync_timestamp=1573280518303&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-5.2.0.tgz", + "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + }, + "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=", + "dev": true + } + } + } + } + }, + "internal-ip": { + "version": "4.3.0", + "resolved": "https://registry.npm.taobao.org/internal-ip/download/internal-ip-4.3.0.tgz", + "integrity": "sha1-hFRSuq2dLKO2nGNaE3rLmg2tCQc=", + "dev": true, + "requires": { + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" + }, + "dependencies": { + "default-gateway": { + "version": "4.2.0", + "resolved": "https://registry.npm.taobao.org/default-gateway/download/default-gateway-4.2.0.tgz", + "integrity": "sha1-FnEEx1AMIRX23WmwpTa7jtcgVSs=", + "dev": true, + "requires": { + "execa": "^1.0.0", + "ip-regex": "^2.1.0" + } + } + } + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npm.taobao.org/invariant/download/invariant-2.2.4.tgz", + "integrity": "sha1-YQ88ksk1nOHbYW5TgAjSP/NRWOY=", + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/invert-kv/download/invert-kv-2.0.0.tgz", + "integrity": "sha1-c5P1r6Weyf9fZ6J2INEcIm4+7AI=", + "dev": true + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npm.taobao.org/ip/download/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true + }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/ip-regex/download/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "dev": true + }, + "ipaddr.js": { + "version": "1.9.0", + "resolved": "https://registry.npm.taobao.org/ipaddr.js/download/ipaddr.js-1.9.0.tgz", + "integrity": "sha1-N9905DCg5HVQ/lSi3v4w2KzZX2U=", + "dev": true + }, + "is-absolute-url": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/is-absolute-url/download/is-absolute-url-2.1.0.tgz?cache=0&sync_timestamp=1569735737284&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-absolute-url%2Fdownload%2Fis-absolute-url-2.1.0.tgz", + "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", + "dev": true + }, + "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=", + "dev": true, + "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?cache=0&sync_timestamp=1579194500634&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fkind-of%2Fdownload%2Fkind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-arguments": { + "version": "1.0.4", + "resolved": "https://registry.npm.taobao.org/is-arguments/download/is-arguments-1.0.4.tgz", + "integrity": "sha1-P6+WbHy6D/Q3+zH2JQCC/PBEjPM=", + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npm.taobao.org/is-arrayish/download/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "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=", + "dev": true, + "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=1569905349018&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-buffer%2Fdownload%2Fis-buffer-1.1.6.tgz", + "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=", + "dev": true + }, + "is-callable": { + "version": "1.1.5", + "resolved": "https://registry.npm.taobao.org/is-callable/download/is-callable-1.1.5.tgz?cache=0&sync_timestamp=1576778603160&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-callable%2Fdownload%2Fis-callable-1.1.5.tgz", + "integrity": "sha1-9+RrWWiQRW23Tn9ul2yzJz0G+qs=", + "dev": true + }, + "is-ci": { + "version": "1.2.1", + "resolved": "https://registry.npm.taobao.org/is-ci/download/is-ci-1.2.1.tgz", + "integrity": "sha1-43ecjuF/zPQoSI9uKBGH8uYyhBw=", + "dev": true, + "requires": { + "ci-info": "^1.5.0" + } + }, + "is-color-stop": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/is-color-stop/download/is-color-stop-1.1.0.tgz", + "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", + "dev": true, + "requires": { + "css-color-names": "^0.0.4", + "hex-color-regex": "^1.1.0", + "hsl-regex": "^1.0.0", + "hsla-regex": "^1.0.0", + "rgb-regex": "^1.0.1", + "rgba-regex": "^1.0.0" + } + }, + "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=", + "dev": true, + "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?cache=0&sync_timestamp=1579194500634&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fkind-of%2Fdownload%2Fkind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/is-date-object/download/is-date-object-1.0.2.tgz?cache=0&sync_timestamp=1576729394532&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-date-object%2Fdownload%2Fis-date-object-1.0.2.tgz", + "integrity": "sha1-vac28s2P0G0yhE53Q7+nSUw7/X4=", + "dev": true + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-0.1.6.tgz", + "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", + "dev": true, + "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?cache=0&sync_timestamp=1579194500634&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fkind-of%2Fdownload%2Fkind-of-5.1.0.tgz", + "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=", + "dev": true + } + } + }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npm.taobao.org/is-directory/download/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "dev": true + }, + "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=", + "dev": true + }, + "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=", + "dev": true + }, + "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=", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npm.taobao.org/is-glob/download/is-glob-4.0.1.tgz", + "integrity": "sha1-dWfb6fL14kZ7x3q4PEopSCQHpdw=", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/is-number/download/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "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?cache=0&sync_timestamp=1579194500634&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fkind-of%2Fdownload%2Fkind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/is-obj/download/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + }, + "is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npm.taobao.org/is-path-cwd/download/is-path-cwd-2.2.0.tgz", + "integrity": "sha1-Z9Q7gmZKe1GR/ZEZEn6zAASKn9s=", + "dev": true + }, + "is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/is-path-in-cwd/download/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha1-v+Lcomxp85cmWkAJljYCk1oFOss=", + "dev": true, + "requires": { + "is-path-inside": "^2.1.0" + } + }, + "is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/is-path-inside/download/is-path-inside-2.1.0.tgz", + "integrity": "sha1-fJgQWH1lmkDSe8201WFuqwWUlLI=", + "dev": true, + "requires": { + "path-is-inside": "^1.0.2" + } + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/is-plain-obj/download/is-plain-obj-1.1.0.tgz?cache=0&sync_timestamp=1579603262724&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-plain-obj%2Fdownload%2Fis-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + }, + "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=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/is-promise/download/is-promise-2.1.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-promise%2Fdownload%2Fis-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true + }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npm.taobao.org/is-regex/download/is-regex-1.0.5.tgz?cache=0&sync_timestamp=1576455852912&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-regex%2Fdownload%2Fis-regex-1.0.5.tgz", + "integrity": "sha1-OdWJo1i/GJZ/cmlnEguPwa7XTq4=", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/is-resolvable/download/is-resolvable-1.1.0.tgz", + "integrity": "sha1-+xj4fOH+uSUWnJpAfBkxijIG7Yg=", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/is-stream/download/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-string": { + "version": "1.0.5", + "resolved": "https://registry.npm.taobao.org/is-string/download/is-string-1.0.5.tgz", + "integrity": "sha1-QEk+0ZjvP/R3uMf5L2ROyCpc06Y=", + "dev": true + }, + "is-svg": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/is-svg/download/is-svg-3.0.0.tgz", + "integrity": "sha1-kyHb0pwhLlypnE+peUxxS8r6L3U=", + "dev": true, + "requires": { + "html-comment-regex": "^1.1.0" + } + }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npm.taobao.org/is-symbol/download/is-symbol-1.0.3.tgz?cache=0&sync_timestamp=1574297184917&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-symbol%2Fdownload%2Fis-symbol-1.0.3.tgz", + "integrity": "sha1-OOEBS55jKb4N6dJKQU/XRB7GGTc=", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/is-typedarray/download/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/is-windows/download/is-windows-1.0.2.tgz", + "integrity": "sha1-0YUOuXkezRjmGCzhKjDzlmNLsZ0=", + "dev": true + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/is-wsl/download/is-wsl-1.1.0.tgz?cache=0&sync_timestamp=1569219793734&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-wsl%2Fdownload%2Fis-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/isexe/download/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npm.taobao.org/isobject/download/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npm.taobao.org/isstream/download/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "javascript-stringify": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/javascript-stringify/download/javascript-stringify-2.0.1.tgz", + "integrity": "sha1-bvNYA1MQ411mfGde1j0+t8GqGeU=", + "dev": true + }, + "jest-worker": { + "version": "24.9.0", + "resolved": "https://registry.npm.taobao.org/jest-worker/download/jest-worker-24.9.0.tgz?cache=0&sync_timestamp=1579655147637&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjest-worker%2Fdownload%2Fjest-worker-24.9.0.tgz", + "integrity": "sha1-Xb/bWy0yLphWeJgjipaXvM5ns+U=", + "dev": true, + "requires": { + "merge-stream": "^2.0.0", + "supports-color": "^6.1.0" + }, + "dependencies": { + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-6.1.0.tgz", + "integrity": "sha1-B2Srxpxj1ayELdSGfo0CXogN+PM=", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "js-message": { + "version": "1.0.5", + "resolved": "https://registry.npm.taobao.org/js-message/download/js-message-1.0.5.tgz", + "integrity": "sha1-IwDSSxrwjondCVvBpMnJz8uJLRU=", + "dev": true + }, + "js-queue": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/js-queue/download/js-queue-2.0.0.tgz", + "integrity": "sha1-NiITz4YPRo8BJfxslqvBdCUx+Ug=", + "dev": true, + "requires": { + "easy-stack": "^1.0.0" + } + }, + "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=", + "dev": true + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npm.taobao.org/js-yaml/download/js-yaml-3.13.1.tgz", + "integrity": "sha1-r/FRswv9+o5J4F2iLnQV6d+jeEc=", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npm.taobao.org/jsbn/download/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npm.taobao.org/jsesc/download/jsesc-2.5.2.tgz", + "integrity": "sha1-gFZNLkg9rPbo7yCWUKZ98/DCg6Q=", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/json-parse-better-errors/download/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha1-u4Z8+zRQ5pEHwTHRxRS6s9yLyqk=", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npm.taobao.org/json-schema/download/json-schema-0.2.3.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjson-schema%2Fdownload%2Fjson-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npm.taobao.org/json-schema-traverse/download/json-schema-traverse-0.4.1.tgz", + "integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA=", + "dev": true + }, + "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=", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npm.taobao.org/json-stringify-safe/download/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json3": { + "version": "3.3.3", + "resolved": "https://registry.npm.taobao.org/json3/download/json3-3.3.3.tgz", + "integrity": "sha1-f8EON1/FrkLEcFpcwKpvYr4wW4E=", + "dev": true + }, + "json5": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/json5/download/json5-2.1.1.tgz", + "integrity": "sha1-gbbLBOm6SW8ccAXQe0NoomOPkLY=", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/jsonfile/download/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npm.taobao.org/jsprim/download/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "killable": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/killable/download/killable-1.0.1.tgz", + "integrity": "sha1-TIzkQRh6Bhx0dPuHygjipjgZSJI=", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-6.0.3.tgz?cache=0&sync_timestamp=1579194500634&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fkind-of%2Fdownload%2Fkind-of-6.0.3.tgz", + "integrity": "sha1-B8BQNKbDSfoG4k+jWqdttFgM5N0=", + "dev": true + }, + "launch-editor": { + "version": "2.2.1", + "resolved": "https://registry.npm.taobao.org/launch-editor/download/launch-editor-2.2.1.tgz", + "integrity": "sha1-hxtaPuOdZoD8wm03kwtu7aidsMo=", + "dev": true, + "requires": { + "chalk": "^2.3.0", + "shell-quote": "^1.6.1" + } + }, + "launch-editor-middleware": { + "version": "2.2.1", + "resolved": "https://registry.npm.taobao.org/launch-editor-middleware/download/launch-editor-middleware-2.2.1.tgz", + "integrity": "sha1-4UsH5scVSwpLhqD9NFeE5FgEwVc=", + "dev": true, + "requires": { + "launch-editor": "^2.2.1" + } + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/lcid/download/lcid-2.0.0.tgz", + "integrity": "sha1-bvXS32DlL4LrIopMNz6NHzlyU88=", + "dev": true, + "requires": { + "invert-kv": "^2.0.0" + } + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/leven/download/leven-3.1.0.tgz", + "integrity": "sha1-d4kd6DQGTMy6gq54QrtrFKE+1/I=", + "dev": true + }, + "levenary": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/levenary/download/levenary-1.1.0.tgz", + "integrity": "sha1-/BRv518y3Eg6Cixkrvcg9gLNYhA=", + "dev": true, + "requires": { + "leven": "^3.1.0" + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npm.taobao.org/levn/download/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "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=", + "dev": true + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/load-json-file/download/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npm.taobao.org/parse-json/download/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npm.taobao.org/pify/download/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "loader-fs-cache": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/loader-fs-cache/download/loader-fs-cache-1.0.2.tgz", + "integrity": "sha1-VM7fa3J+F3n9jwEgXwX26IcG8IY=", + "dev": true, + "requires": { + "find-cache-dir": "^0.1.1", + "mkdirp": "0.5.1" + }, + "dependencies": { + "find-cache-dir": { + "version": "0.1.1", + "resolved": "https://registry.npm.taobao.org/find-cache-dir/download/find-cache-dir-0.1.1.tgz?cache=0&sync_timestamp=1576153981844&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffind-cache-dir%2Fdownload%2Ffind-cache-dir-0.1.1.tgz", + "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "mkdirp": "^0.5.1", + "pkg-dir": "^1.0.0" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/find-up/download/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "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=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "pkg-dir": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/pkg-dir/download/pkg-dir-1.0.0.tgz", + "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", + "dev": true, + "requires": { + "find-up": "^1.0.0" + } + } + } + }, + "loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npm.taobao.org/loader-runner/download/loader-runner-2.4.0.tgz", + "integrity": "sha1-7UcGa/5TTX6ExMe5mYwqdWB9k1c=", + "dev": true + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npm.taobao.org/loader-utils/download/loader-utils-1.2.3.tgz", + "integrity": "sha1-H/XcaRHJ8KBiUxpMBLYJQGEIwsc=", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/json5/download/json5-1.0.1.tgz", + "integrity": "sha1-d5+wAYYE+oVOrL9iUhgNg1Q+Pb4=", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + } + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/locate-path/download/locate-path-3.0.0.tgz", + "integrity": "sha1-2+w7OrdZdYBxtY/ln8QYca8hQA4=", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npm.taobao.org/lodash/download/lodash-4.17.15.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flodash%2Fdownload%2Flodash-4.17.15.tgz", + "integrity": "sha1-tEf2ZwoEVbv+7dETku/zMOoJdUg=", + "dev": true + }, + "lodash.defaultsdeep": { + "version": "4.6.1", + "resolved": "https://registry.npm.taobao.org/lodash.defaultsdeep/download/lodash.defaultsdeep-4.6.1.tgz", + "integrity": "sha1-US6b1yHSctlOPTpjZT+hdRZ0HKY=", + "dev": true + }, + "lodash.kebabcase": { + "version": "4.1.1", + "resolved": "https://registry.npm.taobao.org/lodash.kebabcase/download/lodash.kebabcase-4.1.1.tgz", + "integrity": "sha1-hImxyw0p/4gZXM7KRI/21swpXDY=", + "dev": true + }, + "lodash.mapvalues": { + "version": "4.6.0", + "resolved": "https://registry.npm.taobao.org/lodash.mapvalues/download/lodash.mapvalues-4.6.0.tgz", + "integrity": "sha1-G6+lAF3p3W9PJmaMMMo3IwzJaJw=", + "dev": true + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npm.taobao.org/lodash.memoize/download/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "dev": true + }, + "lodash.transform": { + "version": "4.6.0", + "resolved": "https://registry.npm.taobao.org/lodash.transform/download/lodash.transform-4.6.0.tgz", + "integrity": "sha1-EjBkIvYzJK7YSD0/ODMrX2cFR6A=", + "dev": true + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npm.taobao.org/lodash.uniq/download/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", + "dev": true + }, + "log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npm.taobao.org/log-symbols/download/log-symbols-2.2.0.tgz", + "integrity": "sha1-V0Dhxdbw39pK2TI7UzIQfva0xAo=", + "dev": true, + "requires": { + "chalk": "^2.0.1" + } + }, + "loglevel": { + "version": "1.6.6", + "resolved": "https://registry.npm.taobao.org/loglevel/download/loglevel-1.6.6.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Floglevel%2Fdownload%2Floglevel-1.6.6.tgz", + "integrity": "sha1-DuYwDMBY22s1UfocS/c7g7t3ExI=", + "dev": true + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npm.taobao.org/loose-envify/download/loose-envify-1.4.0.tgz", + "integrity": "sha1-ce5R+nvkyuwaY4OffmgtgTLTDK8=", + "dev": true, + "requires": { + "js-tokens": "^3.0.0 || ^4.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=", + "dev": true + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npm.taobao.org/lru-cache/download/lru-cache-5.1.1.tgz", + "integrity": "sha1-HaJ+ZxAnGUdpXa9oSOhH8B2EuSA=", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/make-dir/download/make-dir-2.1.0.tgz", + "integrity": "sha1-XwMQ4YuL6JjMBwCSlaMK5B6R5vU=", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "mamacro": { + "version": "0.0.3", + "resolved": "https://registry.npm.taobao.org/mamacro/download/mamacro-0.0.3.tgz", + "integrity": "sha1-rSyVdhl8nxq/MI0Hh4Zb2XWj8+Q=", + "dev": true + }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npm.taobao.org/map-age-cleaner/download/map-age-cleaner-0.1.3.tgz", + "integrity": "sha1-fVg6cwZDTAVf5HSw9FB45uG0uSo=", + "dev": true, + "requires": { + "p-defer": "^1.0.0" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npm.taobao.org/map-cache/download/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "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=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npm.taobao.org/md5.js/download/md5.js-1.3.5.tgz", + "integrity": "sha1-tdB7jjIW4+J81yjXL3DR5qNCAF8=", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npm.taobao.org/mdn-data/download/mdn-data-2.0.4.tgz?cache=0&sync_timestamp=1573816585926&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmdn-data%2Fdownload%2Fmdn-data-2.0.4.tgz", + "integrity": "sha1-aZs8OKxvHXKAkaZGULZdOIUC/Vs=", + "dev": true + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npm.taobao.org/media-typer/download/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "mem": { + "version": "4.3.0", + "resolved": "https://registry.npm.taobao.org/mem/download/mem-4.3.0.tgz?cache=0&sync_timestamp=1575034261240&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmem%2Fdownload%2Fmem-4.3.0.tgz", + "integrity": "sha1-Rhr0l7xK4JYIzbLmDu+2m/90QXg=", + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + }, + "dependencies": { + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/mimic-fn/download/mimic-fn-2.1.0.tgz", + "integrity": "sha1-ftLCzMyvhNP/y3pptXcR/CCDQBs=", + "dev": true + } + } + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npm.taobao.org/memory-fs/download/memory-fs-0.4.1.tgz?cache=0&sync_timestamp=1570537539012&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmemory-fs%2Fdownload%2Fmemory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/merge-descriptors/download/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "merge-source-map": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/merge-source-map/download/merge-source-map-1.1.0.tgz", + "integrity": "sha1-L93n5gIJOfcJBqaPLXrmheTIxkY=", + "dev": true, + "requires": { + "source-map": "^0.6.1" + }, + "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=", + "dev": true + } + } + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/merge-stream/download/merge-stream-2.0.0.tgz", + "integrity": "sha1-UoI2KaFN0AyXcPtq1H3GMQ8sH2A=", + "dev": true + }, + "merge2": { + "version": "1.3.0", + "resolved": "https://registry.npm.taobao.org/merge2/download/merge2-1.3.0.tgz?cache=0&sync_timestamp=1568381966726&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmerge2%2Fdownload%2Fmerge2-1.3.0.tgz", + "integrity": "sha1-WzZu6DsvFYLEj4fkfPGpNSEDyoE=", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/methods/download/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npm.taobao.org/micromatch/download/micromatch-3.1.10.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmicromatch%2Fdownload%2Fmicromatch-3.1.10.tgz", + "integrity": "sha1-cIWbyVyYQJUvNZoGij/En57PrCM=", + "dev": true, + "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" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npm.taobao.org/miller-rabin/download/miller-rabin-4.0.1.tgz", + "integrity": "sha1-8IA1HIZbDcViqEYpZtqlNUPHik0=", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + } + }, + "mime": { + "version": "2.4.4", + "resolved": "https://registry.npm.taobao.org/mime/download/mime-2.4.4.tgz", + "integrity": "sha1-vXuRE1/GsBzePpuuM9ZZtj2IV+U=", + "dev": true + }, + "mime-db": { + "version": "1.43.0", + "resolved": "https://registry.npm.taobao.org/mime-db/download/mime-db-1.43.0.tgz", + "integrity": "sha1-ChLgUCZQ5HPXNVNQUOfI9OtPrlg=", + "dev": true + }, + "mime-types": { + "version": "2.1.26", + "resolved": "https://registry.npm.taobao.org/mime-types/download/mime-types-2.1.26.tgz", + "integrity": "sha1-nJIfwJt+FJpl39wNpNIJlyALCgY=", + "dev": true, + "requires": { + "mime-db": "1.43.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/mimic-fn/download/mimic-fn-1.2.0.tgz", + "integrity": "sha1-ggyGo5M0ZA6ZUWkovQP8qIBX0CI=", + "dev": true + }, + "mini-css-extract-plugin": { + "version": "0.8.2", + "resolved": "https://registry.npm.taobao.org/mini-css-extract-plugin/download/mini-css-extract-plugin-0.8.2.tgz?cache=0&sync_timestamp=1576856499989&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmini-css-extract-plugin%2Fdownload%2Fmini-css-extract-plugin-0.8.2.tgz", + "integrity": "sha1-qHXhab6yfIivd92WJ3HJ7tw9oWE=", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "normalize-url": "1.9.1", + "schema-utils": "^1.0.0", + "webpack-sources": "^1.1.0" + }, + "dependencies": { + "normalize-url": { + "version": "1.9.1", + "resolved": "https://registry.npm.taobao.org/normalize-url/download/normalize-url-1.9.1.tgz", + "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", + "dev": true, + "requires": { + "object-assign": "^4.0.1", + "prepend-http": "^1.0.0", + "query-string": "^4.1.0", + "sort-keys": "^1.0.0" + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/schema-utils/download/schema-utils-1.0.0.tgz", + "integrity": "sha1-C3mpMgTXtgDUsoUNH2bCo0lRx3A=", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/minimalistic-assert/download/minimalistic-assert-1.0.1.tgz", + "integrity": "sha1-LhlN4ERibUoQ5/f7wAznPoPk1cc=", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/minimalistic-crypto-utils/download/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npm.taobao.org/minimatch/download/minimatch-3.0.4.tgz", + "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/minimist/download/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "minipass": { + "version": "3.1.1", + "resolved": "https://registry.npm.taobao.org/minipass/download/minipass-3.1.1.tgz", + "integrity": "sha1-dgfOd4RyoYWtbYkIKqIHD3nO3NU=", + "dev": true, + "requires": { + "yallist": "^4.0.0" + }, + "dependencies": { + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/yallist/download/yallist-4.0.0.tgz", + "integrity": "sha1-m7knkNnA7/7GO+c1GeEaNQGaOnI=", + "dev": true + } + } + }, + "minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/minipass-collect/download/minipass-collect-1.0.2.tgz", + "integrity": "sha1-IrgTv3Rdxu26JXa5QAIq1u3Ixhc=", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npm.taobao.org/minipass-flush/download/minipass-flush-1.0.5.tgz", + "integrity": "sha1-gucTXX6JpQ/+ZGEKeHlTxMTLs3M=", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-pipeline": { + "version": "1.2.2", + "resolved": "https://registry.npm.taobao.org/minipass-pipeline/download/minipass-pipeline-1.2.2.tgz", + "integrity": "sha1-PctrtKVG4ylpx61xDyx5qGq7qTo=", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/mississippi/download/mississippi-3.0.0.tgz", + "integrity": "sha1-6goykfl+C16HdrNj1fChLZTGcCI=", + "dev": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npm.taobao.org/mixin-deep/download/mixin-deep-1.3.2.tgz", + "integrity": "sha1-ESC0PcNZp4Xc5ltVuC4lfM9HlWY=", + "dev": true, + "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=", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npm.taobao.org/mkdirp/download/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npm.taobao.org/minimist/download/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + } + } + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/move-concurrently/download/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.2.tgz", + "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=", + "dev": true + }, + "multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npm.taobao.org/multicast-dns/download/multicast-dns-6.2.3.tgz", + "integrity": "sha1-oOx72QVcQoL3kMPIL04o2zsxsik=", + "dev": true, + "requires": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + } + }, + "multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/multicast-dns-service-types/download/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "dev": true + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npm.taobao.org/mute-stream/download/mute-stream-0.0.8.tgz", + "integrity": "sha1-FjDEKyJR/4HiooPelqVJfqkuXg0=", + "dev": true + }, + "mz": { + "version": "2.7.0", + "resolved": "https://registry.npm.taobao.org/mz/download/mz-2.7.0.tgz", + "integrity": "sha1-lQCAV6Vsr63CvGPd5/n/aVWUjjI=", + "dev": true, + "requires": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npm.taobao.org/nan/download/nan-2.14.0.tgz", + "integrity": "sha1-eBj3IgJ7JFmobwKV1DTR/CM2xSw=", + "dev": true, + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npm.taobao.org/nanomatch/download/nanomatch-1.2.13.tgz", + "integrity": "sha1-uHqKpPwN6P5r6IiVs4mD/yZb0Rk=", + "dev": true, + "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" + } + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npm.taobao.org/natural-compare/download/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npm.taobao.org/negotiator/download/negotiator-0.6.2.tgz", + "integrity": "sha1-/qz3zPUlp3rpY0Q2pkiD/+yjRvs=", + "dev": true + }, + "neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npm.taobao.org/neo-async/download/neo-async-2.6.1.tgz", + "integrity": "sha1-rCetpmFn+ohJpq3dg39rGJrSCBw=", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npm.taobao.org/nice-try/download/nice-try-1.0.5.tgz", + "integrity": "sha1-ozeKdpbOfSI+iPybdkvX7xCJ42Y=", + "dev": true + }, + "no-case": { + "version": "2.3.2", + "resolved": "https://registry.npm.taobao.org/no-case/download/no-case-2.3.2.tgz?cache=0&sync_timestamp=1576721537540&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fno-case%2Fdownload%2Fno-case-2.3.2.tgz", + "integrity": "sha1-YLgTOWvjmz8SiKTB7V0efSi0ZKw=", + "dev": true, + "requires": { + "lower-case": "^1.1.1" + } + }, + "node-forge": { + "version": "0.9.0", + "resolved": "https://registry.npm.taobao.org/node-forge/download/node-forge-0.9.0.tgz", + "integrity": "sha1-1iQFDtu0SHStyhK7mlLsY8t4JXk=", + "dev": true + }, + "node-ipc": { + "version": "9.1.1", + "resolved": "https://registry.npm.taobao.org/node-ipc/download/node-ipc-9.1.1.tgz", + "integrity": "sha1-TiRe1pOOZRAOWV68XcNLFujdXWk=", + "dev": true, + "requires": { + "event-pubsub": "4.3.0", + "js-message": "1.0.5", + "js-queue": "2.0.0" + } + }, + "node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npm.taobao.org/node-libs-browser/download/node-libs-browser-2.2.1.tgz", + "integrity": "sha1-tk9RPRgzhiX5A0bSew0jXmMfZCU=", + "dev": true, + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npm.taobao.org/punycode/download/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, + "node-releases": { + "version": "1.1.47", + "resolved": "https://registry.npm.taobao.org/node-releases/download/node-releases-1.1.47.tgz?cache=0&sync_timestamp=1579642045467&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnode-releases%2Fdownload%2Fnode-releases-1.1.47.tgz", + "integrity": "sha1-xZ73OaH9fsvZ8LfPW3hx6Ki1keQ=", + "dev": true, + "requires": { + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz", + "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=", + "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", + "integrity": "sha1-5m2xg4sgDB38IzIl0SyzZSDiNKg=", + "dev": true, + "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=", + "dev": true + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npm.taobao.org/normalize-range/download/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true + }, + "normalize-url": { + "version": "3.3.0", + "resolved": "https://registry.npm.taobao.org/normalize-url/download/normalize-url-3.3.0.tgz", + "integrity": "sha1-suHE3E98bVd0PfczpPWXjRhlBVk=", + "dev": true + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npm.taobao.org/npm-run-path/download/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/nth-check/download/nth-check-1.0.2.tgz", + "integrity": "sha1-sr0pXDfj3VijvwcAN2Zjuk2c8Fw=", + "dev": true, + "requires": { + "boolbase": "~1.0.0" + } + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npm.taobao.org/num2fraction/download/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "dev": true + }, + "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=", + "dev": true + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npm.taobao.org/oauth-sign/download/oauth-sign-0.9.0.tgz", + "integrity": "sha1-R6ewFrqmi1+g7PPe4IqFxnmsZFU=", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npm.taobao.org/object-assign/download/object-assign-4.1.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fobject-assign%2Fdownload%2Fobject-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npm.taobao.org/object-copy/download/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "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=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz?cache=0&sync_timestamp=1579194500634&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fkind-of%2Fdownload%2Fkind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-hash": { + "version": "1.3.1", + "resolved": "https://registry.npm.taobao.org/object-hash/download/object-hash-1.3.1.tgz", + "integrity": "sha1-/eRSCYqVHLFF8Dm7fUVUSd3BJt8=", + "dev": true + }, + "object-inspect": { + "version": "1.7.0", + "resolved": "https://registry.npm.taobao.org/object-inspect/download/object-inspect-1.7.0.tgz?cache=0&sync_timestamp=1573451929207&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fobject-inspect%2Fdownload%2Fobject-inspect-1.7.0.tgz", + "integrity": "sha1-9Pa9GBrXfwBrXs5gvQtvOY/3Smc=", + "dev": true + }, + "object-is": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/object-is/download/object-is-1.0.2.tgz", + "integrity": "sha1-a4DrhP5FFJj2UAeYLwNaW0Re3sQ=", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/object-keys/download/object-keys-1.1.1.tgz", + "integrity": "sha1-HEfyct8nfzsdrwYWd9nILiMixg4=", + "dev": true + }, + "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=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npm.taobao.org/object.assign/download/object.assign-4.1.0.tgz", + "integrity": "sha1-lovxEA15Vrs8oIbwBvhGs7xACNo=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.getownpropertydescriptors": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/object.getownpropertydescriptors/download/object.getownpropertydescriptors-2.1.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fobject.getownpropertydescriptors%2Fdownload%2Fobject.getownpropertydescriptors-2.1.0.tgz", + "integrity": "sha1-Npvx+VktiridcS3O1cuBx8U1Jkk=", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } + }, + "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=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "object.values": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/object.values/download/object.values-1.1.1.tgz", + "integrity": "sha1-aKmezeNWt+kpWjxeDOMdyMlT3l4=", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/obuf/download/obuf-1.1.2.tgz", + "integrity": "sha1-Cb6jND1BhZ69RGKS0RydTbYZCE4=", + "dev": true + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npm.taobao.org/on-finished/download/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "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=", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npm.taobao.org/once/download/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/onetime/download/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "open": { + "version": "6.4.0", + "resolved": "https://registry.npm.taobao.org/open/download/open-6.4.0.tgz", + "integrity": "sha1-XBPpbQ3IlGhhZPGJZez+iJ7PyKk=", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + } + }, + "opener": { + "version": "1.5.1", + "resolved": "https://registry.npm.taobao.org/opener/download/opener-1.5.1.tgz", + "integrity": "sha1-bS8Od/GgrwAyrKcWwsH7uOfoq+0=", + "dev": true + }, + "opn": { + "version": "5.5.0", + "resolved": "https://registry.npm.taobao.org/opn/download/opn-5.5.0.tgz", + "integrity": "sha1-/HFk+rVtI1kExRw7J9pnWMo7m/w=", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npm.taobao.org/optionator/download/optionator-0.8.3.tgz?cache=0&sync_timestamp=1573077370127&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Foptionator%2Fdownload%2Foptionator-0.8.3.tgz", + "integrity": "sha1-hPodA2/p08fiHZmIS2ARZ+yPtJU=", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "ora": { + "version": "3.4.0", + "resolved": "https://registry.npm.taobao.org/ora/download/ora-3.4.0.tgz?cache=0&sync_timestamp=1573641074639&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fora%2Fdownload%2Fora-3.4.0.tgz", + "integrity": "sha1-vwdSSRBZo+8+1MhQl1Md6f280xg=", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-spinners": "^2.0.0", + "log-symbols": "^2.2.0", + "strip-ansi": "^5.2.0", + "wcwidth": "^1.0.1" + }, + "dependencies": { + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-5.2.0.tgz?cache=0&sync_timestamp=1573280518303&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-5.2.0.tgz", + "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "original": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/original/download/original-1.0.2.tgz", + "integrity": "sha1-5EKmHP/hxf0gpl8yYcJmY7MD8l8=", + "dev": true, + "requires": { + "url-parse": "^1.4.3" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npm.taobao.org/os-browserify/download/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "os-locale": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/os-locale/download/os-locale-3.1.0.tgz", + "integrity": "sha1-qAKm7hfyTBBIOrmTVxnO9O0Wvxo=", + "dev": true, + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.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=", + "dev": true + }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/p-defer/download/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/p-finally/download/p-finally-1.0.0.tgz?cache=0&sync_timestamp=1560955759606&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fp-finally%2Fdownload%2Fp-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/p-is-promise/download/p-is-promise-2.1.0.tgz", + "integrity": "sha1-kYzrrqJIpiz3/6uOO8qMX4gvxC4=", + "dev": true + }, + "p-limit": { + "version": "2.2.2", + "resolved": "https://registry.npm.taobao.org/p-limit/download/p-limit-2.2.2.tgz", + "integrity": "sha1-YSebZ3IfUoeqHBOpp/u8SMkpGx4=", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/p-locate/download/p-locate-3.0.0.tgz", + "integrity": "sha1-Mi1poFwCZLJZl9n0DNiokasAZKQ=", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-map": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/p-map/download/p-map-3.0.0.tgz", + "integrity": "sha1-1wTZr4orpoTiYA2aIVmD1BQal50=", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "p-retry": { + "version": "3.0.1", + "resolved": "https://registry.npm.taobao.org/p-retry/download/p-retry-3.0.1.tgz?cache=0&sync_timestamp=1572522037219&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fp-retry%2Fdownload%2Fp-retry-3.0.1.tgz", + "integrity": "sha1-MWtMiJPiyNwc+okfQGxLQivr8yg=", + "dev": true, + "requires": { + "retry": "^0.12.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npm.taobao.org/p-try/download/p-try-2.2.0.tgz", + "integrity": "sha1-yyhoVA4xPWHeWPr741zpAE1VQOY=", + "dev": true + }, + "pako": { + "version": "1.0.10", + "resolved": "https://registry.npm.taobao.org/pako/download/pako-1.0.10.tgz", + "integrity": "sha1-Qyi621CGpCaqkPVBl31JVdpclzI=", + "dev": true + }, + "parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/parallel-transform/download/parallel-transform-1.2.0.tgz", + "integrity": "sha1-kEnKN9bLIYLDsdLHIL6U0UpYFPw=", + "dev": true, + "requires": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "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=", + "dev": true, + "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=", + "dev": true, + "requires": { + "callsites": "^3.0.0" + }, + "dependencies": { + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/callsites/download/callsites-3.1.0.tgz", + "integrity": "sha1-s2MKvYlDQy9Us/BRkjjjPNffL3M=", + "dev": true + } + } + }, + "parse-asn1": { + "version": "5.1.5", + "resolved": "https://registry.npm.taobao.org/parse-asn1/download/parse-asn1-5.1.5.tgz", + "integrity": "sha1-ADJxND2ljclMrOSU+u89IUfs6g4=", + "dev": true, + "requires": { + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/parse-json/download/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "parse5": { + "version": "5.1.1", + "resolved": "https://registry.npm.taobao.org/parse5/download/parse5-5.1.1.tgz", + "integrity": "sha1-9o5OW6GFKsLK3AD0VV//bCq7YXg=", + "dev": true + }, + "parse5-htmlparser2-tree-adapter": { + "version": "5.1.1", + "resolved": "https://registry.npm.taobao.org/parse5-htmlparser2-tree-adapter/download/parse5-htmlparser2-tree-adapter-5.1.1.tgz", + "integrity": "sha1-6MdD1OkhlNUpPs3isIvjHmdGHLw=", + "dev": true, + "requires": { + "parse5": "^5.1.1" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npm.taobao.org/parseurl/download/parseurl-1.3.3.tgz", + "integrity": "sha1-naGee+6NEt/wUT7Vt2lXeTvC6NQ=", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npm.taobao.org/pascalcase/download/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npm.taobao.org/path-browserify/download/path-browserify-0.0.1.tgz", + "integrity": "sha1-5sTd1+06onxoogzE5Q4aTug7vEo=", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/path-dirname/download/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/path-exists/download/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "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=", + "dev": true + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/path-is-inside/download/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/path-key/download/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npm.taobao.org/path-parse/download/path-parse-1.0.6.tgz", + "integrity": "sha1-1i27VnlAXXLEc37FhgDp3c8G0kw=", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npm.taobao.org/path-to-regexp/download/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/path-type/download/path-type-3.0.0.tgz", + "integrity": "sha1-zvMdyOCho7sNEFwM2Xzzv0f0428=", + "dev": true, + "requires": { + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/pify/download/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "pbkdf2": { + "version": "3.0.17", + "resolved": "https://registry.npm.taobao.org/pbkdf2/download/pbkdf2-3.0.17.tgz", + "integrity": "sha1-l2wgZTBhexTrsyEUI597CTNuk6Y=", + "dev": true, + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/performance-now/download/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npm.taobao.org/pify/download/pify-4.0.1.tgz", + "integrity": "sha1-SyzSXFDVmHNcUCkiJP2MbfQeMjE=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npm.taobao.org/pinkie/download/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "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=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/pkg-dir/download/pkg-dir-3.0.0.tgz", + "integrity": "sha1-J0kCDyOe2ZCIGx9xIQ1R62UjvqM=", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "portfinder": { + "version": "1.0.25", + "resolved": "https://registry.npm.taobao.org/portfinder/download/portfinder-1.0.25.tgz?cache=0&sync_timestamp=1571177575818&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fportfinder%2Fdownload%2Fportfinder-1.0.25.tgz", + "integrity": "sha1-JU/TN/+6hp9LnTftwpgFnLTTXso=", + "dev": true, + "requires": { + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.1" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npm.taobao.org/debug/download/debug-3.2.6.tgz", + "integrity": "sha1-6D0X3hbYp++3cX7b5fsQE17uYps=", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "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=", + "dev": true + }, + "postcss": { + "version": "7.0.26", + "resolved": "https://registry.npm.taobao.org/postcss/download/postcss-7.0.26.tgz", + "integrity": "sha1-XtYVz8qzW6m7uCQUpPqI6hBClYc=", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.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=", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-6.1.0.tgz", + "integrity": "sha1-B2Srxpxj1ayELdSGfo0CXogN+PM=", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-calc": { + "version": "7.0.1", + "resolved": "https://registry.npm.taobao.org/postcss-calc/download/postcss-calc-7.0.1.tgz", + "integrity": "sha1-Ntd7qwI7Dsu5eJ2E3LI8SUEUVDY=", + "dev": true, + "requires": { + "css-unit-converter": "^1.1.1", + "postcss": "^7.0.5", + "postcss-selector-parser": "^5.0.0-rc.4", + "postcss-value-parser": "^3.3.1" + } + }, + "postcss-colormin": { + "version": "4.0.3", + "resolved": "https://registry.npm.taobao.org/postcss-colormin/download/postcss-colormin-4.0.3.tgz", + "integrity": "sha1-rgYLzpPteUrHEmTwgTLVUJVr04E=", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "color": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-convert-values": { + "version": "4.0.1", + "resolved": "https://registry.npm.taobao.org/postcss-convert-values/download/postcss-convert-values-4.0.1.tgz", + "integrity": "sha1-yjgT7U2g+BL51DcDWE5Enr4Ymn8=", + "dev": true, + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-discard-comments": { + "version": "4.0.2", + "resolved": "https://registry.npm.taobao.org/postcss-discard-comments/download/postcss-discard-comments-4.0.2.tgz", + "integrity": "sha1-H7q9LCRr/2qq15l7KwkY9NevQDM=", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-discard-duplicates": { + "version": "4.0.2", + "resolved": "https://registry.npm.taobao.org/postcss-discard-duplicates/download/postcss-discard-duplicates-4.0.2.tgz", + "integrity": "sha1-P+EzzTyCKC5VD8myORdqkge3hOs=", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-discard-empty": { + "version": "4.0.1", + "resolved": "https://registry.npm.taobao.org/postcss-discard-empty/download/postcss-discard-empty-4.0.1.tgz", + "integrity": "sha1-yMlR6fc+2UKAGUWERKAq2Qu592U=", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-discard-overridden": { + "version": "4.0.1", + "resolved": "https://registry.npm.taobao.org/postcss-discard-overridden/download/postcss-discard-overridden-4.0.1.tgz", + "integrity": "sha1-ZSrvipZybwKfXj4AFG7npOdV/1c=", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-load-config": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/postcss-load-config/download/postcss-load-config-2.1.0.tgz", + "integrity": "sha1-yE1pK3u3tB3c7ZTuYuirMbQXsAM=", + "dev": true, + "requires": { + "cosmiconfig": "^5.0.0", + "import-cwd": "^2.0.0" + } + }, + "postcss-loader": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/postcss-loader/download/postcss-loader-3.0.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-loader%2Fdownload%2Fpostcss-loader-3.0.0.tgz", + "integrity": "sha1-a5eUPkfHLYRfqeA/Jzdz1OjdbC0=", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "postcss": "^7.0.0", + "postcss-load-config": "^2.0.0", + "schema-utils": "^1.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/schema-utils/download/schema-utils-1.0.0.tgz", + "integrity": "sha1-C3mpMgTXtgDUsoUNH2bCo0lRx3A=", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "postcss-merge-longhand": { + "version": "4.0.11", + "resolved": "https://registry.npm.taobao.org/postcss-merge-longhand/download/postcss-merge-longhand-4.0.11.tgz", + "integrity": "sha1-YvSaE+Sg7gTnuY9CuxYGLKJUniQ=", + "dev": true, + "requires": { + "css-color-names": "0.0.4", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "stylehacks": "^4.0.0" + } + }, + "postcss-merge-rules": { + "version": "4.0.3", + "resolved": "https://registry.npm.taobao.org/postcss-merge-rules/download/postcss-merge-rules-4.0.3.tgz", + "integrity": "sha1-NivqT/Wh+Y5AdacTxsslrv75plA=", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "cssnano-util-same-parent": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0", + "vendors": "^1.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.1", + "resolved": "https://registry.npm.taobao.org/postcss-selector-parser/download/postcss-selector-parser-3.1.1.tgz", + "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=", + "dev": true, + "requires": { + "dot-prop": "^4.1.1", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-minify-font-values": { + "version": "4.0.2", + "resolved": "https://registry.npm.taobao.org/postcss-minify-font-values/download/postcss-minify-font-values-4.0.2.tgz", + "integrity": "sha1-zUw0TM5HQ0P6xdgiBqssvLiv1aY=", + "dev": true, + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-minify-gradients": { + "version": "4.0.2", + "resolved": "https://registry.npm.taobao.org/postcss-minify-gradients/download/postcss-minify-gradients-4.0.2.tgz", + "integrity": "sha1-k7KcL/UJnFNe7NpWxKpuZlpmNHE=", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "is-color-stop": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-minify-params": { + "version": "4.0.2", + "resolved": "https://registry.npm.taobao.org/postcss-minify-params/download/postcss-minify-params-4.0.2.tgz", + "integrity": "sha1-a5zvAwwR41Jh+V9hjJADbWgNuHQ=", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.0", + "browserslist": "^4.0.0", + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "uniqs": "^2.0.0" + } + }, + "postcss-minify-selectors": { + "version": "4.0.2", + "resolved": "https://registry.npm.taobao.org/postcss-minify-selectors/download/postcss-minify-selectors-4.0.2.tgz", + "integrity": "sha1-4uXrQL/uUA0M2SQ1APX46kJi+9g=", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.1", + "resolved": "https://registry.npm.taobao.org/postcss-selector-parser/download/postcss-selector-parser-3.1.1.tgz", + "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=", + "dev": true, + "requires": { + "dot-prop": "^4.1.1", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-modules-extract-imports": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/postcss-modules-extract-imports/download/postcss-modules-extract-imports-2.0.0.tgz", + "integrity": "sha1-gYcZoa4doyX5gyRGsBE27rSTzX4=", + "dev": true, + "requires": { + "postcss": "^7.0.5" + } + }, + "postcss-modules-local-by-default": { + "version": "3.0.2", + "resolved": "https://registry.npm.taobao.org/postcss-modules-local-by-default/download/postcss-modules-local-by-default-3.0.2.tgz", + "integrity": "sha1-6KZWG+kUqvPAUodjd1JMqQ27eRU=", + "dev": true, + "requires": { + "icss-utils": "^4.1.1", + "postcss": "^7.0.16", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.0" + }, + "dependencies": { + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/cssesc/download/cssesc-3.0.0.tgz", + "integrity": "sha1-N3QZGZA7hoVl4cCep0dEXNGJg+4=", + "dev": true + }, + "postcss-selector-parser": { + "version": "6.0.2", + "resolved": "https://registry.npm.taobao.org/postcss-selector-parser/download/postcss-selector-parser-6.0.2.tgz", + "integrity": "sha1-k0z3mdAWyDQRhZ4J3Oyt4BKG7Fw=", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "postcss-value-parser": { + "version": "4.0.2", + "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-4.0.2.tgz", + "integrity": "sha1-SCKCwJpCcG0fyaBptz9E7Ag5Hck=", + "dev": true + } + } + }, + "postcss-modules-scope": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/postcss-modules-scope/download/postcss-modules-scope-2.1.1.tgz", + "integrity": "sha1-M9T8lGYC616TVcQWXWihBydonbo=", + "dev": true, + "requires": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0" + }, + "dependencies": { + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/cssesc/download/cssesc-3.0.0.tgz", + "integrity": "sha1-N3QZGZA7hoVl4cCep0dEXNGJg+4=", + "dev": true + }, + "postcss-selector-parser": { + "version": "6.0.2", + "resolved": "https://registry.npm.taobao.org/postcss-selector-parser/download/postcss-selector-parser-6.0.2.tgz", + "integrity": "sha1-k0z3mdAWyDQRhZ4J3Oyt4BKG7Fw=", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-modules-values": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/postcss-modules-values/download/postcss-modules-values-3.0.0.tgz", + "integrity": "sha1-W1AA1uuuKbQlUwG0o6VFdEI+fxA=", + "dev": true, + "requires": { + "icss-utils": "^4.0.0", + "postcss": "^7.0.6" + } + }, + "postcss-normalize-charset": { + "version": "4.0.1", + "resolved": "https://registry.npm.taobao.org/postcss-normalize-charset/download/postcss-normalize-charset-4.0.1.tgz", + "integrity": "sha1-izWt067oOhNrBHHg1ZvlilAoXdQ=", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-normalize-display-values": { + "version": "4.0.2", + "resolved": "https://registry.npm.taobao.org/postcss-normalize-display-values/download/postcss-normalize-display-values-4.0.2.tgz", + "integrity": "sha1-Db4EpM6QY9RmftK+R2u4MMglk1o=", + "dev": true, + "requires": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-normalize-positions": { + "version": "4.0.2", + "resolved": "https://registry.npm.taobao.org/postcss-normalize-positions/download/postcss-normalize-positions-4.0.2.tgz", + "integrity": "sha1-BfdX+E8mBDc3g2ipH4ky1LECkX8=", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-normalize-repeat-style": { + "version": "4.0.2", + "resolved": "https://registry.npm.taobao.org/postcss-normalize-repeat-style/download/postcss-normalize-repeat-style-4.0.2.tgz", + "integrity": "sha1-xOu8KJ85kaAo1EdRy90RkYsXkQw=", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-normalize-string": { + "version": "4.0.2", + "resolved": "https://registry.npm.taobao.org/postcss-normalize-string/download/postcss-normalize-string-4.0.2.tgz", + "integrity": "sha1-zUTECrB6DHo23F6Zqs4eyk7CaQw=", + "dev": true, + "requires": { + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-normalize-timing-functions": { + "version": "4.0.2", + "resolved": "https://registry.npm.taobao.org/postcss-normalize-timing-functions/download/postcss-normalize-timing-functions-4.0.2.tgz", + "integrity": "sha1-jgCcoqOUnNr4rSPmtquZy159KNk=", + "dev": true, + "requires": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-normalize-unicode": { + "version": "4.0.1", + "resolved": "https://registry.npm.taobao.org/postcss-normalize-unicode/download/postcss-normalize-unicode-4.0.1.tgz", + "integrity": "sha1-hBvUj9zzAZrUuqdJOj02O1KuHPs=", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-normalize-url": { + "version": "4.0.1", + "resolved": "https://registry.npm.taobao.org/postcss-normalize-url/download/postcss-normalize-url-4.0.1.tgz", + "integrity": "sha1-EOQ3+GvHx+WPe5ZS7YeNqqlfquE=", + "dev": true, + "requires": { + "is-absolute-url": "^2.0.0", + "normalize-url": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-normalize-whitespace": { + "version": "4.0.2", + "resolved": "https://registry.npm.taobao.org/postcss-normalize-whitespace/download/postcss-normalize-whitespace-4.0.2.tgz", + "integrity": "sha1-vx1AcP5Pzqh9E0joJdjMDF+qfYI=", + "dev": true, + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-ordered-values": { + "version": "4.1.2", + "resolved": "https://registry.npm.taobao.org/postcss-ordered-values/download/postcss-ordered-values-4.1.2.tgz", + "integrity": "sha1-DPdcgg7H1cTSgBiVWeC1ceusDu4=", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-reduce-initial": { + "version": "4.0.3", + "resolved": "https://registry.npm.taobao.org/postcss-reduce-initial/download/postcss-reduce-initial-4.0.3.tgz", + "integrity": "sha1-f9QuvqXpyBRgljniwuhK4nC6SN8=", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0" + } + }, + "postcss-reduce-transforms": { + "version": "4.0.2", + "resolved": "https://registry.npm.taobao.org/postcss-reduce-transforms/download/postcss-reduce-transforms-4.0.2.tgz", + "integrity": "sha1-F++kBerMbge+NBSlyi0QdGgdTik=", + "dev": true, + "requires": { + "cssnano-util-get-match": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npm.taobao.org/postcss-selector-parser/download/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha1-JJBENWaXsztk8aj3yAki3d7nGVw=", + "dev": true, + "requires": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "postcss-svgo": { + "version": "4.0.2", + "resolved": "https://registry.npm.taobao.org/postcss-svgo/download/postcss-svgo-4.0.2.tgz", + "integrity": "sha1-F7mXvHEbMzurFDqu07jT1uPTglg=", + "dev": true, + "requires": { + "is-svg": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "svgo": "^1.0.0" + } + }, + "postcss-unique-selectors": { + "version": "4.0.1", + "resolved": "https://registry.npm.taobao.org/postcss-unique-selectors/download/postcss-unique-selectors-4.0.1.tgz", + "integrity": "sha1-lEaRHzKJv9ZMbWgPBzwDsfnuS6w=", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.0", + "postcss": "^7.0.0", + "uniqs": "^2.0.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-3.3.1.tgz", + "integrity": "sha1-n/giVH4okyE88cMO+lGsX9G6goE=", + "dev": true + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/prelude-ls/download/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npm.taobao.org/prepend-http/download/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true + }, + "prettier": { + "version": "1.19.1", + "resolved": "https://registry.npm.taobao.org/prettier/download/prettier-1.19.1.tgz", + "integrity": "sha1-99f1/4qc2HKnvkyhQglZVqYHl8s=", + "dev": true + }, + "pretty-error": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/pretty-error/download/pretty-error-2.1.1.tgz", + "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", + "dev": true, + "requires": { + "renderkid": "^2.0.1", + "utila": "~0.4" + } + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npm.taobao.org/private/download/private-0.1.8.tgz", + "integrity": "sha1-I4Hts2ifelPWUxkAYPz4ItLzaP8=", + "dev": true + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npm.taobao.org/process/download/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/process-nextick-args/download/process-nextick-args-2.0.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fprocess-nextick-args%2Fdownload%2Fprocess-nextick-args-2.0.1.tgz", + "integrity": "sha1-eCDZsWEgzFXKmud5JoCufbptf+I=", + "dev": true + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npm.taobao.org/progress/download/progress-2.0.3.tgz", + "integrity": "sha1-foz42PW48jnBvGi+tOt4Vn1XLvg=", + "dev": true + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/promise-inflight/download/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "proxy-addr": { + "version": "2.0.5", + "resolved": "https://registry.npm.taobao.org/proxy-addr/download/proxy-addr-2.0.5.tgz", + "integrity": "sha1-NMvWSi2B9LH9IedvnwbIpFKZ7jQ=", + "dev": true, + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.0" + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/prr/download/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/pseudomap/download/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "psl": { + "version": "1.7.0", + "resolved": "https://registry.npm.taobao.org/psl/download/psl-1.7.0.tgz", + "integrity": "sha1-8cTEeo75cWfepda79IFtc26ISjw=", + "dev": true + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npm.taobao.org/public-encrypt/download/public-encrypt-4.0.3.tgz", + "integrity": "sha1-T8ydd6B+SLp1J+fL4N4z0HATMeA=", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/pump/download/pump-3.0.0.tgz", + "integrity": "sha1-tKIRaBW94vTh6mAjVOjHVWUQemQ=", + "dev": true, + "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=", + "dev": true, + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/pump/download/pump-2.0.1.tgz", + "integrity": "sha1-Ejma3W5M91Jtlzy8i1zi4pCLOQk=", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/punycode/download/punycode-2.1.1.tgz", + "integrity": "sha1-tYsBCsQMIsVldhbI0sLALHv0eew=", + "dev": true + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npm.taobao.org/q/download/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npm.taobao.org/qs/download/qs-6.5.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fqs%2Fdownload%2Fqs-6.5.2.tgz", + "integrity": "sha1-yzroBuh0BERYTvFUzo7pjUA/PjY=", + "dev": true + }, + "query-string": { + "version": "4.3.4", + "resolved": "https://registry.npm.taobao.org/query-string/download/query-string-4.3.4.tgz", + "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", + "dev": true, + "requires": { + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npm.taobao.org/querystring/download/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npm.taobao.org/querystring-es3/download/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "querystringify": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/querystringify/download/querystringify-2.1.1.tgz", + "integrity": "sha1-YOWl/WSn+L+k0qsu1v30yFutFU4=", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/randombytes/download/randombytes-2.1.0.tgz", + "integrity": "sha1-32+ENy8CcNxlzfYpE0mrekc9Tyo=", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npm.taobao.org/randomfill/download/randomfill-1.0.4.tgz", + "integrity": "sha1-ySGW/IarQr6YPxvzF3giSTHWFFg=", + "dev": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npm.taobao.org/range-parser/download/range-parser-1.2.1.tgz", + "integrity": "sha1-PPNwI9GZ4cJNGlW4SADC8+ZGgDE=", + "dev": true + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npm.taobao.org/raw-body/download/raw-body-2.4.0.tgz", + "integrity": "sha1-oc5vucm8NWylLoklarWQWeE9AzI=", + "dev": true, + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npm.taobao.org/read-pkg/download/read-pkg-5.2.0.tgz", + "integrity": "sha1-e/KVQ4yloz5WzTDgU7NO5yUMk8w=", + "dev": true, + "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": { + "parse-json": { + "version": "5.0.0", + "resolved": "https://registry.npm.taobao.org/parse-json/download/parse-json-5.0.0.tgz", + "integrity": "sha1-c+URTJhtFD76NxLU6iTbmkJm9g8=", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1", + "lines-and-columns": "^1.1.6" + } + } + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/read-pkg-up/download/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/find-up/download/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/locate-path/download/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npm.taobao.org/p-limit/download/p-limit-1.3.0.tgz", + "integrity": "sha1-uGvV8MJWkJEcdZD8v8IBDVSzzLg=", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/p-locate/download/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/p-try/download/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/path-type/download/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npm.taobao.org/pify/download/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/read-pkg/download/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + } + } + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npm.taobao.org/readable-stream/download/readable-stream-2.3.7.tgz?cache=0&sync_timestamp=1579280462569&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Freadable-stream%2Fdownload%2Freadable-stream-2.3.7.tgz", + "integrity": "sha1-Hsoc9xGu+BTAT2IlKjamL2yyO1c=", + "dev": true, + "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?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Freaddirp%2Fdownload%2Freaddirp-2.2.1.tgz", + "integrity": "sha1-DodiKjMlqjPokihcr4tOhGUppSU=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "regenerate": { + "version": "1.4.0", + "resolved": "https://registry.npm.taobao.org/regenerate/download/regenerate-1.4.0.tgz", + "integrity": "sha1-SoVuxLVuQHfFV1icroXnpMiGmhE=", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "8.1.0", + "resolved": "https://registry.npm.taobao.org/regenerate-unicode-properties/download/regenerate-unicode-properties-8.1.0.tgz", + "integrity": "sha1-71Hg8OpK1CS3e/fLQfPgFccKPw4=", + "dev": true, + "requires": { + "regenerate": "^1.4.0" + } + }, + "regenerator-runtime": { + "version": "0.13.3", + "resolved": "https://registry.npm.taobao.org/regenerator-runtime/download/regenerator-runtime-0.13.3.tgz", + "integrity": "sha1-fPanfY9cb2Drc8X8GVWyzrAea/U=", + "dev": true + }, + "regenerator-transform": { + "version": "0.14.1", + "resolved": "https://registry.npm.taobao.org/regenerator-transform/download/regenerator-transform-0.14.1.tgz", + "integrity": "sha1-Oy/OThq3cywI9mXf2zFHScfd0vs=", + "dev": true, + "requires": { + "private": "^0.1.6" + } + }, + "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=", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regexp.prototype.flags": { + "version": "1.3.0", + "resolved": "https://registry.npm.taobao.org/regexp.prototype.flags/download/regexp.prototype.flags-1.3.0.tgz", + "integrity": "sha1-erqJs8E6ZFCdq888qNn7ub31y3U=", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } + }, + "regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/regexpp/download/regexpp-2.0.1.tgz?cache=0&sync_timestamp=1567133271100&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fregexpp%2Fdownload%2Fregexpp-2.0.1.tgz", + "integrity": "sha1-jRnTHPYySCtYkEn4KB+T28uk0H8=", + "dev": true + }, + "regexpu-core": { + "version": "4.6.0", + "resolved": "https://registry.npm.taobao.org/regexpu-core/download/regexpu-core-4.6.0.tgz", + "integrity": "sha1-IDfBizJ8/Oim/qKk7EQfJDKvuLY=", + "dev": true, + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.1.0", + "regjsgen": "^0.5.0", + "regjsparser": "^0.6.0", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.1.0" + } + }, + "regjsgen": { + "version": "0.5.1", + "resolved": "https://registry.npm.taobao.org/regjsgen/download/regjsgen-0.5.1.tgz", + "integrity": "sha1-SPC/Gl6iBRlpKcDZeYtC0e2YRDw=", + "dev": true + }, + "regjsparser": { + "version": "0.6.2", + "resolved": "https://registry.npm.taobao.org/regjsparser/download/regjsparser-0.6.2.tgz", + "integrity": "sha1-/WLHU5kUZ9nR/+Cp9n8npSkCS5Y=", + "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", + "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=", + "dev": true + }, + "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=", + "dev": true + }, + "renderkid": { + "version": "2.0.3", + "resolved": "https://registry.npm.taobao.org/renderkid/download/renderkid-2.0.3.tgz", + "integrity": "sha1-OAF5wv9a4TZcUivy/Pz/AcW3QUk=", + "dev": true, + "requires": { + "css-select": "^1.1.0", + "dom-converter": "^0.2", + "htmlparser2": "^3.3.0", + "strip-ansi": "^3.0.0", + "utila": "^0.4.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=", + "dev": true + }, + "css-select": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/css-select/download/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "dev": true, + "requires": { + "boolbase": "~1.0.0", + "css-what": "2.1", + "domutils": "1.5.1", + "nth-check": "~1.0.1" + } + }, + "css-what": { + "version": "2.1.3", + "resolved": "https://registry.npm.taobao.org/css-what/download/css-what-2.1.3.tgz", + "integrity": "sha1-ptdgRXM2X+dGhsPzEcVlE9iChfI=", + "dev": true + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npm.taobao.org/domutils/download/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-3.0.1.tgz?cache=0&sync_timestamp=1573280518303&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npm.taobao.org/repeat-element/download/repeat-element-1.1.3.tgz", + "integrity": "sha1-eC4NglwMWjuzlzH4Tv7mt0Lmsc4=", + "dev": true + }, + "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=", + "dev": true + }, + "request": { + "version": "2.88.0", + "resolved": "https://registry.npm.taobao.org/request/download/request-2.88.0.tgz", + "integrity": "sha1-nC/KT301tZLv5Xx/ClXoEFIST+8=", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "request-promise-core": { + "version": "1.1.3", + "resolved": "https://registry.npm.taobao.org/request-promise-core/download/request-promise-core-1.1.3.tgz", + "integrity": "sha1-6aPAgbUTgN/qZ3M2Bh/qh5qCnuk=", + "dev": true, + "requires": { + "lodash": "^4.17.15" + } + }, + "request-promise-native": { + "version": "1.0.8", + "resolved": "https://registry.npm.taobao.org/request-promise-native/download/request-promise-native-1.0.8.tgz", + "integrity": "sha1-pFW5YLgm5E4r+Jma9k3/K/5YyzY=", + "dev": true, + "requires": { + "request-promise-core": "1.1.3", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + } + }, + "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=", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/require-main-filename/download/require-main-filename-2.0.0.tgz", + "integrity": "sha1-0LMp7MfMD2Fkn2IhW+aa9UqomJs=", + "dev": true + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/requires-port/download/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "resolve": { + "version": "1.15.0", + "resolved": "https://registry.npm.taobao.org/resolve/download/resolve-1.15.0.tgz", + "integrity": "sha1-G3ypYHPrtS50H/15n2s56kYsZ/U=", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/resolve-cwd/download/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/resolve-from/download/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + }, + "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=", + "dev": true + }, + "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=", + "dev": true, + "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=", + "dev": true + }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npm.taobao.org/retry/download/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "dev": true + }, + "rgb-regex": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/rgb-regex/download/rgb-regex-1.0.1.tgz", + "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=", + "dev": true + }, + "rgba-regex": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/rgba-regex/download/rgba-regex-1.0.0.tgz", + "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", + "dev": true + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npm.taobao.org/rimraf/download/rimraf-2.7.1.tgz", + "integrity": "sha1-NXl/E6f9rcVmFCwp1PB8ytSD4+w=", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npm.taobao.org/ripemd160/download/ripemd160-2.0.2.tgz", + "integrity": "sha1-ocGm9iR1FXe6XQeRTLyShQWFiQw=", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npm.taobao.org/run-async/download/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "dev": true, + "requires": { + "is-promise": "^2.1.0" + } + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npm.taobao.org/run-queue/download/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dev": true, + "requires": { + "aproba": "^1.1.1" + } + }, + "rxjs": { + "version": "6.5.4", + "resolved": "https://registry.npm.taobao.org/rxjs/download/rxjs-6.5.4.tgz", + "integrity": "sha1-4Hd/4NGEzseHLfFH8wNXLUFOIRw=", + "dev": true, + "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=", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/safe-regex/download/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "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?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsafer-buffer%2Fdownload%2Fsafer-buffer-2.1.2.tgz", + "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo=", + "dev": true + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npm.taobao.org/sax/download/sax-1.2.4.tgz", + "integrity": "sha1-KBYjTiN4vdxOU1T6tcqold9xANk=", + "dev": true + }, + "schema-utils": { + "version": "2.6.4", + "resolved": "https://registry.npm.taobao.org/schema-utils/download/schema-utils-2.6.4.tgz", + "integrity": "sha1-on779uTnhonZGHLuPM+lfXvdD1M=", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1" + } + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/select-hose/download/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "dev": true + }, + "selfsigned": { + "version": "1.10.7", + "resolved": "https://registry.npm.taobao.org/selfsigned/download/selfsigned-1.10.7.tgz?cache=0&sync_timestamp=1569953102165&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fselfsigned%2Fdownload%2Fselfsigned-1.10.7.tgz", + "integrity": "sha1-2lgZ/QSdVXTyjoipvMbbxubzkGs=", + "dev": true, + "requires": { + "node-forge": "0.9.0" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npm.taobao.org/semver/download/semver-5.7.1.tgz", + "integrity": "sha1-qVT5Ma66UI0we78Gnv8MAclhFvc=", + "dev": true + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npm.taobao.org/send/download/send-0.17.1.tgz", + "integrity": "sha1-wdiwWfeQD3Rm3Uk4vcROEd2zdsg=", + "dev": true, + "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", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "dev": true, + "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=", + "dev": true + } + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npm.taobao.org/mime/download/mime-1.6.0.tgz", + "integrity": "sha1-Ms2eXGRVO9WNGaVor0Uqz/BJgbE=", + "dev": true + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.1.tgz", + "integrity": "sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo=", + "dev": true + } + } + }, + "serialize-javascript": { + "version": "2.1.2", + "resolved": "https://registry.npm.taobao.org/serialize-javascript/download/serialize-javascript-2.1.2.tgz?cache=0&sync_timestamp=1575884487988&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fserialize-javascript%2Fdownload%2Fserialize-javascript-2.1.2.tgz", + "integrity": "sha1-7OxTsOAxe9yV73arcHS3OEeF+mE=", + "dev": true + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npm.taobao.org/serve-index/download/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npm.taobao.org/http-errors/download/http-errors-1.6.3.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhttp-errors%2Fdownload%2Fhttp-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npm.taobao.org/inherits/download/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/setprototypeof/download/setprototypeof-1.1.0.tgz", + "integrity": "sha1-0L2FU2iHtv58DYGMuWLZ2RxU5lY=", + "dev": true + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npm.taobao.org/serve-static/download/serve-static-1.14.1.tgz", + "integrity": "sha1-Zm5jbcTwEPfvKZcKiKZ0MgiYsvk=", + "dev": true, + "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=", + "dev": true + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/set-value/download/set-value-2.0.1.tgz?cache=0&sync_timestamp=1561411160313&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fset-value%2Fdownload%2Fset-value-2.0.1.tgz", + "integrity": "sha1-oY1AUw5vB95CKMfe/kInr4ytAFs=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npm.taobao.org/setimmediate/download/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/setprototypeof/download/setprototypeof-1.1.1.tgz", + "integrity": "sha1-fpWsskqpL1iF4KvvW6ExMw1K5oM=", + "dev": true + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npm.taobao.org/sha.js/download/sha.js-2.4.11.tgz", + "integrity": "sha1-N6XPC4HsvGlD3hCbopYNGyZYSuc=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/shebang-command/download/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/shebang-regex/download/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "shell-quote": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz", + "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npm.taobao.org/signal-exit/download/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npm.taobao.org/simple-swizzle/download/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "dev": true, + "requires": { + "is-arrayish": "^0.3.1" + }, + "dependencies": { + "is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npm.taobao.org/is-arrayish/download/is-arrayish-0.3.2.tgz", + "integrity": "sha1-RXSirlb3qyBolvtDHq7tBm/fjwM=", + "dev": true + } + } + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/slash/download/slash-2.0.0.tgz", + "integrity": "sha1-3lUoUaF1nfOo8gZTVEL17E3eq0Q=", + "dev": true + }, + "slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/slice-ansi/download/slice-ansi-2.1.0.tgz", + "integrity": "sha1-ys12k0YaY3pXiNkqfdT7oGjoFjY=", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + } + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npm.taobao.org/snapdragon/download/snapdragon-0.8.2.tgz", + "integrity": "sha1-ZJIufFZbDhQgS6GqfWlkJ40lGC0=", + "dev": true, + "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", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "dev": true, + "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=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/snapdragon-node/download/snapdragon-node-2.1.1.tgz", + "integrity": "sha1-bBdfhv8UvbByRWPo88GwIaKGhTs=", + "dev": true, + "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=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "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=", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "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=", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz", + "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "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=", + "dev": true, + "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?cache=0&sync_timestamp=1579194500634&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fkind-of%2Fdownload%2Fkind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "sockjs": { + "version": "0.3.19", + "resolved": "https://registry.npm.taobao.org/sockjs/download/sockjs-0.3.19.tgz", + "integrity": "sha1-2Xa76ACve9IK4IWY1YI5NQiZPA0=", + "dev": true, + "requires": { + "faye-websocket": "^0.10.0", + "uuid": "^3.0.1" + } + }, + "sockjs-client": { + "version": "1.4.0", + "resolved": "https://registry.npm.taobao.org/sockjs-client/download/sockjs-client-1.4.0.tgz", + "integrity": "sha1-yfJWjhnI/YFztJl+o0IOC7MGx9U=", + "dev": true, + "requires": { + "debug": "^3.2.5", + "eventsource": "^1.0.7", + "faye-websocket": "~0.11.1", + "inherits": "^2.0.3", + "json3": "^3.3.2", + "url-parse": "^1.4.3" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npm.taobao.org/debug/download/debug-3.2.6.tgz", + "integrity": "sha1-6D0X3hbYp++3cX7b5fsQE17uYps=", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "faye-websocket": { + "version": "0.11.3", + "resolved": "https://registry.npm.taobao.org/faye-websocket/download/faye-websocket-0.11.3.tgz", + "integrity": "sha1-XA6aiWjokSwoZjn96XeosgnyUI4=", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + } + } + }, + "sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/sort-keys/download/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "dev": true, + "requires": { + "is-plain-obj": "^1.0.0" + } + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/source-list-map/download/source-list-map-2.0.1.tgz", + "integrity": "sha1-OZO9hzv8SEecyp6jpUeDXHwVSzQ=", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "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=", + "dev": true, + "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.16", + "resolved": "https://registry.npm.taobao.org/source-map-support/download/source-map-support-0.5.16.tgz?cache=0&sync_timestamp=1572390697943&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsource-map-support%2Fdownload%2Fsource-map-support-0.5.16.tgz", + "integrity": "sha1-CuBp5/47p1OMZMmFFeNTOerFoEI=", + "dev": true, + "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=", + "dev": true + } + } + }, + "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=", + "dev": true + }, + "spdx-correct": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/spdx-correct/download/spdx-correct-3.1.0.tgz", + "integrity": "sha1-+4PlBERSaPFUsHTiGMh8ADzTHfQ=", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.2.0", + "resolved": "https://registry.npm.taobao.org/spdx-exceptions/download/spdx-exceptions-2.2.0.tgz", + "integrity": "sha1-LqRQrudPKom/uUUZwH/Nb0EyKXc=", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/spdx-expression-parse/download/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha1-meEZt6XaAOBUkcn6M4t5BII7QdA=", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.5", + "resolved": "https://registry.npm.taobao.org/spdx-license-ids/download/spdx-license-ids-3.0.5.tgz", + "integrity": "sha1-NpS1gEVnpFjTyARYQqY1hjL2JlQ=", + "dev": true + }, + "spdy": { + "version": "4.0.1", + "resolved": "https://registry.npm.taobao.org/spdy/download/spdy-4.0.1.tgz", + "integrity": "sha1-bxLtHF236k8k67i4m6WMh8CCV/I=", + "dev": true, + "requires": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + } + }, + "spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/spdy-transport/download/spdy-transport-3.0.0.tgz", + "integrity": "sha1-ANSGOmQArXXfkzYaFghgXl3NzzE=", + "dev": true, + "requires": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + }, + "dependencies": { + "readable-stream": { + "version": "3.5.0", + "resolved": "https://registry.npm.taobao.org/readable-stream/download/readable-stream-3.5.0.tgz?cache=0&sync_timestamp=1579280462569&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Freadable-stream%2Fdownload%2Freadable-stream-3.5.0.tgz", + "integrity": "sha1-Rl1w5tEIf2Fi0HnNC123++v9FgY=", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "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=", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npm.taobao.org/sprintf-js/download/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npm.taobao.org/sshpk/download/sshpk-1.16.1.tgz", + "integrity": "sha1-+2YcC+8ps520B2nuOfpwCT1vaHc=", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "ssri": { + "version": "6.0.1", + "resolved": "https://registry.npm.taobao.org/ssri/download/ssri-6.0.1.tgz?cache=0&sync_timestamp=1571962511410&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fssri%2Fdownload%2Fssri-6.0.1.tgz", + "integrity": "sha1-KjxBso3UW2K2Nnbst0ABJlrp7dg=", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "stable": { + "version": "0.1.8", + "resolved": "https://registry.npm.taobao.org/stable/download/stable-0.1.8.tgz", + "integrity": "sha1-g26zyDgv4pNv6vVEYxAXzn1Ho88=", + "dev": true + }, + "stackframe": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/stackframe/download/stackframe-1.1.1.tgz", + "integrity": "sha1-/+8KMxixtgw7WFZJiaylZgcp7HE=", + "dev": true + }, + "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=", + "dev": true, + "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=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npm.taobao.org/statuses/download/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + }, + "stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/stealthy-require/download/stealthy-require-1.1.1.tgz", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", + "dev": true + }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npm.taobao.org/stream-browserify/download/stream-browserify-2.0.2.tgz", + "integrity": "sha1-h1IdOKRKp+6RzhzSpH3wy0ndZgs=", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npm.taobao.org/stream-each/download/stream-each-1.2.3.tgz", + "integrity": "sha1-6+J6DDibBPvMIzZClS4Qcxr6m64=", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npm.taobao.org/stream-http/download/stream-http-2.8.3.tgz", + "integrity": "sha1-stJCRpKIpaJ+xP6JM6z2I95lFPw=", + "dev": true, + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "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=1576147296553&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstream-shift%2Fdownload%2Fstream-shift-1.0.1.tgz", + "integrity": "sha1-1wiCgVWasneEJCebCHfaPDktWj0=", + "dev": true + }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/strict-uri-encode/download/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/string-width/download/string-width-2.1.1.tgz", + "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", + "dev": true, + "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=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-4.0.0.tgz?cache=0&sync_timestamp=1573280518303&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "string.prototype.trimleft": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/string.prototype.trimleft/download/string.prototype.trimleft-2.1.1.tgz", + "integrity": "sha1-m9uKxqvW1gKxek7TIYcNL43O/HQ=", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string.prototype.trimright": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/string.prototype.trimright/download/string.prototype.trimright-2.1.1.tgz", + "integrity": "sha1-RAMUsVmWyGbOigNBiU1FGGIAxdk=", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/string_decoder/download/string_decoder-1.1.1.tgz", + "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-6.0.0.tgz?cache=0&sync_timestamp=1573280518303&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-6.0.0.tgz", + "integrity": "sha1-CxVx3XZpzNTz4G4U7x7tJiJa5TI=", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + }, + "dependencies": { + "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=", + "dev": true + } + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/strip-bom/download/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/strip-eof/download/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/strip-final-newline/download/strip-final-newline-2.0.0.tgz", + "integrity": "sha1-ibhS+y/L6Tb29LMYevsKEsGrWK0=", + "dev": true + }, + "strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/strip-indent/download/strip-indent-2.0.0.tgz", + "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", + "dev": true + }, + "strip-json-comments": { + "version": "3.0.1", + "resolved": "https://registry.npm.taobao.org/strip-json-comments/download/strip-json-comments-3.0.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstrip-json-comments%2Fdownload%2Fstrip-json-comments-3.0.1.tgz", + "integrity": "sha1-hXE5dakfuHvxswXMp3OV5A0qZKc=", + "dev": true + }, + "stylehacks": { + "version": "4.0.3", + "resolved": "https://registry.npm.taobao.org/stylehacks/download/stylehacks-4.0.3.tgz", + "integrity": "sha1-Zxj8r00eB9ihMYaQiB6NlnJqcdU=", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.1", + "resolved": "https://registry.npm.taobao.org/postcss-selector-parser/download/postcss-selector-parser-3.1.1.tgz", + "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=", + "dev": true, + "requires": { + "dot-prop": "^4.1.1", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-5.5.0.tgz", + "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "svg-tags": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/svg-tags/download/svg-tags-1.0.0.tgz", + "integrity": "sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=", + "dev": true + }, + "svgo": { + "version": "1.3.2", + "resolved": "https://registry.npm.taobao.org/svgo/download/svgo-1.3.2.tgz", + "integrity": "sha1-ttxRHAYzRsnkFbgeQ0ARRbltQWc=", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", + "css-tree": "1.0.0-alpha.37", + "csso": "^4.0.2", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" + } + }, + "table": { + "version": "5.4.6", + "resolved": "https://registry.npm.taobao.org/table/download/table-5.4.6.tgz", + "integrity": "sha1-EpLRlQDOP4YFOwXw6Ofko7shB54=", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + }, + "dependencies": { + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npm.taobao.org/emoji-regex/download/emoji-regex-7.0.3.tgz", + "integrity": "sha1-kzoEBShgyF6DwSJHnEdIqOTHIVY=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/string-width/download/string-width-3.1.0.tgz", + "integrity": "sha1-InZ74htirxCBV0MG9prFG2IgOWE=", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-5.2.0.tgz?cache=0&sync_timestamp=1573280518303&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-5.2.0.tgz", + "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npm.taobao.org/tapable/download/tapable-1.1.3.tgz?cache=0&sync_timestamp=1576855891808&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftapable%2Fdownload%2Ftapable-1.1.3.tgz", + "integrity": "sha1-ofzMBrWNth/XpF2i2kT186Pme6I=", + "dev": true + }, + "terser": { + "version": "4.6.3", + "resolved": "https://registry.npm.taobao.org/terser/download/terser-4.6.3.tgz", + "integrity": "sha1-4zqkJGHO1SONNS0t8qZ/IZIfjYc=", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "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=", + "dev": true + } + } + }, + "terser-webpack-plugin": { + "version": "1.4.3", + "resolved": "https://registry.npm.taobao.org/terser-webpack-plugin/download/terser-webpack-plugin-1.4.3.tgz", + "integrity": "sha1-Xsry29xfuZdF/QZ5H0b8ndscmnw=", + "dev": true, + "requires": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^2.1.2", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + }, + "dependencies": { + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/schema-utils/download/schema-utils-1.0.0.tgz", + "integrity": "sha1-C3mpMgTXtgDUsoUNH2bCo0lRx3A=", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "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=", + "dev": true + }, + "thenify": { + "version": "3.3.0", + "resolved": "https://registry.npm.taobao.org/thenify/download/thenify-3.3.0.tgz", + "integrity": "sha1-5p44obq+lpsBCCB5eLn2K4hgSDk=", + "dev": true, + "requires": { + "any-promise": "^1.0.0" + } + }, + "thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npm.taobao.org/thenify-all/download/thenify-all-1.6.0.tgz", + "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", + "dev": true, + "requires": { + "thenify": ">= 3.1.0 < 4" + } + }, + "thread-loader": { + "version": "2.1.3", + "resolved": "https://registry.npm.taobao.org/thread-loader/download/thread-loader-2.1.3.tgz", + "integrity": "sha1-y9LBOfwrLebp0o9iKGq3cMGsvdo=", + "dev": true, + "requires": { + "loader-runner": "^2.3.1", + "loader-utils": "^1.1.0", + "neo-async": "^2.6.0" + } + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npm.taobao.org/through/download/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npm.taobao.org/through2/download/through2-2.0.5.tgz", + "integrity": "sha1-AcHjnrMdB8t9A6lqcIIyYLIxMs0=", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "thunky": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/thunky/download/thunky-1.1.0.tgz", + "integrity": "sha1-Wrr3FKlAXbBQRzK7zNLO3Z75U30=", + "dev": true + }, + "timers-browserify": { + "version": "2.0.11", + "resolved": "https://registry.npm.taobao.org/timers-browserify/download/timers-browserify-2.0.11.tgz", + "integrity": "sha1-gAsfPu4nLlvFPuRloE0OgEwxIR8=", + "dev": true, + "requires": { + "setimmediate": "^1.0.4" + } + }, + "timsort": { + "version": "0.3.0", + "resolved": "https://registry.npm.taobao.org/timsort/download/timsort-0.3.0.tgz", + "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", + "dev": true + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npm.taobao.org/tmp/download/tmp-0.0.33.tgz", + "integrity": "sha1-bTQzWIl2jSGyvNoKonfO07G/rfk=", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/to-arraybuffer/download/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "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=", + "dev": true, + "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?cache=0&sync_timestamp=1579194500634&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fkind-of%2Fdownload%2Fkind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "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=", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "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=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/toidentifier/download/toidentifier-1.0.0.tgz", + "integrity": "sha1-fhvjRw8ed5SLxD2Uo8j013UrpVM=", + "dev": true + }, + "toposort": { + "version": "1.0.7", + "resolved": "https://registry.npm.taobao.org/toposort/download/toposort-1.0.7.tgz", + "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=", + "dev": true + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npm.taobao.org/tough-cookie/download/tough-cookie-2.4.3.tgz", + "integrity": "sha1-U/Nto/R3g7CSWvoG/587FlKA94E=", + "dev": true, + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npm.taobao.org/punycode/download/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, + "tryer": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/tryer/download/tryer-1.0.1.tgz", + "integrity": "sha1-8shUBoALmw90yfdGW4HqrSQSUvg=", + "dev": true + }, + "tslib": { + "version": "1.10.0", + "resolved": "https://registry.npm.taobao.org/tslib/download/tslib-1.10.0.tgz", + "integrity": "sha1-w8GflZc/sKYpc/sJ2Q2WHuQ+XIo=", + "dev": true + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npm.taobao.org/tty-browserify/download/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npm.taobao.org/tunnel-agent/download/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npm.taobao.org/tweetnacl/download/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npm.taobao.org/type-check/download/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npm.taobao.org/type-fest/download/type-fest-0.6.0.tgz", + "integrity": "sha1-jSojcNPfiG61yQraHFv2GIrPg4s=", + "dev": true + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npm.taobao.org/type-is/download/type-is-1.6.18.tgz", + "integrity": "sha1-TlUs0F3wlGfcvE73Od6J8s83wTE=", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npm.taobao.org/typedarray/download/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "uglify-js": { + "version": "3.4.10", + "resolved": "https://registry.npm.taobao.org/uglify-js/download/uglify-js-3.4.10.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fuglify-js%2Fdownload%2Fuglify-js-3.4.10.tgz", + "integrity": "sha1-mtlWPY6zrN+404WX0q8dgV9qdV8=", + "dev": true, + "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", + "integrity": "sha1-9hmKqE5bg8RgVLlN3tv+1e6f8So=", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "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.1.0", + "resolved": "https://registry.npm.taobao.org/unicode-match-property-value-ecmascript/download/unicode-match-property-value-ecmascript-1.1.0.tgz", + "integrity": "sha1-W0tCbgjROoA2Xg1lesemwexGonc=", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "1.0.5", + "resolved": "https://registry.npm.taobao.org/unicode-property-aliases-ecmascript/download/unicode-property-aliases-ecmascript-1.0.5.tgz", + "integrity": "sha1-qcxsx85joKMCP8meNBuUQx1AWlc=", + "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=", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "uniq": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/uniq/download/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", + "dev": true + }, + "uniqs": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/uniqs/download/uniqs-2.0.0.tgz", + "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", + "dev": true + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/unique-filename/download/unique-filename-1.1.1.tgz", + "integrity": "sha1-HWl2k2mtoFgxA6HmrodoG1ZXMjA=", + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npm.taobao.org/unique-slug/download/unique-slug-2.0.2.tgz", + "integrity": "sha1-uqvOkQg/xk6UWw861hPiZPfNTmw=", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npm.taobao.org/universalify/download/universalify-0.1.2.tgz", + "integrity": "sha1-tkb2m+OULavOzJ1mOcgNwQXvqmY=", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/unpipe/download/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "unquote": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/unquote/download/unquote-1.1.1.tgz", + "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=", + "dev": true + }, + "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=", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true + } + } + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/upath/download/upath-1.2.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fupath%2Fdownload%2Fupath-1.2.0.tgz", + "integrity": "sha1-j2bbzVWog6za5ECK+LA1pQRMGJQ=", + "dev": true + }, + "upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npm.taobao.org/upper-case/download/upper-case-1.1.3.tgz", + "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", + "dev": true + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npm.taobao.org/uri-js/download/uri-js-4.2.2.tgz", + "integrity": "sha1-lMVA4f93KVbiKZUHwBCupsiDjrA=", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npm.taobao.org/urix/download/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npm.taobao.org/url/download/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npm.taobao.org/punycode/download/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "url-loader": { + "version": "2.3.0", + "resolved": "https://registry.npm.taobao.org/url-loader/download/url-loader-2.3.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Furl-loader%2Fdownload%2Furl-loader-2.3.0.tgz", + "integrity": "sha1-4OLvZY8APvuMpBsPP/v3a6uIZYs=", + "dev": true, + "requires": { + "loader-utils": "^1.2.3", + "mime": "^2.4.4", + "schema-utils": "^2.5.0" + } + }, + "url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npm.taobao.org/use/download/use-3.1.1.tgz", + "integrity": "sha1-1QyMrHmhn7wg8pEfVuuXP04QBw8=", + "dev": true + }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npm.taobao.org/util/download/util-0.11.1.tgz", + "integrity": "sha1-MjZzNyDsZLsn9uJvQhqqLhtYjWE=", + "dev": true, + "requires": { + "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npm.taobao.org/inherits/download/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/util-deprecate/download/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "util.promisify": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/util.promisify/download/util.promisify-1.0.1.tgz?cache=0&sync_timestamp=1579206994703&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Futil.promisify%2Fdownload%2Futil.promisify-1.0.1.tgz", + "integrity": "sha1-a693dLgO6w91INi4HQeYKlmruu4=", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.2", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.0" + } + }, + "utila": { + "version": "0.4.0", + "resolved": "https://registry.npm.taobao.org/utila/download/utila-0.4.0.tgz", + "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", + "dev": true + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/utils-merge/download/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npm.taobao.org/uuid/download/uuid-3.4.0.tgz", + "integrity": "sha1-sj5DWK+oogL+ehAK8fX4g/AgB+4=", + "dev": true + }, + "v8-compile-cache": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/v8-compile-cache/download/v8-compile-cache-2.1.0.tgz", + "integrity": "sha1-4U3jezGm0ZT1aQ1n78Tn9vxqsw4=", + "dev": true + }, + "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=", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/vary/download/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + }, + "vendors": { + "version": "1.0.4", + "resolved": "https://registry.npm.taobao.org/vendors/download/vendors-1.0.4.tgz", + "integrity": "sha1-4rgApT56Kbk1BsPPQRANFsTErY4=", + "dev": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npm.taobao.org/verror/download/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/vm-browserify/download/vm-browserify-1.1.2.tgz", + "integrity": "sha1-eGQcSIuObKkadfUR56OzKobl3aA=", + "dev": true + }, + "vue": { + "version": "2.6.11", + "resolved": "https://registry.npm.taobao.org/vue/download/vue-2.6.11.tgz", + "integrity": "sha1-dllNh31LEiNEBuhONSdcbVFBJcU=" + }, + "vue-eslint-parser": { + "version": "7.0.0", + "resolved": "https://registry.npm.taobao.org/vue-eslint-parser/download/vue-eslint-parser-7.0.0.tgz", + "integrity": "sha1-pO0mafhxed7dBq/dhzasuzo4ZNY=", + "dev": true, + "requires": { + "debug": "^4.1.1", + "eslint-scope": "^5.0.0", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.1.2", + "esquery": "^1.0.1", + "lodash": "^4.17.15" + }, + "dependencies": { + "eslint-scope": { + "version": "5.0.0", + "resolved": "https://registry.npm.taobao.org/eslint-scope/download/eslint-scope-5.0.0.tgz?cache=0&sync_timestamp=1566286635417&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Feslint-scope%2Fdownload%2Feslint-scope-5.0.0.tgz", + "integrity": "sha1-6HyIh8c+jR7ITxylkWRcNYv8j7k=", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + } + } + }, + "vue-hot-reload-api": { + "version": "2.3.4", + "resolved": "https://registry.npm.taobao.org/vue-hot-reload-api/download/vue-hot-reload-api-2.3.4.tgz", + "integrity": "sha1-UylVzB6yCKPZkLOp+acFdGV+CPI=", + "dev": true + }, + "vue-loader": { + "version": "15.8.3", + "resolved": "https://registry.npm.taobao.org/vue-loader/download/vue-loader-15.8.3.tgz", + "integrity": "sha1-hXy54w61/CXmbbSNzn5PdoYCojw=", + "dev": true, + "requires": { + "@vue/component-compiler-utils": "^3.1.0", + "hash-sum": "^1.0.2", + "loader-utils": "^1.1.0", + "vue-hot-reload-api": "^2.3.0", + "vue-style-loader": "^4.1.0" + } + }, + "vue-style-loader": { + "version": "4.1.2", + "resolved": "https://registry.npm.taobao.org/vue-style-loader/download/vue-style-loader-4.1.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvue-style-loader%2Fdownload%2Fvue-style-loader-4.1.2.tgz", + "integrity": "sha1-3t80mAbyXOtOZPOtfApE+6c1/Pg=", + "dev": true, + "requires": { + "hash-sum": "^1.0.2", + "loader-utils": "^1.0.2" + } + }, + "vue-template-compiler": { + "version": "2.6.11", + "resolved": "https://registry.npm.taobao.org/vue-template-compiler/download/vue-template-compiler-2.6.11.tgz", + "integrity": "sha1-wEcE749JixUxMAGJk+VjCdRpgIA=", + "dev": true, + "requires": { + "de-indent": "^1.0.2", + "he": "^1.1.0" + } + }, + "vue-template-es2015-compiler": { + "version": "1.9.1", + "resolved": "https://registry.npm.taobao.org/vue-template-es2015-compiler/download/vue-template-es2015-compiler-1.9.1.tgz", + "integrity": "sha1-HuO8mhbsv1EYvjNLsV+cRvgvWCU=", + "dev": true + }, + "watchpack": { + "version": "1.6.0", + "resolved": "https://registry.npm.taobao.org/watchpack/download/watchpack-1.6.0.tgz", + "integrity": "sha1-S8EsLr6KonenHx0/FNaFx7RGzQA=", + "dev": true, + "requires": { + "chokidar": "^2.0.2", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + } + }, + "wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npm.taobao.org/wbuf/download/wbuf-1.7.3.tgz", + "integrity": "sha1-wdjRSTFtPqhShIiVy2oL/oh7h98=", + "dev": true, + "requires": { + "minimalistic-assert": "^1.0.0" + } + }, + "wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/wcwidth/download/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "dev": true, + "requires": { + "defaults": "^1.0.3" + } + }, + "webpack": { + "version": "4.41.5", + "resolved": "https://registry.npm.taobao.org/webpack/download/webpack-4.41.5.tgz", + "integrity": "sha1-MhDxiGvOUxDmK7lyBNGMJjNBt3w=", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/wasm-edit": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "acorn": "^6.2.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.1.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.1", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.6.0", + "webpack-sources": "^1.4.1" + }, + "dependencies": { + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/schema-utils/download/schema-utils-1.0.0.tgz", + "integrity": "sha1-C3mpMgTXtgDUsoUNH2bCo0lRx3A=", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "webpack-bundle-analyzer": { + "version": "3.6.0", + "resolved": "https://registry.npm.taobao.org/webpack-bundle-analyzer/download/webpack-bundle-analyzer-3.6.0.tgz?cache=0&sync_timestamp=1571238096756&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fwebpack-bundle-analyzer%2Fdownload%2Fwebpack-bundle-analyzer-3.6.0.tgz", + "integrity": "sha1-ObOo+CnKBEaCvG+eARyV3rVUrv0=", + "dev": true, + "requires": { + "acorn": "^6.0.7", + "acorn-walk": "^6.1.1", + "bfj": "^6.1.1", + "chalk": "^2.4.1", + "commander": "^2.18.0", + "ejs": "^2.6.1", + "express": "^4.16.3", + "filesize": "^3.6.1", + "gzip-size": "^5.0.0", + "lodash": "^4.17.15", + "mkdirp": "^0.5.1", + "opener": "^1.5.1", + "ws": "^6.0.0" + } + }, + "webpack-chain": { + "version": "6.3.0", + "resolved": "https://registry.npm.taobao.org/webpack-chain/download/webpack-chain-6.3.0.tgz", + "integrity": "sha1-pgmOuJpD2+ZTNTj0ZHsoO5m/Zu0=", + "dev": true, + "requires": { + "deepmerge": "^1.5.2", + "javascript-stringify": "^2.0.1" + } + }, + "webpack-dev-middleware": { + "version": "3.7.2", + "resolved": "https://registry.npm.taobao.org/webpack-dev-middleware/download/webpack-dev-middleware-3.7.2.tgz", + "integrity": "sha1-ABnD23FuP6XOy/ZPKriKdLqzMfM=", + "dev": true, + "requires": { + "memory-fs": "^0.4.1", + "mime": "^2.4.4", + "mkdirp": "^0.5.1", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + } + }, + "webpack-dev-server": { + "version": "3.10.1", + "resolved": "https://registry.npm.taobao.org/webpack-dev-server/download/webpack-dev-server-3.10.1.tgz", + "integrity": "sha1-H/PlzM+OCJeqP1kJxlTmI/abHA4=", + "dev": true, + "requires": { + "ansi-html": "0.0.7", + "bonjour": "^3.5.0", + "chokidar": "^2.1.8", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "debug": "^4.1.1", + "del": "^4.1.1", + "express": "^4.17.1", + "html-entities": "^1.2.1", + "http-proxy-middleware": "0.19.1", + "import-local": "^2.0.0", + "internal-ip": "^4.3.0", + "ip": "^1.1.5", + "is-absolute-url": "^3.0.3", + "killable": "^1.0.1", + "loglevel": "^1.6.6", + "opn": "^5.5.0", + "p-retry": "^3.0.1", + "portfinder": "^1.0.25", + "schema-utils": "^1.0.0", + "selfsigned": "^1.10.7", + "semver": "^6.3.0", + "serve-index": "^1.9.1", + "sockjs": "0.3.19", + "sockjs-client": "1.4.0", + "spdy": "^4.0.1", + "strip-ansi": "^3.0.1", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.7.2", + "webpack-log": "^2.0.0", + "ws": "^6.2.1", + "yargs": "12.0.5" + }, + "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=", + "dev": true + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npm.taobao.org/cliui/download/cliui-4.1.0.tgz?cache=0&sync_timestamp=1573942301772&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcliui%2Fdownload%2Fcliui-4.1.0.tgz", + "integrity": "sha1-NIQi2+gtgAswIu709qwQvy5NG0k=", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.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=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-4.0.0.tgz?cache=0&sync_timestamp=1573280518303&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "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=", + "dev": true + }, + "is-absolute-url": { + "version": "3.0.3", + "resolved": "https://registry.npm.taobao.org/is-absolute-url/download/is-absolute-url-3.0.3.tgz?cache=0&sync_timestamp=1569735737284&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-absolute-url%2Fdownload%2Fis-absolute-url-3.0.3.tgz", + "integrity": "sha1-lsaiK2ojkpsR6gr7GDbDatSl1pg=", + "dev": true + }, + "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=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "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=", + "dev": true + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/schema-utils/download/schema-utils-1.0.0.tgz", + "integrity": "sha1-C3mpMgTXtgDUsoUNH2bCo0lRx3A=", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz", + "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-3.0.1.tgz?cache=0&sync_timestamp=1573280518303&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-6.1.0.tgz", + "integrity": "sha1-B2Srxpxj1ayELdSGfo0CXogN+PM=", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "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=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/string-width/download/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, + "yargs": { + "version": "12.0.5", + "resolved": "https://registry.npm.taobao.org/yargs/download/yargs-12.0.5.tgz?cache=0&sync_timestamp=1577941264230&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fyargs%2Fdownload%2Fyargs-12.0.5.tgz", + "integrity": "sha1-BfWZe2CWR7ZPZrgeO0sQo2jnrRM=", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.1" + } + }, + "yargs-parser": { + "version": "11.1.1", + "resolved": "https://registry.npm.taobao.org/yargs-parser/download/yargs-parser-11.1.1.tgz?cache=0&sync_timestamp=1572648119212&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fyargs-parser%2Fdownload%2Fyargs-parser-11.1.1.tgz", + "integrity": "sha1-h5oIZZc7yp9rq1y987HGfsfTvPQ=", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/webpack-log/download/webpack-log-2.0.0.tgz", + "integrity": "sha1-W3ko4GN1k/EZ0y9iJ8HgrDHhtH8=", + "dev": true, + "requires": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + } + }, + "webpack-merge": { + "version": "4.2.2", + "resolved": "https://registry.npm.taobao.org/webpack-merge/download/webpack-merge-4.2.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fwebpack-merge%2Fdownload%2Fwebpack-merge-4.2.2.tgz", + "integrity": "sha1-onxS6ng9E5iv0gh/VH17nS9DY00=", + "dev": true, + "requires": { + "lodash": "^4.17.15" + } + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npm.taobao.org/webpack-sources/download/webpack-sources-1.4.3.tgz", + "integrity": "sha1-7t2OwLko+/HL/plOItLYkPMwqTM=", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + }, + "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=", + "dev": true + } + } + }, + "websocket-driver": { + "version": "0.7.3", + "resolved": "https://registry.npm.taobao.org/websocket-driver/download/websocket-driver-0.7.3.tgz", + "integrity": "sha1-otTg1PTxFvHmKX66WLBdQwEA6fk=", + "dev": true, + "requires": { + "http-parser-js": ">=0.4.0 <0.4.11", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.3", + "resolved": "https://registry.npm.taobao.org/websocket-extensions/download/websocket-extensions-0.1.3.tgz", + "integrity": "sha1-XS/yKXcAPsaHpLhwc9+7rBRszyk=", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npm.taobao.org/which/download/which-1.3.1.tgz?cache=0&sync_timestamp=1574116230888&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fwhich%2Fdownload%2Fwhich-1.3.1.tgz", + "integrity": "sha1-pFBD1U9YBTFtqNYvn1CRjT2nCwo=", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/which-module/download/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "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=", + "dev": true + }, + "worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npm.taobao.org/worker-farm/download/worker-farm-1.7.0.tgz", + "integrity": "sha1-JqlMU5G7ypJhUgAvabhKS/dy5ag=", + "dev": true, + "requires": { + "errno": "~0.1.7" + } + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npm.taobao.org/wrap-ansi/download/wrap-ansi-6.2.0.tgz", + "integrity": "sha1-6Tk7oHEC5skaOyIUePAlfNKFblM=", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-4.2.1.tgz", + "integrity": "sha1-kK51xCTQCNJiTFvynq0xd+v881k=", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-2.0.1.tgz", + "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=", + "dev": 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=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha1-8Rb4Bk/pCz94RKOJl8C3UFEmnx0=", + "dev": true + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npm.taobao.org/string-width/download/string-width-4.2.0.tgz", + "integrity": "sha1-lSGCxGzHssMT0VluYjmSvRY7crU=", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/wrappy/download/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write": { + "version": "1.0.3", + "resolved": "https://registry.npm.taobao.org/write/download/write-1.0.3.tgz?cache=0&sync_timestamp=1567580269963&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fwrite%2Fdownload%2Fwrite-1.0.3.tgz", + "integrity": "sha1-CADhRSO5I6OH5BUSPIZWFqrg9cM=", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + } + }, + "ws": { + "version": "6.2.1", + "resolved": "https://registry.npm.taobao.org/ws/download/ws-6.2.1.tgz", + "integrity": "sha1-RC/fCkftZPWbal2P8TD0dI7VJPs=", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npm.taobao.org/xtend/download/xtend-4.0.2.tgz", + "integrity": "sha1-u3J3n1+kZRhrH0OPZ0+jR/2121Q=", + "dev": true + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/y18n/download/y18n-4.0.0.tgz", + "integrity": "sha1-le+U+F7MgdAHwmThkKEg8KPIVms=", + "dev": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npm.taobao.org/yallist/download/yallist-3.1.1.tgz", + "integrity": "sha1-27fa+b/YusmrRev2ArjLrQ1dCP0=", + "dev": true + }, + "yargs": { + "version": "15.1.0", + "resolved": "https://registry.npm.taobao.org/yargs/download/yargs-15.1.0.tgz?cache=0&sync_timestamp=1577941264230&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fyargs%2Fdownload%2Fyargs-15.1.0.tgz", + "integrity": "sha1-4RE4H1gw6GOolVC9SxNrtqXzchk=", + "dev": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^16.1.0" + }, + "dependencies": { + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npm.taobao.org/cliui/download/cliui-6.0.0.tgz?cache=0&sync_timestamp=1573942301772&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcliui%2Fdownload%2Fcliui-6.0.0.tgz", + "integrity": "sha1-UR1wLAxOQcoVbX0OlgIfI+EyJbE=", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npm.taobao.org/find-up/download/find-up-4.1.0.tgz", + "integrity": "sha1-l6/n1s3AvFkoWEt8jXsW6KmqXRk=", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha1-8Rb4Bk/pCz94RKOJl8C3UFEmnx0=", + "dev": true + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npm.taobao.org/locate-path/download/locate-path-5.0.0.tgz", + "integrity": "sha1-Gvujlq/WdqbUJQTQpno6frn2KqA=", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npm.taobao.org/p-locate/download/p-locate-4.1.0.tgz", + "integrity": "sha1-o0KLtwiLOmApL2aRkni3wpetTwc=", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/path-exists/download/path-exists-4.0.0.tgz", + "integrity": "sha1-UTvb4tO5XXdi6METfvoZXGxhtbM=", + "dev": true + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npm.taobao.org/string-width/download/string-width-4.2.0.tgz", + "integrity": "sha1-lSGCxGzHssMT0VluYjmSvRY7crU=", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + } + } + }, + "yargs-parser": { + "version": "16.1.0", + "resolved": "https://registry.npm.taobao.org/yargs-parser/download/yargs-parser-16.1.0.tgz?cache=0&sync_timestamp=1572648119212&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fyargs-parser%2Fdownload%2Fyargs-parser-16.1.0.tgz", + "integrity": "sha1-c3R9U64YfnuNvjM/lXFMduoA7PE=", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "yorkie": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/yorkie/download/yorkie-2.0.0.tgz", + "integrity": "sha1-kkEZEtQ1IU4SxRwq4Qk+VLa7g9k=", + "dev": true, + "requires": { + "execa": "^0.8.0", + "is-ci": "^1.0.10", + "normalize-path": "^1.0.0", + "strip-indent": "^2.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npm.taobao.org/cross-spawn/download/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "0.8.0", + "resolved": "https://registry.npm.taobao.org/execa/download/execa-0.8.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fexeca%2Fdownload%2Fexeca-0.8.0.tgz", + "integrity": "sha1-2NdrvBtVIX7RkP1t1J08d07PyNo=", + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/get-stream/download/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npm.taobao.org/lru-cache/download/lru-cache-4.1.5.tgz", + "integrity": "sha1-i75Q6oW+1ZvJ4z3KuCNe6bz0Q80=", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "normalize-path": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/normalize-path/download/normalize-path-1.0.0.tgz", + "integrity": "sha1-MtDkcvkf80VwHBWoMRAY07CpA3k=", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npm.taobao.org/yallist/download/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } + } + } + } +} diff --git a/ES6-10/vue-lesson/package.json b/ES6-10/vue-lesson/package.json new file mode 100644 index 0000000..f90c3ad --- /dev/null +++ b/ES6-10/vue-lesson/package.json @@ -0,0 +1,51 @@ +{ + "name": "vue-lesson", + "version": "0.1.0", + "private": true, + "scripts": { + "serve": "vue-cli-service serve", + "build": "vue-cli-service build", + "lint": "vue-cli-service lint" + }, + "dependencies": { + "axios": "^0.21.2", + "core-js": "^3.4.4", + "vue": "^2.6.10" + }, + "devDependencies": { + "@vue/cli-plugin-babel": "^4.1.0", + "@vue/cli-plugin-eslint": "^4.1.0", + "@vue/cli-service": "^4.1.0", + "babel-eslint": "^10.0.3", + "eslint": "^6.8.0", + "eslint-config-standard": "^14.1.0", + "eslint-plugin-import": "^2.20.0", + "eslint-plugin-node": "^11.0.0", + "eslint-plugin-promise": "^4.2.1", + "eslint-plugin-standard": "^4.0.1", + "eslint-plugin-vue": "^6.1.2", + "vue-template-compiler": "^2.6.10" + }, + "eslintConfig": { + "root": true, + "env": { + "node": true + }, + "extends": [ + "plugin:vue/essential", + "eslint:recommended" + ], + "rules": {}, + "parserOptions": { + "parser": "babel-eslint" + } + }, + "browserslist": [ + "> 1%", + "last 2 versions" + ], + "description": "## Project setup ``` npm install ```", + "main": ".eslintrc.js", + "author": "", + "license": "ISC" +} diff --git a/ES6-10/vue-lesson/public/favicon.ico b/ES6-10/vue-lesson/public/favicon.ico new file mode 100644 index 0000000..df36fcf Binary files /dev/null and b/ES6-10/vue-lesson/public/favicon.ico differ diff --git a/ES6-10/vue-lesson/public/index.html b/ES6-10/vue-lesson/public/index.html new file mode 100644 index 0000000..61921e7 --- /dev/null +++ b/ES6-10/vue-lesson/public/index.html @@ -0,0 +1,17 @@ + + + + + + + + vue-lesson + + + +
+ + + diff --git a/ES6-10/vue-lesson/src/App.vue b/ES6-10/vue-lesson/src/App.vue new file mode 100644 index 0000000..0733225 --- /dev/null +++ b/ES6-10/vue-lesson/src/App.vue @@ -0,0 +1,35 @@ + + + + + diff --git a/ES6-10/vue-lesson/src/assets/logo.png b/ES6-10/vue-lesson/src/assets/logo.png new file mode 100644 index 0000000..f3d2503 Binary files /dev/null and b/ES6-10/vue-lesson/src/assets/logo.png differ diff --git a/ES6-10/vue-lesson/src/components/HelloWorld.vue b/ES6-10/vue-lesson/src/components/HelloWorld.vue new file mode 100644 index 0000000..19e6768 --- /dev/null +++ b/ES6-10/vue-lesson/src/components/HelloWorld.vue @@ -0,0 +1,71 @@ + + + + + + diff --git a/ES6-10/vue-lesson/src/components/author.vue b/ES6-10/vue-lesson/src/components/author.vue new file mode 100644 index 0000000..be75abc --- /dev/null +++ b/ES6-10/vue-lesson/src/components/author.vue @@ -0,0 +1,63 @@ + + + + + diff --git a/ES6-10/vue-lesson/src/components/list.vue b/ES6-10/vue-lesson/src/components/list.vue new file mode 100644 index 0000000..3162b00 --- /dev/null +++ b/ES6-10/vue-lesson/src/components/list.vue @@ -0,0 +1,28 @@ + + + + + diff --git a/ES6-10/vue-lesson/src/components/proxy.vue b/ES6-10/vue-lesson/src/components/proxy.vue new file mode 100644 index 0000000..b87d75b --- /dev/null +++ b/ES6-10/vue-lesson/src/components/proxy.vue @@ -0,0 +1,55 @@ + + + + + diff --git a/ES6-10/vue-lesson/src/directive/make-red.js b/ES6-10/vue-lesson/src/directive/make-red.js new file mode 100644 index 0000000..abab305 --- /dev/null +++ b/ES6-10/vue-lesson/src/directive/make-red.js @@ -0,0 +1,13 @@ +import Vue from 'vue' +// Vue.directive('make-red', { +// inserted: function (el) { +// el.style.color = 'red' +// } +// }) + +// 样式变红 +Vue.directive('make-red', { + inserted (el) { + el.style.color = 'red' + } +}) diff --git a/ES6-10/vue-lesson/src/main.js b/ES6-10/vue-lesson/src/main.js new file mode 100644 index 0000000..5547d89 --- /dev/null +++ b/ES6-10/vue-lesson/src/main.js @@ -0,0 +1,9 @@ +import Vue from 'vue' +import App from './App.vue' +import './directive/make-red' + +Vue.config.productionTip = false + +new Vue({ + render: h => h(App) +}).$mount('#app') diff --git a/ES6-10/vue-lesson/src/mock/author.json b/ES6-10/vue-lesson/src/mock/author.json new file mode 100644 index 0000000..9f04784 --- /dev/null +++ b/ES6-10/vue-lesson/src/mock/author.json @@ -0,0 +1,8 @@ +{ + "code": "0", + "allAuthors": { + "fiction": ["Agatha Chars", "bAS", "C", "D.F.S"], + "science": ["Neal", "Arthis", "sad", "asd.S"], + "fantasy": ["Doctor", "OAAas", "Adslkjfo", "oiuqr"] + } +} \ No newline at end of file diff --git a/ES6-10/vue-lesson/src/mock/list.json b/ES6-10/vue-lesson/src/mock/list.json new file mode 100644 index 0000000..7781604 --- /dev/null +++ b/ES6-10/vue-lesson/src/mock/list.json @@ -0,0 +1,10 @@ +{ + "code": "0", + "list": [{ + "name": "li lei", + "addr": "北京 朝阳" + }, { + "name": "han mei", + "addr": "南京" + }] +} \ No newline at end of file diff --git a/ES6-10/vue-lesson/src/mock/proxy.json b/ES6-10/vue-lesson/src/mock/proxy.json new file mode 100644 index 0000000..b469f77 --- /dev/null +++ b/ES6-10/vue-lesson/src/mock/proxy.json @@ -0,0 +1,4 @@ +{ + "code": "0", + "price": [13.02, 2.43, 4.6, 65.3, 45.9, 0.67] +} \ No newline at end of file diff --git a/ES6-10/vue-lesson/src/mock/user.json b/ES6-10/vue-lesson/src/mock/user.json new file mode 100644 index 0000000..3673a9b --- /dev/null +++ b/ES6-10/vue-lesson/src/mock/user.json @@ -0,0 +1,7 @@ +{ + "code": "0", + "user": { + "name": "lilei", + "addr": "北京海定区" + } +} \ No newline at end of file diff --git a/ES6-10/vue-lesson/vue.config.js b/ES6-10/vue-lesson/vue.config.js new file mode 100644 index 0000000..1c2115e --- /dev/null +++ b/ES6-10/vue-lesson/vue.config.js @@ -0,0 +1,31 @@ +module.exports = { + // 必须配置, 固定语法 + devServer: { + proxy: { + '/user': { + target: 'http://localhost:8081', + pathRewrite: { + '/user': '/src/mock/user.json' + } + }, + '/list': { + target: 'http://localhost:8081', + pathRewrite: { + '/list': '/src/mock/list.json' + } + }, + '/proxy': { + target: 'http://localhost:8081', + pathRewrite: { + '/proxy': '/src/mock/proxy.json' + } + }, + '/author': { + target: 'http://localhost:8081', + pathRewrite: { + '/author': '/src/mock/author.json' + } + } + } + } +} \ No newline at end of file diff --git a/ES6-10/webpack-test/.babelrc b/ES6-10/webpack-test/.babelrc new file mode 100644 index 0000000..de1e529 --- /dev/null +++ b/ES6-10/webpack-test/.babelrc @@ -0,0 +1,3 @@ +options: { + presets: ['@babel/preset-env'] +} \ No newline at end of file diff --git a/ES6-10/webpack-test/dist/index.html b/ES6-10/webpack-test/dist/index.html new file mode 100644 index 0000000..7b8c164 --- /dev/null +++ b/ES6-10/webpack-test/dist/index.html @@ -0,0 +1,9 @@ + + + + + Webpack App + + + + \ No newline at end of file diff --git a/ES6-10/webpack-test/dist/index.min.js b/ES6-10/webpack-test/dist/index.min.js new file mode 100644 index 0000000..4d55343 --- /dev/null +++ b/ES6-10/webpack-test/dist/index.min.js @@ -0,0 +1,100 @@ +/******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // define getter function for harmony exports +/******/ __webpack_require__.d = function(exports, name, getter) { +/******/ if(!__webpack_require__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); +/******/ } +/******/ }; +/******/ +/******/ // define __esModule on exports +/******/ __webpack_require__.r = function(exports) { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ +/******/ // create a fake namespace object +/******/ // mode & 1: value is a module id, require it +/******/ // mode & 2: merge all properties of value into the ns +/******/ // mode & 4: return value when already ns object +/******/ // mode & 8|1: behave like require +/******/ __webpack_require__.t = function(value, mode) { +/******/ if(mode & 1) value = __webpack_require__(value); +/******/ if(mode & 8) return value; +/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; +/******/ var ns = Object.create(null); +/******/ __webpack_require__.r(ns); +/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); +/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); +/******/ return ns; +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __webpack_require__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(__webpack_require__.s = "./index.js"); +/******/ }) +/************************************************************************/ +/******/ ({ + +/***/ "./index.js": +/*!******************!*\ + !*** ./index.js ***! + \******************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +eval("var say = function say() {\n console.log('hello webpack');\n};\n\nsay();\n\n//# sourceURL=webpack:///./index.js?"); + +/***/ }) + +/******/ }); \ No newline at end of file diff --git a/ES6-10/webpack-test/index.js b/ES6-10/webpack-test/index.js new file mode 100644 index 0000000..eb93174 --- /dev/null +++ b/ES6-10/webpack-test/index.js @@ -0,0 +1,4 @@ +let say = () => { + console.log('hello webpack'); +} +say() \ No newline at end of file diff --git a/ES6-10/webpack-test/package-lock.json b/ES6-10/webpack-test/package-lock.json new file mode 100644 index 0000000..5684b5f --- /dev/null +++ b/ES6-10/webpack-test/package-lock.json @@ -0,0 +1,5708 @@ +{ + "name": "webpack-test", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/code-frame": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/code-frame/download/@babel/code-frame-7.8.3.tgz", + "integrity": "sha1-M+JZA9dIEYFTThLsCiXxa2/PQZ4=", + "dev": true, + "requires": { + "@babel/highlight": "^7.8.3" + } + }, + "@babel/compat-data": { + "version": "7.8.1", + "resolved": "https://registry.npm.taobao.org/@babel/compat-data/download/@babel/compat-data-7.8.1.tgz?cache=0&sync_timestamp=1578836035025&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fcompat-data%2Fdownload%2F%40babel%2Fcompat-data-7.8.1.tgz", + "integrity": "sha1-/Au7t5keT7K0fhaOYPLMLEFoC+k=", + "dev": true, + "requires": { + "browserslist": "^4.8.2", + "invariant": "^2.2.4", + "semver": "^5.5.0" + } + }, + "@babel/core": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/core/download/@babel/core-7.8.3.tgz?cache=0&sync_timestamp=1578959778152&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fcore%2Fdownload%2F%40babel%2Fcore-7.8.3.tgz", + "integrity": "sha1-MLDrtN0Vhd5pI6C00XngufXYKUE=", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.8.3", + "@babel/helpers": "^7.8.3", + "@babel/parser": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.0", + "lodash": "^4.17.13", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + } + }, + "@babel/generator": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/generator/download/@babel/generator-7.8.3.tgz", + "integrity": "sha1-DiLABbCpTBx06v4Z73jOU6TUXAM=", + "dev": true, + "requires": { + "@babel/types": "^7.8.3", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/helper-annotate-as-pure/download/@babel/helper-annotate-as-pure-7.8.3.tgz?cache=0&sync_timestamp=1578958545043&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-annotate-as-pure%2Fdownload%2F%40babel%2Fhelper-annotate-as-pure-7.8.3.tgz", + "integrity": "sha1-YLwLxlf2Ogkk/5pLSgskoTz03u4=", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/helper-builder-binary-assignment-operator-visitor/download/@babel/helper-builder-binary-assignment-operator-visitor-7.8.3.tgz", + "integrity": "sha1-yECXpCegYaxWocMOv1S3si0kFQM=", + "dev": true, + "requires": { + "@babel/helper-explode-assignable-expression": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-call-delegate": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/helper-call-delegate/download/@babel/helper-call-delegate-7.8.3.tgz", + "integrity": "sha1-3oJhmJiqYF1AnEK+b/uNcgRXlpI=", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.8.3", + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/helper-compilation-targets/download/@babel/helper-compilation-targets-7.8.3.tgz", + "integrity": "sha1-Le7cgW/UHcpzVe85/UDJ6mnwcZo=", + "dev": true, + "requires": { + "@babel/compat-data": "^7.8.1", + "browserslist": "^4.8.2", + "invariant": "^2.2.4", + "levenary": "^1.1.0", + "semver": "^5.5.0" + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/helper-create-regexp-features-plugin/download/@babel/helper-create-regexp-features-plugin-7.8.3.tgz", + "integrity": "sha1-x3QmjJXsB+6SR2o4YrdcwoOb63k=", + "dev": true, + "requires": { + "@babel/helper-regex": "^7.8.3", + "regexpu-core": "^4.6.0" + } + }, + "@babel/helper-define-map": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/helper-define-map/download/@babel/helper-define-map-7.8.3.tgz", + "integrity": "sha1-oGVcrVRRw3YLcm66h18c2PqgLBU=", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.8.3", + "@babel/types": "^7.8.3", + "lodash": "^4.17.13" + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/helper-explode-assignable-expression/download/@babel/helper-explode-assignable-expression-7.8.3.tgz", + "integrity": "sha1-pyjcW06J4w/C38fQT6KKkwZT+YI=", + "dev": true, + "requires": { + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-function-name": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/helper-function-name/download/@babel/helper-function-name-7.8.3.tgz", + "integrity": "sha1-7utmWgGx8RBo6fuGrVahyxqCTMo=", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/helper-get-function-arity/download/@babel/helper-get-function-arity-7.8.3.tgz", + "integrity": "sha1-uJS5R70AQ4HOY+odufCFR+kgq9U=", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/helper-hoist-variables/download/@babel/helper-hoist-variables-7.8.3.tgz", + "integrity": "sha1-Hb6ba1XXjJtBg/yM3G4wzrg7cTQ=", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/helper-member-expression-to-functions/download/@babel/helper-member-expression-to-functions-7.8.3.tgz", + "integrity": "sha1-ZZtxBJjqbB2ZB+DHPyBu7n2twkw=", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-module-imports": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/helper-module-imports/download/@babel/helper-module-imports-7.8.3.tgz", + "integrity": "sha1-f+OVibOcAWMxtrjD9EHo8LFBlJg=", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-module-transforms": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/helper-module-transforms/download/@babel/helper-module-transforms-7.8.3.tgz", + "integrity": "sha1-0wXjXQK+5yD7wsPDYjqgwxbAFZA=", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-simple-access": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3", + "lodash": "^4.17.13" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/helper-optimise-call-expression/download/@babel/helper-optimise-call-expression-7.8.3.tgz", + "integrity": "sha1-ftBxgT0Jx1KY708giVYAa2ER7Lk=", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/helper-plugin-utils/download/@babel/helper-plugin-utils-7.8.3.tgz", + "integrity": "sha1-nqKTvhm6vA9S/4yoizTDYRsghnA=", + "dev": true + }, + "@babel/helper-regex": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/helper-regex/download/@babel/helper-regex-7.8.3.tgz", + "integrity": "sha1-E5dyYH1RuT8j7/5yEFsxnSpMaWU=", + "dev": true, + "requires": { + "lodash": "^4.17.13" + } + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/helper-remap-async-to-generator/download/@babel/helper-remap-async-to-generator-7.8.3.tgz", + "integrity": "sha1-JzxgDYub9QBhQsHjWIfVVcEu3YY=", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.8.3", + "@babel/helper-wrap-function": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-replace-supers": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/helper-replace-supers/download/@babel/helper-replace-supers-7.8.3.tgz", + "integrity": "sha1-kRktJfarvNQdqKmJ1EkldPsVMLw=", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.8.3", + "@babel/helper-optimise-call-expression": "^7.8.3", + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-simple-access": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/helper-simple-access/download/@babel/helper-simple-access-7.8.3.tgz", + "integrity": "sha1-f4EJkotNq0ZUB2mGr1dSMd62Oa4=", + "dev": true, + "requires": { + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/helper-split-export-declaration/download/@babel/helper-split-export-declaration-7.8.3.tgz", + "integrity": "sha1-ManzAHD5E2inGCzwX4MXgQZfx6k=", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-wrap-function": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/helper-wrap-function/download/@babel/helper-wrap-function-7.8.3.tgz", + "integrity": "sha1-nb2yu1XvFKqgH+jJm2Kb1TUthhA=", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helpers": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/helpers/download/@babel/helpers-7.8.3.tgz", + "integrity": "sha1-OC+7A4LOfEzpBZRauWQdaIM2zoU=", + "dev": true, + "requires": { + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/highlight": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/highlight/download/@babel/highlight-7.8.3.tgz", + "integrity": "sha1-KPFz0EIj6qpZvB1Dmjg25tEmV5c=", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/parser/download/@babel/parser-7.8.3.tgz", + "integrity": "sha1-eQh0CR0gAcm+bsQmwu7Ue8dnkIE=", + "dev": true + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-async-generator-functions/download/@babel/plugin-proposal-async-generator-functions-7.8.3.tgz", + "integrity": "sha1-utMpxnCzgliXIbJ1QMfSiGAcbm8=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-remap-async-to-generator": "^7.8.3", + "@babel/plugin-syntax-async-generators": "^7.8.0" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-dynamic-import/download/@babel/plugin-proposal-dynamic-import-7.8.3.tgz", + "integrity": "sha1-OMT+VVdEgm6X4q6TCw+0zAfmYFQ=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-dynamic-import": "^7.8.0" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-json-strings/download/@babel/plugin-proposal-json-strings-7.8.3.tgz", + "integrity": "sha1-2lIWsjipi1ih4F1oUhBLEPmnDWs=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.0" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-nullish-coalescing-operator/download/@babel/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha1-5FciU/3u1lzd7s/as/kor+sv1dI=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-object-rest-spread/download/@babel/plugin-proposal-object-rest-spread-7.8.3.tgz?cache=0&sync_timestamp=1578959778278&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.8.3.tgz", + "integrity": "sha1-61rjZhGN3KZ77Vg7U9dVTK2ZUbs=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-optional-catch-binding/download/@babel/plugin-proposal-optional-catch-binding-7.8.3.tgz", + "integrity": "sha1-ne6WqxZQ7tiGRq6XNMoWesSpxck=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-optional-chaining/download/@babel/plugin-proposal-optional-chaining-7.8.3.tgz", + "integrity": "sha1-rhCzIUyyX3rbHzvIe6QsoQt+JUM=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.0" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-unicode-property-regex/download/@babel/plugin-proposal-unicode-property-regex-7.8.3.tgz", + "integrity": "sha1-tkbDrepfmIAMmrRRBaw00GzUpH8=", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@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-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=1578959786243&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-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-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-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.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-top-level-await/download/@babel/plugin-syntax-top-level-await-7.8.3.tgz", + "integrity": "sha1-Os3s5pXmsTqvV/wpHRqACVDHE5E=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-arrow-functions/download/@babel/plugin-transform-arrow-functions-7.8.3.tgz", + "integrity": "sha1-gndsLtDNnhpJlW2uuJYCTJRzuLY=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-async-to-generator/download/@babel/plugin-transform-async-to-generator-7.8.3.tgz", + "integrity": "sha1-Qwj60NlAnXHq+5sabuNfnWS2QIY=", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-remap-async-to-generator": "^7.8.3" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-block-scoped-functions/download/@babel/plugin-transform-block-scoped-functions-7.8.3.tgz", + "integrity": "sha1-Q37sW3mbWFIHIISzrl72boNJ6KM=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-block-scoping/download/@babel/plugin-transform-block-scoping-7.8.3.tgz", + "integrity": "sha1-l9Ndq2aFekN8FmNYuR0JBQyGjzo=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "lodash": "^4.17.13" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-classes/download/@babel/plugin-transform-classes-7.8.3.tgz", + "integrity": "sha1-Rv16nSu56onOiHIEd5ef4NcbIbg=", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.8.3", + "@babel/helper-define-map": "^7.8.3", + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-optimise-call-expression": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-replace-supers": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-computed-properties/download/@babel/plugin-transform-computed-properties-7.8.3.tgz", + "integrity": "sha1-ltDSi3985OtbEguy4OlDNDyG+Bs=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-destructuring/download/@babel/plugin-transform-destructuring-7.8.3.tgz", + "integrity": "sha1-IN372eRnaQaxBW7mCviFkMx6qgs=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-dotall-regex/download/@babel/plugin-transform-dotall-regex-7.8.3.tgz", + "integrity": "sha1-w8bsXuYSXGmTxcvKINyGIanqem4=", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-duplicate-keys/download/@babel/plugin-transform-duplicate-keys-7.8.3.tgz", + "integrity": "sha1-jRLfMJqlN/JyiZxWXqF2jihuIfE=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-exponentiation-operator/download/@babel/plugin-transform-exponentiation-operator-7.8.3.tgz", + "integrity": "sha1-WBptf1aXDga/UVYM1k9elHtw17c=", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-for-of/download/@babel/plugin-transform-for-of-7.8.3.tgz", + "integrity": "sha1-FfF7zi/JXH1ZokspnoPoHO3CLhg=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-function-name/download/@babel/plugin-transform-function-name-7.8.3.tgz", + "integrity": "sha1-J5NzyycyKqrWfCaD53bfxHGW7Ys=", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-literals/download/@babel/plugin-transform-literals-7.8.3.tgz", + "integrity": "sha1-rvI5gj2RmU7Hto5VGTUl1229XcE=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-member-expression-literals/download/@babel/plugin-transform-member-expression-literals-7.8.3.tgz", + "integrity": "sha1-lj/tS2IKx8v2Apx1VCQCn6OkBBA=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-modules-amd/download/@babel/plugin-transform-modules-amd-7.8.3.tgz", + "integrity": "sha1-ZWBtRGFrUCJedvVXjzPFaKC4dqU=", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "babel-plugin-dynamic-import-node": "^2.3.0" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-modules-commonjs/download/@babel/plugin-transform-modules-commonjs-7.8.3.tgz?cache=0&sync_timestamp=1578959786367&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-modules-commonjs%2Fdownload%2F%40babel%2Fplugin-transform-modules-commonjs-7.8.3.tgz", + "integrity": "sha1-3yUXBuwzG9BYo0vdcmE5FfgpKKU=", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-simple-access": "^7.8.3", + "babel-plugin-dynamic-import-node": "^2.3.0" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-modules-systemjs/download/@babel/plugin-transform-modules-systemjs-7.8.3.tgz", + "integrity": "sha1-2LvyIsHb42YfRA8vAMFum7fQ1CA=", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.8.3", + "@babel/helper-module-transforms": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "babel-plugin-dynamic-import-node": "^2.3.0" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-modules-umd/download/@babel/plugin-transform-modules-umd-7.8.3.tgz", + "integrity": "sha1-WS1XjOBsUvW5iwL5E9ZT/+lyZho=", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-named-capturing-groups-regex/download/@babel/plugin-transform-named-capturing-groups-regex-7.8.3.tgz", + "integrity": "sha1-oqcr/6ICrA4tBQav0JOcXsvEjGw=", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.8.3" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-new-target/download/@babel/plugin-transform-new-target-7.8.3.tgz", + "integrity": "sha1-YMwq5m2FyVq1QOs0urtkNNTHDEM=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-object-super/download/@babel/plugin-transform-object-super-7.8.3.tgz?cache=0&sync_timestamp=1578960944103&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-object-super%2Fdownload%2F%40babel%2Fplugin-transform-object-super-7.8.3.tgz", + "integrity": "sha1-67ah56hv+paFi9asAQLWWUQmFyU=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-replace-supers": "^7.8.3" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-parameters/download/@babel/plugin-transform-parameters-7.8.3.tgz", + "integrity": "sha1-eJBXahOxcyXYt9RMs38h3Du92lk=", + "dev": true, + "requires": { + "@babel/helper-call-delegate": "^7.8.3", + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-property-literals/download/@babel/plugin-transform-property-literals-7.8.3.tgz", + "integrity": "sha1-MxlDANhTnB7SjGKtUIe6OAe5gmM=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-regenerator/download/@babel/plugin-transform-regenerator-7.8.3.tgz", + "integrity": "sha1-sxAx6AWcB0lb8jYUyX89lpi8bsg=", + "dev": true, + "requires": { + "regenerator-transform": "^0.14.0" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-reserved-words/download/@babel/plugin-transform-reserved-words-7.8.3.tgz", + "integrity": "sha1-mgY1rE5mXSmxYoN908xQdF398fU=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-shorthand-properties/download/@babel/plugin-transform-shorthand-properties-7.8.3.tgz", + "integrity": "sha1-KFRSFuAjqDLU06EYXtSSvP6sCMg=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-spread/download/@babel/plugin-transform-spread-7.8.3.tgz", + "integrity": "sha1-nI/+gXD9+4ixFOy5ILgvtulf5eg=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-sticky-regex/download/@babel/plugin-transform-sticky-regex-7.8.3.tgz", + "integrity": "sha1-vnoSkPgdrnZ0dUUhmeH3bWF1sQA=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-regex": "^7.8.3" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-template-literals/download/@babel/plugin-transform-template-literals-7.8.3.tgz", + "integrity": "sha1-e/pHMrRV6mpDEwrcC6dn7A5AKoA=", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-typeof-symbol/download/@babel/plugin-transform-typeof-symbol-7.8.3.tgz", + "integrity": "sha1-XP+yFvslyMZLpr9fds5J06sHn00=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-unicode-regex/download/@babel/plugin-transform-unicode-regex-7.8.3.tgz", + "integrity": "sha1-DO8247pz5cVyc+/7GC9GuRoeyq0=", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/preset-env": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/preset-env/download/@babel/preset-env-7.8.3.tgz?cache=0&sync_timestamp=1578959778442&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fpreset-env%2Fdownload%2F%40babel%2Fpreset-env-7.8.3.tgz", + "integrity": "sha1-3A+yk49Su93XmzyGGks0J906bFQ=", + "dev": true, + "requires": { + "@babel/compat-data": "^7.8.0", + "@babel/helper-compilation-targets": "^7.8.3", + "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-proposal-async-generator-functions": "^7.8.3", + "@babel/plugin-proposal-dynamic-import": "^7.8.3", + "@babel/plugin-proposal-json-strings": "^7.8.3", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-proposal-object-rest-spread": "^7.8.3", + "@babel/plugin-proposal-optional-catch-binding": "^7.8.3", + "@babel/plugin-proposal-optional-chaining": "^7.8.3", + "@babel/plugin-proposal-unicode-property-regex": "^7.8.3", + "@babel/plugin-syntax-async-generators": "^7.8.0", + "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/plugin-syntax-json-strings": "^7.8.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", + "@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.8.3", + "@babel/plugin-transform-arrow-functions": "^7.8.3", + "@babel/plugin-transform-async-to-generator": "^7.8.3", + "@babel/plugin-transform-block-scoped-functions": "^7.8.3", + "@babel/plugin-transform-block-scoping": "^7.8.3", + "@babel/plugin-transform-classes": "^7.8.3", + "@babel/plugin-transform-computed-properties": "^7.8.3", + "@babel/plugin-transform-destructuring": "^7.8.3", + "@babel/plugin-transform-dotall-regex": "^7.8.3", + "@babel/plugin-transform-duplicate-keys": "^7.8.3", + "@babel/plugin-transform-exponentiation-operator": "^7.8.3", + "@babel/plugin-transform-for-of": "^7.8.3", + "@babel/plugin-transform-function-name": "^7.8.3", + "@babel/plugin-transform-literals": "^7.8.3", + "@babel/plugin-transform-member-expression-literals": "^7.8.3", + "@babel/plugin-transform-modules-amd": "^7.8.3", + "@babel/plugin-transform-modules-commonjs": "^7.8.3", + "@babel/plugin-transform-modules-systemjs": "^7.8.3", + "@babel/plugin-transform-modules-umd": "^7.8.3", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.8.3", + "@babel/plugin-transform-new-target": "^7.8.3", + "@babel/plugin-transform-object-super": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.8.3", + "@babel/plugin-transform-property-literals": "^7.8.3", + "@babel/plugin-transform-regenerator": "^7.8.3", + "@babel/plugin-transform-reserved-words": "^7.8.3", + "@babel/plugin-transform-shorthand-properties": "^7.8.3", + "@babel/plugin-transform-spread": "^7.8.3", + "@babel/plugin-transform-sticky-regex": "^7.8.3", + "@babel/plugin-transform-template-literals": "^7.8.3", + "@babel/plugin-transform-typeof-symbol": "^7.8.3", + "@babel/plugin-transform-unicode-regex": "^7.8.3", + "@babel/types": "^7.8.3", + "browserslist": "^4.8.2", + "core-js-compat": "^3.6.2", + "invariant": "^2.2.2", + "levenary": "^1.1.0", + "semver": "^5.5.0" + } + }, + "@babel/template": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/template/download/@babel/template-7.8.3.tgz", + "integrity": "sha1-4CrQT+JipleAkyf1eAVsoV/U0bg=", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/traverse": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/traverse/download/@babel/traverse-7.8.3.tgz", + "integrity": "sha1-qCYhWwEcm09z86iTr7wFFRNYv5o=", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.8.3", + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/parser": "^7.8.3", + "@babel/types": "^7.8.3", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/types/download/@babel/types-7.8.3.tgz", + "integrity": "sha1-Wjg9/6VBbbG3Pe3/0xH/0HiPsxw=", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "@discoveryjs/json-ext": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.3.tgz", + "integrity": "sha512-Fxt+AfXgjMoin2maPIYzFZnQjAXjAL0PHscM5pRTtatFqB+vZxAM9tLp2Optnuw3QOQC40jTNeGYFOMvyf7v9g==", + "dev": true + }, + "@webassemblyjs/ast": { + "version": "1.8.5", + "resolved": "https://registry.npm.taobao.org/@webassemblyjs/ast/download/@webassemblyjs/ast-1.8.5.tgz", + "integrity": "sha1-UbHF/mV2o0lTv0slPfnw1JDZ41k=", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.8.5", + "resolved": "https://registry.npm.taobao.org/@webassemblyjs/floating-point-hex-parser/download/@webassemblyjs/floating-point-hex-parser-1.8.5.tgz", + "integrity": "sha1-G6kmopI2E+3OSW/VsC6M6KX0lyE=", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.8.5", + "resolved": "https://registry.npm.taobao.org/@webassemblyjs/helper-api-error/download/@webassemblyjs/helper-api-error-1.8.5.tgz", + "integrity": "sha1-xJ2tIvZFInxe22EL25aX8aq3Ifc=", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.8.5", + "resolved": "https://registry.npm.taobao.org/@webassemblyjs/helper-buffer/download/@webassemblyjs/helper-buffer-1.8.5.tgz", + "integrity": "sha1-/qk+Qphj3V5DOFVfQikjhaZT8gQ=", + "dev": true + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.8.5", + "resolved": "https://registry.npm.taobao.org/@webassemblyjs/helper-code-frame/download/@webassemblyjs/helper-code-frame-1.8.5.tgz", + "integrity": "sha1-mnQP9I4/qjAisd/1RCPfmqKTwl4=", + "dev": true, + "requires": { + "@webassemblyjs/wast-printer": "1.8.5" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.8.5", + "resolved": "https://registry.npm.taobao.org/@webassemblyjs/helper-fsm/download/@webassemblyjs/helper-fsm-1.8.5.tgz", + "integrity": "sha1-ugt9Oz9+RzPaYFnJMyJ12GBwJFI=", + "dev": true + }, + "@webassemblyjs/helper-module-context": { + "version": "1.8.5", + "resolved": "https://registry.npm.taobao.org/@webassemblyjs/helper-module-context/download/@webassemblyjs/helper-module-context-1.8.5.tgz", + "integrity": "sha1-3vS5knsBAdyMu9jR7bW3ucguskU=", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "mamacro": "^0.0.3" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.8.5", + "resolved": "https://registry.npm.taobao.org/@webassemblyjs/helper-wasm-bytecode/download/@webassemblyjs/helper-wasm-bytecode-1.8.5.tgz", + "integrity": "sha1-U3p1Dt31weky83RCBlUckcG5PmE=", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.8.5", + "resolved": "https://registry.npm.taobao.org/@webassemblyjs/helper-wasm-section/download/@webassemblyjs/helper-wasm-section-1.8.5.tgz", + "integrity": "sha1-dMpqa8vhnlCjtrRihH5pUD5r/L8=", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.8.5", + "resolved": "https://registry.npm.taobao.org/@webassemblyjs/ieee754/download/@webassemblyjs/ieee754-1.8.5.tgz", + "integrity": "sha1-cSMp2+8kDza/V70ve4+5v0FUQh4=", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.8.5", + "resolved": "https://registry.npm.taobao.org/@webassemblyjs/leb128/download/@webassemblyjs/leb128-1.8.5.tgz", + "integrity": "sha1-BE7es06mefPgTNT9mCTV41dnrhA=", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.8.5", + "resolved": "https://registry.npm.taobao.org/@webassemblyjs/utf8/download/@webassemblyjs/utf8-1.8.5.tgz", + "integrity": "sha1-qL87XY/+mGx8Hjc8y9wqCRXwztw=", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.8.5", + "resolved": "https://registry.npm.taobao.org/@webassemblyjs/wasm-edit/download/@webassemblyjs/wasm-edit-1.8.5.tgz", + "integrity": "sha1-li2hKqWswcExyBxCMpkcgs5W4Bo=", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/helper-wasm-section": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-opt": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "@webassemblyjs/wast-printer": "1.8.5" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.8.5", + "resolved": "https://registry.npm.taobao.org/@webassemblyjs/wasm-gen/download/@webassemblyjs/wasm-gen-1.8.5.tgz", + "integrity": "sha1-VIQHZsLBAC62TtGr5yCt7XFPmLw=", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.8.5", + "resolved": "https://registry.npm.taobao.org/@webassemblyjs/wasm-opt/download/@webassemblyjs/wasm-opt-1.8.5.tgz", + "integrity": "sha1-sk2fa6UDlK8TSfUQr6j/y4pj0mQ=", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.8.5", + "resolved": "https://registry.npm.taobao.org/@webassemblyjs/wasm-parser/download/@webassemblyjs/wasm-parser-1.8.5.tgz", + "integrity": "sha1-IVdvDsiLkUJzV7hTY4NmjvfGa40=", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.8.5", + "resolved": "https://registry.npm.taobao.org/@webassemblyjs/wast-parser/download/@webassemblyjs/wast-parser-1.8.5.tgz", + "integrity": "sha1-4Q7s1ULQ5705T2gnxJ899tTu+4w=", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/floating-point-hex-parser": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-code-frame": "1.8.5", + "@webassemblyjs/helper-fsm": "1.8.5", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.8.5", + "resolved": "https://registry.npm.taobao.org/@webassemblyjs/wast-printer/download/@webassemblyjs/wast-printer-1.8.5.tgz", + "integrity": "sha1-EUu8SB/RDKDiOzVg+oEnSLC65bw=", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5", + "@xtuc/long": "4.2.2" + } + }, + "@webpack-cli/configtest": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.0.3.tgz", + "integrity": "sha512-WQs0ep98FXX2XBAfQpRbY0Ma6ADw8JR6xoIkaIiJIzClGOMqVRvPCWqndTxf28DgFopWan0EKtHtg/5W1h0Zkw==", + "dev": true + }, + "@webpack-cli/info": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.2.4.tgz", + "integrity": "sha512-ogE2T4+pLhTTPS/8MM3IjHn0IYplKM4HbVNMCWA9N4NrdPzunwenpCsqKEXyejMfRu6K8mhauIPYf8ZxWG5O6g==", + "dev": true, + "requires": { + "envinfo": "^7.7.3" + } + }, + "@webpack-cli/serve": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.4.0.tgz", + "integrity": "sha512-xgT/HqJ+uLWGX+Mzufusl3cgjAcnqYYskaB7o0vRcwOEfuu6hMzSILQpnIzFMGsTaeaX4Nnekl+6fadLbl1/Vg==", + "dev": true + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/@xtuc/ieee754/download/@xtuc/ieee754-1.2.0.tgz", + "integrity": "sha1-7vAUoxRa5Hehy8AM0eVSM23Ot5A=", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npm.taobao.org/@xtuc/long/download/@xtuc/long-4.2.2.tgz", + "integrity": "sha1-0pHGpOl5ibXGHZrPOWrk/hM6cY0=", + "dev": true + }, + "acorn": { + "version": "6.4.0", + "resolved": "https://registry.npm.taobao.org/acorn/download/acorn-6.4.0.tgz", + "integrity": "sha1-tlnS/7r6JLr12xzbsslKmD7NJ4Q=", + "dev": true + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/ajv-errors/download/ajv-errors-1.0.1.tgz", + "integrity": "sha1-81mGrOuRr63sQQL72FAUlQzvpk0=", + "dev": true + }, + "ajv-keywords": { + "version": "3.4.1", + "resolved": "https://registry.npm.taobao.org/ajv-keywords/download/ajv-keywords-3.4.1.tgz", + "integrity": "sha1-75FuJxxkrBIXH9g4TqrmsjRYVNo=", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-3.2.1.tgz", + "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/anymatch/download/anymatch-2.0.0.tgz", + "integrity": "sha1-vLJLTzeTTZqnrBe0ra+J58du8us=", + "dev": true, + "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=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/aproba/download/aproba-1.2.0.tgz", + "integrity": "sha1-aALmJk79GMeQobDVF/DyYnvyyUo=", + "dev": true + }, + "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=", + "dev": true + }, + "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=", + "dev": true + }, + "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=", + "dev": true + }, + "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=", + "dev": true + }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npm.taobao.org/asn1.js/download/asn1.js-4.10.1.tgz", + "integrity": "sha1-ucK/WAXx5kqt7tbfOiv6+1pz9aA=", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npm.taobao.org/assert/download/assert-1.5.0.tgz", + "integrity": "sha1-VcEJqvbgrv2z3EtxJAxwv1dLGOs=", + "dev": true, + "requires": { + "object-assign": "^4.1.1", + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/inherits/download/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npm.taobao.org/util/download/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "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=", + "dev": true + }, + "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=", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npm.taobao.org/atob/download/atob-2.1.2.tgz", + "integrity": "sha1-bZUX654DDSQ2ZmZR6GvZ9vE1M8k=", + "dev": true + }, + "babel-loader": { + "version": "8.0.6", + "resolved": "https://registry.npm.taobao.org/babel-loader/download/babel-loader-8.0.6.tgz", + "integrity": "sha1-4zvbbzYrA/S7FBoMIauHxQG3Dfs=", + "dev": true, + "requires": { + "find-cache-dir": "^2.0.0", + "loader-utils": "^1.0.2", + "mkdirp": "^0.5.1", + "pify": "^4.0.1" + } + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.0", + "resolved": "https://registry.npm.taobao.org/babel-plugin-dynamic-import-node/download/babel-plugin-dynamic-import-node-2.3.0.tgz?cache=0&sync_timestamp=1571753086816&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbabel-plugin-dynamic-import-node%2Fdownload%2Fbabel-plugin-dynamic-import-node-2.3.0.tgz", + "integrity": "sha1-8A9Qe9qjw+P/bn5emNkKesq5b38=", + "dev": true, + "requires": { + "object.assign": "^4.1.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=", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npm.taobao.org/base/download/base-0.11.2.tgz", + "integrity": "sha1-e95c7RRbbVUakNuH+DxVi060io8=", + "dev": true, + "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=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "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=", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "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=", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz", + "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npm.taobao.org/base64-js/download/base64-js-1.3.1.tgz", + "integrity": "sha1-WOzoy3XdB+ce0IxzarxfrE2/jfE=", + "dev": true + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npm.taobao.org/big.js/download/big.js-5.2.2.tgz", + "integrity": "sha1-ZfCvOC9Xi83HQr2cKB6cstd2gyg=", + "dev": true + }, + "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=", + "dev": true + }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npm.taobao.org/bindings/download/bindings-1.5.0.tgz", + "integrity": "sha1-EDU8npRTNLwFEabZCzj7x8nFBN8=", + "dev": true, + "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=", + "dev": true + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npm.taobao.org/bn.js/download/bn.js-4.11.8.tgz", + "integrity": "sha1-LN4J617jQfSEdGuwMJsyU7GxRC8=", + "dev": true + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/boolbase/download/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npm.taobao.org/brace-expansion/download/brace-expansion-1.1.11.tgz", + "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=", + "dev": true, + "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=", + "dev": true, + "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" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/brorand/download/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/browserify-aes/download/browserify-aes-1.2.0.tgz", + "integrity": "sha1-Mmc0ZC9APavDADIJhTu3CtQo70g=", + "dev": true, + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/browserify-cipher/download/browserify-cipher-1.0.1.tgz", + "integrity": "sha1-jWR0wbhwv9q807z8wZNKEOlPFfA=", + "dev": true, + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/browserify-des/download/browserify-des-1.0.2.tgz", + "integrity": "sha1-OvTx9Zg5QDVy8cZiBDdfen9wPpw=", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npm.taobao.org/browserify-rsa/download/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npm.taobao.org/browserify-sign/download/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "dev": true, + "requires": { + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npm.taobao.org/browserify-zlib/download/browserify-zlib-0.2.0.tgz", + "integrity": "sha1-KGlFnZqjviRf6P4sofRuLn9U1z8=", + "dev": true, + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "version": "4.8.5", + "resolved": "https://registry.npm.taobao.org/browserslist/download/browserslist-4.8.5.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbrowserslist%2Fdownload%2Fbrowserslist-4.8.5.tgz", + "integrity": "sha1-aRr04yesh3sl56P37oacTvNs3qM=", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001022", + "electron-to-chromium": "^1.3.338", + "node-releases": "^1.1.46" + } + }, + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npm.taobao.org/buffer/download/buffer-4.9.2.tgz?cache=0&sync_timestamp=1573257309520&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbuffer%2Fdownload%2Fbuffer-4.9.2.tgz", + "integrity": "sha1-Iw6tNEACmIZEhBqwJEr4xEu+Pvg=", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/buffer-from/download/buffer-from-1.1.1.tgz", + "integrity": "sha1-MnE7wCj3XAL9txDXx7zsHyxgcO8=", + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npm.taobao.org/buffer-xor/download/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/builtin-status-codes/download/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "cacache": { + "version": "12.0.3", + "resolved": "https://registry.npm.taobao.org/cacache/download/cacache-12.0.3.tgz", + "integrity": "sha1-vpmruk4b9d9GHNWiwQcfxDJXM5A=", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "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=", + "dev": true, + "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" + } + }, + "camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/camel-case/download/camel-case-3.0.0.tgz", + "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "dev": true, + "requires": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "caniuse-lite": { + "version": "1.0.30001023", + "resolved": "https://registry.npm.taobao.org/caniuse-lite/download/caniuse-lite-1.0.30001023.tgz?cache=0&sync_timestamp=1579937775290&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcaniuse-lite%2Fdownload%2Fcaniuse-lite-1.0.30001023.tgz", + "integrity": "sha1-uCFVgn8/UAkHe90t89iWi8vMb8Q=", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-2.4.2.tgz", + "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npm.taobao.org/chokidar/download/chokidar-2.1.8.tgz", + "integrity": "sha1-gEs6e2qZNYw8XGHnHYco8EHP+Rc=", + "dev": true, + "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" + } + }, + "chownr": { + "version": "1.1.3", + "resolved": "https://registry.npm.taobao.org/chownr/download/chownr-1.1.3.tgz?cache=0&sync_timestamp=1569391492311&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchownr%2Fdownload%2Fchownr-1.1.3.tgz", + "integrity": "sha1-Qtg31SOWiNVfMDADpQgjD6ZycUI=", + "dev": true + }, + "chrome-trace-event": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/chrome-trace-event/download/chrome-trace-event-1.0.2.tgz", + "integrity": "sha1-I0CQ7pfH1K0aLEvq4nUF3v/GCKQ=", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npm.taobao.org/cipher-base/download/cipher-base-1.0.4.tgz", + "integrity": "sha1-h2Dk7MJy9MNjUy+SbYdKriwTl94=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.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=", + "dev": true, + "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=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "clean-css": { + "version": "4.2.2", + "resolved": "https://registry.npm.taobao.org/clean-css/download/clean-css-4.2.2.tgz?cache=0&sync_timestamp=1579954947396&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fclean-css%2Fdownload%2Fclean-css-4.2.2.tgz", + "integrity": "sha1-hRmr2nJLPnWbx50ZY2mQaSXYGj8=", + "dev": true, + "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=", + "dev": true + } + } + }, + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.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=", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true + }, + "colorette": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", + "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", + "dev": true + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npm.taobao.org/commander/download/commander-2.20.3.tgz", + "integrity": "sha1-/UhehMA+tIgcIHIrpIA16FMa6zM=", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/commondir/download/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npm.taobao.org/component-emitter/download/component-emitter-1.3.0.tgz", + "integrity": "sha1-FuQHD7qK4ptnnyIVhT7hgasuq8A=", + "dev": true + }, + "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=", + "dev": true + }, + "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=", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/console-browserify/download/console-browserify-1.2.0.tgz?cache=0&sync_timestamp=1572252781983&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fconsole-browserify%2Fdownload%2Fconsole-browserify-1.2.0.tgz", + "integrity": "sha1-ZwY871fOts9Jk6KrOlWECujEkzY=", + "dev": true + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/constants-browserify/download/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npm.taobao.org/convert-source-map/download/convert-source-map-1.7.0.tgz?cache=0&sync_timestamp=1573003828038&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fconvert-source-map%2Fdownload%2Fconvert-source-map-1.7.0.tgz", + "integrity": "sha1-F6LLiC1/d9NJBYXizmxSRCSjpEI=", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npm.taobao.org/copy-concurrently/download/copy-concurrently-1.0.5.tgz", + "integrity": "sha1-kilzmMrjSTf8r9bsgTnBgFHwteA=", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npm.taobao.org/copy-descriptor/download/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "core-js-compat": { + "version": "3.6.4", + "resolved": "https://registry.npm.taobao.org/core-js-compat/download/core-js-compat-3.6.4.tgz", + "integrity": "sha1-k4R2Vp67bNqA0zm88Zn65PFv/xc=", + "dev": true, + "requires": { + "browserslist": "^4.8.3", + "semver": "7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npm.taobao.org/semver/download/semver-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=", + "dev": true + }, + "create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npm.taobao.org/create-ecdh/download/create-ecdh-4.0.3.tgz", + "integrity": "sha1-yREbbzMEXEaX8UR4f5JUzcd8Rf8=", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/create-hash/download/create-hash-1.2.0.tgz", + "integrity": "sha1-iJB4rxGmN1a8+1m9IhmWvjqe8ZY=", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npm.taobao.org/create-hmac/download/create-hmac-1.1.7.tgz", + "integrity": "sha1-aRcMeLOrlXFHsriwRXLkfq0iQ/8=", + "dev": true, + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npm.taobao.org/crypto-browserify/download/crypto-browserify-3.12.0.tgz", + "integrity": "sha1-OWz58xN/A+S45TLFj2mCVOAPgOw=", + "dev": true, + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "css-select": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/css-select/download/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "dev": true, + "requires": { + "boolbase": "~1.0.0", + "css-what": "2.1", + "domutils": "1.5.1", + "nth-check": "~1.0.1" + } + }, + "css-what": { + "version": "2.1.3", + "resolved": "https://registry.npm.taobao.org/css-what/download/css-what-2.1.3.tgz", + "integrity": "sha1-ptdgRXM2X+dGhsPzEcVlE9iChfI=", + "dev": true + }, + "cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/cyclist/download/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", + "dev": true + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npm.taobao.org/debug/download/debug-4.1.1.tgz", + "integrity": "sha1-O3ImAlUQnGtYnO4FDx1RYTlmR5E=", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "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=", + "dev": true + }, + "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=", + "dev": true, + "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=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "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=", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "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=", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz", + "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "des.js": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/des.js/download/des.js-1.0.1.tgz", + "integrity": "sha1-U4IULhvcU/hdhtU+X0qn3rkeCEM=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npm.taobao.org/diffie-hellman/download/diffie-hellman-5.0.3.tgz", + "integrity": "sha1-QOjumPVaIUlgcUaSHGPhrl89KHU=", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npm.taobao.org/dom-converter/download/dom-converter-0.2.0.tgz", + "integrity": "sha1-ZyGp2u4uKTaClVtq/kFncWJ7t2g=", + "dev": true, + "requires": { + "utila": "~0.4" + } + }, + "dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npm.taobao.org/dom-serializer/download/dom-serializer-0.2.2.tgz", + "integrity": "sha1-GvuB9TNxcXXUeGVd68XjMtn5u1E=", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/domelementtype/download/domelementtype-2.0.1.tgz", + "integrity": "sha1-H4vf6R9aeAYydOgDtL3O326U+U0=", + "dev": true + } + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/domain-browser/download/domain-browser-1.2.0.tgz?cache=0&sync_timestamp=1575879298649&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdomain-browser%2Fdownload%2Fdomain-browser-1.2.0.tgz", + "integrity": "sha1-PTH1AZGmdJ3RN1p/Ui6CPULlTto=", + "dev": true + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npm.taobao.org/domelementtype/download/domelementtype-1.3.1.tgz", + "integrity": "sha1-0EjESzew0Qp/Kj1f7j9DM9eQSB8=", + "dev": true + }, + "domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npm.taobao.org/domhandler/download/domhandler-2.4.2.tgz", + "integrity": "sha1-iAUJfpM9ZehVRvcm1g9euItE+AM=", + "dev": true, + "requires": { + "domelementtype": "1" + } + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npm.taobao.org/domutils/download/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npm.taobao.org/duplexify/download/duplexify-3.7.1.tgz", + "integrity": "sha1-Kk31MX9sz9kfhtb9JdjYoQO4gwk=", + "dev": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "electron-to-chromium": { + "version": "1.3.340", + "resolved": "https://registry.npm.taobao.org/electron-to-chromium/download/electron-to-chromium-1.3.340.tgz?cache=0&sync_timestamp=1579741585102&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Felectron-to-chromium%2Fdownload%2Felectron-to-chromium-1.3.340.tgz", + "integrity": "sha1-XU/njphNQhEZTPWlLggGlUPaFG8=", + "dev": true + }, + "elliptic": { + "version": "6.5.2", + "resolved": "https://registry.npm.taobao.org/elliptic/download/elliptic-6.5.2.tgz", + "integrity": "sha1-BcVnjXFzwEnYykM1UiJKSV0ON2I=", + "dev": true, + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + } + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/emojis-list/download/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npm.taobao.org/end-of-stream/download/end-of-stream-1.4.4.tgz?cache=0&sync_timestamp=1569416283279&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fend-of-stream%2Fdownload%2Fend-of-stream-1.4.4.tgz", + "integrity": "sha1-WuZKX0UFe682JuwU2gyl5LJDHrA=", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "enhanced-resolve": { + "version": "4.1.1", + "resolved": "https://registry.npm.taobao.org/enhanced-resolve/download/enhanced-resolve-4.1.1.tgz", + "integrity": "sha1-KTfiuAZs0P584JkKmPDXGjUYn2Y=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "dependencies": { + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npm.taobao.org/memory-fs/download/memory-fs-0.5.0.tgz?cache=0&sync_timestamp=1570537539012&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmemory-fs%2Fdownload%2Fmemory-fs-0.5.0.tgz", + "integrity": "sha1-MkwBKIuIZSlm0WHbd4OHIIRajjw=", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + } + } + }, + "entities": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/entities/download/entities-2.0.0.tgz", + "integrity": "sha1-aNYITKsbB5dnVA2A5Wo5tCPkq/Q=", + "dev": true + }, + "envinfo": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", + "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", + "dev": true + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npm.taobao.org/errno/download/errno-0.1.7.tgz", + "integrity": "sha1-RoTXF3mtOa8Xfj8AeZb3xnyFJhg=", + "dev": true, + "requires": { + "prr": "~1.0.1" + } + }, + "es-abstract": { + "version": "1.17.4", + "resolved": "https://registry.npm.taobao.org/es-abstract/download/es-abstract-1.17.4.tgz?cache=0&sync_timestamp=1579624493239&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fes-abstract%2Fdownload%2Fes-abstract-1.17.4.tgz", + "integrity": "sha1-467fGXBrIOfCWUw1/A1XYFp54YQ=", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npm.taobao.org/es-to-primitive/download/es-to-primitive-1.2.1.tgz", + "integrity": "sha1-5VzUyc3BiLzvsDs2bHNjI/xciYo=", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "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=", + "dev": true + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npm.taobao.org/eslint-scope/download/eslint-scope-4.0.3.tgz?cache=0&sync_timestamp=1566286635417&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Feslint-scope%2Fdownload%2Feslint-scope-4.0.3.tgz", + "integrity": "sha1-ygODMxD2iJoyZHgaqC5j65z+eEg=", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npm.taobao.org/esrecurse/download/esrecurse-4.2.1.tgz", + "integrity": "sha1-AHo7n9vCs7uH5IeeoZyS/b05Qs8=", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npm.taobao.org/estraverse/download/estraverse-4.3.0.tgz", + "integrity": "sha1-OYrT88WiSUi+dyXoPRGn3ijNvR0=", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npm.taobao.org/esutils/download/esutils-2.0.3.tgz?cache=0&sync_timestamp=1564535520945&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fesutils%2Fdownload%2Fesutils-2.0.3.tgz", + "integrity": "sha1-dNLrTeC42hKTcRkQ1Qd1ubcQ72Q=", + "dev": true + }, + "events": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/events/download/events-3.1.0.tgz", + "integrity": "sha1-hCea8bNMt1qoi/X/KR9tC9mzGlk=", + "dev": true + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npm.taobao.org/evp_bytestokey/download/evp_bytestokey-1.0.3.tgz", + "integrity": "sha1-f8vbGY3HGVlDLv4ThCaE4FJaywI=", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "execa": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.0.tgz", + "integrity": "sha512-CkdUB7s2y6S+d4y+OM/+ZtQcJCiKUCth4cNImGMqrt2zEVtW2rfHGspQBE1GDo6LjeNIQmTPKXqTCKjqFKyu3A==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "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=", + "dev": true, + "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", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "dev": true, + "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=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "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=", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npm.taobao.org/extglob/download/extglob-2.0.4.tgz", + "integrity": "sha1-rQD+TcYSqSMuhxhxHcXLWrAoVUM=", + "dev": true, + "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=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "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=", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "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=", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz", + "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "fast-deep-equal": { + "version": "3.1.1", + "resolved": "https://registry.npm.taobao.org/fast-deep-equal/download/fast-deep-equal-3.1.1.tgz", + "integrity": "sha1-VFFFB3xQFJHjOxXsQIwpQ3bpSuQ=", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/fast-json-stable-stringify/download/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha1-h0v2nG9ATCtdmcSBNBOZ/VWJJjM=", + "dev": true + }, + "fastest-levenshtein": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz", + "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==", + "dev": true + }, + "figgy-pudding": { + "version": "3.5.1", + "resolved": "https://registry.npm.taobao.org/figgy-pudding/download/figgy-pudding-3.5.1.tgz", + "integrity": "sha1-hiRwESkBxyeg5JWoB0S9W6odZ5A=", + "dev": true + }, + "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=", + "dev": true, + "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=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/find-cache-dir/download/find-cache-dir-2.1.0.tgz?cache=0&sync_timestamp=1576153981844&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffind-cache-dir%2Fdownload%2Ffind-cache-dir-2.1.0.tgz", + "integrity": "sha1-jQ+UzRP+Q8bHwmGg2GEVypGMBfc=", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/find-up/download/find-up-3.0.0.tgz", + "integrity": "sha1-SRafHXmTQwZG2mHsxa41XCHJe3M=", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "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=", + "dev": true, + "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=", + "dev": true + }, + "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=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npm.taobao.org/from2/download/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "fs-minipass": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.6.0" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npm.taobao.org/fs-write-stream-atomic/download/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/fs.realpath/download/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "1.2.11", + "resolved": "https://registry.npm.taobao.org/fsevents/download/fsevents-1.2.11.tgz", + "integrity": "sha1-Z79X9HWPAu3oj7KhcS/vTRU1i+M=", + "dev": true, + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1", + "node-pre-gyp": "*" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "optional": true + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true, + "optional": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "optional": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.3.tgz", + "integrity": "sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==" + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true, + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true, + "optional": true + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "dev": true, + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true, + "optional": true + }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "requires": { + "minipass": "^2.6.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "optional": true, + "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" + } + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", + "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true, + "optional": true + }, + "minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "requires": { + "minipass": "^2.9.0" + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "optional": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true, + "optional": true + }, + "needle": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.4.0.tgz", + "integrity": "sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg==", + "dev": true, + "optional": true, + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.14.0.tgz", + "integrity": "sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA==", + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4.4.2" + } + }, + "nopt": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", + "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", + "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", + "dev": true, + "optional": true, + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.7.tgz", + "integrity": "sha512-vAj7dIkp5NhieaGZxBJB8fF4R0078rqsmhJcAfXZ6O7JJhjhPK96n5Ry1oZcfLXgfun0GWTZPOxaEyqv8GBykQ==", + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "optional": true, + "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" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true, + "optional": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true, + "optional": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true, + "optional": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "optional": true + } + } + }, + "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=", + "dev": true + }, + "gensync": { + "version": "1.0.0-beta.1", + "resolved": "https://registry.npm.taobao.org/gensync/download/gensync-1.0.0-beta.1.tgz", + "integrity": "sha1-WPQ2H/mH5f9uHnohCCeqNx6qwmk=", + "dev": true + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npm.taobao.org/get-value/download/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npm.taobao.org/glob/download/glob-7.1.6.tgz", + "integrity": "sha1-FB8zuBp8JJLhJVlDB0gMRmeSeKY=", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "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=", + "dev": true, + "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=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npm.taobao.org/globals/download/globals-11.12.0.tgz?cache=0&sync_timestamp=1574143265609&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fglobals%2Fdownload%2Fglobals-11.12.0.tgz", + "integrity": "sha1-q4eVM4hooLq9hSV1gBjCp+uVxC4=", + "dev": true + }, + "graceful-fs": { + "version": "4.2.3", + "resolved": "https://registry.npm.taobao.org/graceful-fs/download/graceful-fs-4.2.3.tgz", + "integrity": "sha1-ShL/G2A3bvCYYsIJPt2Qgyi+hCM=", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npm.taobao.org/has/download/has-1.0.3.tgz", + "integrity": "sha1-ci18v8H2qoJB8W3YFOAR4fQeh5Y=", + "dev": true, + "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=", + "dev": true + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/has-symbols/download/has-symbols-1.0.1.tgz", + "integrity": "sha1-n1IUdYpEGWxAbZvXbOv4HsLdMeg=", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/has-value/download/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "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=", + "dev": true, + "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?cache=0&sync_timestamp=1579194500634&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fkind-of%2Fdownload%2Fkind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npm.taobao.org/hash-base/download/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npm.taobao.org/hash.js/download/hash.js-1.1.7.tgz", + "integrity": "sha1-C6vKU46NTuSg+JiNaIZlN6ADz0I=", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/he/download/he-1.2.0.tgz", + "integrity": "sha1-hK5l+n6vsWX922FWauFLrwVmTw8=", + "dev": true + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/hmac-drbg/download/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "html-minifier": { + "version": "3.5.21", + "resolved": "https://registry.npm.taobao.org/html-minifier/download/html-minifier-3.5.21.tgz", + "integrity": "sha1-0AQOBUcw41TbAIRjWTGUAVIS0gw=", + "dev": true, + "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": { + "commander": { + "version": "2.17.1", + "resolved": "https://registry.npm.taobao.org/commander/download/commander-2.17.1.tgz", + "integrity": "sha1-vXerfebelCBc6sxy8XFtKfIKd78=", + "dev": true + } + } + }, + "html-webpack-plugin": { + "version": "3.2.0", + "resolved": "https://registry.npm.taobao.org/html-webpack-plugin/download/html-webpack-plugin-3.2.0.tgz", + "integrity": "sha1-sBq71yOsqqeze2r0SS69oD2d03s=", + "dev": true, + "requires": { + "html-minifier": "^3.2.3", + "loader-utils": "^0.2.16", + "lodash": "^4.17.3", + "pretty-error": "^2.0.2", + "tapable": "^1.0.0", + "toposort": "^1.0.0", + "util.promisify": "1.0.0" + }, + "dependencies": { + "big.js": { + "version": "3.2.0", + "resolved": "https://registry.npm.taobao.org/big.js/download/big.js-3.2.0.tgz", + "integrity": "sha1-pfwpi4G54Nyi5FiCR4S2XFK6WI4=", + "dev": true + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npm.taobao.org/json5/download/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npm.taobao.org/loader-utils/download/loader-utils-0.2.17.tgz", + "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "dev": true, + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" + } + } + } + }, + "htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npm.taobao.org/htmlparser2/download/htmlparser2-3.10.1.tgz", + "integrity": "sha1-vWedw/WYl7ajS7EHSchVu1OpOS8=", + "dev": true, + "requires": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + }, + "dependencies": { + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/entities/download/entities-1.1.2.tgz", + "integrity": "sha1-vfpzUplmTfr9NFKe1PhSKidf6lY=", + "dev": true + }, + "readable-stream": { + "version": "3.5.0", + "resolved": "https://registry.npm.taobao.org/readable-stream/download/readable-stream-3.5.0.tgz?cache=0&sync_timestamp=1579280462569&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Freadable-stream%2Fdownload%2Freadable-stream-3.5.0.tgz", + "integrity": "sha1-Rl1w5tEIf2Fi0HnNC123++v9FgY=", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/https-browserify/download/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npm.taobao.org/ieee754/download/ieee754-1.1.13.tgz", + "integrity": "sha1-7BaFWOlaoYH9h9N/VcMrvLZwi4Q=", + "dev": true + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npm.taobao.org/iferr/download/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "import-local": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", + "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", + "dev": true, + "requires": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.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==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "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==", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + } + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npm.taobao.org/imurmurhash/download/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npm.taobao.org/infer-owner/download/infer-owner-1.0.4.tgz", + "integrity": "sha1-xM78qo5RBRwqQLos6KPScpWvlGc=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npm.taobao.org/inflight/download/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "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=", + "dev": true + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true, + "optional": true + }, + "interpret": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", + "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", + "dev": true + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npm.taobao.org/invariant/download/invariant-2.2.4.tgz", + "integrity": "sha1-YQ88ksk1nOHbYW5TgAjSP/NRWOY=", + "dev": true, + "requires": { + "loose-envify": "^1.0.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=", + "dev": true, + "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?cache=0&sync_timestamp=1579194500634&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fkind-of%2Fdownload%2Fkind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "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=", + "dev": true, + "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=1569905349018&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-buffer%2Fdownload%2Fis-buffer-1.1.6.tgz", + "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=", + "dev": true + }, + "is-callable": { + "version": "1.1.5", + "resolved": "https://registry.npm.taobao.org/is-callable/download/is-callable-1.1.5.tgz?cache=0&sync_timestamp=1576778603160&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-callable%2Fdownload%2Fis-callable-1.1.5.tgz", + "integrity": "sha1-9+RrWWiQRW23Tn9ul2yzJz0G+qs=", + "dev": true + }, + "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=", + "dev": true, + "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?cache=0&sync_timestamp=1579194500634&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fkind-of%2Fdownload%2Fkind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/is-date-object/download/is-date-object-1.0.2.tgz?cache=0&sync_timestamp=1576729394532&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-date-object%2Fdownload%2Fis-date-object-1.0.2.tgz", + "integrity": "sha1-vac28s2P0G0yhE53Q7+nSUw7/X4=", + "dev": true + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-0.1.6.tgz", + "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", + "dev": true, + "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?cache=0&sync_timestamp=1579194500634&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fkind-of%2Fdownload%2Fkind-of-5.1.0.tgz", + "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=", + "dev": true + } + } + }, + "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=", + "dev": true + }, + "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=", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npm.taobao.org/is-glob/download/is-glob-4.0.1.tgz", + "integrity": "sha1-dWfb6fL14kZ7x3q4PEopSCQHpdw=", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/is-number/download/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "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?cache=0&sync_timestamp=1579194500634&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fkind-of%2Fdownload%2Fkind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "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=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npm.taobao.org/is-regex/download/is-regex-1.0.5.tgz?cache=0&sync_timestamp=1576455852912&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-regex%2Fdownload%2Fis-regex-1.0.5.tgz", + "integrity": "sha1-OdWJo1i/GJZ/cmlnEguPwa7XTq4=", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true + }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npm.taobao.org/is-symbol/download/is-symbol-1.0.3.tgz?cache=0&sync_timestamp=1574297184917&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-symbol%2Fdownload%2Fis-symbol-1.0.3.tgz", + "integrity": "sha1-OOEBS55jKb4N6dJKQU/XRB7GGTc=", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/is-windows/download/is-windows-1.0.2.tgz", + "integrity": "sha1-0YUOuXkezRjmGCzhKjDzlmNLsZ0=", + "dev": true + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/is-wsl/download/is-wsl-1.1.0.tgz?cache=0&sync_timestamp=1569219793734&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-wsl%2Fdownload%2Fis-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npm.taobao.org/isobject/download/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "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=", + "dev": true + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npm.taobao.org/jsesc/download/jsesc-2.5.2.tgz", + "integrity": "sha1-gFZNLkg9rPbo7yCWUKZ98/DCg6Q=", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/json-parse-better-errors/download/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha1-u4Z8+zRQ5pEHwTHRxRS6s9yLyqk=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npm.taobao.org/json-schema-traverse/download/json-schema-traverse-0.4.1.tgz", + "integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA=", + "dev": true + }, + "json5": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/json5/download/json5-2.1.1.tgz", + "integrity": "sha1-gbbLBOm6SW8ccAXQe0NoomOPkLY=", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-6.0.3.tgz?cache=0&sync_timestamp=1579194500634&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fkind-of%2Fdownload%2Fkind-of-6.0.3.tgz", + "integrity": "sha1-B8BQNKbDSfoG4k+jWqdttFgM5N0=", + "dev": true + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/leven/download/leven-3.1.0.tgz", + "integrity": "sha1-d4kd6DQGTMy6gq54QrtrFKE+1/I=", + "dev": true + }, + "levenary": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/levenary/download/levenary-1.1.0.tgz", + "integrity": "sha1-/BRv518y3Eg6Cixkrvcg9gLNYhA=", + "dev": true, + "requires": { + "leven": "^3.1.0" + } + }, + "loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npm.taobao.org/loader-runner/download/loader-runner-2.4.0.tgz", + "integrity": "sha1-7UcGa/5TTX6ExMe5mYwqdWB9k1c=", + "dev": true + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npm.taobao.org/loader-utils/download/loader-utils-1.2.3.tgz", + "integrity": "sha1-H/XcaRHJ8KBiUxpMBLYJQGEIwsc=", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/json5/download/json5-1.0.1.tgz", + "integrity": "sha1-d5+wAYYE+oVOrL9iUhgNg1Q+Pb4=", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + } + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/locate-path/download/locate-path-3.0.0.tgz", + "integrity": "sha1-2+w7OrdZdYBxtY/ln8QYca8hQA4=", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npm.taobao.org/loose-envify/download/loose-envify-1.4.0.tgz", + "integrity": "sha1-ce5R+nvkyuwaY4OffmgtgTLTDK8=", + "dev": true, + "requires": { + "js-tokens": "^3.0.0 || ^4.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=", + "dev": true + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npm.taobao.org/lru-cache/download/lru-cache-5.1.1.tgz", + "integrity": "sha1-HaJ+ZxAnGUdpXa9oSOhH8B2EuSA=", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/make-dir/download/make-dir-2.1.0.tgz", + "integrity": "sha1-XwMQ4YuL6JjMBwCSlaMK5B6R5vU=", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "mamacro": { + "version": "0.0.3", + "resolved": "https://registry.npm.taobao.org/mamacro/download/mamacro-0.0.3.tgz", + "integrity": "sha1-rSyVdhl8nxq/MI0Hh4Zb2XWj8+Q=", + "dev": true + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npm.taobao.org/map-cache/download/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "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=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npm.taobao.org/md5.js/download/md5.js-1.3.5.tgz", + "integrity": "sha1-tdB7jjIW4+J81yjXL3DR5qNCAF8=", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npm.taobao.org/memory-fs/download/memory-fs-0.4.1.tgz?cache=0&sync_timestamp=1570537539012&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmemory-fs%2Fdownload%2Fmemory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npm.taobao.org/micromatch/download/micromatch-3.1.10.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmicromatch%2Fdownload%2Fmicromatch-3.1.10.tgz", + "integrity": "sha1-cIWbyVyYQJUvNZoGij/En57PrCM=", + "dev": true, + "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" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npm.taobao.org/miller-rabin/download/miller-rabin-4.0.1.tgz", + "integrity": "sha1-8IA1HIZbDcViqEYpZtqlNUPHik0=", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/minimalistic-assert/download/minimalistic-assert-1.0.1.tgz", + "integrity": "sha1-LhlN4ERibUoQ5/f7wAznPoPk1cc=", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/minimalistic-crypto-utils/download/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npm.taobao.org/minimatch/download/minimatch-3.0.4.tgz", + "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/minimist/download/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.9.0" + } + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/mississippi/download/mississippi-3.0.0.tgz", + "integrity": "sha1-6goykfl+C16HdrNj1fChLZTGcCI=", + "dev": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npm.taobao.org/mixin-deep/download/mixin-deep-1.3.2.tgz", + "integrity": "sha1-ESC0PcNZp4Xc5ltVuC4lfM9HlWY=", + "dev": true, + "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=", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npm.taobao.org/mkdirp/download/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npm.taobao.org/minimist/download/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + } + } + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/move-concurrently/download/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.2.tgz", + "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=", + "dev": true + }, + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npm.taobao.org/nan/download/nan-2.14.0.tgz", + "integrity": "sha1-eBj3IgJ7JFmobwKV1DTR/CM2xSw=", + "dev": true, + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npm.taobao.org/nanomatch/download/nanomatch-1.2.13.tgz", + "integrity": "sha1-uHqKpPwN6P5r6IiVs4mD/yZb0Rk=", + "dev": true, + "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" + } + }, + "neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npm.taobao.org/neo-async/download/neo-async-2.6.1.tgz", + "integrity": "sha1-rCetpmFn+ohJpq3dg39rGJrSCBw=", + "dev": true + }, + "no-case": { + "version": "2.3.2", + "resolved": "https://registry.npm.taobao.org/no-case/download/no-case-2.3.2.tgz?cache=0&sync_timestamp=1576721537540&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fno-case%2Fdownload%2Fno-case-2.3.2.tgz", + "integrity": "sha1-YLgTOWvjmz8SiKTB7V0efSi0ZKw=", + "dev": true, + "requires": { + "lower-case": "^1.1.1" + } + }, + "node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npm.taobao.org/node-libs-browser/download/node-libs-browser-2.2.1.tgz", + "integrity": "sha1-tk9RPRgzhiX5A0bSew0jXmMfZCU=", + "dev": true, + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npm.taobao.org/punycode/download/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, + "node-releases": { + "version": "1.1.47", + "resolved": "https://registry.npm.taobao.org/node-releases/download/node-releases-1.1.47.tgz?cache=0&sync_timestamp=1579642045467&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnode-releases%2Fdownload%2Fnode-releases-1.1.47.tgz", + "integrity": "sha1-xZ73OaH9fsvZ8LfPW3hx6Ki1keQ=", + "dev": true, + "requires": { + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz", + "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=", + "dev": true + } + } + }, + "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=", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/nth-check/download/nth-check-1.0.2.tgz", + "integrity": "sha1-sr0pXDfj3VijvwcAN2Zjuk2c8Fw=", + "dev": true, + "requires": { + "boolbase": "~1.0.0" + } + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npm.taobao.org/object-assign/download/object-assign-4.1.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fobject-assign%2Fdownload%2Fobject-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npm.taobao.org/object-copy/download/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "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=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz?cache=0&sync_timestamp=1579194500634&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fkind-of%2Fdownload%2Fkind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-inspect": { + "version": "1.7.0", + "resolved": "https://registry.npm.taobao.org/object-inspect/download/object-inspect-1.7.0.tgz?cache=0&sync_timestamp=1573451929207&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fobject-inspect%2Fdownload%2Fobject-inspect-1.7.0.tgz", + "integrity": "sha1-9Pa9GBrXfwBrXs5gvQtvOY/3Smc=", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/object-keys/download/object-keys-1.1.1.tgz", + "integrity": "sha1-HEfyct8nfzsdrwYWd9nILiMixg4=", + "dev": true + }, + "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=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npm.taobao.org/object.assign/download/object.assign-4.1.0.tgz", + "integrity": "sha1-lovxEA15Vrs8oIbwBvhGs7xACNo=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.getownpropertydescriptors": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/object.getownpropertydescriptors/download/object.getownpropertydescriptors-2.1.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fobject.getownpropertydescriptors%2Fdownload%2Fobject.getownpropertydescriptors-2.1.0.tgz", + "integrity": "sha1-Npvx+VktiridcS3O1cuBx8U1Jkk=", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } + }, + "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=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npm.taobao.org/once/download/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npm.taobao.org/os-browserify/download/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "p-limit": { + "version": "2.2.2", + "resolved": "https://registry.npm.taobao.org/p-limit/download/p-limit-2.2.2.tgz", + "integrity": "sha1-YSebZ3IfUoeqHBOpp/u8SMkpGx4=", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/p-locate/download/p-locate-3.0.0.tgz", + "integrity": "sha1-Mi1poFwCZLJZl9n0DNiokasAZKQ=", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npm.taobao.org/p-try/download/p-try-2.2.0.tgz", + "integrity": "sha1-yyhoVA4xPWHeWPr741zpAE1VQOY=", + "dev": true + }, + "pako": { + "version": "1.0.10", + "resolved": "https://registry.npm.taobao.org/pako/download/pako-1.0.10.tgz", + "integrity": "sha1-Qyi621CGpCaqkPVBl31JVdpclzI=", + "dev": true + }, + "parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/parallel-transform/download/parallel-transform-1.2.0.tgz", + "integrity": "sha1-kEnKN9bLIYLDsdLHIL6U0UpYFPw=", + "dev": true, + "requires": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "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=", + "dev": true, + "requires": { + "no-case": "^2.2.0" + } + }, + "parse-asn1": { + "version": "5.1.5", + "resolved": "https://registry.npm.taobao.org/parse-asn1/download/parse-asn1-5.1.5.tgz", + "integrity": "sha1-ADJxND2ljclMrOSU+u89IUfs6g4=", + "dev": true, + "requires": { + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npm.taobao.org/pascalcase/download/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npm.taobao.org/path-browserify/download/path-browserify-0.0.1.tgz", + "integrity": "sha1-5sTd1+06onxoogzE5Q4aTug7vEo=", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/path-dirname/download/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/path-exists/download/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "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=", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npm.taobao.org/path-parse/download/path-parse-1.0.6.tgz", + "integrity": "sha1-1i27VnlAXXLEc37FhgDp3c8G0kw=", + "dev": true + }, + "pbkdf2": { + "version": "3.0.17", + "resolved": "https://registry.npm.taobao.org/pbkdf2/download/pbkdf2-3.0.17.tgz", + "integrity": "sha1-l2wgZTBhexTrsyEUI597CTNuk6Y=", + "dev": true, + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npm.taobao.org/pify/download/pify-4.0.1.tgz", + "integrity": "sha1-SyzSXFDVmHNcUCkiJP2MbfQeMjE=", + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/pkg-dir/download/pkg-dir-3.0.0.tgz", + "integrity": "sha1-J0kCDyOe2ZCIGx9xIQ1R62UjvqM=", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "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=", + "dev": true + }, + "pretty-error": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/pretty-error/download/pretty-error-2.1.1.tgz", + "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", + "dev": true, + "requires": { + "renderkid": "^2.0.1", + "utila": "~0.4" + } + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npm.taobao.org/private/download/private-0.1.8.tgz", + "integrity": "sha1-I4Hts2ifelPWUxkAYPz4ItLzaP8=", + "dev": true + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npm.taobao.org/process/download/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/process-nextick-args/download/process-nextick-args-2.0.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fprocess-nextick-args%2Fdownload%2Fprocess-nextick-args-2.0.1.tgz", + "integrity": "sha1-eCDZsWEgzFXKmud5JoCufbptf+I=", + "dev": true + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/promise-inflight/download/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/prr/download/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npm.taobao.org/public-encrypt/download/public-encrypt-4.0.3.tgz", + "integrity": "sha1-T8ydd6B+SLp1J+fL4N4z0HATMeA=", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/pump/download/pump-3.0.0.tgz", + "integrity": "sha1-tKIRaBW94vTh6mAjVOjHVWUQemQ=", + "dev": true, + "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=", + "dev": true, + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/pump/download/pump-2.0.1.tgz", + "integrity": "sha1-Ejma3W5M91Jtlzy8i1zi4pCLOQk=", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/punycode/download/punycode-2.1.1.tgz", + "integrity": "sha1-tYsBCsQMIsVldhbI0sLALHv0eew=", + "dev": true + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npm.taobao.org/querystring/download/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npm.taobao.org/querystring-es3/download/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/randombytes/download/randombytes-2.1.0.tgz", + "integrity": "sha1-32+ENy8CcNxlzfYpE0mrekc9Tyo=", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npm.taobao.org/randomfill/download/randomfill-1.0.4.tgz", + "integrity": "sha1-ySGW/IarQr6YPxvzF3giSTHWFFg=", + "dev": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npm.taobao.org/readable-stream/download/readable-stream-2.3.7.tgz?cache=0&sync_timestamp=1579280462569&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Freadable-stream%2Fdownload%2Freadable-stream-2.3.7.tgz", + "integrity": "sha1-Hsoc9xGu+BTAT2IlKjamL2yyO1c=", + "dev": true, + "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?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Freaddirp%2Fdownload%2Freaddirp-2.2.1.tgz", + "integrity": "sha1-DodiKjMlqjPokihcr4tOhGUppSU=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "rechoir": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.0.tgz", + "integrity": "sha512-ADsDEH2bvbjltXEP+hTIAmeFekTFK0V2BTxMkok6qILyAJEXV0AFfoWcAq4yfll5VdIMd/RVXq0lR+wQi5ZU3Q==", + "dev": true, + "requires": { + "resolve": "^1.9.0" + } + }, + "regenerate": { + "version": "1.4.0", + "resolved": "https://registry.npm.taobao.org/regenerate/download/regenerate-1.4.0.tgz", + "integrity": "sha1-SoVuxLVuQHfFV1icroXnpMiGmhE=", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "8.1.0", + "resolved": "https://registry.npm.taobao.org/regenerate-unicode-properties/download/regenerate-unicode-properties-8.1.0.tgz", + "integrity": "sha1-71Hg8OpK1CS3e/fLQfPgFccKPw4=", + "dev": true, + "requires": { + "regenerate": "^1.4.0" + } + }, + "regenerator-transform": { + "version": "0.14.1", + "resolved": "https://registry.npm.taobao.org/regenerator-transform/download/regenerator-transform-0.14.1.tgz", + "integrity": "sha1-Oy/OThq3cywI9mXf2zFHScfd0vs=", + "dev": true, + "requires": { + "private": "^0.1.6" + } + }, + "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=", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regexpu-core": { + "version": "4.6.0", + "resolved": "https://registry.npm.taobao.org/regexpu-core/download/regexpu-core-4.6.0.tgz", + "integrity": "sha1-IDfBizJ8/Oim/qKk7EQfJDKvuLY=", + "dev": true, + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.1.0", + "regjsgen": "^0.5.0", + "regjsparser": "^0.6.0", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.1.0" + } + }, + "regjsgen": { + "version": "0.5.1", + "resolved": "https://registry.npm.taobao.org/regjsgen/download/regjsgen-0.5.1.tgz", + "integrity": "sha1-SPC/Gl6iBRlpKcDZeYtC0e2YRDw=", + "dev": true + }, + "regjsparser": { + "version": "0.6.2", + "resolved": "https://registry.npm.taobao.org/regjsparser/download/regjsparser-0.6.2.tgz", + "integrity": "sha1-/WLHU5kUZ9nR/+Cp9n8npSkCS5Y=", + "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", + "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=", + "dev": true + }, + "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=", + "dev": true + }, + "renderkid": { + "version": "2.0.3", + "resolved": "https://registry.npm.taobao.org/renderkid/download/renderkid-2.0.3.tgz", + "integrity": "sha1-OAF5wv9a4TZcUivy/Pz/AcW3QUk=", + "dev": true, + "requires": { + "css-select": "^1.1.0", + "dom-converter": "^0.2", + "htmlparser2": "^3.3.0", + "strip-ansi": "^3.0.0", + "utila": "^0.4.0" + } + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npm.taobao.org/repeat-element/download/repeat-element-1.1.3.tgz", + "integrity": "sha1-eC4NglwMWjuzlzH4Tv7mt0Lmsc4=", + "dev": true + }, + "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=", + "dev": true + }, + "resolve": { + "version": "1.15.0", + "resolved": "https://registry.npm.taobao.org/resolve/download/resolve-1.15.0.tgz", + "integrity": "sha1-G3ypYHPrtS50H/15n2s56kYsZ/U=", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "requires": { + "resolve-from": "^5.0.0" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + }, + "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=", + "dev": true + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npm.taobao.org/ret/download/ret-0.1.15.tgz", + "integrity": "sha1-uKSCXVvbH8P29Twrwz+BOIaBx7w=", + "dev": true + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npm.taobao.org/rimraf/download/rimraf-2.7.1.tgz", + "integrity": "sha1-NXl/E6f9rcVmFCwp1PB8ytSD4+w=", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npm.taobao.org/ripemd160/download/ripemd160-2.0.2.tgz", + "integrity": "sha1-ocGm9iR1FXe6XQeRTLyShQWFiQw=", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npm.taobao.org/run-queue/download/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dev": true, + "requires": { + "aproba": "^1.1.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.1.2.tgz", + "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/safe-regex/download/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/schema-utils/download/schema-utils-1.0.0.tgz", + "integrity": "sha1-C3mpMgTXtgDUsoUNH2bCo0lRx3A=", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npm.taobao.org/semver/download/semver-5.7.1.tgz", + "integrity": "sha1-qVT5Ma66UI0we78Gnv8MAclhFvc=", + "dev": true + }, + "serialize-javascript": { + "version": "2.1.2", + "resolved": "https://registry.npm.taobao.org/serialize-javascript/download/serialize-javascript-2.1.2.tgz?cache=0&sync_timestamp=1575884487988&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fserialize-javascript%2Fdownload%2Fserialize-javascript-2.1.2.tgz", + "integrity": "sha1-7OxTsOAxe9yV73arcHS3OEeF+mE=", + "dev": true + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/set-value/download/set-value-2.0.1.tgz?cache=0&sync_timestamp=1561411160313&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fset-value%2Fdownload%2Fset-value-2.0.1.tgz", + "integrity": "sha1-oY1AUw5vB95CKMfe/kInr4ytAFs=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npm.taobao.org/setimmediate/download/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npm.taobao.org/sha.js/download/sha.js-2.4.11.tgz", + "integrity": "sha1-N6XPC4HsvGlD3hCbopYNGyZYSuc=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npm.taobao.org/snapdragon/download/snapdragon-0.8.2.tgz", + "integrity": "sha1-ZJIufFZbDhQgS6GqfWlkJ40lGC0=", + "dev": true, + "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", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "dev": true, + "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=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/snapdragon-node/download/snapdragon-node-2.1.1.tgz", + "integrity": "sha1-bBdfhv8UvbByRWPo88GwIaKGhTs=", + "dev": true, + "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=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "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=", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "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=", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz", + "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "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=", + "dev": true, + "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?cache=0&sync_timestamp=1579194500634&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fkind-of%2Fdownload%2Fkind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/source-list-map/download/source-list-map-2.0.1.tgz", + "integrity": "sha1-OZO9hzv8SEecyp6jpUeDXHwVSzQ=", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "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=", + "dev": true, + "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.16", + "resolved": "https://registry.npm.taobao.org/source-map-support/download/source-map-support-0.5.16.tgz?cache=0&sync_timestamp=1572390697943&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsource-map-support%2Fdownload%2Fsource-map-support-0.5.16.tgz", + "integrity": "sha1-CuBp5/47p1OMZMmFFeNTOerFoEI=", + "dev": true, + "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=", + "dev": true + } + } + }, + "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=", + "dev": true + }, + "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=", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "ssri": { + "version": "6.0.1", + "resolved": "https://registry.npm.taobao.org/ssri/download/ssri-6.0.1.tgz?cache=0&sync_timestamp=1571962511410&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fssri%2Fdownload%2Fssri-6.0.1.tgz", + "integrity": "sha1-KjxBso3UW2K2Nnbst0ABJlrp7dg=", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "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=", + "dev": true, + "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=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npm.taobao.org/stream-browserify/download/stream-browserify-2.0.2.tgz", + "integrity": "sha1-h1IdOKRKp+6RzhzSpH3wy0ndZgs=", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npm.taobao.org/stream-each/download/stream-each-1.2.3.tgz", + "integrity": "sha1-6+J6DDibBPvMIzZClS4Qcxr6m64=", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npm.taobao.org/stream-http/download/stream-http-2.8.3.tgz", + "integrity": "sha1-stJCRpKIpaJ+xP6JM6z2I95lFPw=", + "dev": true, + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "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=1576147296553&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstream-shift%2Fdownload%2Fstream-shift-1.0.1.tgz", + "integrity": "sha1-1wiCgVWasneEJCebCHfaPDktWj0=", + "dev": true + }, + "string.prototype.trimleft": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/string.prototype.trimleft/download/string.prototype.trimleft-2.1.1.tgz", + "integrity": "sha1-m9uKxqvW1gKxek7TIYcNL43O/HQ=", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string.prototype.trimright": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/string.prototype.trimright/download/string.prototype.trimright-2.1.1.tgz", + "integrity": "sha1-RAMUsVmWyGbOigNBiU1FGGIAxdk=", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/string_decoder/download/string_decoder-1.1.1.tgz", + "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-3.0.1.tgz?cache=0&sync_timestamp=1573280518303&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-5.5.0.tgz", + "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npm.taobao.org/tapable/download/tapable-1.1.3.tgz?cache=0&sync_timestamp=1576855891808&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftapable%2Fdownload%2Ftapable-1.1.3.tgz", + "integrity": "sha1-ofzMBrWNth/XpF2i2kT186Pme6I=", + "dev": true + }, + "tar": { + "version": "4.4.19", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.19.tgz", + "integrity": "sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==", + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.1.4", + "fs-minipass": "^1.2.7", + "minipass": "^2.9.0", + "minizlib": "^1.3.3", + "mkdirp": "^0.5.5", + "safe-buffer": "^5.2.1", + "yallist": "^3.1.1" + }, + "dependencies": { + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true, + "optional": true + }, + "minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true, + "optional": true + }, + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "optional": true, + "requires": { + "minimist": "^1.2.6" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "optional": true + } + } + }, + "terser": { + "version": "4.6.3", + "resolved": "https://registry.npm.taobao.org/terser/download/terser-4.6.3.tgz", + "integrity": "sha1-4zqkJGHO1SONNS0t8qZ/IZIfjYc=", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "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=", + "dev": true + } + } + }, + "terser-webpack-plugin": { + "version": "1.4.3", + "resolved": "https://registry.npm.taobao.org/terser-webpack-plugin/download/terser-webpack-plugin-1.4.3.tgz", + "integrity": "sha1-Xsry29xfuZdF/QZ5H0b8ndscmnw=", + "dev": true, + "requires": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^2.1.2", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.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=", + "dev": true + } + } + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npm.taobao.org/through2/download/through2-2.0.5.tgz", + "integrity": "sha1-AcHjnrMdB8t9A6lqcIIyYLIxMs0=", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "timers-browserify": { + "version": "2.0.11", + "resolved": "https://registry.npm.taobao.org/timers-browserify/download/timers-browserify-2.0.11.tgz", + "integrity": "sha1-gAsfPu4nLlvFPuRloE0OgEwxIR8=", + "dev": true, + "requires": { + "setimmediate": "^1.0.4" + } + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/to-arraybuffer/download/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "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=", + "dev": true, + "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?cache=0&sync_timestamp=1579194500634&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fkind-of%2Fdownload%2Fkind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "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=", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "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=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "toposort": { + "version": "1.0.7", + "resolved": "https://registry.npm.taobao.org/toposort/download/toposort-1.0.7.tgz", + "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=", + "dev": true + }, + "tslib": { + "version": "1.10.0", + "resolved": "https://registry.npm.taobao.org/tslib/download/tslib-1.10.0.tgz", + "integrity": "sha1-w8GflZc/sKYpc/sJ2Q2WHuQ+XIo=", + "dev": true + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npm.taobao.org/tty-browserify/download/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npm.taobao.org/typedarray/download/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "uglify-js": { + "version": "3.4.10", + "resolved": "https://registry.npm.taobao.org/uglify-js/download/uglify-js-3.4.10.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fuglify-js%2Fdownload%2Fuglify-js-3.4.10.tgz", + "integrity": "sha1-mtlWPY6zrN+404WX0q8dgV9qdV8=", + "dev": true, + "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", + "integrity": "sha1-9hmKqE5bg8RgVLlN3tv+1e6f8So=", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "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.1.0", + "resolved": "https://registry.npm.taobao.org/unicode-match-property-value-ecmascript/download/unicode-match-property-value-ecmascript-1.1.0.tgz", + "integrity": "sha1-W0tCbgjROoA2Xg1lesemwexGonc=", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "1.0.5", + "resolved": "https://registry.npm.taobao.org/unicode-property-aliases-ecmascript/download/unicode-property-aliases-ecmascript-1.0.5.tgz", + "integrity": "sha1-qcxsx85joKMCP8meNBuUQx1AWlc=", + "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=", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/unique-filename/download/unique-filename-1.1.1.tgz", + "integrity": "sha1-HWl2k2mtoFgxA6HmrodoG1ZXMjA=", + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npm.taobao.org/unique-slug/download/unique-slug-2.0.2.tgz", + "integrity": "sha1-uqvOkQg/xk6UWw861hPiZPfNTmw=", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "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=", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true + } + } + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/upath/download/upath-1.2.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fupath%2Fdownload%2Fupath-1.2.0.tgz", + "integrity": "sha1-j2bbzVWog6za5ECK+LA1pQRMGJQ=", + "dev": true + }, + "upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npm.taobao.org/upper-case/download/upper-case-1.1.3.tgz", + "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", + "dev": true + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npm.taobao.org/uri-js/download/uri-js-4.2.2.tgz", + "integrity": "sha1-lMVA4f93KVbiKZUHwBCupsiDjrA=", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npm.taobao.org/urix/download/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npm.taobao.org/url/download/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npm.taobao.org/punycode/download/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npm.taobao.org/use/download/use-3.1.1.tgz", + "integrity": "sha1-1QyMrHmhn7wg8pEfVuuXP04QBw8=", + "dev": true + }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npm.taobao.org/util/download/util-0.11.1.tgz", + "integrity": "sha1-MjZzNyDsZLsn9uJvQhqqLhtYjWE=", + "dev": true, + "requires": { + "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npm.taobao.org/inherits/download/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/util-deprecate/download/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/util.promisify/download/util.promisify-1.0.0.tgz?cache=0&sync_timestamp=1579206994703&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Futil.promisify%2Fdownload%2Futil.promisify-1.0.0.tgz", + "integrity": "sha1-RA9xZaRZyaFtwUXrjnLzVocJcDA=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "utila": { + "version": "0.4.0", + "resolved": "https://registry.npm.taobao.org/utila/download/utila-0.4.0.tgz", + "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", + "dev": true + }, + "v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/vm-browserify/download/vm-browserify-1.1.2.tgz", + "integrity": "sha1-eGQcSIuObKkadfUR56OzKobl3aA=", + "dev": true + }, + "watchpack": { + "version": "1.6.0", + "resolved": "https://registry.npm.taobao.org/watchpack/download/watchpack-1.6.0.tgz", + "integrity": "sha1-S8EsLr6KonenHx0/FNaFx7RGzQA=", + "dev": true, + "requires": { + "chokidar": "^2.0.2", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + } + }, + "webpack": { + "version": "4.41.5", + "resolved": "https://registry.npm.taobao.org/webpack/download/webpack-4.41.5.tgz", + "integrity": "sha1-MhDxiGvOUxDmK7lyBNGMJjNBt3w=", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/wasm-edit": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "acorn": "^6.2.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.1.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.1", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.6.0", + "webpack-sources": "^1.4.1" + } + }, + "webpack-cli": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.7.0.tgz", + "integrity": "sha512-7bKr9182/sGfjFm+xdZSwgQuFjgEcy0iCTIBxRUeteJ2Kr8/Wz0qNJX+jw60LU36jApt4nmMkep6+W5AKhok6g==", + "dev": true, + "requires": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^1.0.3", + "@webpack-cli/info": "^1.2.4", + "@webpack-cli/serve": "^1.4.0", + "colorette": "^1.2.1", + "commander": "^7.0.0", + "execa": "^5.0.0", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^2.2.0", + "rechoir": "^0.7.0", + "v8-compile-cache": "^2.2.0", + "webpack-merge": "^5.7.3" + }, + "dependencies": { + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true + } + } + }, + "webpack-merge": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.7.3.tgz", + "integrity": "sha512-6/JUQv0ELQ1igjGDzHkXbVDRxkfA57Zw7PfiupdLFJYrgFqY5ZP8xxbpp2lU3EPwYx89ht5Z/aDkD40hFCm5AA==", + "dev": true, + "requires": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + } + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npm.taobao.org/webpack-sources/download/webpack-sources-1.4.3.tgz", + "integrity": "sha1-7t2OwLko+/HL/plOItLYkPMwqTM=", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + }, + "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=", + "dev": true + } + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "wildcard": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", + "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", + "dev": true + }, + "worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npm.taobao.org/worker-farm/download/worker-farm-1.7.0.tgz", + "integrity": "sha1-JqlMU5G7ypJhUgAvabhKS/dy5ag=", + "dev": true, + "requires": { + "errno": "~0.1.7" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/wrappy/download/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npm.taobao.org/xtend/download/xtend-4.0.2.tgz", + "integrity": "sha1-u3J3n1+kZRhrH0OPZ0+jR/2121Q=", + "dev": true + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/y18n/download/y18n-4.0.0.tgz", + "integrity": "sha1-le+U+F7MgdAHwmThkKEg8KPIVms=", + "dev": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npm.taobao.org/yallist/download/yallist-3.1.1.tgz", + "integrity": "sha1-27fa+b/YusmrRev2ArjLrQ1dCP0=", + "dev": true + } + } +} diff --git a/ES6-10/webpack-test/package.json b/ES6-10/webpack-test/package.json new file mode 100644 index 0000000..5cc0e25 --- /dev/null +++ b/ES6-10/webpack-test/package.json @@ -0,0 +1,19 @@ +{ + "name": "webpack-test", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "ISC", + "devDependencies": { + "@babel/core": "^7.8.3", + "@babel/preset-env": "^7.8.3", + "babel-loader": "^8.0.6", + "html-webpack-plugin": "^3.2.0", + "webpack": "^4.41.5", + "webpack-cli": "^4.7.0" + } +} diff --git a/ES6-10/webpack-test/webpack.config.js b/ES6-10/webpack-test/webpack.config.js new file mode 100644 index 0000000..4a29842 --- /dev/null +++ b/ES6-10/webpack-test/webpack.config.js @@ -0,0 +1,27 @@ +const path = require('path'); +const HtmlWebpackPlugin = require('html-webpack-plugin') + +module.exports = { + entry: './index.js', + output: { + path: path.resolve(__dirname, 'dist'), + filename: './index.min.js' + }, + mode: 'development', + // mode: 'production', + module: { + rules: [{ + test: /\.m?js$/, + exclude: /(node_modules|bower_components)/, + use: { + loader: 'babel-loader', + options: { + presets: ['@babel/preset-env'] + } + } + }] + }, + plugins: [ + new HtmlWebpackPlugin() + ] +}; \ No newline at end of file diff --git "a/HTML\345\211\215\347\253\257\345\267\245\347\250\213\345\270\210\351\235\242\350\257\225\345\277\205\345\244\207\346\212\200\345\267\247.assets/image-20210527214757978.png" "b/HTML\345\211\215\347\253\257\345\267\245\347\250\213\345\270\210\351\235\242\350\257\225\345\277\205\345\244\207\346\212\200\345\267\247.assets/image-20210527214757978.png" new file mode 100644 index 0000000..c26b420 Binary files /dev/null and "b/HTML\345\211\215\347\253\257\345\267\245\347\250\213\345\270\210\351\235\242\350\257\225\345\277\205\345\244\207\346\212\200\345\267\247.assets/image-20210527214757978.png" differ diff --git "a/HTML\345\211\215\347\253\257\345\267\245\347\250\213\345\270\210\351\235\242\350\257\225\345\277\205\345\244\207\346\212\200\345\267\247.assets/image-20210528162727704.png" "b/HTML\345\211\215\347\253\257\345\267\245\347\250\213\345\270\210\351\235\242\350\257\225\345\277\205\345\244\207\346\212\200\345\267\247.assets/image-20210528162727704.png" new file mode 100644 index 0000000..ead887f Binary files /dev/null and "b/HTML\345\211\215\347\253\257\345\267\245\347\250\213\345\270\210\351\235\242\350\257\225\345\277\205\345\244\207\346\212\200\345\267\247.assets/image-20210528162727704.png" differ diff --git "a/HTML\345\211\215\347\253\257\345\267\245\347\250\213\345\270\210\351\235\242\350\257\225\345\277\205\345\244\207\346\212\200\345\267\247.assets/image-20210529212303649.png" "b/HTML\345\211\215\347\253\257\345\267\245\347\250\213\345\270\210\351\235\242\350\257\225\345\277\205\345\244\207\346\212\200\345\267\247.assets/image-20210529212303649.png" new file mode 100644 index 0000000..e8b0f69 Binary files /dev/null and "b/HTML\345\211\215\347\253\257\345\267\245\347\250\213\345\270\210\351\235\242\350\257\225\345\277\205\345\244\207\346\212\200\345\267\247.assets/image-20210529212303649.png" differ diff --git "a/HTML\345\211\215\347\253\257\345\267\245\347\250\213\345\270\210\351\235\242\350\257\225\345\277\205\345\244\207\346\212\200\345\267\247.md" "b/HTML\345\211\215\347\253\257\345\267\245\347\250\213\345\270\210\351\235\242\350\257\225\345\277\205\345\244\207\346\212\200\345\267\247.md" new file mode 100644 index 0000000..b97803d --- /dev/null +++ "b/HTML\345\211\215\347\253\257\345\267\245\347\250\213\345\270\210\351\235\242\350\257\225\345\277\205\345\244\207\346\212\200\345\267\247.md" @@ -0,0 +1,304 @@ +# 第1章 课程介绍 + +> 讲师:快乐动起来呀 +> +> 很多同学对面试不够了解,不知道如何准备,对面试环节的设置以及目的不够了解,因此成功率不高。通常情况下校招生面试的成功率低于1%,而社招的面试成功率也低于5%,所以对于候选人一定要知道设立面试的初衷以及每个环节的意义,有的放矢... + +## 1-1 前端面试-课程导学 + +1. 面试那些事 + 1. JD描述怎么看 + 2. 简历怎么写 + 3. 知识怎么复习 + 4. 问题怎么回答 + 5. 项目怎么准备 + 6. 和负责人怎么沟通 + 7. HR印象怎么留 +2. **面试准备** + 1. JD描述分析 + 2. 业务分析 + 3. 技术栈准备 + 4. 自我介绍 +3. **模拟一面** + 1. 面试技巧、页面布局类 + 2. CSS盒模型、DOM事件类 + 3. HTTP协议类、原型链类 + 4. 面向对象类、通信类 + 5. 前端安全类、前端算法类 +4. **模拟二面** + 1. 面试技巧 + 2. 渲染机制类 + 3. JS运行机制 + 4. 页面性能 + 5. 错误监控 +5. **模拟三面** + 1. 面试技巧 + 2. 业务能力 + 3. 团队协作能力 + 4. 带人能力 +6. **模拟终面** + 1. 面试技巧 + 2. 职业竞争力 + 3. 职业规划 +7. **课程总结** + 1. 注意事项 + 2. 复习指南 +8. 授课方式 + 1. 明确面试技巧 + 2. 模拟题目,由浅入深 + 3. 代码实战+学习指南 +9. 适用对象 + 1. 有前端基础 + - 对 HTML、CSS、 JavaScript知识都掌握至少提到一些概念是了解的 + 2. 端正的求职心态 + - 技术过关+面试技巧=面试成功不能只靠技巧而自身不够努力 + 3. 不浮躁的求知心境 + - 这门课中涉及到的一些难点需要有耐心的学习吸收心浮气躁者不宜学习 + 4. 不求押题的初衷 + - 这门课努力覆盖较全的面试知识点但不是押题我们追求技术原理弄懂弄会 + +# 第2章 面试准备 + +> 通过现场分析互联网的JD,让学员掌握分析公司对技术的要求和定位,进而知道自己是否适合该岗位以及应该如何准备。想提高面试成功率一定要了解公司的业务,去分析公司对应业务的站点了解他们使用的技术栈,进而去准备相关的知识,最后一小节关于自我介绍,大多数面试失败都是简历和自我介绍导致的,只是大多数人并不自知。... + +## 2-1 面试及环节设置 + +1. 如何看待面试 + 1. 什么是面试? + - 答:面试是测查和评价人员能力素质的一种考试活动。 + - 具体地说,面试是一种经过组织者**精心设计**,在特定场景下,以考官对考生的面对面交谈与观察为主要手段,由表及里测评考生的**知识、能力经验**等有关素质的一种考试活动。 +2. 面试环节设置 + 1. 一面:基础 + 2. 二三面:技术负责人 + 3. 三四面:业务负责人 + 4. 终面:hr,沟通能力,职业规划 + +## 2-2 职位分析(JD) + +![image-20210527214757978](HTML前端工程师面试必备技巧.assets/image-20210527214757978.png) + +- **职位描述解析**:做什么 + 1. 至少负责两项内容,PC端和移动端 + 2. App H5:hybrid app(混合app)、纯H5开发,native app(原生app) + 3. 沟通能力,数据模拟mock + 4. **难度设立**:基本功扎实,前端组件库经验,读其它UI组件库源码 + 5. 优化和重构,看重经验 +- **任职要求**:会什么 + 1. 工作经验:非强制要求。HTML5:对答如流,学习新知识。 + 2. JavaScript类库、对象 + 3. 最新的Web标准。数据分离:MVVM框架。HTML语义化。MVC框架:vue、react 和实际经验,遇到过的问题。 + 4. 前端架构分析设计:高级职位,把做过的项目重新分析架构。易读、易维护、高质量、高效率:易读易维护即可。 + 5. 用户可用性、体验、研究:重视用户体验。 + 6. 前端技术有强烈兴趣:看一些社区热门项目使用的技术,非重点准备内容。 + 7. Sass、less基本使用。 + 8. 搭建环境:基本技能,grunt、gulp。了解不同技术区别。 + 9. 后端经验:非重点,职位没要求有Node.js需求。 +- 总结:着重职位要求准备技能。东西很杂,不用全准备。 + + + +**2-3 职位分析(JD)(二)** + +![image-20210528162727704](HTML前端工程师面试必备技巧.assets/image-20210528162727704.png) + +- 职位描述: + 1. 系统化设计:模块化设计,前后端分离。 + 2. HTML5、canvas、CSS3、JS:动画(DOM动画,svg动画,canvas:2D、3D) + 3. 微信小程序、微信支付。 + 4. 前端框架开发与维护:现有框架。 +- 岗位要求: + 1. 精通各种技术、工作经验:不用较真。 + 2. 理解Web标准:ES6,网站性能。 + 3. 前端工程化工具:webpack、grunt、sass。 + 4. 代码风格良好。 + 5. 后端经验:熟悉Node.js 或 python。 + 6. 善于沟通,逻辑清晰。 + + + +## 2-4 业务分析或实战模拟 + +- 分析京东金融Web页面:http://jr.jd.com + - 导航栏组件、UI组件 + - 左中右布局 + - CSS3动画 +- F12 调试工具分析网页 + - Sources + - webpack:Vue + - Elements + - head:双核运行优先webkit renderer。DNS预解析:dns-perfetch。 + - Application + - Local Storage:数据类型 + - Fonts:自定义字体 + +**2-5 业务分析或实战模拟(二)** + +- 分析艺龙Web页面:http://elong.com + - 微信小程序 + - 网页端不更新 + +## 2-6 面试准备-技术栈准备 + +- JS相关 + 1. JQuery + 2. VUE + 3. REACT + 4. Angular + 5. Node.js +- 开发环境 + 1. Sass + 2. less + 3. gulp + 4. grunt + 5. npm + 6. browserify + 7. Webpack + +## 2-7 面试准备-自我陈述 + +- 简历 + - 基本信息,姓名-年龄-手机-邮箱-籍贯 + - 学历,博士》硕士》本科》大专 + - 工作经历,时间公司岗位职责技术栈业绩 + - 开源项目, Github和说明 +- 自我陈述 + - 把握面试的沟通方向 + - 豁达、自信的适度发挥 + + + +**2-8 面试准备-自我陈述(二)** + +- 实例 + - 自如谈兴趣、巧妙示实例、适时讨疑问(求知欲) + - 节奏要适宜、切忌小聪明 +- 实战 + - 方向要对,过程要细 + - 胆子要大、心态要和 + + + +# 第3章 一面/二面 + +描述在一面/二面要掌握什么技巧,根据前端的知识点划分并分别出一至两道面试题,根据真实面试的发问方式进行考察,并给出对应知识点的讲解、代码演示以及注意事项。 + +## 3-1 页面布局 + +- 面试技巧 + + 1. 准备要充分 + 2. 知识要系统 + 3. 沟通要简洁 + 4. 内心要诚实 + 5. 态度要谦虚 + 6. 回答要灵活 + +- 题目: + + - 假设高度已知,请写出三栏布局,其中左栏、右栏宽度各为300pX,中间自适应 + + ![image-20210529212303649](HTML前端工程师面试必备技巧.assets/image-20210529212303649.png) + +- + + + +3-2 页面布局(二) + + + +## 3-3 页面布局(总结) + + + +## 3-4 CSS盒模型 + + + +3-5 CSS盒模型(二) + + + +## 3-6 DOM事件 + + + +3-7 DOM事件(二) + + + +## 3-8 类型转换 + + + +## 3-9 HTTP协议类 + + + +## 3-10 原型链 + + + +3-11 原型链(二) + + + +## 3-12 面向对象 + + + +3-13 面向对象(二) + + + +## 3-14 通信类 + + + +## 3-15 安全类 + + + +## 3-16 算法类 + + + +# 第4章 二面/三面 + +二面/三面更侧重于对前端知识的深度和广度来进行考察,这个环节不再局限于基础知识,更多的是考察浏览器、JS引擎、项目实战等方面。本环节通过几大类题目帮大家梳理面试频率较高的重点和难点。 + 4-1 渲染机制 + 4-2 js运行机制 + 4-3 页面性能 + 4-4 错误监控 + 4-5 mvvm框架(双向绑定) + 4-6 mvvm框架(设计模式) + 4-7 mvvm框架(生命周期) + 4-8 mvvm框架(源码分析) + +# 第5章 三面/四面 + +描述在三面/四面要掌握什么技巧,在这个环节对工作2-3年的人特别重要,这个环节的面试官一般是技术负责人或者业务负责人,他们对候选人的考察不再局限于技术,更侧重综合能力。 + 5-1 业务能力 + 5-2 团队协作能力与带人能力 + +# 第6章 课程终面 + +这个环节同样不可忽视,情商、性格、潜力、薪资匹配度都可能成为候选人失败的“主观因素”。如何掌握面试技巧顺利拿到offer,站好最后一班岗吧 + 6-1 终面(1)-职业竞争力 + 6-2 终面(2)-职业规划 + 6-3 终面(3) + 6-4 终面(4) + 6-5 终面(5) + +# 第7章 2017真题解析 + +2017年各大公司笔试真题典型解析,从题干到答案,从思路到方法,层层递进,逐步揭示答题的技巧,让你在笔试中脱颖而出。 + 7-1 九宫格 + 7-2 一道函数考察基本功 + 7-3 阿里笔试题 + 7-4 flat函数设计 + +# 第8章 课程总结 + +课程会涉及很多由点到面的知识点,对课程的学习还远远不够,学习、理解、吸收还需要自身的努力才能发挥更佳的效果,大家加油。 + 8-1 面试总结 \ No newline at end of file diff --git a/JavaScriptES6-10_notes/JavaScriptES6-10.assets/4194814978-5d11dad0ea8bf_articlex.png b/JavaScriptES6-10.assets/4194814978-5d11dad0ea8bf_articlex.png similarity index 100% rename from JavaScriptES6-10_notes/JavaScriptES6-10.assets/4194814978-5d11dad0ea8bf_articlex.png rename to JavaScriptES6-10.assets/4194814978-5d11dad0ea8bf_articlex.png diff --git a/JavaScriptES6-10_notes/JavaScriptES6-10.assets/97a52475c433362e41ffb7cf6e9bd775-1580129648099.png b/JavaScriptES6-10.assets/97a52475c433362e41ffb7cf6e9bd775-1580129648099.png similarity index 100% rename from JavaScriptES6-10_notes/JavaScriptES6-10.assets/97a52475c433362e41ffb7cf6e9bd775-1580129648099.png rename to JavaScriptES6-10.assets/97a52475c433362e41ffb7cf6e9bd775-1580129648099.png diff --git a/JavaScriptES6-10_notes/JavaScriptES6-10.assets/t81ye74b8w.png b/JavaScriptES6-10.assets/t81ye74b8w.png similarity index 100% rename from JavaScriptES6-10_notes/JavaScriptES6-10.assets/t81ye74b8w.png rename to JavaScriptES6-10.assets/t81ye74b8w.png diff --git a/JavaScriptES6-10_notes/JavaScriptES6-10.md b/JavaScriptES6-10.md similarity index 94% rename from JavaScriptES6-10_notes/JavaScriptES6-10.md rename to JavaScriptES6-10.md index abb1f10..07b0b87 100644 --- a/JavaScriptES6-10_notes/JavaScriptES6-10.md +++ b/JavaScriptES6-10.md @@ -1,4203 +1,4232 @@ -〖课程介绍〗: - 应对更复杂的场景,提升自己的技术实力,优化臃肿的代码,都需要对打牢语法基础。本课涉及JavaScript ES6到10的语法教学,内容全面丰富,熟练掌握语法,很多依赖第三方库才能做到的事用原生JS寥寥几行代码就可迎刃而解。 - -〖课程目录〗: - -# 第1章 课程介绍与环境搭建 - - JS作为前端的立身之本,让大家了解学习这门课的必要性。考虑到很多同学刚刚接触前端或者对工程化方法不太了解,为了快速进入到学习状态,我们提供了极其简单的方式帮大家准备好学习环境。 - -## 1-1 课程导学 试看 - -### 怎么学? - -1. 一天后:体验乐趣 -2. 十天后:进入状态 -3. 一个月后:养成习惯 -4. 三个月后:收获知识 -5. 五个月后:形成思维习惯 - -### 课程内容 - -1. 快速搭建开发环境 -2. 学习语法 -3. 推荐阅读材料 -4. 练习题 -5. Vue 框架内实战 -6. 学习开发环境如何构建 - -### 适用人群 - -1. 拥有 JavaScript ES3 以上基础 -2. 会编程,有编程思维 -3. 有耐心 -4. 求上进 - -1-2 电子书位置 - -## 1-3 环境准备 - -### 环境准备 - -- 原理 - 1. ES6-10 :原生代码 - 2. Babel→Webpack :构建转换 - 3. ES5 :浏览器可以识别的代码 - -- 开发环境 - - Chrome和Node环境 - - 自动刷新 自动编译 - - 格式化编写代码 - -## 1-4 Node 安装 - -- Node 安装:-v 12.2.0 - - npm - - npx - -## 1-5 初始化项目 - -### 初始化项目 - -``` -npx es10-cli create projectName // 创建模板文件命令 -``` - -启动项目 - -``` -cd projectName -npm install -npm start -touch static/lesson2-1.js // 新建文件命令 -``` - -## 1-6 编辑器配置 - -VS code 插件 beautify 和 ESLint - -# 第2章 ES6基础知识 - - ES6语法相对于ES5有了非常大的改变,让原生 JavaScript 能力再上一个台阶,这个章节会分门别类进行讲述,单纯讲语法既乏味也不利于记忆更不知道如何运用,我们以应用场景开场分别给出ES5和ES6两种不同的解决方案,循序渐进剖析语法... - -## Let & Const - -### 2-1 作用域(1) - -1. var 声明的全局变量相当于 window 的属性,但无法删除,属性可以删除 -2. 没有var 定义的变量是作为 window 的属性定义的,是全局属性 -3. 在函数内部没有 var 定义的变量是window 的属性,是全局属性 - -### 2-2 作用域(2) - -- 函数作用域 = 局部作用域 -- var 定义的变量会变量提升 -- let 定义的变量具有块状作用域 - -#### this 与 动态作用域 的关系 - -- this 具有动态指向 - -#### 四种作用域 - -1. 全局作用域 -2. 函数作用域 -3. 块状作用域 ,配合 let 和 const 使用 -4. 动态作用域 - -### 2-3 什么是作用域 - -几乎所有编程语言就是在变量中储存值,并且能够读取和修改这些值。事实上在变量中储存和取出值得能力,给程序赋予了状态。 - -如果没有这样的概念,一个程序虽然可以执行一些任务,但是它们将会受到极大的限制而且不会非常有趣。 - -但是这些变量该储存在哪?又如何读取?为了完成这个目标需要制定一些规则,规则就是:作用域。 - -- #### 四种常见作用域类型: - - | 对象 | 类型 | - | -------- | ------------------------ | - | global | 全局作用域 | - | function | 函数作用域(局部作用域) | - | {} | 块状作用域 | - | this | 动态作用域 | - -- > 如果一个变量 或者其它表达式不在“当前得作用域”,那么JavaScript机制会继续沿着作用域链上查找直到找到全局作用域,通常是指沿着链式得作用域查找,而不能从父作用域引用子作用域中的变量和引用 - -### 2-4 let&const - -- let 声明的特点 - - 块状作用域 - - 不能用用全局变量的属性访问 - - 不能重复定义 - - 不会变量提升 -- const 声明的特点 - - **只能赋值一次** - - **初始化时一定要赋值** - - 块状作用域 - - 不能用用全局变量的属性访问 - - 不能重复定义 - - 不会变量提升 -- 阅读 - 1. 什么是作用域 - 2. JavaScript深入之词法作用域和动态作用域 - 3. 深入理解JS中声明提升、作用域(链)和 this 关键字 - -## 数组 - Array - -### 2-6 ES5中数组有多少种遍历的方法? - -他们有什么优势和缺点? - -1. for 循环 - -2. forEach :`arr.forEach(funciton (item) {console.log(item)})` - - > 不支持 `break` 和 `continue` - > - > return false 相当于 continue - > - > 隐式索引 - -3. every :`arr.every(funciton (item) {console.log(item)})` - - > 是否继续执行取决于函数返回值 true 、false - > - > 如果数组中检测到有一个元素不满足,则整个表达式返回 *false* ,且剩余的元素不会再进行检测。 - > - > 如果所有元素都满足条件,则返回 true。 - -4. some:依次执行数组的每个元素: - - > 如果有一个元素满足条件,则表达式返回*true* , 剩余的元素不会再执行检测。 - > - > 如果没有满足条件的元素,则返回false。 - -5. for in :`for ( let index in Object) {console.log(Object[index])}` - - > 为对象设计的,数组的属性和下标作为字符串遍历 - > - > 支持 continue 和 break - -### 2-7 ES6中数组有多少种遍历的方法? - -1. for of :`for (let item of arr) { console.log(item)}` - - > 不仅可以遍历数组和对象 - > - > 可以遍历自定义数据结构 - -2. map() - - > map() 方法返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值。 - > - > map() 方法按照原始数组元素顺序依次处理元素。 - > - > 这种方式也是用的比较广泛的,虽然用起来比较优雅,但实际效率还比不上foreach - -### 2-8 Array.from(如何将伪数组转换成数组?) - -#### ES5 - -```js -let args = [].slice.call(arguments) // collection -let imgs = [].slice.call(doncument.querySelectorAll('img')) // NodeList -``` - -#### ES6 - -- Array.from(arrayLike, mapFn, thisArg) - - > ES6 新增方法,专门转换伪数组到数组,也可用于生成数组 - -```js -Array.prototype.from // ES6 新增方法 -Array.from(arrayLike, mapFn, thisArg) // 语法 伪数组,函数返回值,this指向 -let args = Array.from(arguments) -``` - -#### 什么叫伪数组 - -1. 按照索引方式存储数据 -2. 具有 length 属性 - -```js -let array = Array.from({ length: 5}, function () { return 1}) -``` - - - -### 2-9 Array.of-fill(如何生成新数组?) - -ES6 新方法 - -- Array(5) :初始化长度为5的数组 -- new Array(1,2,3):初始化数组,同时生成数据 - -- Array.of(1,2,3):初始化数组,同时生成数据 -- Array.fill(value,start,end):填充数据 - -```js -// Array.prototype.of -let array = Array.of(1,4,5,2,67) - -// Array.prototype.fill -let array = Array(10).fill(1) - -Array.fill(value,start,end) // 语法 填充值,起始位,截止值。 默认填充所有元素 -console.log(array.fill(9, 5, 8)) -``` - - - -### 2-10 Find&FindIndex(如何查找数组?) - -- array.filter(fn):ES5,返回符合fn 条件的所有值,没有则为空 - -- Array.find(fn):ES6,查找数组中符合fn 条件的第一个值,并返回,没有则为 undefined -- Array.findIndex():ES6,返回位置,未找到则-1 - -```js -let array = Array.of(1, 4, 5, 2, 67) -let find = array.filter(function (item) { - return item % 2 === 0 -}) -// 查找下标 -let find = array.findIndex(function (item) { - return item === 0 -}) -console.log(find); -``` - - - -## Class Update - -### 2-12 Class基础语法(怎么声明一个类?) - -#### ES5中怎么声明一个类 - -- ```JS - let Animal = function (type) { - this.type = type - } - - Animal.prototype.eat = function () { - console.log('you are eatting food hello'); - } - let dog = new Animal('food') - let cat = new Animal('fish') - - console.log(dog) - console.log(cat) - - // 修改实例对象原型链上的方法 - cat.constructor.prototype.eat = function () { - console.log('error') - } - dog.eat() - cat.eat() - ``` - - - -#### ES6中声明一个类 - -- ```JS - class Animal { - constructor(type) { - this.type = type - } - eat() { - console.log('i am food') - } - } - - let dog = new Animal('food') - let cat = new Animal('fish') - - console.log(dog) - console.log(cat) - - // 修改实例对象原型链上的方法 - cat.constructor.prototype.eat = function () { - console.log('error') - } - dog.eat() - cat.eat() - - console.log(typeof Animal); - ``` - - - -### 2-13 Setter&Getter(如何读写属性?) - -#### ES6:set 和 get - -- 可以把属性写成函数,调用时先运行函数 - -```JS -let _age = 4 -class Animal { - constructor(type) { - this.type = type - } - get age() { - return _age - } - set age(val) { - if (val < 7 && val > 4) { - _age = val - } else { - console.log("err") - } - } - eat() { - console.log('i am food') - } -} -let dog = new Animal -dog.age = 52 -console.log(dog.age) -``` - - - -### 2-14 Static Methods(如何操作方法?) - -#### 对象实例的方法和类的静态方法 - -```JS -// ES5 -let Animal2 = function (type) { - this.type = type -} -Animal2.prototype.eat = function () { - Animal2.walk() - console.log('you are eatting food hello'); -} -Animal2.walk = function () { - console.log('i am walking'); -} -let dog = new Animal2('dog') -dog.eat() -``` - - - -- static 与实例对象隔离,拿不到实例对象 - -```JS -// ES6 专有语法定义静态方法 -class Animal { - constructor(type) { - this.type = type - } - eat() { - Animal.walk() - console.log('i am food') - } - static walk() { - console.log('i am flying'); - } -} -let dog = new Animal('dog') -dog.eat() -``` - -#### 什么时候用实例对象的方法,什么时候用类的静态方法? - -- 方法依赖于实例对象的属性或方法,要引用实例对象的信息时必须使用实例对象的方法 -- 方法不会涉及实例对象的属性或方法,可以用类的静态方法 - -### 2-15 Sub Classes(如何继承一个类?) - -#### ES5继承的一种方法 - -```JS -let Animal = function (type) { - this.type = type -} -Animal.prototype.eat = function () { - Animal.walk() - console.log('you are eatting food hello'); -} -Animal.walk = function () { - console.log('i am walking'); -} - -let Dog = function (type) { - // 初始化父类的构造函数 - Animal.call(this, type) - this.run = function () { - console.log('runnig'); - } -} -Dog.prototype = Animal.prototype - -let dog = new Dog('dog') -dog.run() -dog.eat() -console.log(dog.type); -``` - - - -#### ES6中如何继承 extends - -```JS -class Animal { - constructor(type) { - this.type = type - } - eat() { - Animal.walk() - console.log('i am food') - } - static walk() { - console.log('i am flying'); - } -} -class Dog extends Animal { - constructor(type) { - super(type) - this.age = 2 - } -} -let dog = new Dog('dog') -dog.eat() -``` - - - -## Function Update - -- 函数参数升级,参数支持表达式、默认参数、不确定参数 - -### 2-17 Default Parameters(函数参数的默认值) - -### ES5 - -```JS -function fn(x, y, z) { - if (y === undefined) { - y = 3 - } - if (z === undefined) { - z = 4 - } - return x + y + z -} -console.log(fn(2, 10, 30)) -``` - - - -#### ES6 - -```js -// 没有参数的往前写,否则默认没参数的为字符串类型 -function fn(x, y, z = x + y) { - // ES6中废弃arguments - // console.log(Array.from(arguments)) - // fn.length 可以获取到定义过的没有默认值的参数个数 - console.log(fn.length) - - return x + y + z -} -console.log(fn(10, 10, 10)) -console.log(fn(10, 10, undefined), 4, 12) -``` - - - -### 2-18 Rest Parameter(怎么处理不确定参数?) - -### ES5 - -```JS -ES5 -function sum() { - let num = 0 - Array.prototype.forEach.call(arguments, function (item) { - num += item * 1 - }) - return num -} -console.log(sum(1, 2, 3, 4)) - -``` - - - -#### ES6 - -```JS -// ES6 -function sum(base, ...nums) { - // "...nums" Rest parameter 用来获取所有参数:函数执行时的参数,是数组,参数可以分别使用 - let num = 0 - nums.forEach(function (item) { - num += item * 1 - }) - return num + base * 2 -} -console.log(sum(1, 2, 3, 4)) -``` - - - -### 2-19 Spread Operator(rest参数的逆运算) - -#### ES5 - -```JS -// rest参数的逆运算 -// ES5 -function sum (x = 1, y = 2, z = 3) { - return x + y + z -} -let data = [1, 2, 3] -console.log(sum.apply(this, data)) -``` - - - -#### ES6 - -```JS -function sum (x = 1, y = 2, z = 3) { - return x + y + z -} -let data = [1, 2, 3] -// ES6 -// spread -console.log(sum(...data)) -``` - - - -### 2-20 Arrow Functions(箭头函数) - -- ()=>{} - -```JS -let hello = (name, city) => { - console.log(name, 'hello', city) -} -hello('zhangsan', 'imooc') -// 只有一个参数省略括号 -let hi = name => { - console.log(name) -} -hi('zhangsan') -// 后面是表达式,省略花括号 -let sum = (x, y, z) => x + y + z -console.log(sum(1, 2, 3)) -// 以对象返回数据,小括号相当于表达式,花括号是对象的 -let sum2 = (x, y, z) => ({ - x: x, - y: y, - z: z -}) -console.log(sum2(1, 2, 3)) -// webpack eval 让 this 指向了空对象 -// ES6 中this 指向写函数时的对象 -let test = { - name: 'test', - say: () => { - console.log(this.name) - } -} -test.say() -``` - - - -## Object Update - -- Object 的 key 可以用变量或表达式,对象的方法支持异步 -- 语法:object[key] = value - -### 2-23 Set数据结构 - -- 元素可以是任意值:new Set([1, '2', 4]) -- .add(item) -- .delete(item) -- .clear() -- .size -- for of - -```JS -// set存储的数据是唯一的,重复数据会被过滤 -let s = new Set([1, '2', 4]) -s.add('hellos').add('hellos').add('hellos2') -s.delete('hellos') -// s.clear() -console.log(s.has('hellos2'), s.size) -console.log(s.values()) -console.log(s.keys()) -console.log(s.entries()) -s.forEach(item => { - console.log(item) -}) -for (let item of s) { - console.log(item) -} -``` - -- weakSet() - - 语法相同于set,但只能存储对象 - -### 2-24 Map数据结构 - -- 键值对可以是**任意值**:new Map([[1, 2], [2, 3]]) -- .set(key,value) -- .delete(key) -- .clear -- .size -- .has(key) -- .get(key) -- .keys() :键 -- .values() :值 -- .entries() :键值对 -- forEach((value,key)) :value 在前 -- for (let [key, value] of map) :按初始化顺序遍历 - -```JS -// map -let map = new Map([[1, 2], [2, 3]]) -// 添加 -map.set(3, 4) -// 修改 -map.set(1, 5) -// 删除 -map.delete(3) -// console.log(map.size) -// console.log(map.has(3)) -// console.log(map.get(2)) -// console.log(map.keys(), map.values(), map.entries()) -// map.forEach((value, key) => { -// console.log(value, key) -// }) -for (let [key, value] of map) { - console.log(key, value) -} -let o = function () { - console.log('o') -} -map.set(o, 9) -console.log(map.get(o)) -``` - -- weakMap() - - 语法相同于Map,但只能存储对象 - -### 2-25 Object.assign(对象拷贝) - -- 当对象中只有一级属性,没有二级属性的时候,此方法为深拷贝,但是对象中有对象的时候,此方法,在二级属性以后就是浅拷贝。 - -```JS -// object copy -const target = { - a: { - b: { - c: { - d: 4 - } - }, - e: 7 - }, - undefined: null -} -const source = { - a: { - b: { - c: { - null: null - } - } - }, - f: 2 -} -Object.assign(target, source) -console.log(target, 'source') -``` - - - -### 2-26 Object Property(存储数据) - -- 对象属性简写 - 1. 支持变量或表达式 - 2. 只能用常规函数 - 3. 异步函数名称前加 `*` - -```JS -let x = 1 -let y = 2 -let z = 8 -// ES5 -let obj = { - x: x, - y: y, - hello: function () { - console.log('hello ES5') - } -} -obj[z] = 3 -obj.hello() -console.log(obj) - -// ES6 对象属性简写 -let obj2 = { - x, - y, - [z + y]: 6, //支持变量或表达式 - hello () { - // 只能用常规函数 - // 异步函数名称前加 * , Generator - console.log('hello ES6') - } -} -obj2.hello() -console.log(obj2) -``` - - - -## RegExp Update - -### 2-27 Regexp Sticky(y修饰符) - -- sticky 粘连:从上次匹配完剩余字符串的第一位开始匹配,可以连续匹配 - -```JS -const s = 'a_aa_aaa_aa_a' -const r1 = /a+/g -const r2 = /a+/y -console.log(r1.exec(s)) -console.log(r2.exec(s)) -console.log(r1.exec(s)) -console.log(r2.exec(s)) -``` - - - -### 2-28 Regexp Unicode(u修饰符) - -- 处理 Unicode 字符的,**所有中文都加 u** - -```JS -// unicode u修饰符 大于 \uffff -let s = '𠮷' -let s2 = '\uD842\uDF87' - -console.log(/^\uD842/.test(s2)) -console.log(/^\uD842/u.test(s2)) // 无法匹配 - -console.log(/^.$/.test(s)) // 无法匹配 -console.log(/^.$/u.test(s)) // 正确匹配, 使用 "." 大于两个字节要加 u - -console.log(/^\u{20BB7}$/u.test(s)) -console.log(/^\u{61}$/u.test('a')) // 使用码点时,加 u 才能匹配 \u - -console.log(/𠮷{2}/u.test('𠮷𠮷')) // 加 u 才能匹配,所有中文都加 u - -console.log(/[a-z]/i.test('\u212A')) -console.log(/[a-z]/iu.test('\u212A')) -``` - - - -## Template 字符串模板 - -### 2-30 String(字符串拼接问题) - -- ES中字符串换行、包含变量或表达式、包含逻辑运算怎么办? - - ES6更优雅的便捷的方式 -- ${变量/表达式}:字符串模板 -- 函数处理字符串模板 - -```JS -let s1 = `我是第一行 -我是第二行` -console.log(s1) -``` - -```JS -function Price (strings, type) { - let s1 = strings[0] - const retailPrice = 20 - const wholeSalePrice = 16 - let showTxt = '' - if (type === 'retail') { - showTxt = '单价是:' + retailPrice - } else { - showTxt = '批发价是:' + wholeSalePrice - } - return `${s1}${showTxt}` -} -let showTxt = Price`您此次的${'retail'}` -console.log(showTxt) -``` - - - -## Desctructuring 解构赋值 - -- ES5 从一个复杂的数据结构中提取数据是如何做的? -- ES6 的方式 - -### 2-32 Array Destructure(解构赋值) - -1. 可以跳过赋值元素 -2. 赋值元素可以是任意可遍历对象 -3. 左边的变量还可以是对象的属性,不局限于变量 -4. 解构赋值在循环体中配合 entries 使用,map 对象也可以用 -5. rest 参数防止回收 - -```JS -let arr = ['hello', 'world', 'three'] -let [firstName, , surName] = arr -console.log(firstName, surName) - -let [firstName,, thirdName] = new Set([1, 2, 3, 4]) -console.log(firstName, thirdName) - -// 修改内容 -let user = { - name: 's', - surname: 't' -}; -[user.name, user.surname] = [1, 2] -console.log(user) -for (let [k, v] of Object.entries(user)) { - // 隐式赋值,显式索引 - console.log(k, v) -} - -// ...last 防止回收 -let arr = [1, 2, 3, 3, 4, 5, 6, 7] -let [firstName, curName, ...last] = arr -console.log(firstName, curName, last) - -// 无数据就是 未定义 -let arr = [] -// 解构赋值取决于里面有没有值 -let [firstName, curName, ...last] = arr -console.log(firstName, curName, last) - -``` - - - -### 2-34 Object Destructrue(解构赋值) - -- 变量用花括号,数据结构层层对应 - -```JS -// Object 的解构赋值 -let options = { - title: 'menu', - width: 100, - height: 200 -} -let { title: title2, width = 130, height } = options -let { title, ...last } = options -console.log(title, last) - -// 多层结构的解构赋值 -let options = { - size: { - width: 100, - height: 200 - }, - items: ['Cake', 'Donut'], - extra: true -} -let { size: { width, height }, items: [, item2], extra } = options -console.log(width, height, item2, extra) -``` - - - -## Promise 异步操作 - -### 2-36 Callback(异步操作) - -- 回调地狱 - -```JS -function loadScript (src, callback) { - let script = document.createElement('script') - script.src = src - script.onload = () => { - callback(src) - } - document.head.append(script) -} - -function test (name) { - console.log(name) -} -loadScript('./1.js', function (script) { - loadScript('./2.js', function (script) { - loadScript('./3.js', function (script) { - test('log') - }) - }) -}) - -``` - - - -### 2-37 Promise(异步操作) - -```JS -function loadScript (src) { - return new Promise((resolve, reject) => { - let script = document.createElement('script') - script.src = src - script.onload = () => resolve(src) // 状态:fullfilled, 结果: result - script.onerror = (err) => reject(err) // 状态:rejected,结果: error - document.head.appendChild(script) - }) -} - -loadScript('./1.js') - .then(loadScript('./2.js')) - .then(loadScript('./3.js')) -``` - -### 2-38 Then(异步操作) - -- `promise,then(onFullfilled,onRejected) // onFullfilled 必选` - 1. .then 是promise 对象原型上的**实例方法**,必须是promise 对象才能调用 - 2. then 支持两个函数类型参数, - 1. fullfilled 对应resolve 必选 - 2. rejected 对应reject,可选 - 3. 如果传入**空对象**,会返回一个空的 promise 对象 - 4. 参数函数里 return 一个 promise 对象,才能不返回空对象 - -```JS -function loadScript (src) { - // penging, undefined - return new Promise((resolve, reject) => { - let script = document.createElement('script') - script.src = src - script.onload = () => resolve(src) // 状态:fullfilled, 结果: result - script.onerror = (err) => reject(err) // 状态:rejected,结果: error - document.head.appendChild(script) - }) -} - -loadScript('./1.js') - .then(() => { - return loadScript('./4.js') - }, (err) => { - console.log(err) - }) - .then(() => { - return loadScript('./3.js') - }, (err) => { - console.log(err) - }) - -// promise,then(onFullfilled,onRejected) // onFullfilled 必选 -``` - - - -### 2-39 Resolve & Reject(异步操作) - -- Promise的**静态方法**,使用时必须 Promise.resolve 或 Promise.reject - -```js -function test (bool) { - if (bool) { - return new Promise(resolve => { - resolve(20) - }) - } else { - return Promise.reject(new Error('myError')) - } -} -test(0).then((value) => { - console.log(value) -}, (err) => { - console.log(err) -}) - -``` - - - -### 2-40 Catch(异步操作) - -- 捕获链式异步操作中的异常 -- .catch 是promise 对象的**实例方法**,必须是promise 对象才能调用 -- promise 状态改变时捕获,只能用reject 报错,不能用 throw new Error触发错误 - -```JS -function loadScript (src) { - // penging, undefined - return new Promise((resolve, reject) => { - let script = document.createElement('script') - script.src = src - script.onload = () => resolve(src) // 状态:fullfilled, 结果: result - script.onerror = (err) => reject(err) // 状态:rejected,结果: error - document.head.appendChild(script) - }) -} - -loadScript('./1.js') - .then(() => { - return loadScript('./2.js') - }) - .then(() => { - return loadScript('./30.js') - }) - .catch(err => { - console.log(err) - }) - -``` - - - -### 2-41 All(异步操作) - -- **静态方法** -- 并行异步操作,合并多个异步数据成一个 promise - -```JS -// All 操作 -function loadScript (src) { - // penging, undefined - return new Promise((resolve, reject) => { - let script = document.createElement('script') - script.src = src - script.onload = () => resolve(src) // 状态:fullfilled, 结果: result - script.onerror = (err) => reject(err) // 状态:rejected,结果: error - document.head.appendChild(script) - }) -} - -const p1 = loadScript('./2.js') -const p2 = loadScript('./1.js') -const p3 = loadScript('./3.js') -Promise.all([p2, p1, p3]).then((value) => { - console.log(value, 'log') -}) -``` - - - -### 2-42 Race(异步操作) - -- **静态方法** -- 只保留先返回的值 - -```JS -// race -const p1 = () => { - return new Promise((resolve, reject) => { - setTimeout(function () { - resolve(1) - }, 3000) - }) -} -const p2 = () => { - return new Promise((resolve, reject) => { - setTimeout(function () { - resolve(2) - }, 2000) - }) -} -Promise.race([p1(), p2()]).then((value) => { - console.log(value) -}) - -``` - - - -## Reflect 反射制 - -### 2-44 Reflect.apply(反射机制) - - Java 的反射机制是在编译阶段不知道是哪个类被加载 ,而是在运行的时候加载、执行 - -```js -console.log(Math.floor.apply(null, [3.111])) - -console.log(Reflect.apply(Math.floor, null, [2.33])) - -let price = 90.12 -console.log(Reflect.apply(price > 100 ? Math.floor : Math.ceil, null, [price])) -``` - - - -### 2-45 Reflect.construct(反射机制) - -- 动态实例化一个类 - -```js -let d = Reflect.construct(Date, []) -console.log(d.getTime(), d instanceof Date) -``` - -- `Reflect.defineProperty` 新增对象属性 - - 与 Object 区别在于返回值不同,Reflect 返回true/false,Object 返回对象 - - 所有具备反射机制的功能性函数都会放到Reflect 上面去 - - 将来Object 中可能会移除这些方法 -- `Reflect.get` 读取数据操作 - -```JS -const student = {} -const r2 = Object.defineProperty(student, 'name', { value: 'Mike' }) -// console.log(student) -const r = Reflect.defineProperty(student, 'name', { value: 'Mike2' }) -console.log(student, r, r2) - -const obj = { x: 1, y: 2 } -// Reflect.deleteProperty(obj, 'x') -console.log(obj) -console.log(Reflect.get(obj, 'y')) -console.log(Reflect.get([3, 4], 1)) -``` - - - -### 2-46 Reflect.getOwnPropertyDescriptor(反射机制) - -- 获取属性描述符 -- `Reflect.getPrototypeOf(obj)` :**获取实例对象的原型对象** -- `Reflect.has(obj, 'property')`:验证对象下面有没有这个属性,Object 没有这个方法 -- `Reflect.isExtensible(obj)`:是否可扩展,是否被冻结了 - - `Object.freeze(obj)`:冻结对象,不可扩展 -- `Reflect.ownKeys()`:返回对象的键 -- `Reflect.preventExtensions(obj) `:效果和 freeze 相同 -- `Reflect.set(obj,'z','1')` :设置数据 -- `Reflect.setPrototypeOf(obj,'type')` :**设置实例对象的原型对象** - -```js -const obj = { x: 1, y: 2 } -// console.log(Reflect.getOwnPropertyDescriptor(obj, 'x')) -// console.log(Object.getOwnPropertyDescriptor(obj, 'y')) - -// let d = new Date() -// console.log(Reflect.getPrototypeOf(d)) -// console.log(Object.getPrototypeOf(obj)) - -// console.log(Reflect.has(obj, 'y')) -// Object.freeze(obj) -// obj.z = 3 - -// console.log(Reflect.isExtensible(obj), obj) -// console.log(Reflect.ownKeys(obj)) -// console.log(Reflect.ownKeys([1, 2, 3])) -// Symbol - -// Reflect.preventExtensions(obj) // 效果和 freeze 相同 -// console.log(Reflect.isExtensible(obj)) - -Reflect.set(obj, 'z', 1) -console.log(obj) -const arr = ['a', 'w', 's'] -Reflect.set(arr, 3, 'oioo') -console.log(arr) - -console.log(Reflect.getPrototypeOf(arr)) -Reflect.setPrototypeOf(arr, String.prototype) -console.log(Reflect.getPrototypeOf(arr)) - -``` - - - -## Proxy 代理 - -### 2-48 proxy basic syntax(该怎样使用代理功能) - -- new Proxy(obj, data) - -```JS -// let o = { -// name: 'xiaoming', -// price: 190 -// } -// let d = new Proxy(o, { -// get (target, key) { -// if (key === 'price') { -// return target[key] + 20 -// } else { -// return target[key] -// } -// } -// }) -// console.log(d.price, d.name) - -let o = { - name: 'xiaoming', - price: 190 -} -let d = new Proxy(o, { - get (target, key) { - return target[key] - }, - set (target, key, value) { - return false - } -}) -d.price = 700 -console.log(d.price, d.name) - -// ES5 中完全禁止修改元素属性 -for (let [key] of Object.entries(o)) { - Object.defineProperty(o, key, { - writable: false - }) -} -o.price = 300 -console.log(o.name, o.price) -``` - - - -### 2-49 Schema Validation(1模式验证) - -```js -// 拦截 校验 -let o = { - name: 'xiaoming', - price: 190 -} -// 按功能模块化 -let validator = (target, key, value) => { - if (Reflect.has(target, key)) { - if (key === 'price') { - if (value > 300) { - return false - } else { - target[key] = value - } - } else { - target[key] = value - } - } else { - return false - } -} -let d = new Proxy(o, { - get (target, key) { - return target[key] || '' - }, - set: validator -}) -d.price = 320 -d.name = 'lisi' -d.age = 123 -console.log(d.price, d.name, d.age) -``` - - - -### 2-50 Schema Validation(2模式验证) - -```js -// 拦截 校验 -let o = { - name: 'xiaoming', - price: 190 -} -// 监听错误 -window.addEventListener('error', (e) => { - console.log(e.message) - // report('./') -}, true) -// 按功能模块化 -let validator = (target, key, value) => { - if (Reflect.has(target, key)) { - if (key === 'price') { - if (value > 300) { - // 不满足条件触发错误 - throw new TypeError('price exceed 300') - } else { - target[key] = value - } - } else { - target[key] = value - } - } else { - return false - } -} -let d = new Proxy(o, { - get (target, key) { - return target[key] || '' - }, - set: validator -}) -d.price = 320 -d.name = 'lisi' -d.age = 123 -console.log(d.price, d.name, d.age) -``` - - - -### 2-51 Schema Validation(3模式验证) - -```js -// 代理生成ID, 随机\唯一\只读 -class Component { - constructor () { - this.proxy = new Proxy({ - id: Math.random().toString(36).slice(-8) - }, {}) - } - get id () { - return this.proxy.id - } -} -let com = new Component() -let com2 = new Component() -for (let i = 0; i < 10; i++) { - console.log(com.id, com2.id) -} -com.id = 'abc' -console.log(com.id, com2.id) -``` - - - -### 2-52 Revocable Proxy (可撤销代理) - -```JS -// 可撤销代理 -let o = { - name: 'xiaoming', - price: 190 -} -let d = Proxy.revocable(o, { - get (target, key) { - if (key === 'price') { - return target[key] + 20 - } else { - return target[key] - } - } -}) -console.log(d) -console.log(d.proxy.price) -console.log(d.revoke) -setTimeout(function () { - d.revoke() - setTimeout(function () { - console.log(d.proxy.price) - }, 100) -}, 1000) -``` - -- 练习 - 1. 组件初始化的时候都赋值一个可读而且随机的 ID, 该怎么做? - 2. 临时代理有哪些应用场景呢? - 3. 如何把接口的数据用代理进行包装? - -## Generator 生成器 - -### 2-54 Generator(如何让遍历“停”下来) - -- ES6如何让遍历停下来? - -```JS -// ES5 -// function loop () { -// for (let i = 0; i < 5; i++) { -// console.log(i) -// } -// } -// loop() - -// ES6 -function * loop () { - for (let i = 0; i < 5; i++) { - yield console.log(i) - } -} -const l = loop() -l.next() -l.next() -l.next() -l.next() -l.next() -l.next() -``` - - - -### 2-55 Syntax(1语法) - -- `function * loop(){ yield console.log()}` -- 执行一步 : `const l=loop(); l.next()` -- `next()` 恢复执行 - - 返回当前执行的数据(value)和状态(done), value 当前是执行的结果, done 循环是否结束 - - yeild 前不加 `*`, next 返回当前遍历的值和循环是否结束 - - 加 `*` 后面是可迭代(遍历)对象, 也可以**嵌套 Generator 对象**, 会遍历后面内容 -- `yeild` 本身没有返回值 - -```js -// 语法 yeild 本身没有返回值 -// function * gen () { -// let val -// val = yield 1 -// console.log(val) -// } -// const l = gen() -// l.next() -// l.next() - -// next() 的返回值 -function * gen () { - let val - val = yield * 'as23' - console.log(val) -} -const l = gen() -console.log(l.next()) -console.log(l.next()) -``` - - - -### 2-56 Syntax(2语法) - -- `next()` 传参 - - 参数**改变** `yield` 后面表达式的返回值 - - 不传值 `yield` 后面表达式的返回值是 `undefined` -- `return()` 终止 - - 传值则改变 `yiled` 后面的表达式 `value = 参数` - - 不传值是 `undefined` - -```js -// next() 的返回值 -function * gen () { - let val - val = (yield [3, 2, 1]) + 9 - console.log(val) -} -const l = gen() -console.log(l.next(10)) -console.log(l.return()) -console.log(l.next(20)) -``` - -- 使用错误终止 `.throw(new Error('ss'))` - -```js -// 使用 new Error() 终止循环 -function * gen () { - while (true) { - try { - yield 1 - } catch (e) { - console.log(e.message) - } - } -} -const g = gen() -console.log(g.next()) -console.log(g.next()) -console.log(g.next()) -console.log(g.next()) -g.throw(new Error('ss')) -console.log(g.next()) -``` - - - -### 2-57 Scene Pratice(现场练习) - -- 练习-抽奖函数 - -```js -// // 练习-抽奖函数-ES5 -// function draw (first = 1, second = 3, third = 5) { -// let firstPrice = ['1A', '1B', '1C', '1D', '1E'] -// let secondPrice = ['3A', '2B', '2C', '2D', '2E', '2F', '2G', '2H', '2I', '2J', '2K'] -// let thirdPrice = ['3A', '3B', '3C', '3D', '3E', '3F', '3G', '3H', '3I', '3J', '3K', '3L', '3M', '3N'] -// let random -// let result = [] - -// // 抽一等奖 -// for (let i = 0; i < first; i++) { -// random = Math.floor(Math.random() * firstPrice.length) -// result = result.concat(firstPrice.splice(random, 1)) -// } -// // 抽二等奖 -// for (let i = 0; i < second; i++) { -// random = Math.floor(Math.random() * secondPrice.length) -// result = result.concat(secondPrice.splice(random, 1)) -// } -// // 抽三等奖 -// for (let i = 0; i < third; i++) { -// random = Math.floor(Math.random() * thirdPrice.length) -// result = result.concat(thirdPrice.splice(random, 1)) -// } -// return result -// } - -// let t = draw() -// for (let value of t) { -// console.log(value) -// } - -// 练习-抽奖函数-ES6 -function * draw (first = 1, second = 3, third = 5) { - let firstPrice = ['1A', '1B', '1C', '1D', '1E'] - let secondPrice = ['3A', '2B', '2C', '2D', '2E', '2F', '2G', '2H', '2I', '2J', '2K'] - let thirdPrice = ['3A', '3B', '3C', '3D', '3E', '3F', '3G', '3H', '3I', '3J', '3K', '3L', '3M', '3N'] - let count = 0 - let random - - while (true) { - if (count < first) { - random = Math.floor(Math.random() * firstPrice.length) - yield firstPrice[random] - count++ - firstPrice.splice(random, 1) - } else if (count < first + second) { - random = Math.floor(Math.random() * secondPrice.length) - yield secondPrice[random] - count++ - secondPrice.splice(random, 1) - } else if (count < first + second + third) { - random = Math.floor(Math.random() * thirdPrice.length) - yield thirdPrice[random] - count++ - thirdPrice.splice(random, 1) - } else { - return false - } - } -} -const d = draw() -console.log(d.next().value) -console.log(d.next().value) -console.log(d.next().value) -console.log(d.next().value) -console.log(d.next().value) -console.log(d.next().value) -console.log(d.next().value) -console.log(d.next().value) -console.log(d.next().value) -console.log(d.next().value) -``` - - - -- 练习-数到三的人喝酒 - -```JS -// 练习-数到三的人喝酒 -function * count (x = 1) { - while (true) { - if (x % 3 === 0) { - yield x - } - x++ - } -} -let num = count() -console.log(num.next().value) -console.log(num.next().value) -console.log(num.next().value) -``` - - - -- 练习 - - 1. 用 Generator 实现一个斐波那契数列 - - > 什么是斐波那契数列,1,1,2,3,5,8,13...这样一个数列就是斐波那契数列,求第n项的值。 - > - > **一、经典求法** - > - > 观察数列可得,除了第一项和第二项,所有的数列的值都是前一项和前一项的前一项的加和,转换成函数也就是f(n) = f(n-1) + f(n-2) - > - > 显然,递归n次,时间复杂度O(2^n),太恐怖,所以,必须优化。 - > - > **二、顺序求法** - > - > 因为斐波那契数列可以从左到右顺序的求出每一项的值,因此只需要顺序计算到n项即可,时间复杂度为O(n)的,我们可以把它看成在单链表的最后插入一个右最后一个和倒数第二个指针指向的值来决定的。 - - 2. 用 Generator 给自定义数据结构写一个遍历器 - - - -```js -// 用 Generator 实现一个斐波那契数列 1,1,2,3,5,8,13... -function * draw () { - let n1 = 1 - let n2 = 1 - let n3 = 0 - while (true) { - yield n3 = n1 + n2 - n1 = n2 - n2 = n3 - } -} -let d = draw() -console.log(d.next().value) -console.log(d.next().value) -console.log(d.next().value) -console.log(d.next().value) -console.log(d.next().value) -console.log(d.next().value) -``` - -### 附: Generator 是什么 - -> http://www.pianshen.com/article/3896191627/ - -**生成器(Generator)**对象是ES6中新增的语法,和Promise一样,都可以用来异步编程。但与Promise不同的是,它不是使用JS现有能力按照一定标准制定出来的,而是一种新型底层操作,async/await就是在它的基础上实现的。 - -generator对象是由generator function返回的,符合**可迭代协议**和**迭代器协议**。 - -generator function 可以在JS单线程的背景下,使JS的执行权与数据自由的游走在多个执行栈之间,实现协同开发编程,当项目调用generator function时,会在内部开辟一个单独的执行栈,在执行一个generator function 中,可以暂停执行,或去执行另一个generator function,而当前generator function并不会销毁,而是处于一种被暂停的状态,当执行权回来的时候,再继续执行。 - -![在这里插入图片描述](JavaScriptES6-10.assets/97a52475c433362e41ffb7cf6e9bd775-1580129648099.png) - -**可迭代协议**和**迭代器协议**都是ES6的补充 - -#### 迭代器(Iterator) - -顾名思义,所谓迭代器对象就是满足迭代器协议的对象。 - -> 迭代器协议 - -迭代器协议定义了一种标准的方式来产生一个有限或无限序列的值。使的迭代器对象拥有一个`next()`对象,并有以下含义: - -- next: 返回一个对象的无参函数,返回对象有两个属性: - - done(boolean) - - 如果迭代器已经经过了被迭代序列时为 true。这时value可能描述了该迭代器的返回值。 - - 如果迭代器可以产生序列中的下一个值,则为false。这等于说done属性不指定。 - - value - - 迭代器返回的任何 JavaScript 值。done为true时可省略。 - -#### 可迭代(Iterable) - -满足可迭代协议的对象就是可迭代对象。 - -**可迭代协议**:允许JS对象去定义或定制它们的迭代行为。 - -**可迭代对象**:该对象必须实现@@iterator方法,即这个对象或它原型链(prototype chain)上的某个对象必须有一个名字是Symbol.iterator的属性。 - -> Symbol.iterator:返回一个对象的无参函数,被返回对象符合迭代器协议 - -在ES6中,所有的集合对象(Array、Set与Map)以及String、TypedArray、arguments都是可迭代对象,它们都有默认的迭代器。 - -**当一个对象被迭代的时候,它的@@iterator方法被调用并且无参数,并返回一个值迭代器** - -- 扩展运算符 - - ```js - [...'abc'] // ["a", "b", "c"] - ...['a', 'b', 'c'] // ["a", "b", "c"] - 12 - ``` - -- yield* - - ```js - function* generator() { - yield* ['a', 'b', 'c'] - } - generator().next() // { value: "a", done: false } - 1234 - ``` - -- 解构赋值 - - ```js - let [a, b, c] = new Set(['a', 'b', 'c']) - a // 'a' - 12 - ``` - -#### 可迭代对象 - -这里以`for ...of`为例子,加深对可迭代对象的理解 - -`for...of`接受一个可迭代对象(Iterable),或者能强制转换/包装成一个可迭代对象的值(如’abc’)。遍历时,`for...of`会获取可迭代对象的`[Symbol.iterator]()`,对该迭代器逐次调用next(),直到迭代器返回对象的done属性为true时,遍历结束,不对该value处理。 - -#### 使迭代器可迭代 - -在**迭代器**部分我们定义了一个简单的迭代器函数`createIterator`,但是该函数生成的迭代器部分并没有实现可迭代协议,所以不能在`for...of`等语法中使用。需要为该对象实现可迭代协议, - -在`[Symbol.iterator]`函数中返回该迭代器自身。 - -```js -function createIterator(items) { - var i = 0 - return { - next: function () { - var done = (i >= items.length) - var value = !done ? items[i++] : undefined - return { - done: done, - value: value - } - } - [Symbol.iterator]: function () { - return this - } - } -} -var iterator = createIterator([1, 2, 3]) -...iterator // 1, 2, 3 -``` - - - -## Iterator 迭代器 - -### 2-59 Iterator(如何让不支持遍历的数据结构“可遍历”) - -- iterator 代码规范 - 1. 可迭代协议 : `authors[Symbol.iterator] = function () {}` - 2. 迭代器协议 : `函数内部规范` - -### 2-60 Iterator - -```js -let authors = { - allAuthors: { - fiction: ['Agla', 'Skks', 'Lp'], - scienceFiction: ['Neal', 'Arthru', 'Ribert'], - fantasy: ['J.R.Tole', 'J.M.R', 'Terry P.K'] - }, - Addres: [] -} - -// // ES5 -// let r = [] -// for (let [k, v] of Object.entries(authors.allAuthors)) { -// r = r.concat(v) -// } -// console.log(r) - -// authors is not iterable(迭代) -// ES6 -authors[Symbol.iterator] = function () { - let allAuthors = this.allAuthors - let keys = Reflect.ownKeys(allAuthors) - let values = [] - return { - next () { - if (!values.length) { - if (keys.length) { - values = allAuthors[keys[0]] - keys.shift() - } - } - return { - done: !values.length, - value: values.shift() - } - } - } -} -let r = [] -for (let v of authors) { - r.push(v) -} -console.log(r) -``` - - - -### 2-61 Generator - -```js -let authors = { - allAuthors: { - fiction: ['Agla', 'Skks', 'Lp'], - scienceFiction: ['Neal', 'Arthru', 'Ribert'], - fantasy: ['J.R.Tole', 'J.M.R', 'Terry P.K'] - }, - Addres: [] -} - -// 使用 Generator 给自定义数据结构写个遍历器 -authors[Symbol.iterator] = function * () { - let allAuthors = this.allAuthors - let keys = Reflect.ownKeys(allAuthors) - let values = [] - while (true) { - if (!values.length) { - if (keys.length) { - values = allAuthors[keys[0]] - keys.shift() - yield values.shift() - } else { - return false - } - } else { - yield values.shift() - } - } -} - -let r = [] -for (let v of authors) { - r.push(v) -} -console.log(r) -``` - - - -- 练习 - 1. 什么是自定义遍历,如果有复杂的数据结构会使用自定义遍历了吗 - 2. 什么是迭代协议\ 可迭代协议 - 3. Generator 和 Iterator 的关联关系理解了吗 - -## module - -### 2-63 Export Import(如何把代码进行模块化设计) - -```js -// lesson2-14-mod.js -// export const name = 'hello' -// export let addr = 'beijing' -// export let arr = [1, 2, 3] - -const name = 'hello3' -let addr = 'Beijing' -let arr = [1, 2, 3] - -export default name -export { - addr, - arr -} -``` - -```js -// lesson2-14.js -import name, { addr as addr2, arr } from './lesson2-14-mod' -console.log(name, addr2, arr) - -// import name2 from './lesson2-14-mod' -// console.log(name2) -``` - - - -### 2-64 Export Import(2) - -```js -导出函数 -export function say (content) { - console.log(content) -} - -export function run () { - console.log('I am running') -} - -const say = (content) => { - console.log(content) -} -const run = () => { - console.log('I am running') -} -export default say -export { - run -} - -导出对象 -export default { - code: 0, - message: 'success' -} - -const data = { - code: 1, - message: 'success' -} -const des = { - age: 20, - addr: 'Beijing' -} - -export default { - data, - des -} - -导出类 -class Test { - constructor () { - this.id = 2 - } -} -export default Test -export { - Test -} - -export default class Test { - constructor () { - this.id = 2 - } -} - -export default class { - constructor () { - this.id = 5 - } -} - -export class Test { - constructor () { - this.id = 2 - } -} -``` - - - -```js - // 导入函数 -import say, { run } from './lesson2-14-mod' -say('hello world') -run() - -导入对象 -import obj from './lesson2-14-mod' -let { data, des } = obj -console.log(data, des) - -导入类 -// import { Test } from './lesson2-14-mod' -import Test from './lesson2-14-mod' -let test = new Test() -console.log(test.id) -``` - - - -### 2-65 Export Import(3) - -```js -// 导出多个类,批量导入 -export class Test { - constructor () { - this.id = 6 - } -} -export class Animal { - constructor () { - this.name = 'dog' - } -} - -export default class Peiple { - constructor () { - this.id = 123 - } -} -``` - -```js -// 批量导入 -import * as Mod from './lesson2-14-mod' -let test = new Mod.Test() -console.log(test.id) -let animal = new Mod.Animal() -console.log(animal.name) -let people = new Mod.default() -console.log(people.id) -``` - - - -- 练习 - 1. 被导出的模块是否能在本模块中使用 - - 结果: 可以使用 - -```js -// 导入函数 -import { say, run } from './lesson2-14-mod' -say('hello world') -run() -// 导出函数 -export function say (content) { - console.log(content) - run() -} - -export function run () { - console.log('I am running') -} -``` - - - -# 第3章 ES7基础知识 - - ES7在ES6基础上新增了两项功能,一个是数组的 include 方法、一个是 Math.pow 的简写语法 - -## 3-1 includes + pow(数组中如何判断元素是否存在) - -```js -// 数组中如何判断元素是否存在 -const arr = [1, 2, 3] -console.log(arr.includes(4)) -``` - - - -## 3-2 Array.prototype.includes & Math.pow - -```js -// 指数运算 -console.log(Math.pow(2, 5)) -// 简写指数运算 -console.log(2 ** 5) -``` - - - -# 第4章 ES8基础知识 - -1. ES8在异步操作、Object、String能力上做了进一步增强,让代码编写更加效率 -2. Aysnc/Await & Object.values - -## 4-1 Async\Await(有没有比Promise更优雅的异步方式) - -- async - - 异步函数声明, 把函数返回值自动处理为promise对象 -- await - - 等待异步执行结束, 可以自动把后面返回值转换为promise对象 -- 必须成对使用, 是语法糖, 原理是Promise - -```js -// async function firstAsync () { -// return 27 -// // return Promise.resolve(28) -// } - -// firstAsync().then(val => { -// console.log(val) -// }) - -// console.log(firstAsync() instanceof Promise) - -// await 异步操作 -async function firstAsync () { - let promise = new Promise((resolve, reject) => { - setTimeout(function () { - resolve('now it is done') - }, 1000) - }) - console.log(await promise) - console.log(await Promise.resolve(48)) - console.log(2) - return Promise.resolve(28) -} - -firstAsync().then(val => { - console.log(val) -}) -``` - - - -## 4-2 Object keys.values.entries(新增对Object快速遍历的方法,了解下?) - -```js -let grade = { - 'lilei': 95, - 'hanmei': 97, - 'lisi': 99 -} - -// Iterator方式遍历 -// grade[Symbol.iterator] = function () { -// let All = this -// let keys = Reflect.ownKeys(grade) -// let values = [] -// // console.log(All, keys, '内部数据') -// return { -// next () { -// if (!values.length) { -// if (keys.length - 1) { -// values.push(All[keys[0]]) -// keys.shift() -// // console.log(values, values.length, All[keys[0]], keys, '内部') -// } -// } -// return { -// done: !values.length, -// value: values.shift() -// } -// } -// } -// } -// let result = [] -// for (let v of grade) { -// result.push(v) -// } -// console.log(result) - -// ES6方式遍历 -let r = [] -for (let [, v] of Object.entries(grade)) { - r.push(v) -} -console.log(r) - -// ES8方式 -console.log(Object.keys(grade)) -console.log(Object.values(grade)) -console.log(Object.entries(grade)) - -``` - - - -## 4-3 String Padding(对String补白的方式) - -- 前补 `i.toString().padStart(5, '*#')` -- 后补 `i.toString().padEnd(5, '*#')` - -```js -// for (let i = 1; i < 32; i++) { -// if (i < 10) { -// console.log(`0${i}`) -// } else { -// console.log(i) -// } -// } - -for (let i = 1; i < 32011; i += 100) { - // console.log(i.toString().padStart(5, '*#')) - console.log(i.toString().padEnd(5, '*#')) -} - -``` - - - -## 4-4 Object.getOwnDescriptor(如何获取Object数据的描述符) - -- `Object.defineProperty(data, 'Lima', { enumerable: false})` : 设置属性描述符 -- `Object.getOwnPropertyDescriptor(data, 'Lima')` : 查询一项 -- `Object.getOwnPropertyDescriptors(data)` : 查询所有 - -```js -const data = { - PortLand: '78/50', - Dublin: '88/53', - Lima: '32/54' -} - -Object.defineProperty(data, 'Lima', { - // 描述符 - enumerable: false -}) - -console.log(Object.keys(data)) -``` - - - -# 第5章 ES9基础知识 - - ES9主要解决了遍历中异步、异步的归一操作等问题、也提供了对象的拷贝、筛选功能并且提升了正则的处理能力 - -## 5-1 For await of(异步操作集合是如何遍历的) - -- 异步操作集合使用 - -```js -// 异步函数生成 -function Gen (time) { - return new Promise((resolve, reject) => { - setTimeout(function () { - resolve(time) - }, time) - }) -} - -// ES8 -// async function test () { -// let arr = [Gen(2000), Gen(100), Gen(3000)] -// for (let item of arr) { -// console.log(Date.now(), await item.then(console.log)) -// } -// } -// test() - -// ES9 异步操作遍历 -async function test () { - let arr = [Gen(2000), Gen(100), Gen(3000)] - for await (let item of arr) { - console.log(Date.now(), item) - } -} -test() -``` - - - -## 5-2 For await of(2) - -- 对异步自定义数据结构遍历 - -```js -// 对异步自定义数据结构遍历 -const obj = { - count: 0, - // 生成器 - Gen (time) { - return new Promise((resolve, reject) => { - setTimeout(function () { - resolve({ - done: false, - value: time - }) - }, time) - }) - }, - // 声明遍历方式,迭代器 - [Symbol.asyncIterator] () { - let self = this - return { - next () { - self.count++ - if (self.count < 4) { - return self.Gen(Math.random() * 1000) - } else { - return Promise.resolve({ - done: true, - value: '' - }) - } - } - } - } -} - -async function test () { - for await (let item of obj) { - console.log(Date.now(), item) - } -} -test() - -``` - - - -## 5-3 Promise.finally(Promise是如何“兜底”操作的) - -```js -// Promise 生成器 -function Gen (time) { - return new Promise((resolve, reject) => { - setTimeout(function () { - if (time < 500) { - reject(time) - } else { - resolve(time) - } - }, time) - }) -} -// 异步调用函数 无论成功还是失败都会执行 finally 的内容 -Gen(Math.random() * 1000) - .then(val => console.log('resolve', val)) - .catch(err => console.log('reject', err)) - .finally(() => { - console.log('finish') - }) - -``` - - - -## 5-4 Object.rest.spread(新增Object的Rest和Spread方法) - -```js -// // spread -// const input = { -// a: 1, -// b: 2 -// } - -// const test = { -// d: 5 -// } - -// const output = { -// // spread 扩展, 是深拷贝, 不是引用 -// ...input, -// ...test, -// c: 3 -// } - -// console.log(input, output) -// input.a = 4 -// console.log(input, output) - -// rest -const input = { - a: 1, - b: 2, - c: 3, - d: 4 -} - -const { a, b, ...rest } = input -console.log(a, b, rest) - -``` - - - -## 5-5 RegExp-dotAll - -- dotAll 增强 `.` 的匹配能力, 相当于加强版 -- 四字节字符, 行终止符(`\`) , `.` 无法匹配 - -```js -// 正则后面加 s 增强点的匹配能力 \ -// 四字节字符则加 u, ES6中已经讲过 -// console.log(/foo.bar/s.test('foo\nbar')) -// console.log(/foo.bar/.test('foo\nbar')) - -// 是否启用 dotAll 模式 -const re = /foo.bar/sgiu -console.log(re.dotAll) -// 查看修饰符 -console.log(re.flags) - -``` - - - -## 5-6 RegExp-named captured groups(命名分组捕获) - -```js -// 命名分组捕获 -// console.log('12-2019-06-07'.match(/(\d{4})-(\d{2})-(\d{2})/)) - -const t = '12-2019-06-07'.match(/(?\d{4})-(?\d{2})-(?\d{2})/) -// console.log(t[1]) -// console.log(t[2]) -// console.log(t[3]) -console.log(t) -console.log(t.groups.year, t.groups.mouth, t.groups.day) -``` - - - -## 5-7 RegExp-lookbehind assert(后行断言) - -```js -// 先行断言 -let test = 'hello world' -console.log(test.match(/hello(?=\sworld)/)) -// 后行断言 -console.log(test.match(/(?<=hello\s)world/)) - -``` - - - -- 练习 - - 1. 请把 `'$foo %foo foo'`字符串中前面是$符号的foo 替换成bar - - ```js - const re = /(?<=\$)foo/ - let str = '$foo %foo foo' - // console.log(re.test(str)) - str = str.replace(re, 'bar') - console.log(str) - ``` - - - - 2. 请提取 `'$1 is worth about ¥123'` - - ```js - const re2 = /(?<=\$)\d/ - let str2 = '$1 is worth about ¥123' - str2 = str2.match(re2) - console.log(str2) - ``` - - - -# 第6章 ES10基础知识 - - ES10虽然没有大幅的改动,JSON问题修复,数组(Array)、字符串(String)、对象(Object)、函数(function) 等能力进一步增强,同时新增的 BigInt 数据类型也格外引人注目 - -### JSON - -- `0xD800-0xDFFF` - - 字符无法编码成UTF-8, 而显示错误, 现在以非编码形式转义存在 - -### Array - -- `arr.flat()` : - - flat扁平化, 按照指定深度递归遍历数组, 合并成一个新数组, 默认深度1 -- `arr.map(item => item * 2)` : - - map 对每个元素进行遍历, 参数可以使函数 - - `arr.map(item => item * 2).flat()` -- `arr.flatMap(item => item * 2)` : - - flat 和 map 的合并 - -```js -// let arr = [1, [2, 3], [4, 5, [6, 7, [8, 9]]]] - -// flat扁平化, 按照指定深度递归遍历数组, 合并成一个新数组 -// console.log(arr.flat(3)) - -// map 对每个元素进行遍历 arr.map(item => item * 2) -arr.flatMap() -let arr = [[1], [2], [3]] -console.log(arr.map(item => item * 2).flat()) -console.log(arr.flatMap(item => item * 2)) - -// string 字符串 -let str = ' foo ' -// console.log(str.replace(/^\s+|\s+$/g, '_')) -console.log(str.trimStart()) -console.log(str.trimLeft()) -console.log(str.trimRight()) -console.log(str.trimEnd()) -console.log(str.trim()) -``` - - - -### String - -1. 去除空格 - - `str.trimStart()` / `str.trimLeft()` : 去除起始的空格 - - `str.trimEnd()` / `str.trimRight()` : 去除末尾的空格 - - `str.trim()` : 去除首尾空格 -2. `str.matchAll(reg)` - - 获取所有匹配, 并生成可遍历集合 - -```js -// matchAll 匹配 -let str = `"foo" and "bar" and "baz"` - -// ES5 -function select (reg, str) { - const matches = [] - while (true) { - const match = reg.exec(str) - if (match === null) { - break - } - matches.push(match[1]) - } - return matches -} - -console.log(select(/"([^"]*)"/g, str)) -console.log(str.match(/"([^"]*)"/g)) - -// ES5 -function select2 (reg, str) { - const matches = [] - // replace 传入函数 - str.replace(reg, function (all, first) { - matches.push(first) - }) - return matches -} - -console.log(select2(/"([^"]*)"/g, str)) - -// ES10 -function select3 (reg, str) { - const matches = [] - for (const match of str.matchAll(reg)) { - // console.log(match) - matches.push(match[1]) - } - return matches -} -console.log(select3(/"([^"]*)"/g, str)) -``` - - - -### Object - -1. Object Array 相互转换 - - `Object.fromEntries` : 数组转换成对象 - - `Object.entries` : 转换成数组 - -```js -// Object Array 转换 -const arr = [['foo', 1], ['bar', 2]] -console.log(arr[1][1]) - -const obj = Object.fromEntries(arr) -console.log(obj.bar) - -// 案例2 -const obj2 = { - a: 1, - b: 2, - g: 3 -} -// 对象使用数组方法: Object.entries转换成数组, 解构赋值并过滤, Object.fromEntries转换回对象 -let res = Object.fromEntries( - Object.entries(obj).filter(([key, val]) => key.length === 3) -) -console.log(res) -``` - - - -### Try Catch 函数增强 - -- 可以省略 `catch` 后面 `(e)` - -```js -// ES5 -try { - -} catch (e) { - -} - -// ES10 -try { - -} catch { - -} -``` - - - -### BigInt 数据类型 - -- BigInt 处理超过 2^53 的数字 -- 在数字后面加 `n` , 就是 BigInt 类型 - -```js -// BigInt 处理超过 2^53 的数字 -// const a=11n -// console.log(typeof a) -// "bigint" -// ESlint 暂不支持 -``` - -- 练习 - - 1. 自己如何给 Array 实现一个 Flat 函数? - - ```js - - ``` - - - - 2. 利用 Object.fromEntries 把 url 的 search 部分返回一个 object - - ```js - - ``` - - - -# 第7章 ES新语法配合Vue实战 - - Vue是很多前端同学必用的框架,如何把原生语法在Vue项目里运用的活灵活现至关重要,心动不如行动,通过实例演示是最接地气的讲义 - -## 7-1 vue项目安装 - -```shell -npm install -g @vue/cli@3.11.0 - -## vue 安装快速原型开发工具 -npm install -g @vue/cli-service-global@3.12.0 -## nvm 切换 node 版本10.0 以上 - -## 安装 eslint-plugin-vue -npm install eslint-plugin-vue -D -``` - -### 配置Eslint - -```shell - vue create vue-lesson - # 默认安装 - cd vue-lesson - npm run serve - - # eslint 没有生效, 重新安装一遍 - npm install -g eslint - # 初始化 eslint - eslint --init - - # 配置选项: - # To check syntax, find problems, and enforce code style - # JavaScript modules(import/export) - # Vue.js - # Does your project use TyprScript(N) - # Browser - # Use a popular style guide - # Stabdard - # JavaScript - # Do you wan to upgrade(Y) - # Would you like to install them now with npm? (Y) - - # 确认 +eslint-config-standard 安装好 -``` - -### Proxy Mock Config - -```config -Proxy Mock Config -1. 创建 mock ⽬录 -mkdir mock -touch mock/user.json -编辑 user.json -{ -"code": 0, -"user": { -"name": "lilei", -"addr": "北京市海淀区" -} -} -2. 增加 vue 全局配置⽂件 -module.exports = { -devServer: { -proxy: { -'/user': { -target: 'http://localhost:8081', -pathRewrite: { -'/user': 'user.json' -} -}, -'/list': { -target: 'http://localhost:8081', -pathRewrite: { -'/list': 'list.json' -} -} -} -} -} -3. 重启服务 -npm run serve -``` - -### vscode Eslint 配置文件 - -```config -.vscode/settings.json: -{ -"eslint.autoFixOnSave": true, -"prettier.eslintIntegration": true, -"prettier.semi": false, -"prettier.singleQuote": true, -"javascript.format.insertSpaceBeforeFunctionParenthesis": true, -"vetur.format.defaultFormatter.html": "js-beautify-html", -"vetur.format.defaultFormatter.js": "vscode-typescript", -"vetur.format.defaultFormatterOptions": { -"js-beautify-html": { -"wrap_attributes": "force-aligned" -} -}, -"eslint.validate": [ -"javascript", -"html" -], -"eslint.options": { -"plugins": ["html"] -}, -"window.zoomLevel": 1, -"editor.formatOnSave": true, -"html.format.enable": false, -"html.format.indentHandlebars": true, -"html.format.preserveNewLines": true, -"workbench.sideBar.location": "left" -} -``` - -## 7-2 vue 指令 - -> 7-9 Directive_慕课⽹ -> coding.imooc.com/lesson/389.html -> -> ### Directive -> -> 在 Vue Dirctive 指令中,可以尽情的使⽤ ES6+ 相关知识,我们下⾯来看下: -> 创建指令⽂件 -> -> 1. 创建⽂件 -> cd src -> mkdir dirctive -> touch directive/make-red.js -> 2. 代码实现 -> 2.1 编写 make-red.js -> 在 ES5 的时候,⼤概是这么写的: -> import Vue from 'vue' -> Vue.directive('make-red', { -> inserted: function(el) { -> el.style.color = 'red' -> } -> }) -> 现在就可以这样简写了: -> import Vue from 'vue' -> Vue.directive('make-red', { -> inserted(el) { -> el.style.color = 'red' -> } -> }) -> 2.2 在 main.js 引⼊ make-red.js -> import Vue from 'vue' -> import App from './App.vue' -> import './directive/make-red' -> Vue.config.productionTip = false -> new Vue({ -> render: h => h(App), -> }).$mount('#app') -> 1/2 -> 2.3 在对应的 HelloWorld.vue 组件中增加指令 -> -> `

{{ msg }}

` -> -> 这样在浏览器中就可以看到效果了。 -> 阅读 -> -> 1. ⾃定义指令 - -## 7-3 异步操作 Promise - -```js - async mounted () { - // 解构赋值 async - const { data: { user, code } } = await axios.get('/user') - if (user && code === '0') { - console.log(user) - } - // axios.get('/user').then(({ data }) => { - // if (data && data.code === '0') { - // console.log(data.user) - // } - // }) - } -``` - - - -## 7-4 desctructing解构赋值 - -```vue -// list.vue - - - - - -``` - - - -## 7-5 字符串应用 - -```vue -
  • - {{item.name.trim()}}{{item.addr.trim()}} -
  • -``` - - - -## 7-6 代理 Proxy - -```vue - - - - - - -``` - - - -## 7-7 自定义遍历 - -```vue - - - - - - -``` - - - -# 第8章 构建环境 - - 浏览器没有全部兼容新语法,需要通过构建的方式把代码转换成浏览器兼容的代码,学会构建也是前端工程师能力提升的另一个标志 - -## 8-1 webpack - -> 本质上, webpack 是一个现代 JavaScript 应用程序的静态模块打包工具. 当 webpack 处理应用程序时, 他会在内部构建一个 依赖图(dependency graph) , 此依赖图会映射项目所需的每个模块, 并生成一个或多个 bundle(包). - -### 入口(entry) - -入口起点(entry point) 告诉 webpack 哪个是原始文件. 找到这个原始文件之后开始寻找依赖和各种资源, 根据这些包还有资源选择合适的 loader 进行处理. 这个入口是需要在 webpack 的配置文件 (webpack.config.js) 中来声明的: - -```js -module.exports = { - entry: './path/to/my/entry/file.js' -} -``` - -### 出口(output) - -所谓的出口(output) 是告诉 webpack 进过各种 loader 处理后的文件应该生成到哪个目录下, 也就是生成文件所在的地方. 同样, 需要显示的告诉 webpack 的配置文件 (webpack.config.js) : - -```js -const path = require('path'); - -module.exports = { - entry: './path/to/my/entry/file.js', - output: { - path: path.resolve(__dirname, 'dist'), - filename: 'my-first-webpack.bundle.js' - } -} -``` - -### loader - -构建的过程除了处理原生的 JavaScript , 还需要处理其他非 JavaScript 文件, 比如图片\CSS\ES6 等等. webpack loader 的作用就是提供一个机制保证所有的类型资源都可以采用对应的 loader 进行处理, 这样 webpack 就能完成更加复杂的构建过程. 这个 loader 也是需要在配置文件 (webpack.config.js) 中来定义的: - -```js -const path = require('path'); - -const config = { - output: { - filename: 'my-first-webpack.bundle.js' - }, - module: { - rules: [ - {test: /\.txt$/, use: 'raw-loader'} - ] - } -}; - -module.exports = config; -``` - -### 插件(plugins) - -> loader 被用于转换某些资源类型的模块, 而插件则可以用于执行范围更广的任务. 插件的范围包括打包\优化和压缩\重新定义环境中的变量. 插件接口功能及其强大, 可以用来处理各种各样的任务. - -想要使用一个插件, 你只需要 require() 它, 然后把它添加到 plugins 数组中. 多数产检可以通过选项(option)自定义. 你也可以在一个配置文件中因为不同目的而多次使用同一个插件, 这是需要通过使用 new 操作符来创建它的一个实例. - -```js -const path = require('webpack'); // 用于访问内置插件 -const HtmlwebpackPlugin = require('html-webpack-plugin'); // 通过npm安装 - -const config = { - module: { - rules: [ - {test: /\.txt$/, use: 'raw-loader'} - ] - }, - plugins: [ - new HtmlWebpackPlugin({template: './src/index.heml'}) - ] -}; - -module.exports = config; -``` - -### 模式 - -我们平时会存在两种状态: 开发模式\生产模式. 够贱的过程中也是需要的, 比如我们在开发环境需要快速的构建, 在生产环境需要构建一个符合线上环境的版本. 这样我们只要在配置文件中 (webpack.config.js) 简单的配置一下就可以达到目的. - -```js -module.exports = { - mode: 'producion' -}; -``` - -### 实例 - -```shell -mkdir webpack-test -cd webpack-test -npm init -npm install -g webpack-cli@3 -npm install -g webpack@4 -touch webpack.config.js -npm install -g http-server -``` - -参考 https://webpack.docschina.org/ - -```js -const path = require('path'); -const HtmlWebpackPlugin = require('html-webpack-plugin') - -module.exports = { - entry: './index.js', - output: { - path: path.resolve(__dirname, 'dist'), - filename: './index.min.js' - }, - mode: 'development', - // mode: 'production', - module: { - rules: [{ - test: /\.m?js$/, - exclude: /(node_modules|bower_components)/, - use: { - loader: 'babel-loader', - options: { - presets: ['@babel/preset-env'] - } - } - }] - }, - plugins: [ - new HtmlWebpackPlugin() - ] -}; -``` - -```js -let say = () => { - console.log('hello webpack'); -} -say() -``` - -## 8-2 babel - -> Babel 是一个工具链, 主要用于将 ECMAScript2015+ 版本的代码转换为向后兼容的 JavaScript 语法, 以便能够运行在当前和旧版本的浏览器后其它环境中. - -```js -// Babel 输入: ES2015 箭头函数 -[1,2,3].map((n)=>n+1) - -// Balbel 输出: ES5 语法实现的同等功能 -[1,2,3].map(function(){ - return n+1 -}) -``` - -### 工作原理 - -从上述代码可以看出 Babel 是从一种代码转换成另一种代码, 基本工作流程如下: - -![babel](https://segmentfault.com/img/remote/1460000019578481?w=1958&h=812) - -这个图表示了 Babel 首先是把原始的代码转换成抽象语法树(Abstract Syntax Tree, AST), 然后基于这个 AST 做转换, 每个转换被处理成插件的形式, 最后把 AST 还原成代码. 实际上, 我们应用起来不会这么麻烦, 只需要三步: 根据场景选择引用场景, 安装工具, 配置文件. - -### 安装工具 - -因为每个场景的安装方式不同, 我们选择 Webpack , 这是前段工程师必备技能之一. - -```shell -npm install --save-dev babel-loader @babel/core @babel/preset-env -``` - -安装成功之后, 要在 webpack.config.js 中进行简单开启 Babel: - -```js - module: { - rules: [{ - test: /\.m?js$/, - exclude: /(node_modules|bower_components)/, - use: { - loader: 'babel-loader', - options: { - presets: ['@babel/preset-env'] - } - } - }] - } -``` - -### 配置文件 - -我们知道 Babel 的工作原理是利用各种 plugin 对 AST 做转换, 上面的安装只是开启了 Babel , 还没有选择使用哪些 plugin , 接下来就是进行 plugin 的配置, 请在项目中创建 .babelrc 文件, 内容如下: - -```js -{ - "presets": ["@babel/preset-env"] -} -``` - -有的同学发现这个地方使用的不是 plugin 而是presets, 那么两者有什么关系呢? 一句话总结: presets 是 plugin 的集合. - -> Tips -> -> Windows 无法创建 . 开头的文件, 使用命令行工具创建, 如 gitbash. - -## 8-3 eslint - -> ESlint 最初是由 Nicholas C. Zakas 于2013年6月创建的开源项目. 它的目标是提供一个插件化\可组装的 JavaScript 和 JSX 检查工具. - -### 规则 - -首先 ESlint 是一个工具, 无论是常规的 JavaScript 项目还是 React\Vue 等项目, 都可以使用它进行代码检查并格式化. ESlint 对代码的检查都基于"规则", 这些规则可以使官方内置的也可以是开发者自定义的. 当然, 内置的规则还进行了分类, 比如 Variables 规则: - -每个规则会设置三个检查等级: - -- "off" 或 0 关闭规则 -- "warn" 或 1 开启规则, 使用警告级别的错误: warn(不会导致程序退出) -- "error" 或 2 开启规则, 使用错误级别的错误: error(当被触发的时候, 程序会退出) - -```js -{ - "rules": { - "eqeqeq": "off", - "curly": "error", - "quotes": ["error", "double"] - } -} -``` - -### 插件 - -ESlint 通过插件机制来拓展规则的建设, 也就是说用来定义规则的, 我们可以使用他人开发的插件也可以自己开发插件. - -插件的命名方式是: `eslint-plugin- plugin-name`, 比较流行的 ESLint 插件有 eslint-plugin-standard , eslint-plugin-vue, eslint-plugin-react, eslint-plugin-prettier, eslint-plugin-node. - -### 配置 - -ESLint 被设计为完全可配置的, 这意味着你可以关闭每一个规则而只运行基本语法验证, 或混合和匹配 ESLint 默认绑定的规则和你的自定义规则, 以让 ESLint 更适合你的项目. 有两种主要的方式来配置 ESLint : - -1. Configuration Comments : 使用 JavaScript 注释把配置信息直接嵌入到一个代码源文件中. -2. Configuration Files : 使用 JavaScript, Json, 或者 YAML 文件为整个目录(处理你的主目录) 和它的子目录指定配置信息. 可以配置一个独立的 .eslintrc.* 文件, 或者直接在 package.json 文件里的 eslintConfig 字段指定配置, ESLint 会查找和自动读取它们, 再者, 你可以在命令行运行时指定一个任意的配置文件. - -```js -{ - "parserOptions": { - "ecmaVersion": 6, - "sourceType": "module", - "ecmaFeatures": { - "jsx": true - } - }, - "rules": { - "semi": 2 - } -} -``` - - - -## 8-4 babel 文档 - -把 ES6 代码转换为 ES3/ES5 - -> https://www.npmjs.com/package/babel-loader -> -> webpack 4.x | babel-loader 8.x | babel 7.x - -```shell -npm install -D babel-loader @babel/core @babel/preset-env webpack -``` - -### Usage - -webpack documentation: [Loaders](https://webpack.js.org/loaders/) - -Within your webpack configuration object, you'll need to add the babel-loader to the list of modules, like so: - -```js -module: { - rules: [ - { - test: /\.m?js$/, - exclude: /(node_modules|bower_components)/, - use: { - loader: 'babel-loader', - options: { - presets: ['@babel/preset-env'] - } - } - } - ] -} -``` - -### Options - -See the `babel` [options](https://babeljs.io/docs/en/options). - -You can pass options to the loader by using the [`options`](https://webpack.js.org/configuration/module/#rule-options-rule-query) property: - -```js -module: { - rules: [ - { - test: /\.m?js$/, - exclude: /(node_modules|bower_components)/, - use: { - loader: 'babel-loader', - options: { - presets: ['@babel/preset-env'], - plugins: ['@babel/plugin-proposal-object-rest-spread'] - } - } - } - ] -} -``` - -This loader also supports the following loader-specific option: - -- `cacheDirectory`: Default `false`. When set, the given directory will be used to cache the results of the loader. Future webpack builds will attempt to read from the cache to avoid needing to run the potentially expensive Babel recompilation process on each run. If the value is set to `true` in options (`{cacheDirectory: true}`), the loader will use the default cache directory in `node_modules/.cache/babel-loader` or fallback to the default OS temporary file directory if no `node_modules` folder could be found in any root directory. -- `cacheIdentifier`: Default is a string composed by the `@babel/core`'s version, the `babel-loader`'s version, the contents of `.babelrc` file if it exists, and the value of the environment variable `BABEL_ENV` with a fallback to the `NODE_ENV` environment variable. This can be set to a custom value to force cache busting if the identifier changes. -- `cacheCompression`: Default `true`. When set, each Babel transform output will be compressed with Gzip. If you want to opt-out of cache compression, set it to `false` -- your project may benefit from this if it transpiles thousands of files. -- `customize`: Default `null`. The path of a module that exports a `custom` callback [like the one that you'd pass to `.custom()`](https://www.npmjs.com/package/babel-loader#customized-loader). Since you already have to make a new file to use this, it is recommended that you instead use `.custom` to create a wrapper loader. Only use this is you *must* continue using `babel-loader` directly, but still want to customize. - -## 附: Babel 的工作原理以及怎么写一个 Babel 插件 - -> https://cloud.tencent.com/developer/article/1520124 - -- Babel 是怎么工作的 - - [做与不做](javascript:;) -- Babel 编译的三个阶段 - - [解析(Parsing)](javascript:;) - - [转换(Transformation)](javascript:;) -- 如何编写一个 Babel 插件 - - [插件格式](javascript:;) - - [写一个简单的插件](javascript:;) - - [实现一个简单的按需打包功能](javascript:;) -- Babel 常用 API - - [@babel/core](javascript:;) - - [@babel/cli](javascript:;) - - [@babel/node](javascript:;) - - [babylon](javascript:;) - - [babel-traverse](javascript:;) - - [babel-types](javascript:;) - - [babel-generator](javascript:;) -- [总结](javascript:;) - -在前端圈子里,对于 Babel,大家肯定都比较熟悉了。如果哪天少了它,对于前端工程师来说肯定是个噩梦。Babel 的工作原理是怎样的可能了解的人就不太多了。 - -本文将主要介绍 Babel 的工作原理以及怎么写一个 Babel 插件。 - -### **Babel 是怎么工作的** - -`Babel` 是一个 `JavaScript` 编译器。 - -#### **做与不做** - -注意很重要的一点就是,`Babel` 只是转译新标准引入的语法,比如: - -- 箭头函数 -- let / const -- 解构 - -哪些在 Babel 范围外?对于新标准引入的全局变量、部分原生对象新增的原型链上的方法,Babel 表示超纲了。 - -- 全局变量 -- Promise -- Symbol -- WeakMap -- Set -- includes -- generator 函数 - -对于上面的这些 API,`Babel` 是不会转译的,需要引入 `polyfill` 来解决。 - -### **Babel 编译的三个阶段** - -Babel 的编译过程和大多数其他语言的编译器相似,可以分为三个阶段: - -- 解析(Parsing):将代码字符串解析成抽象语法树。 -- 转换(Transformation):对抽象语法树进行转换操作。 -- 生成(Code Generation): 根据变换后的抽象语法树再生成代码字符串。 - -![img](JavaScriptES6-10.assets/t81ye74b8w.png) - -为了理解 `Babel`,我们从最简单一句 `console` 命令下手 - -#### **解析(Parsing)** - -`Babel` 拿到源代码会把代码抽象出来,变成 `AST` (抽象语法树),学过编译原理的同学应该都听过这个词,全称是 **Abstract Syntax Tree**。 - -抽象语法树是源代码的抽象语法结构的树状表示,树上的每个节点都表示源代码中的一种结构,只所以说是抽象的,是因为抽象语法树并不会表示出真实语法出现的每一个细节,比如说,嵌套括号被隐含在树的结构中,并没有以节点的形式呈现,它们主要用于源代码的简单转换。 - -`console.log('zcy');` 的 AST 长这样: - -```javascript -{ - "type": "Program", - "body": [ - { - "type": "ExpressionStatement", - "expression": { - "type": "CallExpression", - "callee": { - "type": "MemberExpression", - "computed": false, - "object": { - "type": "Identifier", - "name": "console" - }, - "property": { - "type": "Identifier", - "name": "log" - } - }, - "arguments": [ - { - "type": "Literal", - "value": "zcy", - "raw": "'zcy'" - } - ] - } - } - ], - "sourceType": "script" -} -``` - -上面的 `AST` 描述了源代码的每个部分以及它们之间的关系。 - -##### **AST 是怎么来的?** - -整个解析过程分为两个步骤: - -- 分词:将整个代码字符串分割成语法单元数组 -- 语法分析:建立分析语法单元之间的关系 - -**分词** - -语法单元通俗点说就是代码中的最小单元,不能再被分割,就像原子是化学变化中的最小粒子一样。 - -`Javascript` 代码中的语法单元主要包括以下这么几种: - -- 关键字:`const`、 `let`、 `var` 等 -- 标识符:可能是一个变量,也可能是 if、else 这些关键字,又或者是 true、false 这些常量 -- 运算符 -- 数字 -- 空格 -- 注释:对于计算机来说,知道是这段代码是注释就行了,不关心其具体内容 - -其实分词说白了就是简单粗暴地对字符串一个个遍历。为了模拟分词的过程,写了一个简单的 Demo,仅仅适用于和上面一样的简单代码。Babel 的实现比这要复杂得多,但是思路大体上是相同的。对于一些好奇心比较强的同学,可以看下具体是怎么实现的,链接在文章底部。 - -```javascript -function tokenizer(input) { - const tokens = []; - const punctuators = [',', '.', '(', ')', '=', ';']; - - let current = 0; - while (current < input.length) { - - let char = input[current]; - - if (punctuators.indexOf(char) !== -1) { - - tokens.push({ - type: 'Punctuator', - value: char, - }); - current++; - continue; - } - // 检查空格,连续的空格放到一起 - let WHITESPACE = /\s/; - if (WHITESPACE.test(char)) { - current++; - continue; - } - - // 标识符是字母、$、_开始的 - if (/[a-zA-Z\$\_]/.test(char)) { - let value = ''; - - while(/[a-zA-Z0-9\$\_]/.test(char)) { - value += char; - char = input[++current]; - } - tokens.push({ type: 'Identifier', value }); - continue; - } - - // 数字从0-9开始,不止一位 - const NUMBERS = /[0-9]/; - if (NUMBERS.test(char)) { - let value = ''; - while (NUMBERS.test(char)) { - value += char; - char = input[++current]; - } - tokens.push({ type: 'Numeric', value }); - continue; - } - - // 处理字符串 - if (char === '"') { - let value = ''; - char = input[++current]; - - while (char !== '"') { - value += char; - char = input[++current]; - } - - char = input[++current]; - - tokens.push({ type: 'String', value }); - - continue; - } - // 最后遇到不认识到字符就抛个异常出来 - throw new TypeError('Unexpected charactor: ' + char); - } - - return tokens; -} - -const input = `console.log("zcy");` - -console.log(tokenizer(input)); -``` - -结果如下: - -```javascript -[ - { - "type" : "Identifier" , - "value" : "console" - }, - { - "type" : "Punctuator" , - "value" : "." - }, - { - "type" : "Identifier" , - "value" : "log" - }, - { - "type" : "Punctuator" , - "value" : "(" - }, - { - "type" : "String" , - "value" : "'zcy'" - }, - { - "type" : "Punctuator" , - "value" : ")" - }, - { - "type" : "Punctuator" , - "value" : ";" - } -] -``` - -**语法分析** - -语义分析则是将得到的词汇进行一个立体的组合,确定词语之间的关系。考虑到编程语言的各种从属关系的复杂性,语义分析的过程又是在遍历得到的语法单元组,相对而言就会变得更复杂。 - -简单来说语法分析是对语句和表达式识别,这是个递归过程,在解析中,`Babel` 会在解析每个语句和表达式的过程中设置一个暂存器,用来暂存当前读取到的语法单元,如果解析失败,就会返回之前的暂存点,再按照另一种方式进行解析,如果解析成功,则将暂存点销毁,不断重复以上操作,直到最后生成对应的语法树。 - -#### **转换(Transformation)** - -##### **Plugins** - -插件应用于 `babel` 的转译过程,尤其是第二个阶段 `Transformation`,如果这个阶段不使用任何插件,那么 `babel` 会原样输出代码。 - -##### **Presets** - -`Babel` 官方帮我们做了一些预设的插件集,称之为 `Preset`,这样我们只需要使用对应的 Preset 就可以了。每年每个 `Preset` 只编译当年批准的内容。而 `babel-preset-env` 相当于 ES2015 ,ES2016 ,ES2017 及最新版本。 - -##### **Plugin/Preset 路径** - -如果 Plugin 是通过 npm 安装,可以传入 Plugin 名字给 Babel,Babel 将检查它是否安装在 `node_modules` 中。 - -```javascript -"plugins": ["babel-plugin-myPlugin"] -``` - -也可以指定你的 Plugin/Preset 的相对或绝对路径。 - -```javascript -"plugins": ["./node_modules/asdf/plugin"] -``` - -##### **Plugin/Preset 排序** - -如果两次转译都访问相同的节点,则转译将按照 Plugin 或 Preset 的规则进行排序然后执行。 - -- Plugin 会运行在 Preset 之前。 -- Plugin 会从第一个开始顺序执行。 -- Preset 的顺序则刚好相反(从最后一个逆序执行)。 - -例如: - -```javascript -{ - "plugins": [ - "transform-decorators-legacy", - "transform-class-properties" - ] -} -``` - -将先执行 `transform-decorators-legacy` 再执行 `transform-class-properties` - -但 preset 是反向的 - -```javascript -{ - "presets": [ - "es2015", - "react", - "stage-2" - ] -} -``` - -会按以下顺序运行: `stage-2`, `react`, 最后 `es2015`。 - -那么问题来了,如果 `presets` 和 `plugins` 同时存在,那执行顺序又是怎样的呢?答案是先执行 `plugins` 的配置,再执行 `presets` 的配置。 - -所以以下代码的执行顺序为 - -1. @babel/plugin-proposal-decorators -2. @babel/plugin-proposal-class-properties -3. @babel/plugin-transform-runtime -4. @babel/preset-env - -```javascript -// .babelrc 文件 -{ - "presets": [ - [ - "@babel/preset-env" - ] - ], - "plugins": [ - ["@babel/plugin-proposal-decorators", { "legacy": true }], - ["@babel/plugin-proposal-class-properties", { "loose": true }], - "@babel/plugin-transform-runtime", - ] -} -``` - -##### - -##### **生成(Code Generation)** - -用 `babel-generator` 通过 AST 树生成 ES5 代码。 - -### **如何编写一个 Babel 插件** - -基础的东西讲了些,下面说下具体如何写插件,只做简单的介绍,感兴趣的同学可以看 `Babel` 官方的介绍。 - -#### **插件格式** - -先从一个接收了当前 `Babel` 对象作为参数的 `Function` 开始。 - -```javascript -export default function(babel) { - // plugin contents -} -``` - -我们经常会这样写 - -```javascript -export default function({ types: t }) { - // -} -``` - -接着返回一个对象,其 `visitor` 属性是这个插件的主要访问者。 - -```javascript -export default function({ types: t }) { - return { - visitor: { - // visitor contents - } - }; -}; -visitor` 中的每个函数接收 2 个参数:`path` 和 `state -export default function({ types: t }) { - return { - visitor: { - CallExpression(path, state) {} - } - }; -}; -``` - -#### **写一个简单的插件** - -我们先写一个简单的插件,把所有定义变量名为 `a` 的换成 `b` ,先看下 `var a = 1`的 AST - -```javascript -{ - "type": "Program", - "start": 0, - "end": 10, - "body": [ - { - "type": "VariableDeclaration", - "start": 0, - "end": 9, - "declarations": [ - { - "type": "VariableDeclarator", - "start": 4, - "end": 9, - "id": { - "type": "Identifier", - "start": 4, - "end": 5, - "name": "a" - }, - "init": { - "type": "Literal", - "start": 8, - "end": 9, - "value": 1, - "raw": "1" - } - } - ], - "kind": "var" - } - ], - "sourceType": "module" -} -``` - -从这里看,要找的节点类型就是 `VariableDeclarator` ,下面开始撸代码 - -```javascript -export default function({ types: t }) { - return { - visitor: { - VariableDeclarator(path, state) { - if (path.node.id.name == 'a') { - path.node.id = t.identifier('b') - } - } - } - } -} -``` - -我们要把 `id` 属性是 a 的替换成 b 就好了。但是这里不能直接 `path.node.id.name = 'b'` 。如果操作的是Object,就没问题,但是这里是 AST 语法树,所以想改变某个值,就是用对应的 AST 来替换,现在我们用新的标识符来替换这个属性。 - -最后测试一下 - -```javascript -import * as babel from '@babel/core'; -const c = `var a = 1`; - -const { code } = babel.transform(c, { - plugins: [ - function({ types: t }) { - return { - visitor: { - VariableDeclarator(path, state) { - if (path.node.id.name == 'a') { - path.node.id = t.identifier('b') - } - } - } - } - } - ] -}) - -console.log(code); // var b = 1 -``` - -#### **实现一个简单的按需打包功能** - -例如我们要实现把 `import { Button } from 'antd'` 转成 `import Button from 'antd/lib/button'` - -通过对比 AST 发现,`specifiers` 里的 `type` 和 `source` 不同。 - -```javascript -// import { Button } from 'antd' -"specifiers": [ - { - "type": "ImportSpecifier", - ... - } -] -// import Button from 'antd/lib/button' -"specifiers": [ - { - "type": "ImportDefaultSpecifier", - ... - } -] -import * as babel from '@babel/core'; -const c = `import { Button } from 'antd'`; - -const { code } = babel.transform(c, { - plugins: [ - function({ types: t }) { - return { - visitor: { - ImportDeclaration(path) { - const { node: { specifiers, source } } = path; - if (!t.isImportDefaultSpecifier(specifiers[0])) { // 对 specifiers 进行判断,是否默认倒入 - const newImport = specifiers.map(specifier => ( - t.importDeclaration( - [t.ImportDefaultSpecifier(specifier.local)], - t.stringLiteral(`${source.value}/lib/${specifier.local.name}`) - ) - )) - path.replaceWithMultiple(newImport) - } - } - } - } - } - ] -}) - -console.log(code); // import Button from "antd/lib/Button"; -``` - -当然 `babel-plugin-import` 这个插件是有配置项的,我们可以对代码做以下更改。 - -```javascript -export default function({ types: t }) { - return { - visitor: { - ImportDeclaration(path, { opts }) { - const { node: { specifiers, source } } = path; - if (source.value === opts.libraryName) { - // ... - } - } - } - } -} -``` - -至此,这个插件我们就编写完成了。 - -### **Babel 常用 API** - -#### **@babel/core** - -`Babel` 的编译器,核心 API 都在这里面,比如常见的 `transform`、`parse`。 - -#### **@babel/cli** - -`cli` 是命令行工具, 安装了 `@babel/cli` 就能够在命令行中使用 `babel` 命令来编译文件。当然我们一般不会用到,打包工具已经帮我们做好了。 - -#### **@babel/node** - -直接在 `node` 环境中,运行 ES6 的代码。 - -#### **babylon** - -`Babel` 的解析器。 - -#### **babel-traverse** - -用于对 AST 的遍历,维护了整棵树的状态,并且负责替换、移除和添加节点。 - -#### **babel-types** - -用于 AST 节点的 Lodash 式工具库, 它包含了构造、验证以及变换 AST 节点的方法,对编写处理 AST 逻辑非常有用。 - -#### **babel-generator** - -Babel 的代码生成器,它读取 AST 并将其转换为代码和源码映射(sourcemaps)。 - -### **总结** - -文章主要介绍 `Babel` 编译代码的过程和原理以及简单编写了一个 `babel` 插件,欢迎大家对内容进行指正和讨论。 - -本文分享自微信公众号 - 前端迷(love_frontend) - -原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。 - -原始发表时间:2019-10-09 - -本文参与[腾讯云自媒体分享计划](https://cloud.tencent.com/developer/support-plan),欢迎正在阅读的你也加入,一起分享。 - -发表于 2019-10-13 - -## 8-5 插件 文档 - -> https://www.npmjs.com/package/html-webpack-plugin - -### Install - -``` - npm i --save-dev html-webpack-plugin - yarn add --dev html-webpack-plugin -``` - -This is a [webpack](http://webpack.js.org/) plugin that simplifies creation of HTML files to serve your `webpack` bundles. This is especially useful for `webpack` bundles that include a hash in the filename which changes every compilation. You can either let the plugin generate an HTML file for you, supply your own template using `lodash` templates or use your own loader. - -#### `Plugins` - -The `html-webpack-plugin` provides [hooks](https://github.com/jantimon/html-webpack-plugin#events) to extend it to your needs. There are already some really powerful plugins which can be integrated with zero configuration - -- [webpack-subresource-integrity](https://www.npmjs.com/package/webpack-subresource-integrity) for enhanced asset security -- [appcache-webpack-plugin](https://github.com/lettertwo/appcache-webpack-plugin) for iOS and Android offline usage -- [favicons-webpack-plugin](https://github.com/jantimon/favicons-webpack-plugin) which generates favicons and icons for iOS, Android and desktop browsers -- [html-webpack-harddisk-plugin](https://github.com/jantimon/html-webpack-harddisk-plugin) can be used to always write to disk the html file, useful when webpack-dev-server / HMR are being used -- [html-webpack-inline-source-plugin](https://github.com/DustinJackson/html-webpack-inline-source-plugin) to inline your assets in the resulting HTML file -- [html-webpack-inline-svg-plugin](https://github.com/thegc/html-webpack-inline-svg-plugin) to inline SVGs in the resulting HTML file. -- [html-webpack-exclude-assets-plugin](https://github.com/jamesjieye/html-webpack-exclude-assets-plugin) for excluding assets using regular expressions -- [html-webpack-include-assets-plugin](https://github.com/jharris4/html-webpack-include-assets-plugin) for including lists of js or css file paths (such as those copied by the copy-webpack-plugin). -- [script-ext-html-webpack-plugin](https://github.com/numical/script-ext-html-webpack-plugin) to add `async`, `defer` or `module` attributes to your `` elements, or even inline them -- [style-ext-html-webpack-plugin](https://github.com/numical/style-ext-html-webpack-plugin) to convert your ``s to external stylesheets into `` elements containing internal CSS -- [resource-hints-webpack-plugin](https://github.com/jantimon/resource-hints-webpack-plugin) to add resource hints for faster initial page loads using `` and `` -- [preload-webpack-plugin](https://github.com/GoogleChrome/preload-webpack-plugin) for automatically wiring up asynchronous (and other types) of JavaScript chunks using `` helping with lazy-loading -- [link-media-html-webpack-plugin](https://github.com/yaycmyk/link-media-html-webpack-plugin) allows for injected stylesheet `` tags to have their media attribute set automatically; useful for providing specific desktop/mobile/print etc. stylesheets that the browser will conditionally download -- [inline-chunk-manifest-html-webpack-plugin](https://github.com/jouni-kantola/inline-chunk-manifest-html-webpack-plugin) for inlining webpack's chunk manifest. Default extracts manifest and inlines in `` -- [html-webpack-inline-style-plugin](https://github.com/djaax/html-webpack-inline-style-plugin) for inlining styles to HTML elements using [juice](https://github.com/Automattic/juice). Useful for email generation automatisation. -- [html-webpack-exclude-empty-assets-plugin](https://github.com/KnisterPeter/html-webpack-exclude-empty-assets-plugin) removes empty assets from being added to the html. This fixes some problems with extract-text-plugin with webpack 4. -- [webpack-concat-plugin](https://github.com/hxlniada/webpack-concat-plugin) for concat and uglify files that needn't to be webpack bundles(for legacy files) and inject to html-webpack-plugin. - -### Usage - -The plugin will generate an HTML5 file for you that includes all your `webpack` bundles in the body using `script` tags. Just add the plugin to your `webpack` config as follows: - -**webpack.config.js** - -``` -const HtmlWebpackPlugin = require('html-webpack-plugin') - -module.exports = { - entry: 'index.js', - output: { - path: __dirname + '/dist', - filename: 'index_bundle.js' - }, - plugins: [ - new HtmlWebpackPlugin() - ] -} -``` - -This will generate a file `dist/index.html` containing the following - -``` - - - - - Webpack App - - - - - -``` - -If you have multiple `webpack` entry points, they will all be included with `script` tags in the generated HTML. - -If you have any CSS assets in webpack's output (for example, CSS extracted with the [ExtractTextPlugin](https://github.com/webpack/extract-text-webpack-plugin)) then these will be included with `` tags in the HTML head. - -If you have plugins that make use of it, `html-webpack-plugin` should be ordered first before any of the integrated plugins. - -### Options - -You can pass a hash of configuration options to `html-webpack-plugin`. Allowed values are as follows - -| Name | Type | Default | Description | -| :----------------------------------------------------------: | :---------------------------: | :------------: | :----------------------------------------------------------- | -| **[`title`](https://www.npmjs.com/package/html-webpack-plugin#)** | `{String}` | `` | The title to use for the generated HTML document | -| **[`filename`](https://www.npmjs.com/package/html-webpack-plugin#)** | `{String}` | `'index.html'` | The file to write the HTML to. Defaults to `index.html`. You can specify a subdirectory here too (eg: `assets/admin.html`) | -| **[`template`](https://www.npmjs.com/package/html-webpack-plugin#)** | `{String}` | `` | `webpack` require path to the template. Please see the [docs](https://github.com/jantimon/html-webpack-plugin/blob/master/docs/template-option.md) for details | -| **[`templateParameters`](https://www.npmjs.com/package/html-webpack-plugin#)** | `{Boolean\|Object\|Function}` | `` | Allows to overwrite the parameters used in the template | -| **[`inject`](https://www.npmjs.com/package/html-webpack-plugin#)** | `{Boolean\|String}` | `true` | `true \|\| 'head' \|\| 'body' \|\| false` Inject all assets into the given `template` or `templateContent`. When passing `true` or `'body'` all javascript resources will be placed at the bottom of the body element. `'head'` will place the scripts in the head element | -| **[`favicon`](https://www.npmjs.com/package/html-webpack-plugin#)** | `{String}` | `` | Adds the given favicon path to the output HTML | -| **[`meta`](https://www.npmjs.com/package/html-webpack-plugin#)** | `{Object}` | `{}` | Allows to inject `meta`-tags. E.g. `meta: {viewport: 'width=device-width, initial-scale=1, shrink-to-fit=no'}` | -| **[`minify`](https://www.npmjs.com/package/html-webpack-plugin#)** | `{Boolean\|Object}` | `true` | Pass [html-minifier](https://github.com/kangax/html-minifier#options-quick-reference)'s options as object to minify the output | -| **[`hash`](https://www.npmjs.com/package/html-webpack-plugin#)** | `{Boolean}` | `false` | If `true` then append a unique `webpack` compilation hash to all included scripts and CSS files. This is useful for cache busting | -| **[`cache`](https://www.npmjs.com/package/html-webpack-plugin#)** | `{Boolean}` | `true` | Emit the file only if it was changed | -| **[`showErrors`](https://www.npmjs.com/package/html-webpack-plugin#)** | `{Boolean}` | `true` | Errors details will be written into the HTML page | -| **[`chunks`](https://www.npmjs.com/package/html-webpack-plugin#)** | `{?}` | `?` | Allows you to add only some chunks (e.g only the unit-test chunk) | -| **[`chunksSortMode`](https://www.npmjs.com/package/html-webpack-plugin#plugins)** | `{String\|Function}` | `auto` | Allows to control how chunks should be sorted before they are included to the HTML. Allowed values are `'none' \| 'auto' \| 'dependency' \| 'manual' \| {Function}` | -| **[`excludeChunks`](https://www.npmjs.com/package/html-webpack-plugin#)** | `{Array.}` | `` | Allows you to skip some chunks (e.g don't add the unit-test chunk) | -| **[`xhtml`](https://www.npmjs.com/package/html-webpack-plugin#)** | `{Boolean}` | `false` | If `true` render the `link` tags as self-closing (XHTML compliant) | - -Here's an example webpack config illustrating how to use these options - -**webpack.config.js** - -``` -{ - entry: 'index.js', - output: { - path: __dirname + '/dist', - filename: 'index_bundle.js' - }, - plugins: [ - new HtmlWebpackPlugin({ - title: 'My App', - filename: 'assets/admin.html' - }) - ] -} -``` - -#### `Generating Multiple HTML Files` - -To generate more than one HTML file, declare the plugin more than once in your plugins array - -**webpack.config.js** - -``` -{ - entry: 'index.js', - output: { - path: __dirname + '/dist', - filename: 'index_bundle.js' - }, - plugins: [ - new HtmlWebpackPlugin(), // Generates default index.html - new HtmlWebpackPlugin({ // Also generate a test.html - filename: 'test.html', - template: 'src/assets/test.html' - }) - ] -} -``` - -#### `Writing Your Own Templates` - -If the default generated HTML doesn't meet your needs you can supply your own template. The easiest way is to use the `template` option and pass a custom HTML file. The html-webpack-plugin will automatically inject all necessary CSS, JS, manifest and favicon files into the markup. - -``` -plugins: [ - new HtmlWebpackPlugin({ - title: 'Custom template', - // Load a custom template (lodash by default see the FAQ for details) - template: 'index.html' - }) -] -``` - -**index.html** - -``` - - - - - <%= htmlWebpackPlugin.options.title %> - - - - -``` - -If you already have a template loader, you can use it to parse the template. Please note that this will also happen if you specifiy the html-loader and use `.html` file as template. - -**webpack.config.js** - -``` -module: { - loaders: [ - { test: /\.hbs$/, loader: "handlebars" } - ] -}, -plugins: [ - new HtmlWebpackPlugin({ - title: 'Custom template using Handlebars', - template: 'index.hbs' - }) -] -``` - -You can use the `lodash` syntax out of the box. If the `inject` feature doesn't fit your needs and you want full control over the asset placement use the [default template](https://github.com/jaketrent/html-webpack-template/blob/86f285d5c790a6c15263f5cc50fd666d51f974fd/index.html) of the [html-webpack-template project](https://github.com/jaketrent/html-webpack-template) as a starting point for writing your own. - -The following variables are available in the template: - -- `htmlWebpackPlugin`: data specific to this plugin - - - `htmlWebpackPlugin.files`: a massaged representation of the `assetsByChunkName` attribute of webpack's [stats](https://github.com/webpack/docs/wiki/node.js-api#stats) object. It contains a mapping from entry point name to the bundle filename, eg: - - ``` - "htmlWebpackPlugin": { - "files": { - "css": [ "main.css" ], - "js": [ "assets/head_bundle.js", "assets/main_bundle.js"], - "chunks": { - "head": { - "entry": "assets/head_bundle.js", - "css": [ "main.css" ] - }, - "main": { - "entry": "assets/main_bundle.js", - "css": [] - }, - } - } - } - ``` - - If you've set a publicPath in your webpack config this will be reflected correctly in this assets hash. - - - `htmlWebpackPlugin.options`: the options hash that was passed to the plugin. In addition to the options actually used by this plugin, you can use this hash to pass arbitrary data through to your template. - -- `webpack`: the webpack [stats](https://github.com/webpack/docs/wiki/node.js-api#stats) object. Note that this is the stats object as it was at the time the HTML template was emitted and as such may not have the full set of stats that are available after the webpack run is complete. - -- `webpackConfig`: the webpack configuration that was used for this compilation. This can be used, for example, to get the `publicPath` (`webpackConfig.output.publicPath`). - -- `compilation`: the webpack [compilation](https://webpack.js.org/api/compilation/) object. This can be used, for example, to get the contents of processed assets and inline them directly in the page, through `compilation.assets[...].source()` (see [the inline template example](https://github.com/jantimon/html-webpack-plugin/blob/HEAD/examples/inline/template.jade)). - -#### `Filtering Chunks` - -To include only certain chunks you can limit the chunks being used - -**webpack.config.js** - -``` -plugins: [ - new HtmlWebpackPlugin({ - chunks: ['app'] - }) -] -``` - -It is also possible to exclude certain chunks by setting the `excludeChunks` option - -**webpack.config.js** - -``` -plugins: [ - new HtmlWebpackPlugin({ - excludeChunks: [ 'dev-helper' ] - }) -] -``` - -### `Events` - -To allow other [plugins](https://github.com/webpack/docs/wiki/plugins) to alter the HTML this plugin executes the following events: - -#### `Sync` - -- `html-webpack-plugin-alter-chunks` - -#### `Async` - -- `html-webpack-plugin-before-html-generation` -- `html-webpack-plugin-before-html-processing` -- `html-webpack-plugin-alter-asset-tags` -- `html-webpack-plugin-after-html-processing` -- `html-webpack-plugin-after-emit` - -Example implementation: [html-webpack-harddisk-plugin](https://github.com/jantimon/html-webpack-harddisk-plugin) - -**plugin.js** - -``` -function MyPlugin(options) { - // Configure your plugin with options... -} - -MyPlugin.prototype.apply = function (compiler) { - compiler.plugin('compilation', (compilation) => { - console.log('The compiler is starting a new compilation...'); - - compilation.plugin( - 'html-webpack-plugin-before-html-processing', - (data, cb) => { - data.html += 'The Magic Footer' - - cb(null, data) - } - ) - }) -} - -module.exports = MyPlugin -``` - -**webpack.config.js** - -``` -plugins: [ - new MyPlugin({ options: '' }) -] -``` - -Note that the callback must be passed the HtmlWebpackPluginData in order to pass this onto any other plugins listening on the same `html-webpack-plugin-before-html-processing` event - -# 第9章 课程总结 - - 对课程进行整体的回顾与总结。 - +〖课程介绍〗: + 应对更复杂的场景,提升自己的技术实力,优化臃肿的代码,都需要对打牢语法基础。本课涉及JavaScript ES6到10的语法教学,内容全面丰富,熟练掌握语法,很多依赖第三方库才能做到的事用原生JS寥寥几行代码就可迎刃而解。 + +〖课程目录〗: + +# 第1章 课程介绍与环境搭建 + + JS作为前端的立身之本,让大家了解学习这门课的必要性。考虑到很多同学刚刚接触前端或者对工程化方法不太了解,为了快速进入到学习状态,我们提供了极其简单的方式帮大家准备好学习环境。 + +## 1-1 课程导学 试看 + +### 怎么学? + +1. 一天后:体验乐趣 +2. 十天后:进入状态 +3. 一个月后:养成习惯 +4. 三个月后:收获知识 +5. 五个月后:形成思维习惯 + +### 课程内容 + +1. 快速搭建开发环境 +2. 学习语法 +3. 推荐阅读材料 +4. 练习题 +5. Vue 框架内实战 +6. 学习开发环境如何构建 + +### 适用人群 + +1. 拥有 JavaScript ES3 以上基础 +2. 会编程,有编程思维 +3. 有耐心 +4. 求上进 + +1-2 电子书位置 + +## 1-3 环境准备 + +环境准备 + +- 原理 + 1. ES6-10 :原生代码 + 2. Babel→Webpack :构建转换 + 3. ES5 :浏览器可以识别的代码 + +- 开发环境 + - Chrome和Node环境 + - 自动刷新 自动编译 + - 格式化编写代码 + +## 1-4 Node 安装 + +- Node 安装:`-v 12.2.0` + - npm + - npx + +## 1-5 初始化项目 + +初始化项目 + +``` +npx es10-cli create projectName // 创建模板文件命令 +``` + +启动项目 + +``` +cd projectName +npm install +npm start +touch static/lesson2-1.js // 新建文件命令 +``` + +## 1-6 编辑器配置 + +VS code 插件 beautify 和 ESLint + +1. 课程框架框架运行逻辑: + + 1. `package.json` 运行`npm start` + + ```json + "scripts": { + "babel": "babel-node app.js", + "start": "nodemon --exec npm run babel", + "webpack": "webpack -w" + } + ``` + + 2. `app.js` + + 3. `routes/user.js` + + 4. `index.min.js` + + 5. `js/index.js` + + 6. `lesson2-1.js` + +2. 修改`js/index.js` 内 `import './lesson2-1'` 代码实现更换课程项目代码。 + + + +# 第2章 ES6基础知识 + + ES6语法相对于ES5有了非常大的改变,让原生 JavaScript 能力再上一个台阶,这个章节会分门别类进行讲述,单纯讲语法既乏味也不利于记忆更不知道如何运用,我们以应用场景开场分别给出ES5和ES6两种不同的解决方案,循序渐进剖析语法... + +## Let & Const + +### 2-1 作用域(1) + +1. var 声明的全局变量相当于 window 的属性,但无法删除,属性可以删除 +2. 没有var 定义的变量是作为 window 的属性定义的,是全局属性 +3. 在函数内部没有 var 定义的变量是window 的属性,是全局属性 + +### 2-2 作用域(2) + +- 函数作用域 = 局部作用域 +- var 定义的变量会变量提升 +- let 定义的变量具有块状作用域 + +**this 与 动态作用域 的关系** + +- this 具有动态指向 + +**四种作用域** + +1. 全局作用域 +2. 函数作用域 +3. 块状作用域 ,配合 let 和 const 使用 +4. 动态作用域 + +### 2-3 什么是作用域 + +几乎所有编程语言就是在变量中储存值,并且能够读取和修改这些值。事实上在变量中储存和取出值得能力,给程序赋予了状态。 + +如果没有这样的概念,一个程序虽然可以执行一些任务,但是它们将会受到极大的限制而且不会非常有趣。 + +但是这些变量该储存在哪?又如何读取?为了完成这个目标需要制定一些规则,规则就是:作用域。 + +- #### 四种常见作用域类型: + + | 对象 | 类型 | + | -------- | ------------------------ | + | global | 全局作用域 | + | function | 函数作用域(局部作用域) | + | {} | 块状作用域 | + | this | 动态作用域 | + +- > 如果一个变量 或者其它表达式不在“当前得作用域”,那么JavaScript机制会继续沿着作用域链上查找直到找到全局作用域,通常是指沿着链式得作用域查找,而不能从父作用域引用子作用域中的变量和引用 + +### 2-4 let&const + +- let 声明的特点 + - 块状作用域 + - 不能用用全局变量的属性访问 + - 不能重复定义 + - 不会变量提升 +- const 声明的特点 + - **只能赋值一次** + - **初始化时一定要赋值** + - 块状作用域 + - 不能用用全局变量的属性访问 + - 不能重复定义 + - 不会变量提升 +- 阅读 + 1. 什么是作用域 + 2. JavaScript深入之词法作用域和动态作用域 + 3. 深入理解JS中声明提升、作用域(链)和 this 关键字 + +## 数组 - Array + +### 2-6 ES5中数组有多少种遍历的方法? + +他们有什么优势和缺点? + +1. for 循环 + +2. forEach :`arr.forEach(funciton (item) {console.log(item)})` + + > 不支持 `break` 和 `continue` + > + > return false 相当于 continue + > + > 隐式索引 + +3. every :`arr.every(funciton (item) {console.log(item)})` + + > 是否继续执行取决于函数返回值 true 、false + > + > 如果数组中检测到有一个元素不满足,则整个表达式返回 *false* ,且剩余的元素不会再进行检测。 + > + > 如果所有元素都满足条件,则返回 true。 + +4. some:依次执行数组的每个元素: + + > 如果有一个元素满足条件,则表达式返回*true* , 剩余的元素不会再执行检测。 + > + > 如果没有满足条件的元素,则返回false。 + +5. for in :`for ( let index in Object) {console.log(Object[index])}` + + > 为对象设计的,数组的属性和下标作为字符串遍历 + > + > 支持 continue 和 break + +### 2-7 ES6中数组有多少种遍历的方法? + +1. for of :`for (let item of arr) { console.log(item)}` + + > 不仅可以遍历数组和对象 + > + > 可以遍历自定义数据结构 + +2. map() + + > map() 方法返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值。 + > + > map() 方法按照原始数组元素顺序依次处理元素。 + > + > 这种方式也是用的比较广泛的,虽然用起来比较优雅,但实际效率还比不上foreach + +### 2-8 Array.from(如何将伪数组转换成数组?) + +**ES5** + +```js +let args = [].slice.call(arguments) // collection +let imgs = [].slice.call(doncument.querySelectorAll('img')) // NodeList +``` + +**ES6** + +- `Array.from(arrayLike, mapFn, thisArg)` + + > ES6 新增方法,专门转换伪数组到数组,也可用于生成数组 + +```js +Array.prototype.from // ES6 新增方法 +Array.from(arrayLike, mapFn, thisArg) // 语法 伪数组,函数返回值,this指向 +let args = Array.from(arguments) +``` + +**什么叫伪数组** + +1. 按照索引方式存储数据 +2. 具有 length 属性 + +```js +let array = Array.from({ length: 5}, function () { return 1}) +``` + + + +### 2-9 Array.of-fill(如何生成新数组?) + +ES6 新方法 + +- Array(5) :初始化长度为5的数组 +- new Array(1,2,3):初始化数组,同时生成数据 + +- Array.of(1,2,3):初始化数组,同时生成数据 +- Array.fill(value,start,end):填充数据 + +```js +// Array.prototype.of +let array = Array.of(1,4,5,2,67) + +// Array.prototype.fill +let array = Array(10).fill(1) + +Array.fill(value,start,end) // 语法 填充值,起始位,截止值。 默认填充所有元素 +console.log(array.fill(9, 5, 8)) +``` + + + +### 2-10 Find&FindIndex(如何查找数组?) + +- array.filter(fn):ES5,返回符合fn 条件的所有值,没有则为空 + +- Array.find(fn):ES6,查找数组中符合fn 条件的第一个值,并返回,没有则为 undefined +- Array.findIndex():ES6,返回位置,未找到则-1 + +```js +let array = Array.of(1, 4, 5, 2, 67) +let find = array.filter(function (item) { + return item % 2 === 0 +}) +// 查找下标 +let find = array.findIndex(function (item) { + return item === 0 +}) +console.log(find); +``` + + + +## Class Update + +### 2-12 Class基础语法(怎么声明一个类?) + +ES5中怎么声明一个类 + +- ```JS + let Animal = function (type) { + this.type = type + } + + Animal.prototype.eat = function () { + console.log('you are eatting food hello'); + } + let dog = new Animal('food') + let cat = new Animal('fish') + + console.log(dog) + console.log(cat) + + // 修改实例对象原型链上的方法 + cat.constructor.prototype.eat = function () { + console.log('error') + } + dog.eat() + cat.eat() + ``` + + + +ES6中声明一个类 + +- ```JS + class Animal { + constructor(type) { + this.type = type + } + eat() { + console.log('i am food') + } + } + + let dog = new Animal('food') + let cat = new Animal('fish') + + console.log(dog) + console.log(cat) + + // 修改实例对象原型链上的方法 + cat.constructor.prototype.eat = function () { + console.log('error') + } + dog.eat() + cat.eat() + + console.log(typeof Animal); + ``` + + + +### 2-13 Setter&Getter(如何读写属性?) + +ES6:set 和 get + +- 可以把属性写成函数,调用时先运行函数 + +```JS +let _age = 4 +class Animal { + constructor(type) { + this.type = type + } + get age() { + return _age + } + set age(val) { + if (val < 7 && val > 4) { + _age = val + } else { + console.log("err") + } + } + eat() { + console.log('i am food') + } +} +let dog = new Animal +dog.age = 52 +console.log(dog.age) +``` + + + +### 2-14 Static Methods(如何操作方法?) + +对象实例的方法和类的静态方法 + +```JS +// ES5 +let Animal2 = function (type) { + this.type = type +} +Animal2.prototype.eat = function () { + Animal2.walk() + console.log('you are eatting food hello'); +} +Animal2.walk = function () { + console.log('i am walking'); +} +let dog = new Animal2('dog') +dog.eat() +``` + + + +- static 与实例对象隔离,拿不到实例对象 + +```JS +// ES6 专有语法定义静态方法 +class Animal { + constructor(type) { + this.type = type + } + eat() { + Animal.walk() + console.log('i am food') + } + static walk() { + console.log('i am flying'); + } +} +let dog = new Animal('dog') +dog.eat() +``` + +什么时候用实例对象的方法,什么时候用类的静态方法? + +- 方法依赖于实例对象的属性或方法,要引用实例对象的信息时必须使用实例对象的方法 +- 方法不会涉及实例对象的属性或方法,可以用类的静态方法 + +### 2-15 Sub Classes(如何继承一个类?) + +ES5继承的一种方法 + +```JS +let Animal = function (type) { + this.type = type +} +Animal.prototype.eat = function () { + Animal.walk() + console.log('you are eatting food hello'); +} +Animal.walk = function () { + console.log('i am walking'); +} + +let Dog = function (type) { + // 初始化父类的构造函数 + Animal.call(this, type) + this.run = function () { + console.log('runnig'); + } +} +Dog.prototype = Animal.prototype + +let dog = new Dog('dog') +dog.run() +dog.eat() +console.log(dog.type); +``` + + + +ES6中如何继承 extends + +```JS +class Animal { + constructor(type) { + this.type = type + } + eat() { + Animal.walk() + console.log('i am food') + } + static walk() { + console.log('i am flying'); + } +} +class Dog extends Animal { + constructor(type) { + super(type) + this.age = 2 + } +} +let dog = new Dog('dog') +dog.eat() +``` + + + +## Function Update + +- 函数参数升级,参数支持表达式、默认参数、不确定参数 + +### 2-17 Default Parameters(函数参数的默认值) + +ES5 + +```JS +function fn(x, y, z) { + if (y === undefined) { + y = 3 + } + if (z === undefined) { + z = 4 + } + return x + y + z +} +console.log(fn(2, 10, 30)) +``` + + + +ES6 + +```js +// 没有参数的往前写,否则默认没参数的为字符串类型 +function fn(x, y, z = x + y) { + // ES6中废弃arguments + // console.log(Array.from(arguments)) + // fn.length 可以获取到定义过的没有默认值的参数个数 + console.log(fn.length) + + return x + y + z +} +console.log(fn(10, 10, 10)) +console.log(fn(10, 10, undefined), 4, 12) +``` + + + +### 2-18 Rest Parameter(怎么处理不确定参数?) + +ES5 + +```JS +ES5 +function sum() { + let num = 0 + Array.prototype.forEach.call(arguments, function (item) { + num += item * 1 + }) + return num +} +console.log(sum(1, 2, 3, 4)) + +``` + + + +ES6 + +```JS +// ES6 +function sum(base, ...nums) { + // "...nums" Rest parameter 用来获取所有参数:函数执行时的参数,是数组,参数可以分别使用 + let num = 0 + nums.forEach(function (item) { + num += item * 1 + }) + return num + base * 2 +} +console.log(sum(1, 2, 3, 4)) +``` + + + +### 2-19 Spread Operator(rest参数的逆运算) + +ES5 + +```JS +// rest参数的逆运算 +// ES5 +function sum (x = 1, y = 2, z = 3) { + return x + y + z +} +let data = [1, 2, 3] +console.log(sum.apply(this, data)) +``` + + + +ES6 + +```JS +function sum (x = 1, y = 2, z = 3) { + return x + y + z +} +let data = [1, 2, 3] +// ES6 +// spread +console.log(sum(...data)) +``` + + + +### 2-20 Arrow Functions(箭头函数) + +- ()=>{} + +```JS +let hello = (name, city) => { + console.log(name, 'hello', city) +} +hello('zhangsan', 'imooc') +// 只有一个参数省略括号 +let hi = name => { + console.log(name) +} +hi('zhangsan') +// 后面是表达式,省略花括号 +let sum = (x, y, z) => x + y + z +console.log(sum(1, 2, 3)) +// 以对象返回数据,小括号相当于表达式,花括号是对象的 +let sum2 = (x, y, z) => ({ + x: x, + y: y, + z: z +}) +console.log(sum2(1, 2, 3)) +// webpack eval 让 this 指向了空对象 +// ES6 中this 指向写函数时的对象 +let test = { + name: 'test', + say: () => { + console.log(this.name) + } +} +test.say() +``` + + + +## Object Update + +- Object 的 key 可以用变量或表达式,对象的方法支持异步 +- 语法:object[key] = value + +### 2-23 Set数据结构 + +- 元素可以是任意值:new Set([1, '2', 4]) +- .add(item) +- .delete(item) +- .clear() +- .size +- for of + +```JS +// set存储的数据是唯一的,重复数据会被过滤 +let s = new Set([1, '2', 4]) +s.add('hellos').add('hellos').add('hellos2') +s.delete('hellos') +// s.clear() +console.log(s.has('hellos2'), s.size) +console.log(s.values()) +console.log(s.keys()) +console.log(s.entries()) +s.forEach(item => { + console.log(item) +}) +for (let item of s) { + console.log(item) +} +``` + +- weakSet() + - 语法相同于set,但只能存储对象 + +### 2-24 Map数据结构 + +- 键值对可以是**任意值**:new Map([[1, 2], [2, 3]]) +- .set(key,value) +- .delete(key) +- .clear +- .size +- .has(key) +- .get(key) +- .keys() :键 +- .values() :值 +- .entries() :键值对 +- forEach((value,key)) :value 在前 +- for (let [key, value] of map) :按初始化顺序遍历 + +```JS +// map +let map = new Map([[1, 2], [2, 3]]) +// 添加 +map.set(3, 4) +// 修改 +map.set(1, 5) +// 删除 +map.delete(3) +// console.log(map.size) +// console.log(map.has(3)) +// console.log(map.get(2)) +// console.log(map.keys(), map.values(), map.entries()) +// map.forEach((value, key) => { +// console.log(value, key) +// }) +for (let [key, value] of map) { + console.log(key, value) +} +let o = function () { + console.log('o') +} +map.set(o, 9) +console.log(map.get(o)) +``` + +- weakMap() + - 语法相同于Map,但只能存储对象 + +### 2-25 Object.assign(对象拷贝) + +- 当对象中只有一级属性,没有二级属性的时候,此方法为深拷贝,但是对象中有对象的时候,此方法,在二级属性以后就是浅拷贝。 + +```JS +// object copy +const target = { + a: { + b: { + c: { + d: 4 + } + }, + e: 7 + }, + undefined: null +} +const source = { + a: { + b: { + c: { + null: null + } + } + }, + f: 2 +} +Object.assign(target, source) +console.log(target, 'source') +``` + + + +### 2-26 Object Property(存储数据) + +- 对象属性简写 + 1. 支持变量或表达式 + 2. 只能用常规函数 + 3. 异步函数名称前加 `*` + +```JS +let x = 1 +let y = 2 +let z = 8 +// ES5 +let obj = { + x: x, + y: y, + hello: function () { + console.log('hello ES5') + } +} +obj[z] = 3 +obj.hello() +console.log(obj) + +// ES6 对象属性简写 +let obj2 = { + x, + y, + [z + y]: 6, //支持变量或表达式 + hello () { + // 只能用常规函数 + // 异步函数名称前加 * , Generator + console.log('hello ES6') + } +} +obj2.hello() +console.log(obj2) +``` + + + +## RegExp Update + +### 2-27 Regexp Sticky(y修饰符) + +- sticky 粘连:从上次匹配完剩余字符串的第一位开始匹配,可以连续匹配 + +```JS +const s = 'a_aa_aaa_aa_a' +const r1 = /a+/g +const r2 = /a+/y +console.log(r1.exec(s)) +console.log(r2.exec(s)) +console.log(r1.exec(s)) +console.log(r2.exec(s)) +``` + + + +### 2-28 Regexp Unicode(u修饰符) + +- 处理 Unicode 字符的,**所有中文都加 u** + +```JS +// unicode u修饰符 大于 \uffff +let s = '𠮷' +let s2 = '\uD842\uDF87' + +console.log(/^\uD842/.test(s2)) +console.log(/^\uD842/u.test(s2)) // 无法匹配 + +console.log(/^.$/.test(s)) // 无法匹配 +console.log(/^.$/u.test(s)) // 正确匹配, 使用 "." 大于两个字节要加 u + +console.log(/^\u{20BB7}$/u.test(s)) +console.log(/^\u{61}$/u.test('a')) // 使用码点时,加 u 才能匹配 \u + +console.log(/𠮷{2}/u.test('𠮷𠮷')) // 加 u 才能匹配,所有中文都加 u + +console.log(/[a-z]/i.test('\u212A')) +console.log(/[a-z]/iu.test('\u212A')) +``` + + + +## Template 字符串模板 + +### 2-30 String(字符串拼接问题) + +- ES中字符串换行、包含变量或表达式、包含逻辑运算怎么办? + - ES6更优雅的便捷的方式 +- ${变量/表达式}:字符串模板 +- 函数处理字符串模板 + +```JS +let s1 = `我是第一行 +我是第二行` +console.log(s1) +``` + +```JS +function Price (strings, type) { + let s1 = strings[0] + const retailPrice = 20 + const wholeSalePrice = 16 + let showTxt = '' + if (type === 'retail') { + showTxt = '单价是:' + retailPrice + } else { + showTxt = '批发价是:' + wholeSalePrice + } + return `${s1}${showTxt}` +} +let showTxt = Price`您此次的${'retail'}` +console.log(showTxt) +``` + + + +## Desctructuring 解构赋值 + +- ES5 从一个复杂的数据结构中提取数据是如何做的? +- ES6 的方式 + +### 2-32 Array Destructure(解构赋值) + +1. 可以跳过赋值元素 +2. 赋值元素可以是任意可遍历对象 +3. 左边的变量还可以是对象的属性,不局限于变量 +4. 解构赋值在循环体中配合 entries 使用,map 对象也可以用 +5. rest 参数防止回收 + +```JS +let arr = ['hello', 'world', 'three'] +let [firstName, , surName] = arr +console.log(firstName, surName) + +let [firstName,, thirdName] = new Set([1, 2, 3, 4]) +console.log(firstName, thirdName) + +// 修改内容 +let user = { + name: 's', + surname: 't' +}; +[user.name, user.surname] = [1, 2] +console.log(user) +for (let [k, v] of Object.entries(user)) { + // 隐式赋值,显式索引 + console.log(k, v) +} + +// ...last 防止回收 +let arr = [1, 2, 3, 3, 4, 5, 6, 7] +let [firstName, curName, ...last] = arr +console.log(firstName, curName, last) + +// 无数据就是 未定义 +let arr = [] +// 解构赋值取决于里面有没有值 +let [firstName, curName, ...last] = arr +console.log(firstName, curName, last) + +``` + + + +### 2-34 Object Destructrue(解构赋值) + +- 变量用花括号,数据结构层层对应 + +```JS +// Object 的解构赋值 +let options = { + title: 'menu', + width: 100, + height: 200 +} +let { title: title2, width = 130, height } = options +let { title, ...last } = options +console.log(title, last) + +// 多层结构的解构赋值 +let options = { + size: { + width: 100, + height: 200 + }, + items: ['Cake', 'Donut'], + extra: true +} +let { size: { width, height }, items: [, item2], extra } = options +console.log(width, height, item2, extra) +``` + + + +## Promise 异步操作 + +### 2-36 Callback(异步操作) + +- 回调地狱 + +```JS +function loadScript (src, callback) { + let script = document.createElement('script') + script.src = src + script.onload = () => { + callback(src) + } + document.head.append(script) +} + +function test (name) { + console.log(name) +} +loadScript('./1.js', function (script) { + loadScript('./2.js', function (script) { + loadScript('./3.js', function (script) { + test('log') + }) + }) +}) + +``` + + + +### 2-37 Promise(异步操作) + +```JS +function loadScript (src) { + return new Promise((resolve, reject) => { + let script = document.createElement('script') + script.src = src + script.onload = () => resolve(src) // 状态:fullfilled, 结果: result + script.onerror = (err) => reject(err) // 状态:rejected,结果: error + document.head.appendChild(script) + }) +} + +loadScript('./1.js') + .then(loadScript('./2.js')) + .then(loadScript('./3.js')) +``` + +### 2-38 Then(异步操作) + +- `promise,then(onFullfilled,onRejected) // onFullfilled 必选` + 1. .then 是promise 对象原型上的**实例方法**,必须是promise 对象才能调用 + 2. then 支持两个函数类型参数, + 1. fullfilled 对应resolve 必选 + 2. rejected 对应reject,可选 + 3. 如果传入**空对象**,会返回一个空的 promise 对象 + 4. 参数函数里 return 一个 promise 对象,才能不返回空对象 + +```JS +function loadScript (src) { + // penging, undefined + return new Promise((resolve, reject) => { + let script = document.createElement('script') + script.src = src + script.onload = () => resolve(src) // 状态:fullfilled, 结果: result + script.onerror = (err) => reject(err) // 状态:rejected,结果: error + document.head.appendChild(script) + }) +} + +loadScript('./1.js') + .then(() => { + return loadScript('./4.js') + }, (err) => { + console.log(err) + }) + .then(() => { + return loadScript('./3.js') + }, (err) => { + console.log(err) + }) + +// promise,then(onFullfilled,onRejected) // onFullfilled 必选 +``` + + + +### 2-39 Resolve & Reject(异步操作) + +- Promise的**静态方法**,使用时必须 Promise.resolve 或 Promise.reject + +```js +function test (bool) { + if (bool) { + return new Promise(resolve => { + resolve(20) + }) + } else { + return Promise.reject(new Error('myError')) + } +} +test(0).then((value) => { + console.log(value) +}, (err) => { + console.log(err) +}) + +``` + + + +### 2-40 Catch(异步操作) + +- 捕获链式异步操作中的异常 +- .catch 是promise 对象的**实例方法**,必须是promise 对象才能调用 +- promise 状态改变时捕获,只能用reject 报错,不能用 throw new Error触发错误 + +```JS +function loadScript (src) { + // penging, undefined + return new Promise((resolve, reject) => { + let script = document.createElement('script') + script.src = src + script.onload = () => resolve(src) // 状态:fullfilled, 结果: result + script.onerror = (err) => reject(err) // 状态:rejected,结果: error + document.head.appendChild(script) + }) +} + +loadScript('./1.js') + .then(() => { + return loadScript('./2.js') + }) + .then(() => { + return loadScript('./30.js') + }) + .catch(err => { + console.log(err) + }) + +``` + + + +### 2-41 All(异步操作) + +- **静态方法** +- 并行异步操作,合并多个异步数据成一个 promise + +```JS +// All 操作 +function loadScript (src) { + // penging, undefined + return new Promise((resolve, reject) => { + let script = document.createElement('script') + script.src = src + script.onload = () => resolve(src) // 状态:fullfilled, 结果: result + script.onerror = (err) => reject(err) // 状态:rejected,结果: error + document.head.appendChild(script) + }) +} + +const p1 = loadScript('./2.js') +const p2 = loadScript('./1.js') +const p3 = loadScript('./3.js') +Promise.all([p2, p1, p3]).then((value) => { + console.log(value, 'log') +}) +``` + + + +### 2-42 Race(异步操作) + +- **静态方法** +- 只保留先返回的值 + +```JS +// race +const p1 = () => { + return new Promise((resolve, reject) => { + setTimeout(function () { + resolve(1) + }, 3000) + }) +} +const p2 = () => { + return new Promise((resolve, reject) => { + setTimeout(function () { + resolve(2) + }, 2000) + }) +} +Promise.race([p1(), p2()]).then((value) => { + console.log(value) +}) + +``` + + + +## Reflect 反射制 + +### 2-44 Reflect.apply(反射机制) + + Java 的反射机制是在编译阶段不知道是哪个类被加载 ,而是在运行的时候加载、执行 + +```js +console.log(Math.floor.apply(null, [3.111])) + +console.log(Reflect.apply(Math.floor, null, [2.33])) + +let price = 90.12 +console.log(Reflect.apply(price > 100 ? Math.floor : Math.ceil, null, [price])) +``` + + + +### 2-45 Reflect.construct(反射机制) + +- 动态实例化一个类 + +```js +let d = Reflect.construct(Date, []) +console.log(d.getTime(), d instanceof Date) +``` + +- `Reflect.defineProperty` 新增对象属性 + - 与 Object 区别在于返回值不同,Reflect 返回true/false,Object 返回对象 + - 所有具备反射机制的功能性函数都会放到Reflect 上面去 + - 将来Object 中可能会移除这些方法 +- `Reflect.get` 读取数据操作 + +```JS +const student = {} +const r2 = Object.defineProperty(student, 'name', { value: 'Mike' }) +// console.log(student) +const r = Reflect.defineProperty(student, 'name', { value: 'Mike2' }) +console.log(student, r, r2) + +const obj = { x: 1, y: 2 } +// Reflect.deleteProperty(obj, 'x') +console.log(obj) +console.log(Reflect.get(obj, 'y')) +console.log(Reflect.get([3, 4], 1)) +``` + + + +### 2-46 Reflect.getOwnPropertyDescriptor(反射机制) + +- 获取属性描述符 +- `Reflect.getPrototypeOf(obj)` :**获取实例对象的原型对象** +- `Reflect.has(obj, 'property')`:验证对象下面有没有这个属性,Object 没有这个方法 +- `Reflect.isExtensible(obj)`:是否可扩展,是否被冻结了 + - `Object.freeze(obj)`:冻结对象,不可扩展 +- `Reflect.ownKeys()`:返回对象的键 +- `Reflect.preventExtensions(obj) `:效果和 freeze 相同 +- `Reflect.set(obj,'z','1')` :设置数据 +- `Reflect.setPrototypeOf(obj,'type')` :**设置实例对象的原型对象** + +```js +const obj = { x: 1, y: 2 } +// console.log(Reflect.getOwnPropertyDescriptor(obj, 'x')) +// console.log(Object.getOwnPropertyDescriptor(obj, 'y')) + +// let d = new Date() +// console.log(Reflect.getPrototypeOf(d)) +// console.log(Object.getPrototypeOf(obj)) + +// console.log(Reflect.has(obj, 'y')) +// Object.freeze(obj) +// obj.z = 3 + +// console.log(Reflect.isExtensible(obj), obj) +// console.log(Reflect.ownKeys(obj)) +// console.log(Reflect.ownKeys([1, 2, 3])) +// Symbol + +// Reflect.preventExtensions(obj) // 效果和 freeze 相同 +// console.log(Reflect.isExtensible(obj)) + +Reflect.set(obj, 'z', 1) +console.log(obj) +const arr = ['a', 'w', 's'] +Reflect.set(arr, 3, 'oioo') +console.log(arr) + +console.log(Reflect.getPrototypeOf(arr)) +Reflect.setPrototypeOf(arr, String.prototype) +console.log(Reflect.getPrototypeOf(arr)) + +``` + + + +## Proxy 代理 + +### 2-48 proxy basic syntax(该怎样使用代理功能) + +- new Proxy(obj, data) + +```JS +// let o = { +// name: 'xiaoming', +// price: 190 +// } +// let d = new Proxy(o, { +// get (target, key) { +// if (key === 'price') { +// return target[key] + 20 +// } else { +// return target[key] +// } +// } +// }) +// console.log(d.price, d.name) + +let o = { + name: 'xiaoming', + price: 190 +} +let d = new Proxy(o, { + get (target, key) { + return target[key] + }, + set (target, key, value) { + return false + } +}) +d.price = 700 +console.log(d.price, d.name) + +// ES5 中完全禁止修改元素属性 +for (let [key] of Object.entries(o)) { + Object.defineProperty(o, key, { + writable: false + }) +} +o.price = 300 +console.log(o.name, o.price) +``` + + + +### 2-49 Schema Validation(1模式验证) + +```js +// 拦截 校验 +let o = { + name: 'xiaoming', + price: 190 +} +// 按功能模块化 +let validator = (target, key, value) => { + if (Reflect.has(target, key)) { + if (key === 'price') { + if (value > 300) { + return false + } else { + target[key] = value + } + } else { + target[key] = value + } + } else { + return false + } +} +let d = new Proxy(o, { + get (target, key) { + return target[key] || '' + }, + set: validator +}) +d.price = 320 +d.name = 'lisi' +d.age = 123 +console.log(d.price, d.name, d.age) +``` + + + +### 2-50 Schema Validation(2模式验证) + +```js +// 拦截 校验 +let o = { + name: 'xiaoming', + price: 190 +} +// 监听错误 +window.addEventListener('error', (e) => { + console.log(e.message) + // report('./') +}, true) +// 按功能模块化 +let validator = (target, key, value) => { + if (Reflect.has(target, key)) { + if (key === 'price') { + if (value > 300) { + // 不满足条件触发错误 + throw new TypeError('price exceed 300') + } else { + target[key] = value + } + } else { + target[key] = value + } + } else { + return false + } +} +let d = new Proxy(o, { + get (target, key) { + return target[key] || '' + }, + set: validator +}) +d.price = 320 +d.name = 'lisi' +d.age = 123 +console.log(d.price, d.name, d.age) +``` + + + +### 2-51 Schema Validation(3模式验证) + +```js +// 代理生成ID, 随机\唯一\只读 +class Component { + constructor () { + this.proxy = new Proxy({ + id: Math.random().toString(36).slice(-8) + }, {}) + } + get id () { + return this.proxy.id + } +} +let com = new Component() +let com2 = new Component() +for (let i = 0; i < 10; i++) { + console.log(com.id, com2.id) +} +com.id = 'abc' +console.log(com.id, com2.id) +``` + + + +### 2-52 Revocable Proxy (可撤销代理) + +```JS +// 可撤销代理 +let o = { + name: 'xiaoming', + price: 190 +} +let d = Proxy.revocable(o, { + get (target, key) { + if (key === 'price') { + return target[key] + 20 + } else { + return target[key] + } + } +}) +console.log(d) +console.log(d.proxy.price) +console.log(d.revoke) +setTimeout(function () { + d.revoke() + setTimeout(function () { + console.log(d.proxy.price) + }, 100) +}, 1000) +``` + +- 练习 + 1. 组件初始化的时候都赋值一个可读而且随机的 ID, 该怎么做? + 2. 临时代理有哪些应用场景呢? + 3. 如何把接口的数据用代理进行包装? + +## Generator 生成器 + +### 2-54 Generator(如何让遍历“停”下来) + +- ES6如何让遍历停下来? + +```JS +// ES5 +// function loop () { +// for (let i = 0; i < 5; i++) { +// console.log(i) +// } +// } +// loop() + +// ES6 +function * loop () { + for (let i = 0; i < 5; i++) { + yield console.log(i) + } +} +const l = loop() +l.next() +l.next() +l.next() +l.next() +l.next() +l.next() +``` + + + +### 2-55 Syntax(1语法) + +- `function * loop(){ yield console.log()}` +- 执行一步 : `const l=loop(); l.next()` +- `next()` 恢复执行 + - 返回当前执行的数据(value)和状态(done), value 当前是执行的结果, done 循环是否结束 + - yeild 前不加 `*`, next 返回当前遍历的值和循环是否结束 + - 加 `*` 后面是可迭代(遍历)对象, 也可以**嵌套 Generator 对象**, 会遍历后面内容 +- `yeild` 本身没有返回值 + +```js +// 语法 yeild 本身没有返回值 +// function * gen () { +// let val +// val = yield 1 +// console.log(val) +// } +// const l = gen() +// l.next() +// l.next() + +// next() 的返回值 +function * gen () { + let val + val = yield * 'as23' + console.log(val) +} +const l = gen() +console.log(l.next()) +console.log(l.next()) +``` + + + +### 2-56 Syntax(2语法) + +- `next()` 传参 + - 参数**改变** `yield` 后面表达式的返回值 + - 不传值 `yield` 后面表达式的返回值是 `undefined` +- `return()` 终止 + - 传值则改变 `yiled` 后面的表达式 `value = 参数` + - 不传值是 `undefined` + +```js +// next() 的返回值 +function * gen () { + let val + val = (yield [3, 2, 1]) + 9 + console.log(val) +} +const l = gen() +console.log(l.next(10)) +console.log(l.return()) +console.log(l.next(20)) +``` + +- 使用错误终止 `.throw(new Error('ss'))` + +```js +// 使用 new Error() 终止循环 +function * gen () { + while (true) { + try { + yield 1 + } catch (e) { + console.log(e.message) + } + } +} +const g = gen() +console.log(g.next()) +console.log(g.next()) +console.log(g.next()) +console.log(g.next()) +g.throw(new Error('ss')) +console.log(g.next()) +``` + + + +### 2-57 Scene Pratice(现场练习) + +- 练习-抽奖函数 + +```js +// // 练习-抽奖函数-ES5 +// function draw (first = 1, second = 3, third = 5) { +// let firstPrice = ['1A', '1B', '1C', '1D', '1E'] +// let secondPrice = ['3A', '2B', '2C', '2D', '2E', '2F', '2G', '2H', '2I', '2J', '2K'] +// let thirdPrice = ['3A', '3B', '3C', '3D', '3E', '3F', '3G', '3H', '3I', '3J', '3K', '3L', '3M', '3N'] +// let random +// let result = [] + +// // 抽一等奖 +// for (let i = 0; i < first; i++) { +// random = Math.floor(Math.random() * firstPrice.length) +// result = result.concat(firstPrice.splice(random, 1)) +// } +// // 抽二等奖 +// for (let i = 0; i < second; i++) { +// random = Math.floor(Math.random() * secondPrice.length) +// result = result.concat(secondPrice.splice(random, 1)) +// } +// // 抽三等奖 +// for (let i = 0; i < third; i++) { +// random = Math.floor(Math.random() * thirdPrice.length) +// result = result.concat(thirdPrice.splice(random, 1)) +// } +// return result +// } + +// let t = draw() +// for (let value of t) { +// console.log(value) +// } + +// 练习-抽奖函数-ES6 +function * draw (first = 1, second = 3, third = 5) { + let firstPrice = ['1A', '1B', '1C', '1D', '1E'] + let secondPrice = ['3A', '2B', '2C', '2D', '2E', '2F', '2G', '2H', '2I', '2J', '2K'] + let thirdPrice = ['3A', '3B', '3C', '3D', '3E', '3F', '3G', '3H', '3I', '3J', '3K', '3L', '3M', '3N'] + let count = 0 + let random + + while (true) { + if (count < first) { + random = Math.floor(Math.random() * firstPrice.length) + yield firstPrice[random] + count++ + firstPrice.splice(random, 1) + } else if (count < first + second) { + random = Math.floor(Math.random() * secondPrice.length) + yield secondPrice[random] + count++ + secondPrice.splice(random, 1) + } else if (count < first + second + third) { + random = Math.floor(Math.random() * thirdPrice.length) + yield thirdPrice[random] + count++ + thirdPrice.splice(random, 1) + } else { + return false + } + } +} +const d = draw() +console.log(d.next().value) +console.log(d.next().value) +console.log(d.next().value) +console.log(d.next().value) +console.log(d.next().value) +console.log(d.next().value) +console.log(d.next().value) +console.log(d.next().value) +console.log(d.next().value) +console.log(d.next().value) +``` + + + +- 练习-数到三的人喝酒 + +```JS +// 练习-数到三的人喝酒 +function * count (x = 1) { + while (true) { + if (x % 3 === 0) { + yield x + } + x++ + } +} +let num = count() +console.log(num.next().value) +console.log(num.next().value) +console.log(num.next().value) +``` + + + +- 练习 + + 1. 用 Generator 实现一个斐波那契数列 + + > 什么是斐波那契数列,1,1,2,3,5,8,13...这样一个数列就是斐波那契数列,求第n项的值。 + > + > **一、经典求法** + > + > 观察数列可得,除了第一项和第二项,所有的数列的值都是前一项和前一项的前一项的加和,转换成函数也就是f(n) = f(n-1) + f(n-2) + > + > 显然,递归n次,时间复杂度O(2^n),太恐怖,所以,必须优化。 + > + > **二、顺序求法** + > + > 因为斐波那契数列可以从左到右顺序的求出每一项的值,因此只需要顺序计算到n项即可,时间复杂度为O(n)的,我们可以把它看成在单链表的最后插入一个右最后一个和倒数第二个指针指向的值来决定的。 + + 2. 用 Generator 给自定义数据结构写一个遍历器 + + + +```js +// 用 Generator 实现一个斐波那契数列 1,1,2,3,5,8,13... +function * draw () { + let n1 = 1 + let n2 = 1 + let n3 = 0 + while (true) { + yield n3 = n1 + n2 + n1 = n2 + n2 = n3 + } +} +let d = draw() +console.log(d.next().value) +console.log(d.next().value) +console.log(d.next().value) +console.log(d.next().value) +console.log(d.next().value) +console.log(d.next().value) +``` + +### 附: Generator 是什么 + +> http://www.pianshen.com/article/3896191627/ + +**生成器(Generator)**对象是ES6中新增的语法,和Promise一样,都可以用来异步编程。但与Promise不同的是,它不是使用JS现有能力按照一定标准制定出来的,而是一种新型底层操作,async/await就是在它的基础上实现的。 + +generator对象是由generator function返回的,符合**可迭代协议**和**迭代器协议**。 + +generator function 可以在JS单线程的背景下,使JS的执行权与数据自由的游走在多个执行栈之间,实现协同开发编程,当项目调用generator function时,会在内部开辟一个单独的执行栈,在执行一个generator function 中,可以暂停执行,或去执行另一个generator function,而当前generator function并不会销毁,而是处于一种被暂停的状态,当执行权回来的时候,再继续执行。 + +![在这里插入图片描述](JavaScriptES6-10.assets/97a52475c433362e41ffb7cf6e9bd775-1580129648099.png) + +**可迭代协议**和**迭代器协议**都是ES6的补充 + +#### 迭代器(Iterator) + +顾名思义,所谓迭代器对象就是满足迭代器协议的对象。 + +> 迭代器协议 + +迭代器协议定义了一种标准的方式来产生一个有限或无限序列的值。使的迭代器对象拥有一个`next()`对象,并有以下含义: + +- next: 返回一个对象的无参函数,返回对象有两个属性: + - done(boolean) + - 如果迭代器已经经过了被迭代序列时为 true。这时value可能描述了该迭代器的返回值。 + - 如果迭代器可以产生序列中的下一个值,则为false。这等于说done属性不指定。 + - value + - 迭代器返回的任何 JavaScript 值。done为true时可省略。 + +#### 可迭代(Iterable) + +满足可迭代协议的对象就是可迭代对象。 + +**可迭代协议**:允许JS对象去定义或定制它们的迭代行为。 + +**可迭代对象**:该对象必须实现@@iterator方法,即这个对象或它原型链(prototype chain)上的某个对象必须有一个名字是Symbol.iterator的属性。 + +> Symbol.iterator:返回一个对象的无参函数,被返回对象符合迭代器协议 + +在ES6中,所有的集合对象(Array、Set与Map)以及String、TypedArray、arguments都是可迭代对象,它们都有默认的迭代器。 + +**当一个对象被迭代的时候,它的@@iterator方法被调用并且无参数,并返回一个值迭代器** + +- 扩展运算符 + + ```js + [...'abc'] // ["a", "b", "c"] + ...['a', 'b', 'c'] // ["a", "b", "c"] + 12 + ``` + +- yield* + + ```js + function* generator() { + yield* ['a', 'b', 'c'] + } + generator().next() // { value: "a", done: false } + 1234 + ``` + +- 解构赋值 + + ```js + let [a, b, c] = new Set(['a', 'b', 'c']) + a // 'a' + 12 + ``` + +#### 可迭代对象 + +这里以`for ...of`为例子,加深对可迭代对象的理解 + +`for...of`接受一个可迭代对象(Iterable),或者能强制转换/包装成一个可迭代对象的值(如’abc’)。遍历时,`for...of`会获取可迭代对象的`[Symbol.iterator]()`,对该迭代器逐次调用next(),直到迭代器返回对象的done属性为true时,遍历结束,不对该value处理。 + +#### 使迭代器可迭代 + +在**迭代器**部分我们定义了一个简单的迭代器函数`createIterator`,但是该函数生成的迭代器部分并没有实现可迭代协议,所以不能在`for...of`等语法中使用。需要为该对象实现可迭代协议, + +在`[Symbol.iterator]`函数中返回该迭代器自身。 + +```js +function createIterator(items) { + var i = 0 + return { + next: function () { + var done = (i >= items.length) + var value = !done ? items[i++] : undefined + return { + done: done, + value: value + } + } + [Symbol.iterator]: function () { + return this + } + } +} +var iterator = createIterator([1, 2, 3]) +...iterator // 1, 2, 3 +``` + + + +## Iterator 迭代器 + +### 2-59 Iterator(如何让不支持遍历的数据结构“可遍历”) + +- iterator 代码规范 + 1. 可迭代协议 : `authors[Symbol.iterator] = function () {}` + 2. 迭代器协议 : `函数内部规范` + +### 2-60 Iterator + +```js +let authors = { + allAuthors: { + fiction: ['Agla', 'Skks', 'Lp'], + scienceFiction: ['Neal', 'Arthru', 'Ribert'], + fantasy: ['J.R.Tole', 'J.M.R', 'Terry P.K'] + }, + Addres: [] +} + +// // ES5 +// let r = [] +// for (let [k, v] of Object.entries(authors.allAuthors)) { +// r = r.concat(v) +// } +// console.log(r) + +// authors is not iterable(迭代) +// ES6 +authors[Symbol.iterator] = function () { + let allAuthors = this.allAuthors + let keys = Reflect.ownKeys(allAuthors) + let values = [] + return { + next () { + if (!values.length) { + if (keys.length) { + values = allAuthors[keys[0]] + keys.shift() + } + } + return { + done: !values.length, + value: values.shift() + } + } + } +} +let r = [] +for (let v of authors) { + r.push(v) +} +console.log(r) +``` + + + +### 2-61 Generator + +```js +let authors = { + allAuthors: { + fiction: ['Agla', 'Skks', 'Lp'], + scienceFiction: ['Neal', 'Arthru', 'Ribert'], + fantasy: ['J.R.Tole', 'J.M.R', 'Terry P.K'] + }, + Addres: [] +} + +// 使用 Generator 给自定义数据结构写个遍历器 +authors[Symbol.iterator] = function * () { + let allAuthors = this.allAuthors + let keys = Reflect.ownKeys(allAuthors) + let values = [] + while (true) { + if (!values.length) { + if (keys.length) { + values = allAuthors[keys[0]] + keys.shift() + yield values.shift() + } else { + return false + } + } else { + yield values.shift() + } + } +} + +let r = [] +for (let v of authors) { + r.push(v) +} +console.log(r) +``` + + + +- 练习 + 1. 什么是自定义遍历,如果有复杂的数据结构会使用自定义遍历了吗 + 2. 什么是迭代协议\ 可迭代协议 + 3. Generator 和 Iterator 的关联关系理解了吗 + +## module + +### 2-63 Export Import(如何把代码进行模块化设计) + +```js +// lesson2-14-mod.js +// export const name = 'hello' +// export let addr = 'beijing' +// export let arr = [1, 2, 3] + +const name = 'hello3' +let addr = 'Beijing' +let arr = [1, 2, 3] + +export default name +export { + addr, + arr +} +``` + +```js +// lesson2-14.js +import name, { addr as addr2, arr } from './lesson2-14-mod' +console.log(name, addr2, arr) + +// import name2 from './lesson2-14-mod' +// console.log(name2) +``` + + + +### 2-64 Export Import(2) + +```js +导出函数 +export function say (content) { + console.log(content) +} + +export function run () { + console.log('I am running') +} + +const say = (content) => { + console.log(content) +} +const run = () => { + console.log('I am running') +} +export default say +export { + run +} + +导出对象 +export default { + code: 0, + message: 'success' +} + +const data = { + code: 1, + message: 'success' +} +const des = { + age: 20, + addr: 'Beijing' +} + +export default { + data, + des +} + +导出类 +class Test { + constructor () { + this.id = 2 + } +} +export default Test +export { + Test +} + +export default class Test { + constructor () { + this.id = 2 + } +} + +export default class { + constructor () { + this.id = 5 + } +} + +export class Test { + constructor () { + this.id = 2 + } +} +``` + + + +```js + // 导入函数 +import say, { run } from './lesson2-14-mod' +say('hello world') +run() + +导入对象 +import obj from './lesson2-14-mod' +let { data, des } = obj +console.log(data, des) + +导入类 +// import { Test } from './lesson2-14-mod' +import Test from './lesson2-14-mod' +let test = new Test() +console.log(test.id) +``` + + + +### 2-65 Export Import(3) + +```js +// 导出多个类,批量导入 +export class Test { + constructor () { + this.id = 6 + } +} +export class Animal { + constructor () { + this.name = 'dog' + } +} + +export default class Peiple { + constructor () { + this.id = 123 + } +} +``` + +```js +// 批量导入 +import * as Mod from './lesson2-14-mod' +let test = new Mod.Test() +console.log(test.id) +let animal = new Mod.Animal() +console.log(animal.name) +let people = new Mod.default() +console.log(people.id) +``` + + + +- 练习 + 1. 被导出的模块是否能在本模块中使用 + - 结果: 可以使用 + +```js +// 导入函数 +import { say, run } from './lesson2-14-mod' +say('hello world') +run() +// 导出函数 +export function say (content) { + console.log(content) + run() +} + +export function run () { + console.log('I am running') +} +``` + + + +# 第3章 ES7基础知识 + + ES7在ES6基础上新增了两项功能,一个是数组的 include 方法、一个是 Math.pow 的简写语法 + +## 3-1 includes + pow(数组中如何判断元素是否存在) + +```js +// 数组中如何判断元素是否存在 +const arr = [1, 2, 3] +console.log(arr.includes(4)) +``` + + + +## 3-2 Array.prototype.includes & Math.pow + +```js +// 指数运算 +console.log(Math.pow(2, 5)) +// 简写指数运算 +console.log(2 ** 5) +``` + + + +# 第4章 ES8基础知识 + +1. ES8在异步操作、Object、String能力上做了进一步增强,让代码编写更加效率 +2. Aysnc/Await & Object.values + +## 4-1 Async\Await(有没有比Promise更优雅的异步方式) + +- async + - 异步函数声明, 把函数返回值自动处理为promise对象 +- await + - 等待异步执行结束, 可以自动把后面返回值转换为promise对象 +- 必须成对使用, 是语法糖, 原理是Promise + +```js +// async function firstAsync () { +// return 27 +// // return Promise.resolve(28) +// } + +// firstAsync().then(val => { +// console.log(val) +// }) + +// console.log(firstAsync() instanceof Promise) + +// await 异步操作 +async function firstAsync () { + let promise = new Promise((resolve, reject) => { + setTimeout(function () { + resolve('now it is done') + }, 1000) + }) + console.log(await promise) + console.log(await Promise.resolve(48)) + console.log(2) + return Promise.resolve(28) +} + +firstAsync().then(val => { + console.log(val) +}) +``` + + + +## 4-2 Object keys.values.entries(新增对Object快速遍历的方法,了解下?) + +```js +let grade = { + 'lilei': 95, + 'hanmei': 97, + 'lisi': 99 +} + +// Iterator方式遍历 +// grade[Symbol.iterator] = function () { +// let All = this +// let keys = Reflect.ownKeys(grade) +// let values = [] +// // console.log(All, keys, '内部数据') +// return { +// next () { +// if (!values.length) { +// if (keys.length - 1) { +// values.push(All[keys[0]]) +// keys.shift() +// // console.log(values, values.length, All[keys[0]], keys, '内部') +// } +// } +// return { +// done: !values.length, +// value: values.shift() +// } +// } +// } +// } +// let result = [] +// for (let v of grade) { +// result.push(v) +// } +// console.log(result) + +// ES6方式遍历 +let r = [] +for (let [, v] of Object.entries(grade)) { + r.push(v) +} +console.log(r) + +// ES8方式 +console.log(Object.keys(grade)) +console.log(Object.values(grade)) +console.log(Object.entries(grade)) + +``` + + + +## 4-3 String Padding(对String补白的方式) + +- 前补 `i.toString().padStart(5, '*#')` +- 后补 `i.toString().padEnd(5, '*#')` + +```js +// for (let i = 1; i < 32; i++) { +// if (i < 10) { +// console.log(`0${i}`) +// } else { +// console.log(i) +// } +// } + +for (let i = 1; i < 32011; i += 100) { + // console.log(i.toString().padStart(5, '*#')) + console.log(i.toString().padEnd(5, '*#')) +} + +``` + + + +## 4-4 Object.getOwnDescriptor(如何获取Object数据的描述符) + +- `Object.defineProperty(data, 'Lima', { enumerable: false})` : 设置属性描述符 +- `Object.getOwnPropertyDescriptor(data, 'Lima')` : 查询一项 +- `Object.getOwnPropertyDescriptors(data)` : 查询所有 + +```js +const data = { + PortLand: '78/50', + Dublin: '88/53', + Lima: '32/54' +} + +Object.defineProperty(data, 'Lima', { + // 描述符 + enumerable: false +}) + +console.log(Object.keys(data)) +``` + + + +# 第5章 ES9基础知识 + + ES9主要解决了遍历中异步、异步的归一操作等问题、也提供了对象的拷贝、筛选功能并且提升了正则的处理能力 + +## 5-1 For await of(异步操作集合是如何遍历的) + +- 异步操作集合使用 + +```js +// 异步函数生成 +function Gen (time) { + return new Promise((resolve, reject) => { + setTimeout(function () { + resolve(time) + }, time) + }) +} + +// ES8 +// async function test () { +// let arr = [Gen(2000), Gen(100), Gen(3000)] +// for (let item of arr) { +// console.log(Date.now(), await item.then(console.log)) +// } +// } +// test() + +// ES9 异步操作遍历 +async function test () { + let arr = [Gen(2000), Gen(100), Gen(3000)] + for await (let item of arr) { + console.log(Date.now(), item) + } +} +test() +``` + + + +## 5-2 For await of(2) + +- 对异步自定义数据结构遍历 + +```js +// 对异步自定义数据结构遍历 +const obj = { + count: 0, + // 生成器 + Gen (time) { + return new Promise((resolve, reject) => { + setTimeout(function () { + resolve({ + done: false, + value: time + }) + }, time) + }) + }, + // 声明遍历方式,迭代器 + [Symbol.asyncIterator] () { + let self = this + return { + next () { + self.count++ + if (self.count < 4) { + return self.Gen(Math.random() * 1000) + } else { + return Promise.resolve({ + done: true, + value: '' + }) + } + } + } + } +} + +async function test () { + for await (let item of obj) { + console.log(Date.now(), item) + } +} +test() + +``` + + + +## 5-3 Promise.finally(Promise是如何“兜底”操作的) + +```js +// Promise 生成器 +function Gen (time) { + return new Promise((resolve, reject) => { + setTimeout(function () { + if (time < 500) { + reject(time) + } else { + resolve(time) + } + }, time) + }) +} +// 异步调用函数 无论成功还是失败都会执行 finally 的内容 +Gen(Math.random() * 1000) + .then(val => console.log('resolve', val)) + .catch(err => console.log('reject', err)) + .finally(() => { + console.log('finish') + }) + +``` + + + +## 5-4 Object.rest.spread(新增Object的Rest和Spread方法) + +```js +// // spread +// const input = { +// a: 1, +// b: 2 +// } + +// const test = { +// d: 5 +// } + +// const output = { +// // spread 扩展, 是深拷贝, 不是引用 +// ...input, +// ...test, +// c: 3 +// } + +// console.log(input, output) +// input.a = 4 +// console.log(input, output) + +// rest +const input = { + a: 1, + b: 2, + c: 3, + d: 4 +} + +const { a, b, ...rest } = input +console.log(a, b, rest) + +``` + + + +## 5-5 RegExp-dotAll + +- dotAll 增强 `.` 的匹配能力, 相当于加强版 +- 四字节字符, 行终止符(`\`) , `.` 无法匹配 + +```js +// 正则后面加 s 增强点的匹配能力 \ +// 四字节字符则加 u, ES6中已经讲过 +// console.log(/foo.bar/s.test('foo\nbar')) +// console.log(/foo.bar/.test('foo\nbar')) + +// 是否启用 dotAll 模式 +const re = /foo.bar/sgiu +console.log(re.dotAll) +// 查看修饰符 +console.log(re.flags) + +``` + + + +## 5-6 RegExp-named captured groups(命名分组捕获) + +```js +// 命名分组捕获 +// console.log('12-2019-06-07'.match(/(\d{4})-(\d{2})-(\d{2})/)) + +const t = '12-2019-06-07'.match(/(?\d{4})-(?\d{2})-(?\d{2})/) +// console.log(t[1]) +// console.log(t[2]) +// console.log(t[3]) +console.log(t) +console.log(t.groups.year, t.groups.mouth, t.groups.day) +``` + + + +## 5-7 RegExp-lookbehind assert(后行断言) + +```js +// 先行断言 +let test = 'hello world' +console.log(test.match(/hello(?=\sworld)/)) +// 后行断言 +console.log(test.match(/(?<=hello\s)world/)) + +``` + + + +- 练习 + + 1. 请把 `'$foo %foo foo'`字符串中前面是$符号的foo 替换成bar + + ```js + const re = /(?<=\$)foo/ + let str = '$foo %foo foo' + // console.log(re.test(str)) + str = str.replace(re, 'bar') + console.log(str) + ``` + + + + 2. 请提取 `'$1 is worth about ¥123'` + + ```js + const re2 = /(?<=\$)\d/ + let str2 = '$1 is worth about ¥123' + str2 = str2.match(re2) + console.log(str2) + ``` + + + +# 第6章 ES10基础知识 + + ES10虽然没有大幅的改动,JSON问题修复,数组(Array)、字符串(String)、对象(Object)、函数(function) 等能力进一步增强,同时新增的 BigInt 数据类型也格外引人注目 + +### JSON + +- `0xD800-0xDFFF` + - 字符无法编码成UTF-8, 而显示错误, 现在以非编码形式转义存在 + +### Array + +- `arr.flat()` : + - flat扁平化, 按照指定深度递归遍历数组, 合并成一个新数组, 默认深度1 +- `arr.map(item => item * 2)` : + - map 对每个元素进行遍历, 参数可以是函数 + - `arr.map(item => item * 2).flat()` +- `arr.flatMap(item => item * 2)` : + - flat 和 map 的合并 + +```js +// let arr = [1, [2, 3], [4, 5, [6, 7, [8, 9]]]] + +// flat扁平化, 按照指定深度递归遍历数组, 合并成一个新数组 +// console.log(arr.flat(3)) + +// map 对每个元素进行遍历 arr.map(item => item * 2) +arr.flatMap() +let arr = [[1], [2], [3]] +console.log(arr.map(item => item * 2).flat()) +console.log(arr.flatMap(item => item * 2)) + +// string 字符串 +let str = ' foo ' +// console.log(str.replace(/^\s+|\s+$/g, '_')) +console.log(str.trimStart()) +console.log(str.trimLeft()) +console.log(str.trimRight()) +console.log(str.trimEnd()) +console.log(str.trim()) +``` + + + +### String + +1. 去除空格 + - `str.trimStart()` / `str.trimLeft()` : 去除起始的空格 + - `str.trimEnd()` / `str.trimRight()` : 去除末尾的空格 + - `str.trim()` : 去除首尾空格 +2. `str.matchAll(reg)` + - 获取所有匹配, 并生成可遍历集合 + +```js +// matchAll 匹配 +let str = `"foo" and "bar" and "baz"` + +// ES5 +function select (reg, str) { + const matches = [] + while (true) { + const match = reg.exec(str) + if (match === null) { + break + } + matches.push(match[1]) + } + return matches +} + +console.log(select(/"([^"]*)"/g, str)) +console.log(str.match(/"([^"]*)"/g)) + +// ES5 +function select2 (reg, str) { + const matches = [] + // replace 传入函数 + str.replace(reg, function (all, first) { + matches.push(first) + }) + return matches +} + +console.log(select2(/"([^"]*)"/g, str)) + +// ES10 +function select3 (reg, str) { + const matches = [] + for (const match of str.matchAll(reg)) { + // console.log(match) + matches.push(match[1]) + } + return matches +} +console.log(select3(/"([^"]*)"/g, str)) +``` + + + +### Object + +1. Object Array 相互转换 + - `Object.fromEntries` : 数组转换成对象 + - `Object.entries` : 转换成数组 + +```js +// Object Array 转换 +const arr = [['foo', 1], ['bar', 2]] +console.log(arr[1][1]) + +const obj = Object.fromEntries(arr) +console.log(obj.bar) + +// 案例2 +const obj2 = { + a: 1, + b: 2, + g: 3 +} +// 对象使用数组方法: Object.entries转换成数组, 解构赋值并过滤, Object.fromEntries转换回对象 +let res = Object.fromEntries( + Object.entries(obj).filter(([key, val]) => key.length === 3) +) +console.log(res) +``` + + + +### Try Catch 函数增强 + +- 可以省略 `catch` 后面 `(e)` + +```js +// ES5 +try { + +} catch (e) { + +} + +// ES10 +try { + +} catch { + +} +``` + + + +### BigInt 数据类型 + +- BigInt 处理超过 2^53 的数字 +- 在数字后面加 `n` , 就是 BigInt 类型 + +```js +// BigInt 处理超过 2^53 的数字 +// const a=11n +// console.log(typeof a) +// "bigint" +// ESlint 暂不支持 +``` + +- 练习 + + 1. 自己如何给 Array 实现一个 Flat 函数? + + ```js + + ``` + + + + 2. 利用 Object.fromEntries 把 url 的 search 部分返回一个 object + + ```js + + ``` + + + +# 第7章 ES新语法配合Vue实战 + + Vue是很多前端同学必用的框架,如何把原生语法在Vue项目里运用的活灵活现至关重要,心动不如行动,通过实例演示是最接地气的讲义 + +## 7-1 vue项目安装 + +```shell +npm install -g @vue/cli@3.11.0 + +## vue 安装快速原型开发工具 +npm install -g @vue/cli-service-global@3.12.0 +## nvm 切换 node 版本10.0 以上 + +## 安装 eslint-plugin-vue +npm install eslint-plugin-vue -D +``` + +### 配置Eslint + +```shell + vue create vue-lesson + # 默认安装 + cd vue-lesson + npm run serve + + # eslint 没有生效, 重新安装一遍 + npm install -g eslint + # 初始化 eslint + eslint --init + + # 配置选项: + # To check syntax, find problems, and enforce code style + # JavaScript modules(import/export) + # Vue.js + # Does your project use TyprScript(N) + # Browser + # Use a popular style guide + # Stabdard + # JavaScript + # Do you wan to upgrade(Y) + # Would you like to install them now with npm? (Y) + + # 确认 +eslint-config-standard 安装好 +``` + +### Proxy Mock Config + +```config +Proxy Mock Config +1. 创建 mock ⽬录 +mkdir mock +touch mock/user.json +编辑 user.json +{ +"code": 0, +"user": { +"name": "lilei", +"addr": "北京市海淀区" +} +} +2. 增加 vue 全局配置⽂件 +module.exports = { +devServer: { +proxy: { +'/user': { +target: 'http://localhost:8081', +pathRewrite: { +'/user': 'user.json' +} +}, +'/list': { +target: 'http://localhost:8081', +pathRewrite: { +'/list': 'list.json' +} +} +} +} +} +3. 重启服务 +npm run serve +``` + +### vscode Eslint 配置文件 + +```config +.vscode/settings.json: +{ +"eslint.autoFixOnSave": true, +"prettier.eslintIntegration": true, +"prettier.semi": false, +"prettier.singleQuote": true, +"javascript.format.insertSpaceBeforeFunctionParenthesis": true, +"vetur.format.defaultFormatter.html": "js-beautify-html", +"vetur.format.defaultFormatter.js": "vscode-typescript", +"vetur.format.defaultFormatterOptions": { +"js-beautify-html": { +"wrap_attributes": "force-aligned" +} +}, +"eslint.validate": [ +"javascript", +"html" +], +"eslint.options": { +"plugins": ["html"] +}, +"window.zoomLevel": 1, +"editor.formatOnSave": true, +"html.format.enable": false, +"html.format.indentHandlebars": true, +"html.format.preserveNewLines": true, +"workbench.sideBar.location": "left" +} +``` + +## 7-2 vue 指令 + +> 7-9 Directive_慕课⽹ +> coding.imooc.com/lesson/389.html +> +> ### Directive +> +> 在 Vue Dirctive 指令中,可以尽情的使⽤ ES6+ 相关知识,我们下⾯来看下: +> 创建指令⽂件 +> +> 1. 创建⽂件 +> cd src +> mkdir dirctive +> touch directive/make-red.js +> 2. 代码实现 +> 2.1 编写 make-red.js +> 在 ES5 的时候,⼤概是这么写的: +> import Vue from 'vue' +> Vue.directive('make-red', { +> inserted: function(el) { +> el.style.color = 'red' +> } +> }) +> 现在就可以这样简写了: +> import Vue from 'vue' +> Vue.directive('make-red', { +> inserted(el) { +> el.style.color = 'red' +> } +> }) +> 2.2 在 main.js 引⼊ make-red.js +> import Vue from 'vue' +> import App from './App.vue' +> import './directive/make-red' +> Vue.config.productionTip = false +> new Vue({ +> render: h => h(App), +> }).$mount('#app') +> 1/2 +> 2.3 在对应的 HelloWorld.vue 组件中增加指令 +> +> `

    {{ msg }}

    ` +> +> 这样在浏览器中就可以看到效果了。 +> 阅读 +> +> 1. ⾃定义指令 + +## 7-3 异步操作 Promise + +```js + async mounted () { + // 解构赋值 async + const { data: { user, code } } = await axios.get('/user') + if (user && code === '0') { + console.log(user) + } + // axios.get('/user').then(({ data }) => { + // if (data && data.code === '0') { + // console.log(data.user) + // } + // }) + } +``` + + + +## 7-4 desctructing解构赋值 + +```vue +// list.vue + + + + + +``` + + + +## 7-5 字符串应用 + +```vue +
  • + {{item.name.trim()}}{{item.addr.trim()}} +
  • +``` + + + +## 7-6 代理 Proxy + +```vue + + + + + + +``` + + + +## 7-7 自定义遍历 + +```vue + + + + + + +``` + + + +# 第8章 构建环境 + +**建议直接看官网教程!有中文** https://webpack.docschina.org/ + + 浏览器没有全部兼容新语法,需要通过构建的方式把代码转换成浏览器兼容的代码,学会构建也是前端工程师能力提升的另一个标志 + +## 8-1 webpack + +> https://webpack.docschina.org/ +> +> 本质上, webpack 是一个现代 JavaScript 应用程序的静态模块打包工具. 当 webpack 处理应用程序时, 他会在内部构建一个 依赖图(dependency graph) , 此依赖图会映射项目所需的每个模块, 并生成一个或多个 bundle(包). + +**入口(entry)** + +入口起点(entry point) 告诉 webpack 哪个是原始文件. 找到这个原始文件之后开始寻找依赖和各种资源, 根据这些包还有资源选择合适的 loader 进行处理. 这个入口是需要在 webpack 的配置文件 (webpack.config.js) 中来声明的: + +```js +module.exports = { + entry: './path/to/my/entry/file.js' +} +``` + +**出口(output)** + +所谓的出口(output) 是告诉 webpack 进过各种 loader 处理后的文件应该生成到哪个目录下, 也就是生成文件所在的地方. 同样, 需要显示的告诉 webpack 的配置文件 (webpack.config.js) : + +```js +const path = require('path'); + +module.exports = { + entry: './path/to/my/entry/file.js', + output: { + path: path.resolve(__dirname, 'dist'), + filename: 'my-first-webpack.bundle.js' + } +} +``` + +**loader** + +构建的过程除了处理原生的 JavaScript , 还需要处理其他非 JavaScript 文件, 比如图片\CSS\ES6 等等. webpack loader 的作用就是提供一个机制保证所有的类型资源都可以采用对应的 loader 进行处理, 这样 webpack 就能完成更加复杂的构建过程. 这个 loader 也是需要在配置文件 (webpack.config.js) 中来定义的: + +在更高层面,在 webpack 的配置中,**loader** 有两个属性: + +1. `test` 属性,识别出哪些文件会被转换。 +2. `use` 属性,定义出在进行转换时,应该使用哪个 loader。 + +```js +const path = require('path'); + +const config = { + output: { + filename: 'my-first-webpack.bundle.js' + }, + module: { + rules: [ + {test: /\.txt$/, use: 'raw-loader'} + ] + } +}; + +module.exports = config; +``` + +**插件(plugins)** + +> loader 被用于转换某些资源类型的模块, 而插件则可以用于执行范围更广的任务. 插件的范围包括打包\优化和压缩\重新定义环境中的变量. 插件接口功能及其强大, 可以用来处理各种各样的任务. + +想要使用一个插件, 你只需要 require() 它, 然后把它添加到 plugins 数组中. 多数产检可以通过选项(option)自定义. 你也可以在一个配置文件中因为不同目的而多次使用同一个插件, 这是需要通过使用 new 操作符来创建它的一个实例. + +```js +const path = require('webpack'); // 用于访问内置插件 +const HtmlwebpackPlugin = require('html-webpack-plugin'); // 通过npm安装 + +const config = { + module: { + rules: [ + {test: /\.txt$/, use: 'raw-loader'} + ] + }, + plugins: [ + new HtmlWebpackPlugin({template: './src/index.heml'}) + ] +}; + +module.exports = config; +``` + +### 模式 + +我们平时会存在两种状态: 开发模式\生产模式。构建的过程中也是需要的, 比如我们在开发环境需要快速的构建, 在生产环境需要构建一个符合线上环境的版本. 这样我们只要在配置文件中 (webpack.config.js) 简单的配置一下就可以达到目的. + +```js +module.exports = { + mode: 'producion' +}; +``` + +### 实例 + +```shell +mkdir webpack-test +cd webpack-test +npm init +npm install -g webpack-cli@3 +npm install -g webpack@4 +touch webpack.config.js +npm install -g http-server +``` + +参考 https://webpack.docschina.org/ + +```js +const path = require('path'); +const HtmlWebpackPlugin = require('html-webpack-plugin') + +module.exports = { + entry: './index.js', + output: { + path: path.resolve(__dirname, 'dist'), + filename: './index.min.js' + }, + mode: 'development', + // mode: 'production', + module: { + rules: [{ + test: /\.m?js$/, + exclude: /(node_modules|bower_components)/, + use: { + loader: 'babel-loader', + options: { + presets: ['@babel/preset-env'] + } + } + }] + }, + plugins: [ + new HtmlWebpackPlugin() + ] +}; +``` + +```js +let say = () => { + console.log('hello webpack'); +} +say() +``` + +## 8-2 babel + +> Babel 是一个工具链, 主要用于将 ECMAScript2015+ 版本的代码转换为向后兼容的 JavaScript 语法, 以便能够运行在当前和旧版本的浏览器后其它环境中. + +```js +// Babel 输入: ES2015 箭头函数 +[1,2,3].map((n)=>n+1) + +// Balbel 输出: ES5 语法实现的同等功能 +[1,2,3].map(function(){ + return n+1 +}) +``` + +### 工作原理 + +从上述代码可以看出 Babel 是从一种代码转换成另一种代码, 基本工作流程如下: + +![babel](https://segmentfault.com/img/remote/1460000019578481?w=1958&h=812) + +这个图表示了 Babel 首先是把原始的代码转换成抽象语法树(Abstract Syntax Tree, AST), 然后基于这个 AST 做转换, 每个转换被处理成插件的形式, 最后把 AST 还原成代码. 实际上, 我们应用起来不会这么麻烦, 只需要三步: 根据场景选择引用场景, 安装工具, 配置文件. + +### 安装工具 + +因为每个场景的安装方式不同, 我们选择 Webpack , 这是前段工程师必备技能之一. + +```shell +npm install --save-dev babel-loader @babel/core @babel/preset-env +``` + +安装成功之后, 要在 webpack.config.js 中进行简单开启 Babel: + +```js + module: { + rules: [{ + test: /\.m?js$/, + exclude: /(node_modules|bower_components)/, + use: { + loader: 'babel-loader', + options: { + presets: ['@babel/preset-env'] + } + } + }] + } +``` + +### 配置文件 + +我们知道 Babel 的工作原理是利用各种 plugin 对 AST 做转换, 上面的安装只是开启了 Babel , 还没有选择使用哪些 plugin , 接下来就是进行 plugin 的配置, 请在项目中创建 .babelrc 文件, 内容如下: + +```js +{ + "presets": ["@babel/preset-env"] +} +``` + +有的同学发现这个地方使用的不是 plugin 而是presets, 那么两者有什么关系呢? 一句话总结: presets 是 plugin 的集合. + +> Tips +> +> Windows 无法创建 . 开头的文件, 使用命令行工具创建, 如 gitbash. + +## 8-3 eslint + +> ESlint 最初是由 Nicholas C. Zakas 于2013年6月创建的开源项目. 它的目标是提供一个插件化\可组装的 JavaScript 和 JSX 检查工具. + +### 规则 + +首先 ESlint 是一个工具, 无论是常规的 JavaScript 项目还是 React\Vue 等项目, 都可以使用它进行代码检查并格式化. ESlint 对代码的检查都基于"规则", 这些规则可以使官方内置的也可以是开发者自定义的. 当然, 内置的规则还进行了分类, 比如 Variables 规则: + +每个规则会设置三个检查等级: + +- "off" 或 0 关闭规则 +- "warn" 或 1 开启规则, 使用警告级别的错误: warn(不会导致程序退出) +- "error" 或 2 开启规则, 使用错误级别的错误: error(当被触发的时候, 程序会退出) + +```js +{ + "rules": { + "eqeqeq": "off", + "curly": "error", + "quotes": ["error", "double"] + } +} +``` + +### 插件 + +ESlint 通过插件机制来拓展规则的建设, 也就是说用来定义规则的, 我们可以使用他人开发的插件也可以自己开发插件. + +插件的命名方式是: `eslint-plugin- plugin-name`, 比较流行的 ESLint 插件有 eslint-plugin-standard , eslint-plugin-vue, eslint-plugin-react, eslint-plugin-prettier, eslint-plugin-node. + +### 配置 + +ESLint 被设计为完全可配置的, 这意味着你可以关闭每一个规则而只运行基本语法验证, 或混合和匹配 ESLint 默认绑定的规则和你的自定义规则, 以让 ESLint 更适合你的项目. 有两种主要的方式来配置 ESLint : + +1. Configuration Comments : 使用 JavaScript 注释把配置信息直接嵌入到一个代码源文件中. +2. Configuration Files : 使用 JavaScript, Json, 或者 YAML 文件为整个目录(处理你的主目录) 和它的子目录指定配置信息. 可以配置一个独立的 .eslintrc.* 文件, 或者直接在 package.json 文件里的 eslintConfig 字段指定配置, ESLint 会查找和自动读取它们, 再者, 你可以在命令行运行时指定一个任意的配置文件. + +```js +{ + "parserOptions": { + "ecmaVersion": 6, + "sourceType": "module", + "ecmaFeatures": { + "jsx": true + } + }, + "rules": { + "semi": 2 + } +} +``` + + + +## 8-4 babel 文档 + +把 ES6 代码转换为 ES3/ES5 + +> https://www.npmjs.com/package/babel-loader +> +> webpack 4.x | babel-loader 8.x | babel 7.x + +```shell +npm install -D babel-loader @babel/core @babel/preset-env webpack +``` + +### Usage + +webpack documentation: [Loaders](https://webpack.js.org/loaders/) + +Within your webpack configuration object, you'll need to add the babel-loader to the list of modules, like so: + +```js +module: { + rules: [ + { + test: /\.m?js$/, + exclude: /(node_modules|bower_components)/, + use: { + loader: 'babel-loader', + options: { + presets: ['@babel/preset-env'] + } + } + } + ] +} +``` + +### Options + +See the `babel` [options](https://babeljs.io/docs/en/options). + +You can pass options to the loader by using the [`options`](https://webpack.js.org/configuration/module/#rule-options-rule-query) property: + +```js +module: { + rules: [ + { + test: /\.m?js$/, + exclude: /(node_modules|bower_components)/, + use: { + loader: 'babel-loader', + options: { + presets: ['@babel/preset-env'], + plugins: ['@babel/plugin-proposal-object-rest-spread'] + } + } + } + ] +} +``` + +This loader also supports the following loader-specific option: + +- `cacheDirectory`: Default `false`. When set, the given directory will be used to cache the results of the loader. Future webpack builds will attempt to read from the cache to avoid needing to run the potentially expensive Babel recompilation process on each run. If the value is set to `true` in options (`{cacheDirectory: true}`), the loader will use the default cache directory in `node_modules/.cache/babel-loader` or fallback to the default OS temporary file directory if no `node_modules` folder could be found in any root directory. +- `cacheIdentifier`: Default is a string composed by the `@babel/core`'s version, the `babel-loader`'s version, the contents of `.babelrc` file if it exists, and the value of the environment variable `BABEL_ENV` with a fallback to the `NODE_ENV` environment variable. This can be set to a custom value to force cache busting if the identifier changes. +- `cacheCompression`: Default `true`. When set, each Babel transform output will be compressed with Gzip. If you want to opt-out of cache compression, set it to `false` -- your project may benefit from this if it transpiles thousands of files. +- `customize`: Default `null`. The path of a module that exports a `custom` callback [like the one that you'd pass to `.custom()`](https://www.npmjs.com/package/babel-loader#customized-loader). Since you already have to make a new file to use this, it is recommended that you instead use `.custom` to create a wrapper loader. Only use this is you *must* continue using `babel-loader` directly, but still want to customize. + +## 附: Babel 的工作原理以及怎么写一个 Babel 插件 + +> https://cloud.tencent.com/developer/article/1520124 + +- Babel 是怎么工作的 + - [做与不做](javascript:;) +- Babel 编译的三个阶段 + - [解析(Parsing)](javascript:;) + - [转换(Transformation)](javascript:;) +- 如何编写一个 Babel 插件 + - [插件格式](javascript:;) + - [写一个简单的插件](javascript:;) + - [实现一个简单的按需打包功能](javascript:;) +- Babel 常用 API + - [@babel/core](javascript:;) + - [@babel/cli](javascript:;) + - [@babel/node](javascript:;) + - [babylon](javascript:;) + - [babel-traverse](javascript:;) + - [babel-types](javascript:;) + - [babel-generator](javascript:;) +- [总结](javascript:;) + +在前端圈子里,对于 Babel,大家肯定都比较熟悉了。如果哪天少了它,对于前端工程师来说肯定是个噩梦。Babel 的工作原理是怎样的可能了解的人就不太多了。 + +本文将主要介绍 Babel 的工作原理以及怎么写一个 Babel 插件。 + +### **Babel 是怎么工作的** + +`Babel` 是一个 `JavaScript` 编译器。 + +#### **做与不做** + +注意很重要的一点就是,`Babel` 只是转译新标准引入的语法,比如: + +- 箭头函数 +- let / const +- 解构 + +哪些在 Babel 范围外?对于新标准引入的全局变量、部分原生对象新增的原型链上的方法,Babel 表示超纲了。 + +- 全局变量 +- Promise +- Symbol +- WeakMap +- Set +- includes +- generator 函数 + +对于上面的这些 API,`Babel` 是不会转译的,需要引入 `polyfill` 来解决。 + +### **Babel 编译的三个阶段** + +Babel 的编译过程和大多数其他语言的编译器相似,可以分为三个阶段: + +- 解析(Parsing):将代码字符串解析成抽象语法树。 +- 转换(Transformation):对抽象语法树进行转换操作。 +- 生成(Code Generation): 根据变换后的抽象语法树再生成代码字符串。 + +![img](JavaScriptES6-10.assets/t81ye74b8w.png) + +为了理解 `Babel`,我们从最简单一句 `console` 命令下手 + +#### **解析(Parsing)** + +`Babel` 拿到源代码会把代码抽象出来,变成 `AST` (抽象语法树),学过编译原理的同学应该都听过这个词,全称是 **Abstract Syntax Tree**。 + +抽象语法树是源代码的抽象语法结构的树状表示,树上的每个节点都表示源代码中的一种结构,只所以说是抽象的,是因为抽象语法树并不会表示出真实语法出现的每一个细节,比如说,嵌套括号被隐含在树的结构中,并没有以节点的形式呈现,它们主要用于源代码的简单转换。 + +`console.log('zcy');` 的 AST 长这样: + +```javascript +{ + "type": "Program", + "body": [ + { + "type": "ExpressionStatement", + "expression": { + "type": "CallExpression", + "callee": { + "type": "MemberExpression", + "computed": false, + "object": { + "type": "Identifier", + "name": "console" + }, + "property": { + "type": "Identifier", + "name": "log" + } + }, + "arguments": [ + { + "type": "Literal", + "value": "zcy", + "raw": "'zcy'" + } + ] + } + } + ], + "sourceType": "script" +} +``` + +上面的 `AST` 描述了源代码的每个部分以及它们之间的关系。 + +##### **AST 是怎么来的?** + +整个解析过程分为两个步骤: + +- 分词:将整个代码字符串分割成语法单元数组 +- 语法分析:建立分析语法单元之间的关系 + +**分词** + +语法单元通俗点说就是代码中的最小单元,不能再被分割,就像原子是化学变化中的最小粒子一样。 + +`Javascript` 代码中的语法单元主要包括以下这么几种: + +- 关键字:`const`、 `let`、 `var` 等 +- 标识符:可能是一个变量,也可能是 if、else 这些关键字,又或者是 true、false 这些常量 +- 运算符 +- 数字 +- 空格 +- 注释:对于计算机来说,知道是这段代码是注释就行了,不关心其具体内容 + +其实分词说白了就是简单粗暴地对字符串一个个遍历。为了模拟分词的过程,写了一个简单的 Demo,仅仅适用于和上面一样的简单代码。Babel 的实现比这要复杂得多,但是思路大体上是相同的。对于一些好奇心比较强的同学,可以看下具体是怎么实现的,链接在文章底部。 + +```javascript +function tokenizer(input) { + const tokens = []; + const punctuators = [',', '.', '(', ')', '=', ';']; + + let current = 0; + while (current < input.length) { + + let char = input[current]; + + if (punctuators.indexOf(char) !== -1) { + + tokens.push({ + type: 'Punctuator', + value: char, + }); + current++; + continue; + } + // 检查空格,连续的空格放到一起 + let WHITESPACE = /\s/; + if (WHITESPACE.test(char)) { + current++; + continue; + } + + // 标识符是字母、$、_开始的 + if (/[a-zA-Z\$\_]/.test(char)) { + let value = ''; + + while(/[a-zA-Z0-9\$\_]/.test(char)) { + value += char; + char = input[++current]; + } + tokens.push({ type: 'Identifier', value }); + continue; + } + + // 数字从0-9开始,不止一位 + const NUMBERS = /[0-9]/; + if (NUMBERS.test(char)) { + let value = ''; + while (NUMBERS.test(char)) { + value += char; + char = input[++current]; + } + tokens.push({ type: 'Numeric', value }); + continue; + } + + // 处理字符串 + if (char === '"') { + let value = ''; + char = input[++current]; + + while (char !== '"') { + value += char; + char = input[++current]; + } + + char = input[++current]; + + tokens.push({ type: 'String', value }); + + continue; + } + // 最后遇到不认识到字符就抛个异常出来 + throw new TypeError('Unexpected charactor: ' + char); + } + + return tokens; +} + +const input = `console.log("zcy");` + +console.log(tokenizer(input)); +``` + +结果如下: + +```javascript +[ + { + "type" : "Identifier" , + "value" : "console" + }, + { + "type" : "Punctuator" , + "value" : "." + }, + { + "type" : "Identifier" , + "value" : "log" + }, + { + "type" : "Punctuator" , + "value" : "(" + }, + { + "type" : "String" , + "value" : "'zcy'" + }, + { + "type" : "Punctuator" , + "value" : ")" + }, + { + "type" : "Punctuator" , + "value" : ";" + } +] +``` + +**语法分析** + +语义分析则是将得到的词汇进行一个立体的组合,确定词语之间的关系。考虑到编程语言的各种从属关系的复杂性,语义分析的过程又是在遍历得到的语法单元组,相对而言就会变得更复杂。 + +简单来说语法分析是对语句和表达式识别,这是个递归过程,在解析中,`Babel` 会在解析每个语句和表达式的过程中设置一个暂存器,用来暂存当前读取到的语法单元,如果解析失败,就会返回之前的暂存点,再按照另一种方式进行解析,如果解析成功,则将暂存点销毁,不断重复以上操作,直到最后生成对应的语法树。 + +#### **转换(Transformation)** + +##### **Plugins** + +插件应用于 `babel` 的转译过程,尤其是第二个阶段 `Transformation`,如果这个阶段不使用任何插件,那么 `babel` 会原样输出代码。 + +##### **Presets** + +`Babel` 官方帮我们做了一些预设的插件集,称之为 `Preset`,这样我们只需要使用对应的 Preset 就可以了。每年每个 `Preset` 只编译当年批准的内容。而 `babel-preset-env` 相当于 ES2015 ,ES2016 ,ES2017 及最新版本。 + +##### **Plugin/Preset 路径** + +如果 Plugin 是通过 npm 安装,可以传入 Plugin 名字给 Babel,Babel 将检查它是否安装在 `node_modules` 中。 + +```javascript +"plugins": ["babel-plugin-myPlugin"] +``` + +也可以指定你的 Plugin/Preset 的相对或绝对路径。 + +```javascript +"plugins": ["./node_modules/asdf/plugin"] +``` + +##### **Plugin/Preset 排序** + +如果两次转译都访问相同的节点,则转译将按照 Plugin 或 Preset 的规则进行排序然后执行。 + +- Plugin 会运行在 Preset 之前。 +- Plugin 会从第一个开始顺序执行。 +- Preset 的顺序则刚好相反(从最后一个逆序执行)。 + +例如: + +```javascript +{ + "plugins": [ + "transform-decorators-legacy", + "transform-class-properties" + ] +} +``` + +将先执行 `transform-decorators-legacy` 再执行 `transform-class-properties` + +但 preset 是反向的 + +```javascript +{ + "presets": [ + "es2015", + "react", + "stage-2" + ] +} +``` + +会按以下顺序运行: `stage-2`, `react`, 最后 `es2015`。 + +那么问题来了,如果 `presets` 和 `plugins` 同时存在,那执行顺序又是怎样的呢?答案是先执行 `plugins` 的配置,再执行 `presets` 的配置。 + +所以以下代码的执行顺序为 + +1. @babel/plugin-proposal-decorators +2. @babel/plugin-proposal-class-properties +3. @babel/plugin-transform-runtime +4. @babel/preset-env + +```javascript +// .babelrc 文件 +{ + "presets": [ + [ + "@babel/preset-env" + ] + ], + "plugins": [ + ["@babel/plugin-proposal-decorators", { "legacy": true }], + ["@babel/plugin-proposal-class-properties", { "loose": true }], + "@babel/plugin-transform-runtime", + ] +} +``` + +##### **生成(Code Generation)** + +用 `babel-generator` 通过 AST 树生成 ES5 代码。 + +### **如何编写一个 Babel 插件** + +基础的东西讲了些,下面说下具体如何写插件,只做简单的介绍,感兴趣的同学可以看 `Babel` 官方的介绍。 + +#### **插件格式** + +先从一个接收了当前 `Babel` 对象作为参数的 `Function` 开始。 + +```javascript +export default function(babel) { + // plugin contents +} +``` + +我们经常会这样写 + +```javascript +export default function({ types: t }) { + // +} +``` + +接着返回一个对象,其 `visitor` 属性是这个插件的主要访问者。 + +```javascript +export default function({ types: t }) { + return { + visitor: { + // visitor contents + } + }; +}; +visitor` 中的每个函数接收 2 个参数:`path` 和 `state +export default function({ types: t }) { + return { + visitor: { + CallExpression(path, state) {} + } + }; +}; +``` + +#### **写一个简单的插件** + +我们先写一个简单的插件,把所有定义变量名为 `a` 的换成 `b` ,先看下 `var a = 1`的 AST + +```javascript +{ + "type": "Program", + "start": 0, + "end": 10, + "body": [ + { + "type": "VariableDeclaration", + "start": 0, + "end": 9, + "declarations": [ + { + "type": "VariableDeclarator", + "start": 4, + "end": 9, + "id": { + "type": "Identifier", + "start": 4, + "end": 5, + "name": "a" + }, + "init": { + "type": "Literal", + "start": 8, + "end": 9, + "value": 1, + "raw": "1" + } + } + ], + "kind": "var" + } + ], + "sourceType": "module" +} +``` + +从这里看,要找的节点类型就是 `VariableDeclarator` ,下面开始撸代码 + +```javascript +export default function({ types: t }) { + return { + visitor: { + VariableDeclarator(path, state) { + if (path.node.id.name == 'a') { + path.node.id = t.identifier('b') + } + } + } + } +} +``` + +我们要把 `id` 属性是 a 的替换成 b 就好了。但是这里不能直接 `path.node.id.name = 'b'` 。如果操作的是Object,就没问题,但是这里是 AST 语法树,所以想改变某个值,就是用对应的 AST 来替换,现在我们用新的标识符来替换这个属性。 + +最后测试一下 + +```javascript +import * as babel from '@babel/core'; +const c = `var a = 1`; + +const { code } = babel.transform(c, { + plugins: [ + function({ types: t }) { + return { + visitor: { + VariableDeclarator(path, state) { + if (path.node.id.name == 'a') { + path.node.id = t.identifier('b') + } + } + } + } + } + ] +}) + +console.log(code); // var b = 1 +``` + +#### **实现一个简单的按需打包功能** + +例如我们要实现把 `import { Button } from 'antd'` 转成 `import Button from 'antd/lib/button'` + +通过对比 AST 发现,`specifiers` 里的 `type` 和 `source` 不同。 + +```javascript +// import { Button } from 'antd' +"specifiers": [ + { + "type": "ImportSpecifier", + ... + } +] +// import Button from 'antd/lib/button' +"specifiers": [ + { + "type": "ImportDefaultSpecifier", + ... + } +] +import * as babel from '@babel/core'; +const c = `import { Button } from 'antd'`; + +const { code } = babel.transform(c, { + plugins: [ + function({ types: t }) { + return { + visitor: { + ImportDeclaration(path) { + const { node: { specifiers, source } } = path; + if (!t.isImportDefaultSpecifier(specifiers[0])) { // 对 specifiers 进行判断,是否默认倒入 + const newImport = specifiers.map(specifier => ( + t.importDeclaration( + [t.ImportDefaultSpecifier(specifier.local)], + t.stringLiteral(`${source.value}/lib/${specifier.local.name}`) + ) + )) + path.replaceWithMultiple(newImport) + } + } + } + } + } + ] +}) + +console.log(code); // import Button from "antd/lib/Button"; +``` + +当然 `babel-plugin-import` 这个插件是有配置项的,我们可以对代码做以下更改。 + +```javascript +export default function({ types: t }) { + return { + visitor: { + ImportDeclaration(path, { opts }) { + const { node: { specifiers, source } } = path; + if (source.value === opts.libraryName) { + // ... + } + } + } + } +} +``` + +至此,这个插件我们就编写完成了。 + +### **Babel 常用 API** + +#### **@babel/core** + +`Babel` 的编译器,核心 API 都在这里面,比如常见的 `transform`、`parse`。 + +#### **@babel/cli** + +`cli` 是命令行工具, 安装了 `@babel/cli` 就能够在命令行中使用 `babel` 命令来编译文件。当然我们一般不会用到,打包工具已经帮我们做好了。 + +#### **@babel/node** + +直接在 `node` 环境中,运行 ES6 的代码。 + +#### **babylon** + +`Babel` 的解析器。 + +#### **babel-traverse** + +用于对 AST 的遍历,维护了整棵树的状态,并且负责替换、移除和添加节点。 + +#### **babel-types** + +用于 AST 节点的 Lodash 式工具库, 它包含了构造、验证以及变换 AST 节点的方法,对编写处理 AST 逻辑非常有用。 + +#### **babel-generator** + +Babel 的代码生成器,它读取 AST 并将其转换为代码和源码映射(sourcemaps)。 + +### **总结** + +文章主要介绍 `Babel` 编译代码的过程和原理以及简单编写了一个 `babel` 插件,欢迎大家对内容进行指正和讨论。 + +本文分享自微信公众号 - 前端迷(love_frontend) + +原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。 + +原始发表时间:2019-10-09 + +本文参与[腾讯云自媒体分享计划](https://cloud.tencent.com/developer/support-plan),欢迎正在阅读的你也加入,一起分享。 + +发表于 2019-10-13 + +## 8-5 插件 文档 + +> https://www.npmjs.com/package/html-webpack-plugin + +### Install + +``` + npm i --save-dev html-webpack-plugin + yarn add --dev html-webpack-plugin +``` + +This is a [webpack](http://webpack.js.org/) plugin that simplifies creation of HTML files to serve your `webpack` bundles. This is especially useful for `webpack` bundles that include a hash in the filename which changes every compilation. You can either let the plugin generate an HTML file for you, supply your own template using `lodash` templates or use your own loader. + +#### `Plugins` + +The `html-webpack-plugin` provides [hooks](https://github.com/jantimon/html-webpack-plugin#events) to extend it to your needs. There are already some really powerful plugins which can be integrated with zero configuration + +- [webpack-subresource-integrity](https://www.npmjs.com/package/webpack-subresource-integrity) for enhanced asset security +- [appcache-webpack-plugin](https://github.com/lettertwo/appcache-webpack-plugin) for iOS and Android offline usage +- [favicons-webpack-plugin](https://github.com/jantimon/favicons-webpack-plugin) which generates favicons and icons for iOS, Android and desktop browsers +- [html-webpack-harddisk-plugin](https://github.com/jantimon/html-webpack-harddisk-plugin) can be used to always write to disk the html file, useful when webpack-dev-server / HMR are being used +- [html-webpack-inline-source-plugin](https://github.com/DustinJackson/html-webpack-inline-source-plugin) to inline your assets in the resulting HTML file +- [html-webpack-inline-svg-plugin](https://github.com/thegc/html-webpack-inline-svg-plugin) to inline SVGs in the resulting HTML file. +- [html-webpack-exclude-assets-plugin](https://github.com/jamesjieye/html-webpack-exclude-assets-plugin) for excluding assets using regular expressions +- [html-webpack-include-assets-plugin](https://github.com/jharris4/html-webpack-include-assets-plugin) for including lists of js or css file paths (such as those copied by the copy-webpack-plugin). +- [script-ext-html-webpack-plugin](https://github.com/numical/script-ext-html-webpack-plugin) to add `async`, `defer` or `module` attributes to your `` elements, or even inline them +- [style-ext-html-webpack-plugin](https://github.com/numical/style-ext-html-webpack-plugin) to convert your ``s to external stylesheets into `` elements containing internal CSS +- [resource-hints-webpack-plugin](https://github.com/jantimon/resource-hints-webpack-plugin) to add resource hints for faster initial page loads using `` and `` +- [preload-webpack-plugin](https://github.com/GoogleChrome/preload-webpack-plugin) for automatically wiring up asynchronous (and other types) of JavaScript chunks using `` helping with lazy-loading +- [link-media-html-webpack-plugin](https://github.com/yaycmyk/link-media-html-webpack-plugin) allows for injected stylesheet `` tags to have their media attribute set automatically; useful for providing specific desktop/mobile/print etc. stylesheets that the browser will conditionally download +- [inline-chunk-manifest-html-webpack-plugin](https://github.com/jouni-kantola/inline-chunk-manifest-html-webpack-plugin) for inlining webpack's chunk manifest. Default extracts manifest and inlines in `` +- [html-webpack-inline-style-plugin](https://github.com/djaax/html-webpack-inline-style-plugin) for inlining styles to HTML elements using [juice](https://github.com/Automattic/juice). Useful for email generation automatisation. +- [html-webpack-exclude-empty-assets-plugin](https://github.com/KnisterPeter/html-webpack-exclude-empty-assets-plugin) removes empty assets from being added to the html. This fixes some problems with extract-text-plugin with webpack 4. +- [webpack-concat-plugin](https://github.com/hxlniada/webpack-concat-plugin) for concat and uglify files that needn't to be webpack bundles(for legacy files) and inject to html-webpack-plugin. + +### Usage + +The plugin will generate an HTML5 file for you that includes all your `webpack` bundles in the body using `script` tags. Just add the plugin to your `webpack` config as follows: + +**webpack.config.js** + +``` +const HtmlWebpackPlugin = require('html-webpack-plugin') + +module.exports = { + entry: 'index.js', + output: { + path: __dirname + '/dist', + filename: 'index_bundle.js' + }, + plugins: [ + new HtmlWebpackPlugin() + ] +} +``` + +This will generate a file `dist/index.html` containing the following + +``` + + + + + Webpack App + + + + + +``` + +If you have multiple `webpack` entry points, they will all be included with `script` tags in the generated HTML. + +If you have any CSS assets in webpack's output (for example, CSS extracted with the [ExtractTextPlugin](https://github.com/webpack/extract-text-webpack-plugin)) then these will be included with `` tags in the HTML head. + +If you have plugins that make use of it, `html-webpack-plugin` should be ordered first before any of the integrated plugins. + +### Options + +You can pass a hash of configuration options to `html-webpack-plugin`. Allowed values are as follows + +| Name | Type | Default | Description | +| :----------------------------------------------------------: | :---------------------------: | :------------: | :----------------------------------------------------------- | +| **[`title`](https://www.npmjs.com/package/html-webpack-plugin#)** | `{String}` | `` | The title to use for the generated HTML document | +| **[`filename`](https://www.npmjs.com/package/html-webpack-plugin#)** | `{String}` | `'index.html'` | The file to write the HTML to. Defaults to `index.html`. You can specify a subdirectory here too (eg: `assets/admin.html`) | +| **[`template`](https://www.npmjs.com/package/html-webpack-plugin#)** | `{String}` | `` | `webpack` require path to the template. Please see the [docs](https://github.com/jantimon/html-webpack-plugin/blob/master/docs/template-option.md) for details | +| **[`templateParameters`](https://www.npmjs.com/package/html-webpack-plugin#)** | `{Boolean\|Object\|Function}` | `` | Allows to overwrite the parameters used in the template | +| **[`inject`](https://www.npmjs.com/package/html-webpack-plugin#)** | `{Boolean\|String}` | `true` | `true \|\| 'head' \|\| 'body' \|\| false` Inject all assets into the given `template` or `templateContent`. When passing `true` or `'body'` all javascript resources will be placed at the bottom of the body element. `'head'` will place the scripts in the head element | +| **[`favicon`](https://www.npmjs.com/package/html-webpack-plugin#)** | `{String}` | `` | Adds the given favicon path to the output HTML | +| **[`meta`](https://www.npmjs.com/package/html-webpack-plugin#)** | `{Object}` | `{}` | Allows to inject `meta`-tags. E.g. `meta: {viewport: 'width=device-width, initial-scale=1, shrink-to-fit=no'}` | +| **[`minify`](https://www.npmjs.com/package/html-webpack-plugin#)** | `{Boolean\|Object}` | `true` | Pass [html-minifier](https://github.com/kangax/html-minifier#options-quick-reference)'s options as object to minify the output | +| **[`hash`](https://www.npmjs.com/package/html-webpack-plugin#)** | `{Boolean}` | `false` | If `true` then append a unique `webpack` compilation hash to all included scripts and CSS files. This is useful for cache busting | +| **[`cache`](https://www.npmjs.com/package/html-webpack-plugin#)** | `{Boolean}` | `true` | Emit the file only if it was changed | +| **[`showErrors`](https://www.npmjs.com/package/html-webpack-plugin#)** | `{Boolean}` | `true` | Errors details will be written into the HTML page | +| **[`chunks`](https://www.npmjs.com/package/html-webpack-plugin#)** | `{?}` | `?` | Allows you to add only some chunks (e.g only the unit-test chunk) | +| **[`chunksSortMode`](https://www.npmjs.com/package/html-webpack-plugin#plugins)** | `{String\|Function}` | `auto` | Allows to control how chunks should be sorted before they are included to the HTML. Allowed values are `'none' \| 'auto' \| 'dependency' \| 'manual' \| {Function}` | +| **[`excludeChunks`](https://www.npmjs.com/package/html-webpack-plugin#)** | `{Array.}` | `` | Allows you to skip some chunks (e.g don't add the unit-test chunk) | +| **[`xhtml`](https://www.npmjs.com/package/html-webpack-plugin#)** | `{Boolean}` | `false` | If `true` render the `link` tags as self-closing (XHTML compliant) | + +Here's an example webpack config illustrating how to use these options + +**webpack.config.js** + +``` +{ + entry: 'index.js', + output: { + path: __dirname + '/dist', + filename: 'index_bundle.js' + }, + plugins: [ + new HtmlWebpackPlugin({ + title: 'My App', + filename: 'assets/admin.html' + }) + ] +} +``` + +#### `Generating Multiple HTML Files` + +To generate more than one HTML file, declare the plugin more than once in your plugins array + +**webpack.config.js** + +``` +{ + entry: 'index.js', + output: { + path: __dirname + '/dist', + filename: 'index_bundle.js' + }, + plugins: [ + new HtmlWebpackPlugin(), // Generates default index.html + new HtmlWebpackPlugin({ // Also generate a test.html + filename: 'test.html', + template: 'src/assets/test.html' + }) + ] +} +``` + +#### `Writing Your Own Templates` + +If the default generated HTML doesn't meet your needs you can supply your own template. The easiest way is to use the `template` option and pass a custom HTML file. The html-webpack-plugin will automatically inject all necessary CSS, JS, manifest and favicon files into the markup. + +``` +plugins: [ + new HtmlWebpackPlugin({ + title: 'Custom template', + // Load a custom template (lodash by default see the FAQ for details) + template: 'index.html' + }) +] +``` + +**index.html** + +``` + + + + + <%= htmlWebpackPlugin.options.title %> + + + + +``` + +If you already have a template loader, you can use it to parse the template. Please note that this will also happen if you specifiy the html-loader and use `.html` file as template. + +**webpack.config.js** + +``` +module: { + loaders: [ + { test: /\.hbs$/, loader: "handlebars" } + ] +}, +plugins: [ + new HtmlWebpackPlugin({ + title: 'Custom template using Handlebars', + template: 'index.hbs' + }) +] +``` + +You can use the `lodash` syntax out of the box. If the `inject` feature doesn't fit your needs and you want full control over the asset placement use the [default template](https://github.com/jaketrent/html-webpack-template/blob/86f285d5c790a6c15263f5cc50fd666d51f974fd/index.html) of the [html-webpack-template project](https://github.com/jaketrent/html-webpack-template) as a starting point for writing your own. + +The following variables are available in the template: + +- `htmlWebpackPlugin`: data specific to this plugin + + - `htmlWebpackPlugin.files`: a massaged representation of the `assetsByChunkName` attribute of webpack's [stats](https://github.com/webpack/docs/wiki/node.js-api#stats) object. It contains a mapping from entry point name to the bundle filename, eg: + + ``` + "htmlWebpackPlugin": { + "files": { + "css": [ "main.css" ], + "js": [ "assets/head_bundle.js", "assets/main_bundle.js"], + "chunks": { + "head": { + "entry": "assets/head_bundle.js", + "css": [ "main.css" ] + }, + "main": { + "entry": "assets/main_bundle.js", + "css": [] + }, + } + } + } + ``` + + If you've set a publicPath in your webpack config this will be reflected correctly in this assets hash. + + - `htmlWebpackPlugin.options`: the options hash that was passed to the plugin. In addition to the options actually used by this plugin, you can use this hash to pass arbitrary data through to your template. + +- `webpack`: the webpack [stats](https://github.com/webpack/docs/wiki/node.js-api#stats) object. Note that this is the stats object as it was at the time the HTML template was emitted and as such may not have the full set of stats that are available after the webpack run is complete. + +- `webpackConfig`: the webpack configuration that was used for this compilation. This can be used, for example, to get the `publicPath` (`webpackConfig.output.publicPath`). + +- `compilation`: the webpack [compilation](https://webpack.js.org/api/compilation/) object. This can be used, for example, to get the contents of processed assets and inline them directly in the page, through `compilation.assets[...].source()` (see [the inline template example](https://github.com/jantimon/html-webpack-plugin/blob/HEAD/examples/inline/template.jade)). + +#### `Filtering Chunks` + +To include only certain chunks you can limit the chunks being used + +**webpack.config.js** + +``` +plugins: [ + new HtmlWebpackPlugin({ + chunks: ['app'] + }) +] +``` + +It is also possible to exclude certain chunks by setting the `excludeChunks` option + +**webpack.config.js** + +``` +plugins: [ + new HtmlWebpackPlugin({ + excludeChunks: [ 'dev-helper' ] + }) +] +``` + +### `Events` + +To allow other [plugins](https://github.com/webpack/docs/wiki/plugins) to alter the HTML this plugin executes the following events: + +#### `Sync` + +- `html-webpack-plugin-alter-chunks` + +#### `Async` + +- `html-webpack-plugin-before-html-generation` +- `html-webpack-plugin-before-html-processing` +- `html-webpack-plugin-alter-asset-tags` +- `html-webpack-plugin-after-html-processing` +- `html-webpack-plugin-after-emit` + +Example implementation: [html-webpack-harddisk-plugin](https://github.com/jantimon/html-webpack-harddisk-plugin) + +**plugin.js** + +``` +function MyPlugin(options) { + // Configure your plugin with options... +} + +MyPlugin.prototype.apply = function (compiler) { + compiler.plugin('compilation', (compilation) => { + console.log('The compiler is starting a new compilation...'); + + compilation.plugin( + 'html-webpack-plugin-before-html-processing', + (data, cb) => { + data.html += 'The Magic Footer' + + cb(null, data) + } + ) + }) +} + +module.exports = MyPlugin +``` + +**webpack.config.js** + +``` +plugins: [ + new MyPlugin({ options: '' }) +] +``` + +Note that the callback must be passed the HtmlWebpackPluginData in order to pass this onto any other plugins listening on the same `html-webpack-plugin-before-html-processing` event + diff --git a/JavaScriptES6-10_notes/JavaScriptES6-10.assets/97a52475c433362e41ffb7cf6e9bd775.png b/JavaScriptES6-10_notes/JavaScriptES6-10.assets/97a52475c433362e41ffb7cf6e9bd775.png deleted file mode 100644 index 8934ed4..0000000 Binary files a/JavaScriptES6-10_notes/JavaScriptES6-10.assets/97a52475c433362e41ffb7cf6e9bd775.png and /dev/null differ diff --git "a/JavaScript_code/1.\347\254\254\344\270\200\344\270\252JS\346\225\210\346\236\234.html" "b/JavaScript_code/1.\347\254\254\344\270\200\344\270\252JS\346\225\210\346\236\234.html" new file mode 100644 index 0000000..1c2d95d --- /dev/null +++ "b/JavaScript_code/1.\347\254\254\344\270\200\344\270\252JS\346\225\210\346\236\234.html" @@ -0,0 +1,95 @@ + + + + + 第一个JS效果 + + + + + + + + + +
    +
    + + +
    +

    文字
    文字2

    +
    + + \ No newline at end of file diff --git "a/JavaScript_code/10.\346\225\260\347\240\201\346\227\266\351\222\237.html" "b/JavaScript_code/10.\346\225\260\347\240\201\346\227\266\351\222\237.html" new file mode 100644 index 0000000..85c3744 --- /dev/null +++ "b/JavaScript_code/10.\346\225\260\347\240\201\346\227\266\351\222\237.html" @@ -0,0 +1,69 @@ + + + + 数码时钟 + + + +
      +
    • +
    • + : +
    • +
    • + : +
    • +
    • +
    + + \ No newline at end of file diff --git "a/JavaScript_code/11.\347\247\273\345\207\272\345\273\266\346\227\266\351\232\220\350\227\217\345\222\214\346\227\240\347\274\235\346\273\232\345\212\250.html" "b/JavaScript_code/11.\347\247\273\345\207\272\345\273\266\346\227\266\351\232\220\350\227\217\345\222\214\346\227\240\347\274\235\346\273\232\345\212\250.html" new file mode 100644 index 0000000..d7ab5e5 --- /dev/null +++ "b/JavaScript_code/11.\347\247\273\345\207\272\345\273\266\346\227\266\351\232\220\350\227\217\345\222\214\346\227\240\347\274\235\346\273\232\345\212\250.html" @@ -0,0 +1,126 @@ + + + + +移出延时隐藏 + + + + +
    +
    +
    +
      +
    • +
    • +
    • +
    • +
    +
    + + + + + \ No newline at end of file diff --git "a/JavaScript_code/12.\345\210\233\345\273\272\346\217\222\345\205\245\345\210\240\351\231\244\345\205\203\347\264\240.html" "b/JavaScript_code/12.\345\210\233\345\273\272\346\217\222\345\205\245\345\210\240\351\231\244\345\205\203\347\264\240.html" new file mode 100644 index 0000000..4dd07a3 --- /dev/null +++ "b/JavaScript_code/12.\345\210\233\345\273\272\346\217\222\345\205\245\345\210\240\351\231\244\345\205\203\347\264\240.html" @@ -0,0 +1,71 @@ + + + + + DOM创建插入删除元素 + + + + + + + + +
    +
      +
    +
    + + \ No newline at end of file diff --git "a/JavaScript_code/13.\347\224\237\346\210\220\350\241\250\346\240\274\344\270\216\346\223\215\344\275\234.html" "b/JavaScript_code/13.\347\224\237\346\210\220\350\241\250\346\240\274\344\270\216\346\223\215\344\275\234.html" new file mode 100644 index 0000000..88f2197 --- /dev/null +++ "b/JavaScript_code/13.\347\224\237\346\210\220\350\241\250\346\240\274\344\270\216\346\223\215\344\275\234.html" @@ -0,0 +1,298 @@ + + + + + 表格操作 + + + + +
    + + + +
    +
    + + + + +
    +
    + + +
    +
    + + +
    + + \ No newline at end of file diff --git "a/JavaScript_code/14.\350\277\220\345\212\250\346\241\206\346\236\266\345\217\212\345\272\224\347\224\250.html" "b/JavaScript_code/14.\350\277\220\345\212\250\346\241\206\346\236\266\345\217\212\345\272\224\347\224\250.html" new file mode 100644 index 0000000..1406b1a --- /dev/null +++ "b/JavaScript_code/14.\350\277\220\345\212\250\346\241\206\346\236\266\345\217\212\345\272\224\347\224\250.html" @@ -0,0 +1,102 @@ + + + + + 运动框架及应用 + + + + +
    + 分享到 +
    +
    + + \ No newline at end of file diff --git "a/JavaScript_code/15.\347\274\223\345\206\262\350\277\220\345\212\250\345\217\212\345\201\234\346\255\242\346\235\241\344\273\266.html" "b/JavaScript_code/15.\347\274\223\345\206\262\350\277\220\345\212\250\345\217\212\345\201\234\346\255\242\346\235\241\344\273\266.html" new file mode 100644 index 0000000..61b6776 --- /dev/null +++ "b/JavaScript_code/15.\347\274\223\345\206\262\350\277\220\345\212\250\345\217\212\345\201\234\346\255\242\346\235\241\344\273\266.html" @@ -0,0 +1,215 @@ + + + + + + + 缓冲运动及停止条件 + + + + + +
    + 分享到 +
    +
    +
    +
    + + + + +
    + + + + \ No newline at end of file diff --git "a/JavaScript_code/16.\345\244\232\347\211\251\344\275\223\350\277\220\345\212\250\346\241\206\346\236\266.html" "b/JavaScript_code/16.\345\244\232\347\211\251\344\275\223\350\277\220\345\212\250\346\241\206\346\236\266.html" new file mode 100644 index 0000000..9d07699 --- /dev/null +++ "b/JavaScript_code/16.\345\244\232\347\211\251\344\275\223\350\277\220\345\212\250\346\241\206\346\236\266.html" @@ -0,0 +1,285 @@ + + + + + + + 缓冲运动及停止条件 + + + + + +
    +
    +
    +
    +
    +
    +
    +
    +
    123adsfzv
    +
    +
    + + + \ No newline at end of file diff --git "a/JavaScript_code/17.\344\273\277Flash\345\233\276\347\211\207\345\261\225\347\244\272.html" "b/JavaScript_code/17.\344\273\277Flash\345\233\276\347\211\207\345\261\225\347\244\272.html" new file mode 100644 index 0000000..7f1aee6 --- /dev/null +++ "b/JavaScript_code/17.\344\273\277Flash\345\233\276\347\211\207\345\261\225\347\244\272.html" @@ -0,0 +1,383 @@ + + + +仿Flash图片展示 + + + + + + +
    +
    +
    +
      +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    +
    +
      +
    • +
    • +
    • +
    +
      +
    • +
    • 图片说明:introduction
    • +
    • 图片位置:
    • +
    +
    +
      +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    +
    +
    +
    + + + \ No newline at end of file diff --git "a/JavaScript_code/18.0.\345\234\237\350\261\206\350\217\234\345\215\225\345\222\214\351\223\276\345\274\217\350\277\220\345\212\250\346\241\206\346\236\266.html" "b/JavaScript_code/18.0.\345\234\237\350\261\206\350\217\234\345\215\225\345\222\214\351\223\276\345\274\217\350\277\220\345\212\250\346\241\206\346\236\266.html" new file mode 100644 index 0000000..dca637d --- /dev/null +++ "b/JavaScript_code/18.0.\345\234\237\350\261\206\350\217\234\345\215\225\345\222\214\351\223\276\345\274\217\350\277\220\345\212\250\346\241\206\346\236\266.html" @@ -0,0 +1,117 @@ + + + + + 链式运动框架 + + + + + + +
    +
    +
    土豆
    +
    播放器
    + +
    + + \ No newline at end of file diff --git "a/JavaScript_code/18.1.\345\271\273\347\201\257\347\211\207\344\270\212\344\270\213\346\273\221\345\212\250\345\222\214\346\226\260\346\265\252\345\276\256\345\215\232\346\225\210\346\236\234.html" "b/JavaScript_code/18.1.\345\271\273\347\201\257\347\211\207\344\270\212\344\270\213\346\273\221\345\212\250\345\222\214\346\226\260\346\265\252\345\276\256\345\215\232\346\225\210\346\236\234.html" new file mode 100644 index 0000000..5ebff74 --- /dev/null +++ "b/JavaScript_code/18.1.\345\271\273\347\201\257\347\211\207\344\270\212\344\270\213\346\273\221\345\212\250\345\222\214\346\226\260\346\265\252\345\276\256\345\215\232\346\225\210\346\236\234.html" @@ -0,0 +1,334 @@ + + + +幻灯片上下滑动和新浪微博效果 + + + + + + +
    +
    +
    +
      +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    +
    +
      +
    • +
    • +
    • +
    +
      +
    • +
    • 图片说明:introduction
    • +
    • 图片位置:
    • +
    +
    +
      +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    +
    +
    +
    + + +
    +
    +
    +
    +
    +
    + + + \ No newline at end of file diff --git "a/JavaScript_code/19.0.\350\267\237\351\232\217\351\274\240\346\240\207\344\270\200\344\270\262div.html" "b/JavaScript_code/19.0.\350\267\237\351\232\217\351\274\240\346\240\207\344\270\200\344\270\262div.html" new file mode 100644 index 0000000..2225da5 --- /dev/null +++ "b/JavaScript_code/19.0.\350\267\237\351\232\217\351\274\240\346\240\207\344\270\200\344\270\262div.html" @@ -0,0 +1,109 @@ + + + + + + 跟随鼠标的一串div + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + + \ No newline at end of file diff --git "a/JavaScript_code/19.1.\351\224\256\347\233\230\344\272\213\344\273\266\344\273\277select\344\270\213\346\213\211\346\241\206.html" "b/JavaScript_code/19.1.\351\224\256\347\233\230\344\272\213\344\273\266\344\273\277select\344\270\213\346\213\211\346\241\206.html" new file mode 100644 index 0000000..efb01b6 --- /dev/null +++ "b/JavaScript_code/19.1.\351\224\256\347\233\230\344\272\213\344\273\266\344\273\277select\344\270\213\346\213\211\346\241\206.html" @@ -0,0 +1,45 @@ + + + + + + 键盘事件和仿select下拉框 + + + + + + + +
    + + + \ No newline at end of file diff --git "a/JavaScript_code/2.\347\275\221\351\241\265\346\215\242\350\202\244.html" "b/JavaScript_code/2.\347\275\221\351\241\265\346\215\242\350\202\244.html" new file mode 100644 index 0000000..725b6ab --- /dev/null +++ "b/JavaScript_code/2.\347\275\221\351\241\265\346\215\242\350\202\244.html" @@ -0,0 +1,63 @@ + + + + + + + + + + + +
    1
    +
    2
    +
    3
    + +
    + + + +
    + + javascript:; + + +
    4
    + + + \ No newline at end of file diff --git "a/JavaScript_code/20.\351\224\256\347\233\230\346\216\247\345\210\266\345\205\203\347\264\240\347\247\273\345\212\250\345\222\214\345\233\236\350\275\246\346\217\220\344\272\244.html" "b/JavaScript_code/20.\351\224\256\347\233\230\346\216\247\345\210\266\345\205\203\347\264\240\347\247\273\345\212\250\345\222\214\345\233\236\350\275\246\346\217\220\344\272\244.html" new file mode 100644 index 0000000..23edd64 --- /dev/null +++ "b/JavaScript_code/20.\351\224\256\347\233\230\346\216\247\345\210\266\345\205\203\347\264\240\347\247\273\345\212\250\345\222\214\345\233\236\350\275\246\346\217\220\344\272\244.html" @@ -0,0 +1,185 @@ + + + + + + 键盘控制元素移动和回车提交 + + + + + + +
    +
    + + +
    +
    +

    CTRL + 回车 提交

    +

    键盘控制留言框位置

    +
    +
    + + + \ No newline at end of file diff --git "a/JavaScript_code/21.0.\351\230\273\346\255\242\351\273\230\350\256\244\344\272\213\344\273\266\350\207\252\345\256\232\344\271\211\345\217\263\351\224\256\350\217\234\345\215\225\351\231\220\345\256\232\350\276\223\345\205\245\346\241\206.html" "b/JavaScript_code/21.0.\351\230\273\346\255\242\351\273\230\350\256\244\344\272\213\344\273\266\350\207\252\345\256\232\344\271\211\345\217\263\351\224\256\350\217\234\345\215\225\351\231\220\345\256\232\350\276\223\345\205\245\346\241\206.html" new file mode 100644 index 0000000..8471bb2 --- /dev/null +++ "b/JavaScript_code/21.0.\351\230\273\346\255\242\351\273\230\350\256\244\344\272\213\344\273\266\350\207\252\345\256\232\344\271\211\345\217\263\351\224\256\350\217\234\345\215\225\351\231\220\345\256\232\350\276\223\345\205\245\346\241\206.html" @@ -0,0 +1,69 @@ + + + + + + 默认事件 + + + + + + + +
    +
  • 123
  • +
  • 456
  • +
  • 789
  • +
  • 123
  • +
  • 456
  • +
  • 789
  • +
  • 123
  • +
  • 456
  • +
  • 789
  • +
    + + + \ No newline at end of file diff --git "a/JavaScript_code/21.1.\345\237\272\346\234\254\346\213\226\346\213\275.html" "b/JavaScript_code/21.1.\345\237\272\346\234\254\346\213\226\346\213\275.html" new file mode 100644 index 0000000..71ab7b0 --- /dev/null +++ "b/JavaScript_code/21.1.\345\237\272\346\234\254\346\213\226\346\213\275.html" @@ -0,0 +1,68 @@ + + + + + + 拖拽 + + + + + + +
    + + + \ No newline at end of file diff --git "a/JavaScript_code/22.0.\344\272\213\344\273\266\347\273\221\345\256\232.html" "b/JavaScript_code/22.0.\344\272\213\344\273\266\347\273\221\345\256\232.html" new file mode 100644 index 0000000..00529ff --- /dev/null +++ "b/JavaScript_code/22.0.\344\272\213\344\273\266\347\273\221\345\256\232.html" @@ -0,0 +1,53 @@ + + + + + + 事件绑定 + + + + + + + +
    + + + \ No newline at end of file diff --git "a/JavaScript_code/22.1.\351\253\230\347\272\247\346\213\226\346\213\275.html" "b/JavaScript_code/22.1.\351\253\230\347\272\247\346\213\226\346\213\275.html" new file mode 100644 index 0000000..8f1364f --- /dev/null +++ "b/JavaScript_code/22.1.\351\253\230\347\272\247\346\213\226\346\213\275.html" @@ -0,0 +1,101 @@ + + + + + + 高级拖拽 + + + + + + +
    + asdfasdfas/sad'234 +
    asdfasdfas/sad
    + asdfasdfas/sad'234 +
    + + + \ No newline at end of file diff --git "a/JavaScript_code/22.2.\350\207\252\345\256\232\344\271\211\346\273\232\345\212\250\346\235\241.html" "b/JavaScript_code/22.2.\350\207\252\345\256\232\344\271\211\346\273\232\345\212\250\346\235\241.html" new file mode 100644 index 0000000..5525462 --- /dev/null +++ "b/JavaScript_code/22.2.\350\207\252\345\256\232\344\271\211\346\273\232\345\212\250\346\235\241.html" @@ -0,0 +1,262 @@ + + + + + + 自定义滚动条 + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    +
    + 值 描述 + normal 默认。空白会被浏览器忽略。 + pre 空白会被浏览器保留。其行为方式类似 HTML 中的 标签。inherit 规定应该从父元素继承 white-space 属性的值。 + nowrap 文本不会换行,文本会在在同一行上继续,直到遇到 标签为止。 + pre-wrap 保留空白符序列,但是正常地进行换行。 + pre-line 合并空白符序列,但是保留换行符。 + inherit 规定应该从父元素继承 white-space 属性的值。 + - 拖拽 + - 只有横向拖拽 + - 限制范围:范围的大小 + - 计算比例:当前值/最大值 + - 控制其他对象 + - 例子1:控制物体的大小 + - 例子2:控制物体的透明度 + - 例子3:控制文字滚动 + - 代码:- 拖拽 + - 只有横向拖拽 + - 限制范围:范围的大小 + - 计算比例:当前值/最大值 + - 控制其他对象 + - 例子1:控制物体的大小 + - 例子2:控制物体的透明度 + - 例子3:控制文字滚动 + - 代码:- 代码:- 拖拽 + - 只有横向拖拽 + - 限制范围:范围的大小 + - 计算比例:当前值/最大值 + - 控制其他对象 +
    +
    +
    + + + \ No newline at end of file diff --git "a/JavaScript_code/22.3.\351\274\240\346\240\207\346\273\232\350\275\256\346\273\232\345\212\250.html" "b/JavaScript_code/22.3.\351\274\240\346\240\207\346\273\232\350\275\256\346\273\232\345\212\250.html" new file mode 100644 index 0000000..b272ea7 --- /dev/null +++ "b/JavaScript_code/22.3.\351\274\240\346\240\207\346\273\232\350\275\256\346\273\232\345\212\250.html" @@ -0,0 +1,54 @@ + + + + + + 事件绑定与鼠标滚轮 + + + + + + +
    + + + \ No newline at end of file diff --git a/JavaScript_code/23.ajax.html b/JavaScript_code/23.ajax.html new file mode 100644 index 0000000..c391b01 --- /dev/null +++ b/JavaScript_code/23.ajax.html @@ -0,0 +1,64 @@ + + + + + + +

    + + + diff --git "a/JavaScript_code/24.\345\237\272\347\241\200\351\235\242\345\257\271\345\257\271\350\261\241.html" "b/JavaScript_code/24.\345\237\272\347\241\200\351\235\242\345\257\271\345\257\271\350\261\241.html" new file mode 100644 index 0000000..587ffa9 --- /dev/null +++ "b/JavaScript_code/24.\345\237\272\347\241\200\351\235\242\345\257\271\345\257\271\350\261\241.html" @@ -0,0 +1,48 @@ + + + + + 面对对象基础 + + + + + + \ No newline at end of file diff --git "a/JavaScript_code/25.\351\235\242\345\257\271\345\257\271\350\261\241\347\232\204\351\200\211\351\241\271\345\215\241.html" "b/JavaScript_code/25.\351\235\242\345\257\271\345\257\271\350\261\241\347\232\204\351\200\211\351\241\271\345\215\241.html" new file mode 100644 index 0000000..b2623b9 --- /dev/null +++ "b/JavaScript_code/25.\351\235\242\345\257\271\345\257\271\350\261\241\347\232\204\351\200\211\351\241\271\345\215\241.html" @@ -0,0 +1,114 @@ + + + + + 面对对象的选项卡 + + + + +
    +
    + 11 + 22 + 33 + 44 +
    +
    +
      +
    • 1
    • +
    +
      +
    • 2
    • +
    +
      +
    • 3
    • +
    +
      +
    • 4
    • +
    +
    +
    + + \ No newline at end of file diff --git "a/JavaScript_code/26.\351\235\242\345\220\221\345\257\271\350\261\241\347\232\204\346\213\226\346\213\275.html" "b/JavaScript_code/26.\351\235\242\345\220\221\345\257\271\350\261\241\347\232\204\346\213\226\346\213\275.html" new file mode 100644 index 0000000..36640d2 --- /dev/null +++ "b/JavaScript_code/26.\351\235\242\345\220\221\345\257\271\350\261\241\347\232\204\346\213\226\346\213\275.html" @@ -0,0 +1,40 @@ + + + + + + 面对对象的拖拽 + + + + + + + + +
    普通拖拽
    +
    限制范围的拖拽
    + + + \ No newline at end of file diff --git "a/JavaScript_code/27.BOM\345\272\224\347\224\250.html" "b/JavaScript_code/27.BOM\345\272\224\347\224\250.html" new file mode 100644 index 0000000..faa9c8e --- /dev/null +++ "b/JavaScript_code/27.BOM\345\272\224\347\224\250.html" @@ -0,0 +1,52 @@ + + + + + Bom应用 + + + + + + + + \ No newline at end of file diff --git "a/JavaScript_code/28.0.cookie\345\237\272\347\241\200\344\270\216\345\272\224\347\224\250.html" "b/JavaScript_code/28.0.cookie\345\237\272\347\241\200\344\270\216\345\272\224\347\224\250.html" new file mode 100644 index 0000000..0a6d37b --- /dev/null +++ "b/JavaScript_code/28.0.cookie\345\237\272\347\241\200\344\270\216\345\272\224\347\224\250.html" @@ -0,0 +1,39 @@ + + + + + cookie + + + + + + \ No newline at end of file diff --git "a/JavaScript_code/28.1.\347\231\273\351\231\206\345\220\216cookie\350\257\273\345\217\226\347\224\250\346\210\267\345\220\215.html" "b/JavaScript_code/28.1.\347\231\273\351\231\206\345\220\216cookie\350\257\273\345\217\226\347\224\250\346\210\267\345\220\215.html" new file mode 100644 index 0000000..0ab37f3 --- /dev/null +++ "b/JavaScript_code/28.1.\347\231\273\351\231\206\345\220\216cookie\350\257\273\345\217\226\347\224\250\346\210\267\345\220\215.html" @@ -0,0 +1,52 @@ + + + + + 28.1.登陆后cookie读取用户名 + + + + +
    + + + +
    + + \ No newline at end of file diff --git "a/JavaScript_code/29.0.\346\255\243\345\210\231\345\237\272\347\241\200\345\255\227\347\254\246\344\270\262.html" "b/JavaScript_code/29.0.\346\255\243\345\210\231\345\237\272\347\241\200\345\255\227\347\254\246\344\270\262.html" new file mode 100644 index 0000000..575d5cd --- /dev/null +++ "b/JavaScript_code/29.0.\346\255\243\345\210\231\345\237\272\347\241\200\345\255\227\347\254\246\344\270\262.html" @@ -0,0 +1,115 @@ + + + + + + 正则表达式应用 + + + + + + +
    + + + + +
    + + + + \ No newline at end of file diff --git "a/JavaScript_code/3.\345\207\275\346\225\260\344\274\240\345\217\202.html" "b/JavaScript_code/3.\345\207\275\346\225\260\344\274\240\345\217\202.html" new file mode 100644 index 0000000..c640179 --- /dev/null +++ "b/JavaScript_code/3.\345\207\275\346\225\260\344\274\240\345\217\202.html" @@ -0,0 +1,99 @@ + + + + + 函数传参 + + + + + + + + + + + + + + + +
    + + + \ No newline at end of file diff --git a/JavaScript_code/30.0.template.html b/JavaScript_code/30.0.template.html new file mode 100644 index 0000000..2e408c4 --- /dev/null +++ b/JavaScript_code/30.0.template.html @@ -0,0 +1,84 @@ + + + + + + + + Document + + + + +
    + + + + + + + + \ No newline at end of file diff --git "a/JavaScript_code/4.\346\217\220\345\217\226\350\241\214\351\227\264\344\272\213\344\273\266\345\222\214\345\276\252\347\216\257.html" "b/JavaScript_code/4.\346\217\220\345\217\226\350\241\214\351\227\264\344\272\213\344\273\266\345\222\214\345\276\252\347\216\257.html" new file mode 100644 index 0000000..3e7997d --- /dev/null +++ "b/JavaScript_code/4.\346\217\220\345\217\226\350\241\214\351\227\264\344\272\213\344\273\266\345\222\214\345\276\252\347\216\257.html" @@ -0,0 +1,127 @@ + + + + + 提取行间事件 + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    + +
    + + + + + + + +
    + + + \ No newline at end of file diff --git "a/JavaScript_code/5.\345\257\274\350\210\252\351\200\211\351\241\271\345\215\241.html" "b/JavaScript_code/5.\345\257\274\350\210\252\351\200\211\351\241\271\345\215\241.html" new file mode 100644 index 0000000..12f0c47 --- /dev/null +++ "b/JavaScript_code/5.\345\257\274\350\210\252\351\200\211\351\241\271\345\215\241.html" @@ -0,0 +1,108 @@ + + + + + 导航选项卡 + + + + +
    + 1 + 2 + 3 + 4 +
    +
    +
      +
    • 1
    • +
    • 1
    • +
    • 1
    • +
    +
      +
    • 2
    • +
    • 2
    • +
    • 2
    • +
    +
      +
    • 3
    • +
    • 3
    • +
    • 3
    • +
    +
      +
    • 4
    • +
    • 4
    • +
    • 4
    • +
    +
    + + \ No newline at end of file diff --git "a/JavaScript_code/6.\347\256\200\346\230\223\346\227\245\345\216\206.html" "b/JavaScript_code/6.\347\256\200\346\230\223\346\227\245\345\216\206.html" new file mode 100644 index 0000000..5d47c03 --- /dev/null +++ "b/JavaScript_code/6.\347\256\200\346\230\223\346\227\245\345\216\206.html" @@ -0,0 +1,117 @@ + + + + + 简易日历 + + + + +
    + + + + + + + + + + + + + + + + + + + + + +
    1
    JAN
    2
    FER
    3
    MAR
    4
    APR
    5
    MAY
    6
    JUN
    7
    JUL
    8
    AUG
    9
    SEP
    10
    OCT
    11
    NOV
    12
    DEC
    +
    +

    + +

    +
    +
    + + \ No newline at end of file diff --git "a/JavaScript_code/7.\345\217\230\351\207\217\347\261\273\345\236\213\350\275\254\346\215\242.html" "b/JavaScript_code/7.\345\217\230\351\207\217\347\261\273\345\236\213\350\275\254\346\215\242.html" new file mode 100644 index 0000000..4ce3e9b --- /dev/null +++ "b/JavaScript_code/7.\345\217\230\351\207\217\347\261\273\345\236\213\350\275\254\346\215\242.html" @@ -0,0 +1,57 @@ + + + + + 变量类型转换 + + + + + + + +
    + +
    +
    + +
    + + \ No newline at end of file diff --git "a/JavaScript_code/8.\350\277\220\347\256\227\347\254\246.html" "b/JavaScript_code/8.\350\277\220\347\256\227\347\254\246.html" new file mode 100644 index 0000000..5b7d349 --- /dev/null +++ "b/JavaScript_code/8.\350\277\220\347\256\227\347\254\246.html" @@ -0,0 +1,114 @@ + + + + + 运算符 + + + + +
    +
      +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    +
    +
    + + \ No newline at end of file diff --git "a/JavaScript_code/9.1.\346\265\201\347\250\213\346\216\247\345\210\266\345\222\214JSON.html" "b/JavaScript_code/9.1.\346\265\201\347\250\213\346\216\247\345\210\266\345\222\214JSON.html" new file mode 100644 index 0000000..7879096 --- /dev/null +++ "b/JavaScript_code/9.1.\346\265\201\347\250\213\346\216\247\345\210\266\345\222\214JSON.html" @@ -0,0 +1,54 @@ + + + + + 程序流程控制 + + + + + + diff --git "a/JavaScript_code/9.2.\346\225\260\347\273\204\346\223\215\344\275\234.html" "b/JavaScript_code/9.2.\346\225\260\347\273\204\346\223\215\344\275\234.html" new file mode 100644 index 0000000..f7b630d --- /dev/null +++ "b/JavaScript_code/9.2.\346\225\260\347\273\204\346\223\215\344\275\234.html" @@ -0,0 +1,145 @@ + + + + + 数组操作 + + + + +
    + + + + + +
    +
    + + +
    +
    + + + +
    +
    + + \ No newline at end of file diff --git a/JavaScript_code/css/18.1.css b/JavaScript_code/css/18.1.css new file mode 100644 index 0000000..54558b8 --- /dev/null +++ b/JavaScript_code/css/18.1.css @@ -0,0 +1,171 @@ + + body { + width: 100%; + height: 100%; + background-color: cornsilk; + } + li { + float: left; + } + /* 居中 div */ + #div_center { + margin: 20px auto; + width: 640px; + height: 450px; + } + /* 定位 div */ + #div_position { + width: 640px; + height: 1100px; + overflow: hidden; + background-color: rgb(70, 70, 70); + position: absolute; + } + + /* 大图样式 */ + #div_pic { + width: 640px; + height: 360px; + overflow: hidden; + position: absolute; + } + .ul_pic { + position: absolute; + } + .li_pic { + position: absolute; + } + .li_pic img{ + width: 640px; + height: 360px; + } + + /* 左右键样式 */ + .ul_btn { + top: 0px; + width: 640px; + height: 360px; + position: absolute; + float: left; + } + .slider_btn_left, .slider_btn_right { + width: 150px; + height: 360px; + } + .slider_btn_right { + float: right; + } + .slider_btn_left img{ + padding: 150px 105px 150px 10px ; + position: relative; + width: 35px; + height: 60px; + opacity: 0; + filter: alpha(opacity=0); + float: left; + } + .slider_btn_right img{ + padding: 150px 10px 150px 105px ; + position: relative; + width: 35px; + height: 60px; + opacity: 0; + filter: alpha(opacity=0); + float: right; + } + + /* 小图样式 */ + #div_thumbnail { + top: 360px; + width: 620px; + background-color: rgb(70, 70, 70); + margin: 0 10px 0 5px; + overflow: hidden; + position: absolute; + } + .ul_thumbnail { + width: 640px; + height: 90px; + } + .li_thumnali { + opacity: 0.5; + filter: alpha(opacity=50); + } + .li_thumnali img{ + padding: 10px 0px 10px 10px; + width: 125px; + height: 70px; + } + + /* 图片文字栏 */ + .ul_txt { + width: 640px; + height: 20px; + position: absolute; + top: 340px; + } + .li4_background { + width: 640px; + height: 20px; + top: 0px; + background-color: rgb(0, 0, 0); + opacity: 0.5; + filter: alpha(opacity=50); + } + .li4_introduction { + top: -17px; + margin-left: 10px; + width: 500px; + position: relative; + color: rgb(255, 255, 255); + filter: alpha(opacity=80); + opacity: 0.8; + } + .li4_sum_num { + width: 120px; + top: -17px; + left: 10px; + position: relative; + color: rgb(255, 255, 255); + filter: alpha(opacity=80); + opacity: 0.8; + } + + /* 评论区 */ + #div_comments { + position: absolute; + display: block; + top: 450px; + padding-top: 20px; + width: 640px; + background-color: rgb(252, 229, 200); + } + #div_com_inp { + margin-top: 5px; + border-top: burlywood dashed 1px; + border-bottom: burlywood dashed 1px; + } + .text { + margin: 20px 0 20px 53px; + } + .btn { + margin: 20px 0 20px 20px; + width: 70px; + height: 70px; + } + #div_com_show { + height: 475px; + margin: 20px 50px; + padding: 0px 20px; + background-color: rgb(255, 255, 255); + overflow: hidden; + } + .li_comment { + white-space: pre-wrap; + padding: 10px 5px; + float: none; + border-bottom: cadetblue dashed 1px; + opacity: 0; + filter: alpha(opacity=0); + overflow: hidden; + } \ No newline at end of file diff --git a/JavaScript_code/css/black.css b/JavaScript_code/css/black.css new file mode 100644 index 0000000..18bbe44 --- /dev/null +++ b/JavaScript_code/css/black.css @@ -0,0 +1,5 @@ +div { + background: black; + width: 100px; + height: 50px; +} diff --git a/JavaScript_code/css/grey.css b/JavaScript_code/css/grey.css new file mode 100644 index 0000000..876dc21 --- /dev/null +++ b/JavaScript_code/css/grey.css @@ -0,0 +1,5 @@ +div { + background: grey; + width: 100px; + height: 50px; +} \ No newline at end of file diff --git a/JavaScript_code/css/reset.css b/JavaScript_code/css/reset.css new file mode 100644 index 0000000..351046a --- /dev/null +++ b/JavaScript_code/css/reset.css @@ -0,0 +1,44 @@ +@charset "utf-8"; +/* + Document : CSS样式初始化 + Created on : 2016. 8. 7,09:41:00 + Author : + Description: + CSS样式表的初始化,全局样式设置。部分样式属性请根据具体页面重置其属性 + 导入方式: */ + +/* reset */ +body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,textarea,p,blockquote,th,td,input,select,textarea,button {margin:0;padding:0} /* 初始化标签在所有浏览器中的margin、padding值 */ +fieldset,img {border:0 none} /* 重置fieldset(表单分组)、图片的边框为0*/ +dl,ul,ol,menu,li {list-style:none} /* 重置类表前导符号为onne,menu在HTML5中有效 */ +blockquote, q {quotes: none} /* 重置嵌套引用的引号类型 */ +blockquote:before, blockquote:after,q:before, q:after {content:'';content:none} /* 重置嵌套引用*/ +input,select,textarea,button {vertical-align:middle;} /* 重置表单控件垂直居中*/ +button {border:0 none;background-color:transparent;cursor:pointer} /* 重置表单button按钮效果 */ +body {background:#fff} /* 重置body 页面背景为白色 */ +body,th,td,input,select,textarea,button {font-size:14px;line-height:1 ;font-family:"微软雅黑", "黑体","宋体";color:#000} /* 重置页面文字属性 */ +a {color:#ccc;text-decoration:none} /* 重置链接a标签 */ +a:active, a:hover {text-decoration:none} /* 重置链接a标签的鼠标滑动效果 */ +address,caption,cite,code,dfn,em,var {font-style:normal;font-weight:normal} /* 重置样式标签的样式 */ +caption {display:none;} /* 重置表格标题为隐藏 */ +table {width:100%;border-collapse:collapse;border-spacing:0;table-layout:fixed;} /* 重置table属性 */ +img{vertical-align:top} /* 图片在当前行内的垂直位置 */ + +/* 页面设置 */ + + /* 取消a标签点击后的虚线框 */ +a {outline: none;} +a:active {star:expression(this.onFocus=this.blur());} + + /* 设置页面文字等在拖动鼠标选中情况下的背景色与文字颜色 */ +/* +::selection {color: #fff;background-color: #4C6E78;} +::-moz-selection {color: #fff;background-color: #4C6E78;} +*/ + +/*清除浮动*/ +.clear{clear: both;} + +/*清除浮动--推荐使用*/ +.clearfix:before,.clearfix:after{content: '';display: table;} +.clearfix:after{clear: both;} \ No newline at end of file diff --git a/JavaScript_code/images/0.png b/JavaScript_code/images/0.png new file mode 100644 index 0000000..eec1135 Binary files /dev/null and b/JavaScript_code/images/0.png differ diff --git a/JavaScript_code/images/1.png b/JavaScript_code/images/1.png new file mode 100644 index 0000000..d9623e0 Binary files /dev/null and b/JavaScript_code/images/1.png differ diff --git a/JavaScript_code/images/11.png b/JavaScript_code/images/11.png new file mode 100644 index 0000000..28f18b0 Binary files /dev/null and b/JavaScript_code/images/11.png differ diff --git a/JavaScript_code/images/11_07.png b/JavaScript_code/images/11_07.png new file mode 100644 index 0000000..d7fae97 Binary files /dev/null and b/JavaScript_code/images/11_07.png differ diff --git a/JavaScript_code/images/12.png b/JavaScript_code/images/12.png new file mode 100644 index 0000000..840ecee Binary files /dev/null and b/JavaScript_code/images/12.png differ diff --git a/JavaScript_code/images/13.png b/JavaScript_code/images/13.png new file mode 100644 index 0000000..77918af Binary files /dev/null and b/JavaScript_code/images/13.png differ diff --git a/JavaScript_code/images/14.png b/JavaScript_code/images/14.png new file mode 100644 index 0000000..67e9f9c Binary files /dev/null and b/JavaScript_code/images/14.png differ diff --git a/JavaScript_code/images/1_07.png b/JavaScript_code/images/1_07.png new file mode 100644 index 0000000..338d4cc Binary files /dev/null and b/JavaScript_code/images/1_07.png differ diff --git a/JavaScript_code/images/2.png b/JavaScript_code/images/2.png new file mode 100644 index 0000000..07509d1 Binary files /dev/null and b/JavaScript_code/images/2.png differ diff --git a/JavaScript_code/images/3.png b/JavaScript_code/images/3.png new file mode 100644 index 0000000..84c4a34 Binary files /dev/null and b/JavaScript_code/images/3.png differ diff --git a/JavaScript_code/images/4.png b/JavaScript_code/images/4.png new file mode 100644 index 0000000..b6cecec Binary files /dev/null and b/JavaScript_code/images/4.png differ diff --git a/JavaScript_code/images/5.png b/JavaScript_code/images/5.png new file mode 100644 index 0000000..c6aff74 Binary files /dev/null and b/JavaScript_code/images/5.png differ diff --git a/JavaScript_code/images/6.png b/JavaScript_code/images/6.png new file mode 100644 index 0000000..23ccf6d Binary files /dev/null and b/JavaScript_code/images/6.png differ diff --git a/JavaScript_code/images/7.png b/JavaScript_code/images/7.png new file mode 100644 index 0000000..f3f83ef Binary files /dev/null and b/JavaScript_code/images/7.png differ diff --git a/JavaScript_code/images/8.png b/JavaScript_code/images/8.png new file mode 100644 index 0000000..8825fc6 Binary files /dev/null and b/JavaScript_code/images/8.png differ diff --git a/JavaScript_code/images/9.png b/JavaScript_code/images/9.png new file mode 100644 index 0000000..004d7b4 Binary files /dev/null and b/JavaScript_code/images/9.png differ diff --git a/JavaScript_code/images/album/1.jpeg b/JavaScript_code/images/album/1.jpeg new file mode 100644 index 0000000..e57c728 Binary files /dev/null and b/JavaScript_code/images/album/1.jpeg differ diff --git a/JavaScript_code/images/album/2.jpeg b/JavaScript_code/images/album/2.jpeg new file mode 100644 index 0000000..300aad0 Binary files /dev/null and b/JavaScript_code/images/album/2.jpeg differ diff --git a/JavaScript_code/images/album/3.jpeg b/JavaScript_code/images/album/3.jpeg new file mode 100644 index 0000000..70a4bbc Binary files /dev/null and b/JavaScript_code/images/album/3.jpeg differ diff --git a/JavaScript_code/images/album/4.jpeg b/JavaScript_code/images/album/4.jpeg new file mode 100644 index 0000000..93e08ad Binary files /dev/null and b/JavaScript_code/images/album/4.jpeg differ diff --git a/JavaScript_code/images/album/5.jpeg b/JavaScript_code/images/album/5.jpeg new file mode 100644 index 0000000..ae1bd7f Binary files /dev/null and b/JavaScript_code/images/album/5.jpeg differ diff --git a/JavaScript_code/images/album/6.jpeg b/JavaScript_code/images/album/6.jpeg new file mode 100644 index 0000000..6023c2b Binary files /dev/null and b/JavaScript_code/images/album/6.jpeg differ diff --git a/JavaScript_code/images/ara.png b/JavaScript_code/images/ara.png new file mode 100644 index 0000000..7a47895 Binary files /dev/null and b/JavaScript_code/images/ara.png differ diff --git a/JavaScript_code/images/arabutton.png b/JavaScript_code/images/arabutton.png new file mode 100644 index 0000000..4c93bfe Binary files /dev/null and b/JavaScript_code/images/arabutton.png differ diff --git a/JavaScript_code/images/bg.jpg b/JavaScript_code/images/bg.jpg new file mode 100644 index 0000000..e8e517d Binary files /dev/null and b/JavaScript_code/images/bg.jpg differ diff --git a/JavaScript_code/images/footer.png b/JavaScript_code/images/footer.png new file mode 100644 index 0000000..7fda508 Binary files /dev/null and b/JavaScript_code/images/footer.png differ diff --git a/JavaScript_code/images/images/slider_btn_icon_01.png b/JavaScript_code/images/images/slider_btn_icon_01.png new file mode 100644 index 0000000..406ef7b Binary files /dev/null and b/JavaScript_code/images/images/slider_btn_icon_01.png differ diff --git a/JavaScript_code/images/images/slider_btn_icon_02.png b/JavaScript_code/images/images/slider_btn_icon_02.png new file mode 100644 index 0000000..1de6500 Binary files /dev/null and b/JavaScript_code/images/images/slider_btn_icon_02.png differ diff --git a/JavaScript_code/images/images/slider_btn_icon_04.png b/JavaScript_code/images/images/slider_btn_icon_04.png new file mode 100644 index 0000000..0504880 Binary files /dev/null and b/JavaScript_code/images/images/slider_btn_icon_04.png differ diff --git a/JavaScript_code/images/images/slider_btn_icon_09.png b/JavaScript_code/images/images/slider_btn_icon_09.png new file mode 100644 index 0000000..7b593f5 Binary files /dev/null and b/JavaScript_code/images/images/slider_btn_icon_09.png differ diff --git a/JavaScript_code/images/images/slider_btn_icon_left.png b/JavaScript_code/images/images/slider_btn_icon_left.png new file mode 100644 index 0000000..503baeb Binary files /dev/null and b/JavaScript_code/images/images/slider_btn_icon_left.png differ diff --git a/JavaScript_code/images/images/slider_btn_icon_right.png b/JavaScript_code/images/images/slider_btn_icon_right.png new file mode 100644 index 0000000..7365ee7 Binary files /dev/null and b/JavaScript_code/images/images/slider_btn_icon_right.png differ diff --git a/JavaScript_code/images/kat-alt.png b/JavaScript_code/images/kat-alt.png new file mode 100644 index 0000000..8fc7dd0 Binary files /dev/null and b/JavaScript_code/images/kat-alt.png differ diff --git a/JavaScript_code/images/kat-bas.png b/JavaScript_code/images/kat-bas.png new file mode 100644 index 0000000..601e1bf Binary files /dev/null and b/JavaScript_code/images/kat-bas.png differ diff --git a/JavaScript_code/images/kat-orta.png b/JavaScript_code/images/kat-orta.png new file mode 100644 index 0000000..0e2c0ce Binary files /dev/null and b/JavaScript_code/images/kat-orta.png differ diff --git a/JavaScript_code/images/logo.png b/JavaScript_code/images/logo.png new file mode 100644 index 0000000..418f511 Binary files /dev/null and b/JavaScript_code/images/logo.png differ diff --git a/JavaScript_code/images/menu-hover.png b/JavaScript_code/images/menu-hover.png new file mode 100644 index 0000000..93c73e8 Binary files /dev/null and b/JavaScript_code/images/menu-hover.png differ diff --git a/JavaScript_code/images/shoppingcartlogo.png b/JavaScript_code/images/shoppingcartlogo.png new file mode 100644 index 0000000..0dca335 Binary files /dev/null and b/JavaScript_code/images/shoppingcartlogo.png differ diff --git a/JavaScript_code/images/shoppingset-bg.png b/JavaScript_code/images/shoppingset-bg.png new file mode 100644 index 0000000..03f873c Binary files /dev/null and b/JavaScript_code/images/shoppingset-bg.png differ diff --git a/JavaScript_code/img/0.png b/JavaScript_code/img/0.png new file mode 100644 index 0000000..ec648b7 Binary files /dev/null and b/JavaScript_code/img/0.png differ diff --git a/JavaScript_code/img/1.png b/JavaScript_code/img/1.png new file mode 100644 index 0000000..cfec27c Binary files /dev/null and b/JavaScript_code/img/1.png differ diff --git a/JavaScript_code/img/2.png b/JavaScript_code/img/2.png new file mode 100644 index 0000000..703b30a Binary files /dev/null and b/JavaScript_code/img/2.png differ diff --git a/JavaScript_code/img/3.png b/JavaScript_code/img/3.png new file mode 100644 index 0000000..b3c7646 Binary files /dev/null and b/JavaScript_code/img/3.png differ diff --git a/JavaScript_code/img/4.png b/JavaScript_code/img/4.png new file mode 100644 index 0000000..9bab394 Binary files /dev/null and b/JavaScript_code/img/4.png differ diff --git a/JavaScript_code/img/5.png b/JavaScript_code/img/5.png new file mode 100644 index 0000000..9a5a64d Binary files /dev/null and b/JavaScript_code/img/5.png differ diff --git a/JavaScript_code/img/6.png b/JavaScript_code/img/6.png new file mode 100644 index 0000000..e5730b2 Binary files /dev/null and b/JavaScript_code/img/6.png differ diff --git a/JavaScript_code/img/7.png b/JavaScript_code/img/7.png new file mode 100644 index 0000000..b607cf3 Binary files /dev/null and b/JavaScript_code/img/7.png differ diff --git a/JavaScript_code/img/8.png b/JavaScript_code/img/8.png new file mode 100644 index 0000000..9eccf8f Binary files /dev/null and b/JavaScript_code/img/8.png differ diff --git a/JavaScript_code/img/9.png b/JavaScript_code/img/9.png new file mode 100644 index 0000000..0cd3534 Binary files /dev/null and b/JavaScript_code/img/9.png differ diff --git a/JavaScript_code/lib/Drag.js b/JavaScript_code/lib/Drag.js new file mode 100644 index 0000000..dd8425e --- /dev/null +++ b/JavaScript_code/lib/Drag.js @@ -0,0 +1,36 @@ +function Drag(id) { + this.disX = ''; + this.disY = ''; + this.oDiv = document.getElementById(id); + var _this = this; + this.oDiv.onmousedown = function (ev) { + _this.fnDown(ev); + return false; + }; +} +Drag.prototype.fnDown = function (ev) { + var ev = event||ev; + var _this = this; + // 鼠标可视区位置 - div左边距 = 鼠标在div内的位置 + this.disX = ev.clientX - this.oDiv.offsetLeft; + this.disY = ev.clientY - this.oDiv.offsetTop; + console.log(this.disX,'可视区鼠标X:', ev.clientX, '鼠标Y:',ev.clientY); + document.onmousemove = function (ev) { + _this.mouseMove(ev); + } + document.onmouseup = function (ev) { + _this.mouseUp(ev); + } +} +Drag.prototype.mouseMove = function(ev) { + // 不断获取Event 对象,坐标才会不断更新 + var ev = event||ev; + // console.log('可视区鼠标X:', ev.clientX, '鼠标Y:',ev.clientY); + // div位置 = 鼠标可视区新的位置 - 鼠标与div的距离 + this.oDiv.style.left = ev.clientX - this.disX + 'px'; + this.oDiv.style.top = ev.clientY - this.disY + 'px'; + } +Drag.prototype.mouseUp = function () { + document.onmousemove = ''; + document.onmouseup = ''; +} \ No newline at end of file diff --git a/JavaScript_code/lib/LimitDrag.js b/JavaScript_code/lib/LimitDrag.js new file mode 100644 index 0000000..ba34017 --- /dev/null +++ b/JavaScript_code/lib/LimitDrag.js @@ -0,0 +1,29 @@ +// 继承属性 +function LimitDrag(id) { + Drag.call(this, id); +} +// 继承原型 +for (var i in Drag.prototype) { + LimitDrag.prototype[i] = Drag.prototype[i]; +} + +LimitDrag.prototype.mouseMove = function(ev) { + // 不断获取Event 对象,坐标才会不断更新 + var ev = event||ev; + // console.log('可视区鼠标X:', ev.clientX, '鼠标Y:',ev.clientY); + // div位置 = 鼠标可视区新的位置 - 鼠标与div的距离 + var l = ev.clientX - this.disX; + var t = ev.clientY - this.disY; + if (l < 0) { + l = 0; + } else if (l > document.documentElement.clientWidth - this.oDiv.offsetWidth) { + l = document.documentElement.clientWidth - this.oDiv.offsetWidth; + } + if ( t < 0) { + t = 0; + } else if (t > document.documentElement.clientHeight - this.oDiv.offsetHeight) { + t = document.documentElement.clientHeight - this.oDiv.offsetHeight; + } + this.oDiv.style.top = t + 'px'; + this.oDiv.style.left = l + 'px'; +} \ No newline at end of file diff --git a/JavaScript_code/lib/move.js b/JavaScript_code/lib/move.js new file mode 100644 index 0000000..69c99de --- /dev/null +++ b/JavaScript_code/lib/move.js @@ -0,0 +1,42 @@ + +// 封装获取计算后元素样式函数,返回小数 +function getStyle(obj, name) { + if (obj.currentStyle) { + return obj.currentStyle[name]; + } else { + return getComputedStyle(obj, '') [name]; + } +} + // 任意值运动框架 +function startMove(obj, name, iTarget ) { + clearInterval(obj.timer); + obj.timer = setInterval(move, 30); + function move() { + var current = 0; + if (name === 'opacity') { + // 用 parseFloat 保留小数并去掉后面 px ,从左至右提取数字,遇到不是数字跳出 + // Math.round() 四舍五入取整 + current = Math.round(parseFloat(getStyle(obj, name))*100); + } else { + // 用 parseInt 去掉后面 px ,从左至右提取数字,遇到不是数字跳出 + current = parseInt(getStyle(obj, name)); + } + var speed = (iTarget - current)/3; + if (speed < 0) { + speed = Math.floor(speed); + } else { + speed = Math.ceil(speed); + } + if (iTarget === current) { + clearInterval(obj.timer); + } else { + if (name === 'opacity') { + obj.style[name] = (current + speed)/100; + obj.style.filter = "alpha("+[name]+ "=" + (current + speed) + ")"; + } else { + obj.style[name] = current + speed + 'px'; + } + } + // console.log('iTarget',iTarget,'current',current,'getStyle',getStyle(obj, name),speed) + } +} \ No newline at end of file diff --git a/JavaScript_code/lib/move2.js b/JavaScript_code/lib/move2.js new file mode 100644 index 0000000..627c1dd --- /dev/null +++ b/JavaScript_code/lib/move2.js @@ -0,0 +1,52 @@ +// ./lib/move.js +// 封装获取计算后元素样式函数,返回小数 +function getStyle(obj, name) { + if (obj.currentStyle) { + return obj.currentStyle[name]; + } else { + return getComputedStyle(obj, '') [name]; + } +} + // 任意值运动框架 +function startMove(obj, json, fnEnd ) { + clearInterval(obj.timer); + obj.timer = setInterval(move, 30); + function move() { + var current = 0; + var stop = true; + for (const attr in json) { + if (attr === 'opacity') { + // 用 parseFloat 保留小数并去掉后面 px ,从左至右提取数字,遇到不是数字跳出 + // Math.round() 四舍五入取整 + current = Math.round(parseFloat(getStyle(obj, attr))*100); + } else { + // 用 parseInt 去掉后面 px ,从左至右提取数字,遇到不是数字跳出 + current = parseInt(getStyle(obj, attr)); + } + var speed = (json[attr] - current)/4; + if (speed < 0) { + speed = Math.floor(speed); + } else { + speed = Math.ceil(speed); + } + if (json[attr] === current) { + stop = true; + } else { + stop = false; + if (attr === 'opacity') { + obj.style[attr] = (current + speed)/100; + obj.style.filter = "alpha("+[attr]+ "=" + (current + speed) + ")"; + } else { + obj.style[attr] = current + speed + 'px'; + } + } + // console.log('json[attr]:',json[attr],'attr:', attr,'current:',current,'getStyle:',getStyle(obj, attr),'speed:',speed); + } + if (stop === true) { + clearInterval(obj.timer); + if (fnEnd) { + fnEnd() + } + } + } +} \ No newline at end of file diff --git a/JavaScript_code/lib/move3.js b/JavaScript_code/lib/move3.js new file mode 100644 index 0000000..a7a8741 --- /dev/null +++ b/JavaScript_code/lib/move3.js @@ -0,0 +1,52 @@ +// ./lib/move.js +// 封装获取计算后元素样式函数,返回小数 +function getStyle(obj, name) { + if (obj.currentStyle) { + return obj.currentStyle[name]; + } else { + return getComputedStyle(obj, '') [name]; + } +} + // 任意值运动框架 +function startMove(obj, json, fnEnd ) { + clearInterval(obj.timer); + obj.timer = setInterval(move, 30); + function move() { + var current = 0; + var stop = true; + for (const attr in json) { + if (attr === 'opacity') { + // 用 parseFloat 保留小数并去掉后面 px ,从左至右提取数字,遇到不是数字跳出 + // Math.round() 四舍五入取整 + current = Math.round(parseFloat(getStyle(obj, attr))*100); + } else { + // 用 parseInt 去掉后面 px ,从左至右提取数字,遇到不是数字跳出 + current = parseInt(getStyle(obj, attr)); + } + var speed = (json[attr] - current)/4; + if (speed < 0) { + speed = Math.floor(speed); + } else { + speed = Math.ceil(speed); + } + if (json[attr] === current) { + stop = true; + } else { + stop = false; + if (attr === 'opacity') { + obj.style[attr] = (current + speed)/100; + obj.style.filter = "alpha("+[attr]+ "=" + (current + speed) + ")"; + } else { + obj.style[attr] = current + speed + 'px'; + } + } + console.log('json[attr]:',json[attr],'attr:', attr,'current:',current,'getStyle:',getStyle(obj, attr),'speed:',speed); + } + if (stop === true) { + clearInterval(obj.timer); + if (fnEnd) { + fnEnd() + } + } + } +} \ No newline at end of file diff --git a/JavaScript_code/lib/template-web.js b/JavaScript_code/lib/template-web.js new file mode 100644 index 0000000..8609639 --- /dev/null +++ b/JavaScript_code/lib/template-web.js @@ -0,0 +1,3 @@ +/*! art-template@4.13.1 for browser | https://github.com/aui/art-template */ +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.template=t():e.template=t()}("undefined"!=typeof self?self:this,function(){return function(e){function t(r){if(n[r])return n[r].exports;var i=n[r]={i:r,l:!1,exports:{}};return e[r].call(i.exports,i,i.exports,t),i.l=!0,i.exports}var n={};return t.m=e,t.c=n,t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},t.n=function(e){var n=e&&e.__esModule?function(){return e["default"]}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=4)}([function(e,t,n){"use strict";var r=n(6),i=n(2),o=n(22),s=function(e,t){t.onerror(e,t);var n=function(){return"{Template Error}"};return n.mappings=[],n.sourcesContent=[],n},a=function u(e){var t=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};"string"!=typeof e?t=e:t.source=e,t=i.$extend(t),e=t.source,!0===t.debug&&(t.cache=!1,t.minimize=!1,t.compileDebug=!0),t.compileDebug&&(t.minimize=!1),t.filename&&(t.filename=t.resolveFilename(t.filename,t));var n=t.filename,a=t.cache,c=t.caches;if(a&&n){var l=c.get(n);if(l)return l}if(!e)try{e=t.loader(n,t),t.source=e}catch(m){var f=new o({name:"CompileError",path:n,message:"template not found: "+m.message,stack:m.stack});if(t.bail)throw f;return s(f,t)}var p=void 0,h=new r(t);try{p=h.build()}catch(f){if(f=new o(f),t.bail)throw f;return s(f,t)}var d=function(e,n){try{return p(e,n)}catch(f){if(!t.compileDebug)return t.cache=!1,t.compileDebug=!0,u(t)(e,n);if(f=new o(f),t.bail)throw f;return s(f,t)()}};return d.mappings=p.mappings,d.sourcesContent=p.sourcesContent,d.toString=function(){return p.toString()},a&&n&&c.set(n,d),d};a.Compiler=r,e.exports=a},function(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t["default"]=/((['"])(?:(?!\2|\\).|\\(?:\r\n|[\s\S]))*(\2)?|`(?:[^`\\$]|\\[\s\S]|\$(?!\{)|\$\{(?:[^{}]|\{[^}]*\}?)*\}?)*(`)?)|(\/\/.*)|(\/\*(?:[^*]|\*(?!\/))*(\*\/)?)|(\/(?!\*)(?:\[(?:(?![\]\\]).|\\.)*\]|(?![\/\]\\]).|\\.)+\/(?:(?!\s*(?:\b|[\u0080-\uFFFF$\\'"~({]|[+\-!](?!=)|\.?\d))|[gmiyu]{1,5}\b(?![\u0080-\uFFFF$\\]|\s*(?:[+\-*%&|^<>!=?({]|\/(?![\/*])))))|(0[xX][\da-fA-F]+|0[oO][0-7]+|0[bB][01]+|(?:\d*\.\d+|\d+\.?)(?:[eE][+-]?\d+)?)|((?!\d)(?:(?!\s)[$\w\u0080-\uFFFF]|\\u[\da-fA-F]{4}|\\u\{[\da-fA-F]+\})+)|(--|\+\+|&&|\|\||=>|\.{3}|(?:[+\-\/%&|^]|\*{1,2}|<{1,2}|>{1,3}|!=?|={1,2})=?|[?~.,:;[\](){}])|(\s+)|(^$|[\s\S])/g,t.matchToToken=function(e){var t={type:"invalid",value:e[0]};return e[1]?(t.type="string",t.closed=!(!e[3]&&!e[4])):e[5]?t.type="comment":e[6]?(t.type="comment",t.closed=!!e[7]):e[8]?t.type="regex":e[9]?t.type="number":e[10]?t.type="name":e[11]?t.type="punctuator":e[12]&&(t.type="whitespace"),t}},function(e,t,n){"use strict";function r(){this.$extend=function(e){return e=e||{},o(e,e instanceof r?e:this)}}var i=n(10),o=n(12),s=n(13),a=n(14),u=n(15),c=n(16),l=n(17),f=n(18),p=n(19),h=n(21),d="undefined"==typeof window,m={source:null,filename:null,rules:[f,l],escape:!0,debug:!!d&&"production"!==process.env.NODE_ENV,bail:!0,cache:!0,minimize:!0,compileDebug:!1,resolveFilename:h,include:s,htmlMinifier:p,htmlMinifierOptions:{collapseWhitespace:!0,minifyCSS:!0,minifyJS:!0,ignoreCustomFragments:[]},onerror:a,loader:c,caches:u,root:"/",extname:".art",ignore:[],imports:i};r.prototype=m,e.exports=new r},function(e,t){},function(e,t,n){"use strict";var r=n(5),i=n(0),o=n(23),s=function(e,t){return t instanceof Object?r({filename:e},t):i({filename:e,source:t})};s.render=r,s.compile=i,s.defaults=o,e.exports=s},function(e,t,n){"use strict";var r=n(0),i=function(e,t,n){return r(e,n)(t)};e.exports=i},function(e,t,n){"use strict";function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t|\([\w\W]*?\))\s*{[\s;]*$)/,"$1})"],[/(^[\w\W]*?\([\w\W]*?\)\s*{[\s;]*$)/,"$1}"]],n=0;n2&&arguments[2]!==undefined?arguments[2]:{},o=[new i("string",e)],s=0;sd&&(p=new i("string",v.slice(d,h.index),p),m.push(p)),p=new i("expression",h[0],p),h[0]=r(p),p.script=a.use.apply(n,h),m.push(p),d=h.index+h[0].length;d]/;o.$escape=function(e){return r(n(e))},o.$each=function(e,t){if(Array.isArray(e))for(var n=0,r=e.length;n {{"+n+"}}")};switch("#"===t&&h("#value","@value"),p){case"set":i="var "+u.join("").trim();break;case"if":i="if("+u.join("").trim()+"){";break;case"else":var d=u.indexOf("if");~d?(u.splice(0,d+1),i="}else if("+u.join("").trim()+"){"):i="}else{";break;case"/if":i="}";break;case"each":l=r._split(a),l.shift(),"as"===l[1]&&(h("each object as value index","each object value index"),l.splice(1,1));i="$each("+(l[0]||"$data")+",function("+(l[1]||"$value")+","+(l[2]||"$index")+"){";break;case"/each":i="})";break;case"block":l=r._split(a),l.shift(),i="block("+l.join(",").trim()+",function(){";break;case"/block":i="})";break;case"echo":p="print",h("echo value","value");case"print":case"include":case"extend":if(0!==u.join("").trim().indexOf("(")){l=r._split(a),l.shift(),i=p+"("+l.join(",")+")";break}default:if(~u.indexOf("|")){var m=a.reduce(function(e,t){var n=t.value,r=t.type;return"|"===n?e.push([]):"whitespace"!==r&&"comment"!==r&&(e.length||e.push([]),":"===n&&1===e[e.length-1].length?h("value | filter: argv","value | filter argv"):e[e.length-1].push(t)),e},[]).map(function(e){return r._split(e)});i=m.reduce(function(e,t){var n=t.shift();return t.unshift(e),"$imports."+n+"("+t.join(",")+")"},m.shift().join(" ").trim())}f=f||"escape"}return c.code=i,c.output=f,c},_split:function(e){e=e.filter(function(e){var t=e.type;return"whitespace"!==t&&"comment"!==t});for(var t=0,n=e.shift(),r=/\]|\)/,i=[[n]];t/,use:function(e,t,n,r){return n={"-":"raw","=":"escape","":!1,"==":"raw","=#":"raw"}[n],t&&(r="/*"+r+"*/",n=!1),{code:r,output:n}}};e.exports=r},function(e,t,n){"use strict";function r(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t> ":" ")+n+"| "+e}).join("\n");return(r||"anonymous")+":"+i+":"+o+"\n"+f+"\n\n"+t+": "+a+(s?"\n generated: "+s:"")}var a=function(e){function t(e){r(this,t);var n=i(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e.message));return n.name="TemplateError",n.message=s(e),Error.captureStackTrace&&Error.captureStackTrace(n,n.constructor),n}return o(t,e),t}(Error);e.exports=a},function(e,t,n){"use strict";e.exports=n(2)}])}); \ No newline at end of file diff --git "a/JavaScript\344\273\216\345\205\245\351\227\250\345\210\260\347\262\276\351\200\232+w3school.md" "b/JavaScript\344\273\216\345\205\245\351\227\250\345\210\260\347\262\276\351\200\232+w3school.md" new file mode 100644 index 0000000..093559c --- /dev/null +++ "b/JavaScript\344\273\216\345\205\245\351\227\250\345\210\260\347\262\276\351\200\232+w3school.md" @@ -0,0 +1,9162 @@ +# [JavaScript从入门到精通](https://www.bilibili.com/video/av29885002) + +## 初探 JavaScript 魅力 + +### JavsScript 是什么 + +- 网页特效原理 + - JavaScript 就是修改样式(文档) +- 编写 JS 的流程 + - 布局:HTML + CSS + - 属性:确定要修改的属性 + - 事件: 确定用户 做哪些操作(产品设计) + - 编写 JS :在事件中,用 JS 来修改页面元素的样式 + +### 第一个 JS 特效:鼠标提示框 + +- 分析效果实现原理 + + - 样式:`div` 的 `display / none` + - 事件:`onmouseover / onmouseout` + - 动手编写效果 + +- 特效基础 + + - 事件驱动:`onmouseover` + - 元素属性操作:`obj.style.[...]` + - 特效实现原理概括:响应式用户操作,对页面元素样式修改 + +- 兼容性问题 + + ```js + // div2.style.display='block'; // 部分浏览器不兼容 + document.getElementById('div2').style.display='block'; // 所有浏览器兼容 + ``` + +- 函数 + + - 制作更复杂的效果 + - 直接在事件内写代码会很乱 + - 引入 `function()` 函数的基本形式 + - 把 JS 标签里放入到函数里,类似于 css 里的 `class` + - 变量的使用:别名 + - 定义和调用 + - 函数定义:告诉系统有这个函数,不会执行 + - 函数调用:执行函数里面的代码 + - 关系和区别 + +- 代码 + + ```html + + + + + 第一个JS效果 + + + + + + + + + +
    +
    + + +
    +

    文字
    文字2

    +
    + + + ``` + +### 网页换肤和 if 判断 + +- 网页换肤 + + - 土豆网 “开灯” “关灯效果” + - 任何标签都可以加 ID ,包括 link + - 任何标签的属性,都可以修改 + - HTML 里面怎么写,JS 里面就怎么写 + +- if 判断 + + - 特效实现原理 + - if 基本形式 + - JS 里面 ` = 赋值, == 判断` + - 为 a 链接添加 JS + - ` ` + - className 的使用 + - ` class ` 是关键字,所以用 ` className ` 代替 + - 其它 HTML 里面怎么写,JS 里面就怎么写 + +- 代码 + + ```html + + + + + + + + + + + +
    1
    +
    2
    +
    3
    + +
    + + + +
    + + javascript:; + + +
    4
    + + + + ``` + +### 函数传参 + +- 改变背景颜色 + + - 函数传参:参数就是占位符 + - 函数里面变量用传参 + +- 改变 div 的任意样式 + + - 操纵属性的第二种方式 + - 要修改的属性不确定时:` 元素.style[ 变量/字符串 ] = 变量/字符串 ` + - JS 中用 `.` 的地方都可以用 `[]` 代替; + - 字符串变量区别和关系 :带引号是字符串,不带是变量 + - 将属性名作为参数传递 + +- style 与 className + + - ` 元素.style.属性 = 变量/字符串 ` + - style 是修改行内样式 + - 行内样式优先级最高,之后再修改 className 不会有效果 + - 建议:只操作一种样式,要么只操作 style ,要么只操作 className + +- 代码: + + ```HTML + + + + + 函数传参 + + + + + + + + + + + + + + + +
    + + + + ``` + + + +### 提取行间事件 + +- 提取事件 + - 为元素添加事件 + - 事件和其它属性一样,可以用 JS 添加:`元素.事件 = 函数名/函数;` + - 不能加括号,加括号直接执行函数 + - `window.onload` 的意义:等待页面加载完成再执行 JS + - 行为( js )、样式( css )、结构( html ) 三者分离 +- 获取一组元素 + - ` 元素.getElementsByTagName('标签名') ` + - 数组的使用 + - 数组的属性 + - 全选的实现 +- 代码: 同下 + +### 循环 while 和 for + +- 用 while 引入 循环的概念 + + - while 循环语法 + - 自增的意义 + - 循环的构成:初始化、条件、语句、自增 + +- for 循环 + + - 用 for 代替 while 循环 + - 用 for 循环为一组元素甜腻骄傲事件 + - 什么时候用循环----一组元素 + - 例子 + - 全选---- checked 属性 + - 反选---- for 循环配合 if 判断 + +- 代码: + + ```HTML + + + + + 提取行间事件和循环 + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    + +
    + + + + + + + +
    + + + + ``` + + + +### 导航栏选项卡 + +- 按钮的实现 + + - 添加事件 + - this 的使用: 指当前发生事件的元素 + - 先清空所有按钮,再选中当前按钮 + +- 内容的实现(ul) + + - 先隐藏所有 ul,再显示当前 ul + - 索引值的使用:什么时候用索引值 + - HTML 添加 index 会被 FireFox 过滤 + - JS 添加 index + +- 代码: + + ```HTML + + + + + 导航选项卡 + + + + +
    + 1 + 2 + 3 + 4 +
    +
    +
      +
    • 1
    • +
    • 1
    • +
    • 1
    • +
    +
      +
    • 2
    • +
    • 2
    • +
    • 2
    • +
    +
      +
    • 3
    • +
    • 3
    • +
    • 3
    • +
    +
      +
    • 4
    • +
    • 4
    • +
    • 4
    • +
    +
    + + + ``` + + + +### JS 简易日历 + +- 程序实现思路 + + - 类似于选项卡,只是下面只有一个div + - innerHTML 的使用 + +- 数组的使用 + + - 定义:` arr = [1, 2, 3] ` + - 使用:` arr[0] ` + +- 字符串拼接 + + - 作用:拼接两个字符串 + - 问题:拼接中的优先级 + - 就近相加, 字符串后面数字相加要加括号 + +- 代码: + + ```HTML + + + + + 简易日历 + + + + +
    + + + + + + + + + + + + + + + + + + + + + +
    1
    JAN
    2
    FER
    3
    MAR
    4
    APR
    5
    MAY
    6
    JUN
    7
    JUL
    8
    AUG
    9
    SEP
    10
    OCT
    11
    NOV
    12
    DEC
    +
    +

    + +

    +
    +
    + + + ``` + + + +## JavaScript 基础 + +### JavaScript 组成 + +- ECMAScript:解释器、编译器(几乎所有兼容) +- DOM:Document Object Model,HTML,`document`(大部分兼容) +- BOM:Browser Object Model,浏览器,`window`(完全不兼容) + - 各组成部分的兼容性、兼容性问题的由来 + +### 变量类型 + +- 类型:`typeof` 运算符 + - 用法:`typeof 元素`返回变量的类型 + - 常见类型: + - `number` 、`string` 、`boolean` 、`undefined`(未定义或定义未使用)、`object`、`function` +- 一个变量应该只放一种类型的数据 + +### 变量类型转换 + +- 数据类型转换 + + - 例子:计算两个文本框的和 + + - 显式类型转换(强制类型转换) + + - `parseInt()` 去除小数、`parseFloat() ` 保留小数:从左至右提取数字,遇到不是数字跳出 + + - `NaN ` 的意义和检测:`Not a Number` + + - NaN: NaN 和任何值都不相等,包括它自己 + + - 使用 ` isNaN()` 检测是否是全是数字 + + - ``` + Number() 转换数值,String() 转换字符串,Boolean() 转换布尔值 + ``` + + - 隐式类型的转换 + + - `== `:先转换类型 再比较 + + 对比 `=== `:全等于,不转换类型直接比较 + + - ` - `:数字相减 + + 对比 ` +`:字符串连接、数字相加 + + - ```js + 5 + null // 返回 5 因为 null 被转换为 0 + "5" + null // 返回 "5null" 因为 null 被转换为 "null" + "5" + 2 // 返回 52 因为 2 被转换为 "2" + "5" - 2 // 返回 3 因为 "5" 被转换为 5 + "5" * "2" // 返回 10 因为 "5" 和 "2" 被转换为 5 和 2 + ``` + +- 更多可用于将数值转换为字符串的方法: + + | 方法 | 描述 | + | :-------------- | :----------------------------------------------------- | + | toExponential() | 返回字符串,对数字进行舍入,并使用指数计数法来写。 | + | toFixed() | 返回字符串,对数字进行舍入,并使用指定位数的小数来写。 | + | toPrecision() | 返回字符串,把数字写为指定的长度。 | + +- 代码: + + ```HTML + + + + + 变量类型转换 + + + + + + + +
    + +
    +
    + +
    + + + ``` + + +### 变量的作用域和闭包 + +- 变量作用域(作用范围) + - 局部变量、全局变量 +- 什么是闭包? + - **子函数可以使用父函数中的局部变量** + - 之前一直在使用闭包 + - 网上对于闭包的定义 + +### 命名规范 + +- 命名规范及必要性 + - 可读性--能看懂 + - 规范性--符合规则 +- 匈牙利命名法 + - **类型前缀 + 首字母大写**:` getElementByTagName ` + +| 类型 | 前缀 | 类型(英文) | 实例 | +| ---------- | ---- | ------------ | ------------ | +| 数组 | a | Array | aItems | +| 布尔值 | b | Boolean | bIsComplete | +| 浮点数 | f | Float | fPrice | +| 函数 | fn | Function | fnHandler | +| 整数 | i | Integer | iItemCount | +| 对象 | o | Object | oDiv1 | +| 正则表达式 | re | RegExp | reEmailCheck | +| 字符串 | s | String | sUserName | +| 变体变量 | v | Variant | vAnything | + +### 运算符 + +- 算数:` +加、-减、*乘、/ 除、%取模 ` + + - 实例:隔行变色、秒转时间 + +- 赋值:` =、+=、-=、*=、/=、%= ` + + - ` +=` : `i += 1 等于 i++ ` + +- 关系:` <、>、<=、>=、== 、===、!=、!==` + + - `!==` :不同类型不比较,且无结果,同类型才比较,对应 `===` + - `!=`:若类型不同,会偿试转换类型,对应 `== ` + +- 逻辑:&&与、||或、!否 + + - 实例:全选与反选 + +- 运算符优先级:括号 + +- 代码: + + ```HTML + + + + + 运算符 + + + + +
    +
      +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    +
    +
    + + + ``` + +### 程序流程控制 + +- 判断:`if、switch、?:` +- 循环:`while、for` +- 跳出:`break、continue` +- 什么是真、什么是假 + - 在 [JavaScript](https://developer.mozilla.org/zh-CN/docs/Glossary/JavaScript) 中,**truthy**(真值)指的是在[布尔值](https://developer.mozilla.org/zh-CN/docs/Glossary/Boolean)上下文中,转换后的值为真的值。所有值都是真值,除非它们被定义为 [假值](https://developer.mozilla.org/zh-CN/docs/Glossary/Falsy)(即除 `false`、`0`、`""`、`null`、`undefined` 和 `NaN` 以外皆为真值)。 +- 代码:同下 + +### JSON + +- 什么是 JSON + +- JSON 和数组 + +- `JSON` 和 `for in` + +- 代码: + + ```HTML + + + + + 程序流程控制 + + + + + + ``` + +## 深入 JavaScript + +### 函数返回值 + +- 什么是函数返回值 + - 函数的执行结果 + - 可以没有 return +- 一个函数应该只有一种返回值类型 + +### 函数传参与行间样式 + +- 可变函数(不定参数):`arguments` + + - 是一个对应于传递给函数的参数的类数组对象。 + + - `arguments`对象是所有(非箭头)函数中都可用的**局部变量**。你可以使用`arguments`对象在函数中引用函数的参数。 + + - JavaScript 中的函数与其他面向对象语言有几个不同的地方。 + + 1. 没有函数重载 + 2. 有一个表示实参列表的类数组对象 `arguments` + + ![img](https://upload-images.jianshu.io/upload_images/12636523-7c8ba2c48d65a375.png?imageMogr2/auto-orient/strip|imageView2/2/w/968/format/webp) + +- 例子:求和 + + - 求所有参数的和 + +- 例子2:CSS 函数 + + - 判断 `arguments.length` + - 给参数取名,增强可读性 + +- **取非行间样式(不能用来设置):** + + - `obj.currentStyle[attr]` 只兼容 IE ,返回小数 + + - `getComputedStyle(obj, false)[attr]`,返回小数 + + - ```js + // 解决兼容问题 + // 封装获取计算后元素样式函数 + function getStyle(obj, name) { + if (obj.currentStyle) { + return obj.currentStyle[name]; + } else { + return getComputedStyle(obj, '') [name]; + } + } + ``` + + - 复合样式:`background` / `border ` 要用具体样式名 `backgroundColor ` 等 + + - 单一样式:` width` / `height` / `position` + +### 数组基础操作 + +- 数组的使用 + + - 定义 + - `var arr = [23, 234, 23, 45];` + - `var arr = new Array(12, 5, 7, 34);` + - 没有任何差别,`[]` 的性能略高,因为代码短 + +- 数组的属性 + + - `length` + - 既可以获取,又可以设置 + - 例子:快速清空数组 `length = 0` + +- 数组的使用原则:数组中应该只存一种类型的变量 + +- 数组的方法 + + - 添加 + - `push(元素)`,从尾部添加 + - `unshift(元素)`,从头部添加 + - 删除 + - `pop()`,从尾部删除 + - `shift()`,从头部删除 + +- 排序 + + - `数组.sort([比较函数])`,排序一个数组,只有数组能使用 + + - 排序一个字符串数组,不加比较函数,**默认按照 ASCII 码排序** + + - 排序一个数字数组,加数字比较大小函数 + + - ```js + // 正序比较函数 数字比大小 字符比ASCII值大小 + function positiveSort(n1, n2) { + if (isNaN) { + if (n1 > n2) { + return 1; + } + if (n1 < n2) { + return -1; + } + if (n1 === n2) { + return 0; + } + } else { + return n1 - n2; + } + } + ``` + +- 转换类 + + - `数组.concat(数组2)` + - 连接两个数组,可用于深度复制 + - `数组.join(分隔符)` + - 用指定`分隔符`替代数组的 `,`,重新组合数组元素,**生成字符串** + - 字符串 `split` + - `数组.reverse()` + - 颠倒数组中元素的顺序 + +- `数组.slice(start,end)` + + - 从已有数组中返回选定元素,可用于深度复制 + - start 为负数时,和数组长度相加再查找 + +- `splice`:先删除,后插入 + + - `数组.splice(起点,长度,元素)` + + - 删除 + + - `数组.splice(起点,长度)` + + - 插入 + + - `数组.splice(起点,0,元素...)` + + - 替换 + + - `数组.splice(起点,长度,元素)` + +- ECMAScript 两个关于位置的方法 + + - `arrayObject.indexOf(searchvalue,startIndex)` + - 从startIndex 开始向后查找,默认值为 0 + - 返回 number 查找项在数组中的位置,没找到返回-1 + - ``arrayObject.lastIndexOf(searchvalue,startIndex)` + - 从startIndex 开始向前查找,默认值为 0 + - 返回 number 查找项在数组中的位置,没找到返回-1 + +- 代码: + + ```HTML + + + + + 数组操作 + + + + +
    + + + + + +
    +
    + + +
    +
    + + + +
    +
    + + + ``` + +- 数组名作为变量(遍历数组中的数组): + + ```js + var arr1=new Array(); + var arr2=new Array(); + var arrlist= new Array(); //存放以上数组 + arrlist.push(arr1); + arrlist.push(arr2); + //循环遍历arrlist,就可以达到你要的效果 + ``` + + + +## 定时器的使用 + +### 定时器的作用 + +- 开启定时器 + + - `setInterval(函数, 间隔时间)` 间隔型,函数后面不能带括号和传参 + + - `setTimeout(函数, 延时时间)` 延时型 + + 1. 如果当前任务执行时间过久,会影延迟到期定时器任务的执行 + 2. 使用 setTimeout 设置的回调函数中的 this 环境不是指向回调函数 + 3. 未激活的页面,setTimeout 执行最小间隔是 1000 毫秒 + 4. setTimeout 存在嵌套调用问题,调用超过5次后,系统会设置最短执行时间间隔为 4 毫秒 + 5. 延时执行时间有最大值 + + - Web Workers 是 HTML5 提供的一个javascript多线程解决方案,可以将一些大计算量的代码交由web Worker运行而不冻结用户界面。 + + 注意:Web Workers需要IE10及其以上的浏览器支持。 + + - 两种定时器的区别,定时器要 `window.onload` 完一秒后才执行 + +- 停止定时器 + + - `clearInterval(定时器名字)` + - `clearTimeout(定时器名字)` + +- 代码: + + ```js + window.onload = function () { + var oBtn1 = document.getElementById('btn1'); + var oBtn2 = document.getElementById('btn2'); + var timer = null; + + oBtn1.onclick = function () { + timer = setInterval(function () { + alert('a'); + }, 2000); + }; + + oBtn2.onclick = function () { + clearInterval(timer); + }; + }; + ``` + +### 数码时钟 + +- 效果思路 + +- 获取系统时间 + + - `new Date` 对象 + - `getHours / getMinutes / getSeconds` + +- 显示系统时间 + + - 字符串连接 + - 空位补零 + +- 设置图片路径 + + - `str[i]`:取出字符串中的第 i 个值,不兼容 ie7 + +- `charAt(i)` 方法 :取出字符串中的第 i 个值,兼容各种浏览器 + +- 设置路径:`"url('img/0.png')"` + +- JavaScript 中的 String 字符串操作方法 + + - `obj.charAt(index)` + - 返回index位置的字符 + - `obj.charCodeAt()` + - 返回index位置的字符编码 + - `obj.indexOf("str")` + - 顺序搜索str,返回其位置,未找到返回-1 + - `obj.lastIndexOf("str")` + - 倒序搜索str,返回其位置,未找到返回-1 + - `slice(start,end)`:同数组 + - `substring(start,end)`:同上,区别在于参数为负数时自动转换为0,并且较小的数为起始位 + - `substr(start,len)`:同上,len 表示截取的长度 + +- 代码: + + ```HTML + + + + 数码时钟 + + + +
      +
    • +
    • + : +
    • +
    • + : +
    • +
    • +
    + + + ``` + + + +### Date 对象其它方法 + +| 方法 | 描述 | +| :---------------- | :-------------------------------------- | +| getDate() | 获得以数值计(1-31)的日 | +| getDay() | 或者以数值计(0-6)的周 | +| getFullYear() | 获得四位的年(yyyy) | +| getHours() | 获得时(0-23) | +| getMilliseconds() | 获得毫秒(0-999) | +| getMinutes() | 获得分钟(0-59) | +| getMonth() | 获得月(0-11) | +| getSeconds() | 获得秒(0-59) | +| getTime() | 获得时间(1970 年 1 月 1 日以来的毫秒) | + +### 延时提示框 + +- 效果演示 + +- 原来的方法 + + - 移入显示,移出隐藏 + +- 移出延时隐藏 + + - 移入下面 `div` 后,还是隐藏 + +- 简化代码 + + - 合并两个相同的 `mouseover` 和 `mouseout` + - 连续 `a=b=c=function()` 两个事件共使用一个函数 + +- 代码:同下 + + +### 无缝滚动 + +- 效果演示 + +- 物体运动基础 + + - 让 `div` 移动起来 + - `offsetLeft/offsetTop` 的作用:获取当前对象的左边距/上边距 + - `offsetWidth/offsetHeight` + - 用定时器让物体连续移动: + - `innerHTML` 拼接两节图片, 宽度后面加 `px` 才会生效 + - `overflow:hidden;` 隐藏元素外的内容 + +- 改变滚动的方向 + + - 修改 `speed` + - 修改判定条件 + - 多次点击越来越快:`if (!timer) `或`clearInterval(timer);` 避免重复调用 + +- 鼠标移入暂停 + + - 移入关闭定时器 + - 移出重新开启定时器 + +- 代码: + + ```HTML + + + + + 移出延时隐藏 + + + +
    +
    +
    +
      +
    • +
    • +
    • +
    • +
    +
    + + + + + ``` + + + +## DOM 基础 + +### DOM 基础 + +- 什么是 DOM +- 浏览器支持情况 + +### DOM 节点 + +- DOM 节点 + - 获取子节点 + - `childNodes`:不兼容高版本,用`nodeType` 兼容 + - 获取文本节点`( nodeType == 3)` 和元素节点`( nodeType == 1)` + - `children`:**只获取元素节点,兼容** + - `parentNode`:查找父节点 + - 例子:点击链接,隐藏整个 `li` + - `offsetParent`:查找定位父级 + - 例子:获取元素在页面上的实际位置 + - 首尾子节点 + - `firstChild` 有兼容性问题,IE6-8用 + - `firstElementChild` 高版本使用 + - `lastChild `/ `lastElementChild` + - 兄弟节点 + - 有兼容性问题,IE6-8用前面的 + - `nextSbling` / ` nextElementSibling` + - `previousSibling ` / `previousElementSibling` + +### 操作元素属性 + +- 操作元素属性 + - 元素属性操作 + - 第一种:`oDiv.style.display = 'block';` + - 第二种:`oDiv.style['display'] = 'block';` + - 第三种:Dom 方式 + - Dom 方式操作元素属性 + - 获取:`getAttribute(名称)` + - 设置:`setAttribute(名称, 值)` + - 删除:`removeAttribute(名称)` + +### DOM 元素灵活查找 + +- 用 className 选择元素 + + - 如何用 className 选择元素 + + - 选出所有元素 + - 通过 className 条件筛选 + + - 封装成函数: + + ```js + // 通过 className 查找元素 + function getByClass(oParent, sClass) { + var aResult = []; + var aEle = oParent.getElementsByTagName('*'); + + for(var i = 0; i < aEle.length; i++) { + if (aEle[i].className == sClass) { + aResult.push(aEle[i]); + } + } + return aResult; + } + ``` + + +​ + +## DOM 操作应用 + +### 创建、插入和删除元素 + +- 创建 DOM 元素 + + - `document.createElement(标签名)` 创建一个节点,不渲染 + - `父级.appendChild(节点)` **删除原有子节点**,再添加子节点,并渲染 + - 例子:为 `ul` 插入 `li` + +- 插入元素 + + - `父级.insertBefore(节点, 原有节点)` 在已有元素前插入 + - 例子:倒叙插入 `li` + +- 删除 DOM 元素 + + - `父级.removeChild(节点)` 删除一个节点 + - 例子:删除 `li` + +- 代码: + + ```HTML + + + + + DOM创建插入删除元素 + + + + + + + + +
    +
      +
    +
    + + + ``` + +### 文档碎片 + +- 文档碎片理论上可以提高 DOM 操作性能 + +- 文档碎片原理 + +- `document.createDocumentFragment()`:Vue 、MVVM 还有用到 + +- 代码: + + ```js + var element = document.getElementById('ul'); // assuming ul exists + var fragment = document.createDocumentFragment(); + var browsers = ['Firefox', 'Chrome', 'Opera', + 'Safari', 'Internet Explorer']; + + browsers.forEach(function(browser) { + var li = document.createElement('li'); + li.textContent = browser; + fragment.appendChild(li); + }); + + element.appendChild(fragment); + ``` + + + +## DOM操作应用高级 + +### 表格标签 + +| 表格 | 描述 | +| :----------- | :--------------------- | +| `` | 定义表格 | +| `` | 定义表格的行。 | +| `` | 定义表格的页眉。 | +| `` | 定义表格的主体。 | +| `` | 定义表格的页脚。 | +| `` | 定义用于表格列的属性。 | +| `` | 定义表格列的组。 | + +### 表格应用 + +- 获取 + + - `tBodies / tHead / tFoot / rows / cells ` + + ```js + var oTab = document.getElementById('tab1'); + alert(oTab.tBodies[0].rows[1].cells[1].innerHTML); + ``` + +- 隔行变色 + + - 鼠标移入高亮 + +- 添加/删除一行 + + - DOM 方法的使用 + +- 搜索 + + - 版本1:基础版本 -- 字符串比较 + - 版本2:忽略大小写 -- 大小写转换 `toLowerCase()/toUpperCase()`,返回字符串 + - 版本3:模糊搜索 -- `search()` 的使用,没找到返回 -1,找到则返回位置 + - 版本4:多关键词 -- `split()` 分割字符串,返回数组 + - 高亮显示、筛选 + +- 排序 + + - 移动 `li` ,使用`appendChild()`: 删除原有 `li`,尾部新增 `li` + - 元素排序:元素集合转换成数组 -- `sort()` 排序 -- `appendChild()`插入 + +- 代码: + + ```HTML + + + + + 表格操作 + + + + +
    + + + +
    +
    + + + + +
    +
    + + +
    +
    + + +
    + + + ``` + + + +### 表单应用 + +- 表单基础知识(本章学习事件的时候再详细说明) + - 什么是表单 + - 向服务器提交数据,比如:用户注册 + - `action ` : 提交到哪里 +- 表单事件 + - `onsubmit`:提交时发生 + - `onreset`:重置时发生 +- 表单内容验证 + - 阻止用户输入非法字符:阻止事件 + - 输入时、失去焦点时验证:`onkeyup` 和`onblur` + - 提交时检查:`onsubmit` + - 后台数据检查 + + + +## JS 运动基础 + +### 运动基础 + +- 让 `div` 动起来 +- 速度:物体运动快慢 +- 运动中的 Bug + - 不会停止 + - 速度取某些值会无法停止 + - 到达位置后点击还会运动 + - 重复点击速度加快 +- 匀速运动 + - 速度不变 + +### 运动框架及应用 + +- 运动框架 + + - 在开始运动时,关闭已有定时器 + - 把运动和停止隔开:`if / else` + +- 运动框架实例 + + - 例子1:“分享到” 侧边栏 + - 通过目标点,计算速度值 + - 例子2:淡入淡出图片 + - 用变量储存透明度 + - `filter:alpha(opacity=30); opacity: 0.3;` IE 用前者 + +- ```HTML + + + + + 运动框架及应用 + + + + +
    + 分享到 +
    +
    + + + ``` + +### 缓冲运动 + +- 逐渐变慢,最后停止 + +- 距离越大速度越大,**速度取整** + + - 速度由距离决定 + - 速度 = (目标值-当前值)/缩放系数 + - `Math.ceil`:向上取整 + - `Math.floor`:向下取整 + +- 例子:缓冲菜单 + + - Bug:速度取整 `Math.ceil`、`Math.floor` + - 跟随页面滚动的缓冲侧边栏 + - 潜在问题:目标不是整数时 + - 目标取整:`parseInt()` + - ` scrollTop = document.documentElement.scrollTop || document.body.scrollTop;` + - `document.documentElement.scrollTop`:IE、Firefox + - `document.body.scrollTop`:chrome + +- `Math.random()` + + - 返回一个等于0小于1的一个随机浮点数 + - 说明:求 n到 m之间的**随机整数的公式** + - `random = Math.floor(Math.random()*(m-n+1)+n)` + +- 代码: + + ```HTML + + + + + + 缓冲运动及停止条件 + + + + +
    + 分享到 +
    +
    +
    +
    + + + + +
    + + + + ``` + +### 运动的停止条件 + +- 运动终止条件 + - 匀速运动:两点足够近(直接改位置),`Math.abs()` 取绝对值 + - 缓冲运动:两点重合(取整后) +- 代码:同上 + +## JS 运动应用 + +### 多物体运动框架 + +- 多个物体同时运动 + - 例子:多个 `div` ,鼠标移入变宽 + - 单定时器,存在问题 + - 每个 `div` 一个定时器 +- 多物体运动框架 + - 定时器作为物体的属性 + - 参数的传递:物体、目标值 + - 例子:多个 `div` 淡入淡出 + - 所有东西都不能公用 + - 属性与运动对象绑定:速度、其它属性值(如透明度等) +- 代码:同下 + +### 任意值运动框架 + +- `offset` 属性的 Bug + + - 获取的是整个盒子模型的大小,有边框的 div 变宽 + - 用 `obj.currentStyle('name')` 和 `getComputedStyle(obj,'').name`代替 `offset` + +- 原有运动框架的问题 + + - 只能让某个值运动起来 + - 如果想让其他值运动起来,要修改程序 + +- 扩展的运动框架 + + - 运动属性作为参数 + - 封装 `opacity ` + - 小数精度问题:`Math.round()` 四舍五入取整 + +- 代码: + + ```HTML + + + + + + 缓冲运动及停止条件 + + + + +
    +
    +
    +
    +
    +
    +
    +
    +
    123adsfzv
    +
    +
    + + + ``` + + + +### 仿 Flash 图片展示 + +- 效果思路 + + - 两边的按钮:淡入淡出 + - 大图下拉:层级、高度变化 + - 下方的 `li` :多物体淡入淡出 + - 下方的 `ul` :位置计算 + +- 左右按钮 + + - 淡入淡出 + - 鼠标移动到按钮上,按钮会消失 + - 层级问题 + - 按钮和遮罩上都得加上事件 + +- 下方 `li` 效果 + + - 点击切换大图:选项卡 + - `li` 淡入淡出:移入移出 + - `ul` 移动:位置计算 + +- 大图片切换 + + - 图片层级:`z-Index` 一直 +1 + - 图片下拉效果(运动框架) + - 可以改为淡入淡出 + +- 加入自动播放 + + - 和选项卡一样 + +- 代码: + + ```HTML + + + + 仿Flash图片展示 + + + + + +
    +
    +
    +
      +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    +
    +
      +
    • +
    • +
    +
      +
    • +
    • 图片说明:introduction
    • +
    • 图片位置:
    • +
    +
    +
      +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    +
    +
    +
    + + + ``` + +- ```js + // ./lib/move.js + // 封装获取计算后元素样式函数,返回小数 + function getStyle(obj, name) { + if (obj.currentStyle) { + return obj.currentStyle[name]; + } else { + return getComputedStyle(obj, '') [name]; + } + } + // 任意值运动框架 + function startMove(obj, name, iTarget ) { + clearInterval(obj.timer); + obj.timer = setInterval(move, 30); + function move() { + var current = 0; + if (name === 'opacity') { + // 用 parseFloat 保留小数并去掉后面 px ,从左至右提取数字,遇到不是数字跳出 + // Math.round() 四舍五入取整 + current = Math.round(parseFloat(getStyle(obj, name))*100); + } else { + // 用 parseInt 去掉后面 px ,从左至右提取数字,遇到不是数字跳出 + current = parseInt(getStyle(obj, name)); + } + var speed = (iTarget - current)/3; + if (speed < 0) { + speed = Math.floor(speed); + } else { + speed = Math.ceil(speed); + } + if (iTarget === current) { + clearInterval(obj.timer); + } else { + if (name === 'opacity') { + obj.style[name] = (current + speed)/100; + obj.style.filter = "alpha("+[name]+ "=" + (current + speed) + ")"; + } else { + obj.style[name] = current + speed + 'px'; + } + } + // console.log('iTarget',iTarget,'current',current,'getStyle',getStyle(obj, name),speed) + } + } + ``` + + + +- 笔记:不让子元素继承父元素的 `opacity ` 属性 + + - 使用 `rgba(R,G,B,opacity)` 间接的设定 `opacity` 的值,这个属性不会向下继承 + - 或者把 `opacity` 属性放到同级元素实现 + +- 笔记:父级使用相对定位,子级才能在范围内绝对定位 + +## JS 运动中级 + +### 链式运动框架 + +- 回调函数:`startMove(obj, attr, iTarget, fn)` + - 运动停止时,执行函数 + - 运动停止时,开始下一次运动 + - 例子:土豆网右下角菜单 + +### 完美运动框架 + +- 多个值同时变化:`startMove(obj, json)` + + - `setStyle` 同时设置多个属性 + - 参数传递: + - `JSON` 的使用 + - `for in` 遍历属性 + +- 运用到运动框架 + +- 检测运动停止 + + - 标志变量 + +- 例子:伸缩同时淡入淡出的菜单 + +- 代码: + + ```js + // ./lib/move2.js + // 封装获取计算后元素样式函数,返回小数 + function getStyle(obj, name) { + if (obj.currentStyle) { + return obj.currentStyle[name]; + } else { + return getComputedStyle(obj, '') [name]; + } + } + // 任意值运动框架 + function startMove(obj, json, fnEnd ) { + clearInterval(obj.timer); + obj.timer = setInterval(move, 30); + function move() { + var current = 0; + var stop = true; + for (const attr in json) { + if (attr === 'opacity') { + // 用 parseFloat 保留小数并去掉后面 px ,从左至右提取数字,遇到不是数字跳出 + // Math.round() 四舍五入取整 + current = Math.round(parseFloat(getStyle(obj, attr))*100); + } else { + // 用 parseInt 去掉后面 px ,从左至右提取数字,遇到不是数字跳出 + current = parseInt(getStyle(obj, attr)); + } + var speed = (json[attr] - current)/4; + if (speed < 0) { + speed = Math.floor(speed); + } else { + speed = Math.ceil(speed); + } + if (json[attr] === current) { + stop = true; + } else { + stop = false; + if (attr === 'opacity') { + obj.style[attr] = (current + speed)/100; + obj.style.filter = "alpha("+[attr]+ "=" + (current + speed) + ")"; + } else { + obj.style[attr] = current + speed + 'px'; + } + } + console.log('json[attr]:',json[attr],'attr:', attr,'current:',current,'getStyle:',getStyle(obj, attr),'speed:',speed); + } + if (stop === true) { + clearInterval(obj.timer); + if (fnEnd) { + fnEnd() + } + } + } + } + ``` + +- ```HTML + + + + + 链式运动框架 + + + + + + +
    +
    +
    土豆
    +
    播放器
    + +
    + + + ``` + + + +### 运动框架总结 + +- 运动框架演变过程 + - `startMove(iTarget)` :运动框架 + - `startMove(obj, iTarget)` :多物体 + - `startMove(obj, attr, iTarget)` :任意值 + - `startMove(obj, attr, iTarget, fn)` :链式运动 + - `startMove(obj, json)` :多值运动 + - `startMove(obj, json, fn)` :完美运动框架 + +### 运动框架应用 + +- 运动框架应用 + + - 例子:幻灯片 + +- 例子:新浪微博 + + - 链式运动 + + - 笔记:CSS `white-space` 属性 保留换行 + + ``` + 值 描述 + normal 默认。空白会被浏览器忽略。 + pre 空白会被浏览器保留。其行为方式类似 HTML 中的
     标签。
    +    nowrap		文本不会换行,文本会在在同一行上继续,直到遇到 
    标签为止。 + pre-wrap 保留空白符序列,但是正常地进行换行。 + pre-line 合并空白符序列,但是保留换行符。 + inherit 规定应该从父元素继承 white-space 属性的值。 + ``` + +- 代码: + + ```HTML + + + + 幻灯片上下滑动和新浪微博效果 + + + + + +
    +
    +
    +
      +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    +
    +
      +
    • +
    • +
    +
      +
    • +
    • 图片说明:introduction
    • +
    • 图片位置:
    • +
    +
    +
      +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    +
    +
    +
    + + +
    +
    +
    +
    +
    +
    + + + ``` + +- ```css + /* 18.1.css */ + body { + width: 100%; + height: 100%; + background-color: cornsilk; + } + li { + float: left; + } + /* 居中 div */ + #div_center { + margin: 20px auto; + width: 640px; + height: 450px; + } + /* 定位 div */ + #div_position { + width: 640px; + height: 1100px; + overflow: hidden; + background-color: rgb(70, 70, 70); + position: absolute; + } + + /* 大图样式 */ + #div_pic { + width: 640px; + height: 360px; + overflow: hidden; + position: absolute; + } + .ul_pic { + position: absolute; + } + .li_pic { + position: absolute; + } + .li_pic img{ + width: 640px; + height: 360px; + } + + /* 左右键样式 */ + .ul_btn { + top: 0px; + width: 640px; + height: 360px; + position: absolute; + float: left; + } + .slider_btn_left, .slider_btn_right { + width: 150px; + height: 360px; + } + .slider_btn_right { + float: right; + } + .slider_btn_left img{ + padding: 150px 105px 150px 10px ; + position: relative; + width: 35px; + height: 60px; + opacity: 0; + filter: alpha(opacity=0); + float: left; + } + .slider_btn_right img{ + padding: 150px 10px 150px 105px ; + position: relative; + width: 35px; + height: 60px; + opacity: 0; + filter: alpha(opacity=0); + float: right; + } + + /* 小图样式 */ + #div_thumbnail { + top: 360px; + width: 620px; + background-color: rgb(70, 70, 70); + margin: 0 10px 0 5px; + overflow: hidden; + position: absolute; + } + .ul_thumbnail { + width: 640px; + height: 90px; + } + .li_thumnali { + opacity: 0.5; + filter: alpha(opacity=50); + } + .li_thumnali img{ + padding: 10px 0px 10px 10px; + width: 125px; + height: 70px; + } + + /* 图片文字栏 */ + .ul_txt { + width: 640px; + height: 20px; + position: absolute; + top: 340px; + } + .li4_background { + width: 640px; + height: 20px; + top: 0px; + background-color: rgb(0, 0, 0); + opacity: 0.5; + filter: alpha(opacity=50); + } + .li4_introduction { + top: -17px; + margin-left: 10px; + width: 500px; + position: relative; + color: rgb(255, 255, 255); + filter: alpha(opacity=80); + opacity: 0.8; + } + .li4_sum_num { + width: 120px; + top: -17px; + left: 10px; + position: relative; + color: rgb(255, 255, 255); + filter: alpha(opacity=80); + opacity: 0.8; + } + + /* 评论区 */ + #div_comments { + position: absolute; + display: block; + top: 450px; + padding-top: 20px; + width: 640px; + background-color: rgb(252, 229, 200); + } + #div_com_inp { + margin-top: 5px; + border-top: burlywood dashed 1px; + border-bottom: burlywood dashed 1px; + } + .text { + margin: 20px 0 20px 53px; + } + .btn { + margin: 20px 0 20px 20px; + width: 70px; + height: 70px; + } + #div_com_show { + height: 475px; + margin: 20px 50px; + padding: 0px 20px; + background-color: rgb(255, 255, 255); + overflow: hidden; + } + .li_comment { + white-space: pre-wrap; + padding: 10px 5px; + float: none; + border-bottom: cadetblue dashed 1px; + opacity: 0; + filter: alpha(opacity=0); + overflow: hidden; + } + ``` + + +## JS事件基础 + +### Event 对象和事件冒泡 + +- 什么是 Event 对象 + - 用来获取鼠标/键盘事件的信息:**鼠标位置、键盘按键** + - 例子:获取鼠标位置:`clientX` + - `document` 的本质是整个网页:`document.childNodes[0].tagName = ''` + - `body` 不加事件,因为没有内容就没高度 + +- 获取 `Event` 对象**(兼容性写法)** + + - `var oEvent = ev||event;` 火狐用 `ev` / IE 用 `event` + - 事件函数把事件对象最为参数传入:`btn.onclick = function(ev) { var oEvent = ev||event;}` + +- 事件流 + - 事件流冒泡:事件往父级传递 + - 取消冒泡:`oEvent.cancelBubble = true` + - 例子:仿 `select` 控件 + - `DOM` 事件流 + +- 代码: + + ```HTML + + + + + 键盘事件和仿select下拉框 + + + + + + +
    + + + ``` + + + +### 鼠标事件 + +- 鼠标位置 + - 可视区位置:`clientX`、`clientY` + + - 例子:跟随鼠标的 `Div` + + - 消除滚动条的影响:**可视区**与**页面顶部**的距离 + + - 代码: + + ```js + // 封装鼠标当前坐标函数 + function getPos(ev) { + var scrollTop = document.documentElement.scrollTop||document.body.scrollTop; + var scrollLeft = document.documentElement.scollLeft||document.body.scrollLeft; + + return {x: ev.clientX+scrollLeft, y: ev.clientY+scrollTop}; + } + ``` + + - 滚轮事件:`onmousewheel` 滚轮数据:`event.wheelDelta` + + - 代码:鼠标滚轮控制 `div` 移动 + + ```HTML + + + + + 事件绑定与鼠标滚轮 + + + + + +
    + + + ``` + + + +- 获取鼠标在页面的绝对位置 + - 封装函数 + + - 例子:一串跟随鼠标的 `Div` + + - 代码: + + ```HTML + + + + + 跟随鼠标的一串div + + + + + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + + ``` + +### 键盘事件 + +- `keyCode` + + - 获取用户按下键盘的哪个键:`onkeydown` / `onkeyup` + - 例子:键盘控制 `Div` 移动 + +- 其它属性 + - `ctrlKey`、`shiftKey`、`altKey` + - 例子:提交留言 + - 回车提交 + - CTRL + 回车 提交 + +- 代码: + + ```HTML + + + + + 键盘控制元素移动和回车提交 + + + + + +
    +
    + + +
    +
    +

    CTRL + 回车 提交

    +

    键盘控制留言框位置

    +
    +
    + + + ``` + + + +## JS 事件中级 + +### 默认事件 + +- 默认事件 + + - 什么是默认事件 + +- 阻止默认事件 + - 普通写法:`return false;` + - 例子1:屏蔽右键菜单 + - ` document.oncontextmenu = function (ev) { return false; }` + - 弹出自定义右键菜单 + - 例子2:只能输入数字的输入框 + - ` oTxt.onkeydown = function (ev) { return false; }` + - `keydown`、`keyup` 事件区别 + +- 代码: + + ```HTML + + + + + 默认事件 + + + + + + +
    +
  • 123
  • +
  • 456
  • +
  • 789
  • +
  • 123
  • +
  • 456
  • +
  • 789
  • +
  • 123
  • +
  • 456
  • +
  • 789
  • +
    + + + ``` + + + +### 拖拽 + +- 简单拖拽 + - 拖拽原理 + - 鼠标按下位置到 div 距离不变 + - 三个事件:` onmousedown` `onmousemove` `onmouseup` + +- 靠谱拖拽 + - 原有拖拽的问题:移动太快鼠标会移出 div + - 直接给 `document` 加事件 + - FireFox 下,空 Div 拖拽 Bug + - 阻止默认事件:`onmousedown {return false}` + - 防止拖出页面 + - 修正位置:在可视区内 + +- 代码: + + ```HTML + + + + + 拖拽 + + + + + +
    + + + ``` + + + +## JS 事件高级应用 + +### 事件绑定 + +- IE 方式: + - `attachEvent(事件名称, 函数)`,绑定事件处理函数 + - `detachEvent(事件名称, 函数)`,接触绑定 + +- DOM 方式:不兼容 IE7 + - `addEventListener(事件名称, 函数, 捕获)` + - `removeEventListener(事件名称, 函数, 捕获)` + +- 何时使用绑定 + +- 绑定事件和 `this` + +- 绑定匿名函数,会无法删除 + +- 代码: + + ```HTML + + + + + 事件绑定 + + + + + + +
    + + + ``` + + + +### 高级拖拽 + +- 复习拖拽原理 + + - 距离不变 + - 三个事件 + +- 限制范围 + + - 对位置进行判断 + - 例子1:不能拖出窗口的 Div + - 例子2:不能拖出指定窗口的 Div + - 磁性吸附 + +- 图片拖拽 + + - 阻止默认事件 + +- **文字选中** + + - 阻止默认事件 `return false` 可以解决 `chrome` 、`FireFox` 、`IE9`的文字选中问题 + - IE 下拖动有问题: + - 事件捕获:`.setCapture()` 只兼容IE + - 取消捕获:`.releaseCapture()` + +- 与 DOM 配合 + + - 带框的拖拽 + - 保留原有位置的拖拽 + +- 代码: + + ```HTML + + + + + 高级拖拽 + + + + + +
    + asdfasdfas/sad'234 +
    asdfasdfas/sad
    + asdfasdfas/sad'234 +
    + + + ``` + + + +### 自定义滚动条 + +- 拖拽 + + - 只有横向拖拽 + - 限制范围:范围的大小 + - 计算比例:当前值/最大值 + +- 控制其他对象 + + - 例子1:控制物体的大小 + - 例子2:控制物体的透明度 + - 例子3:控制文字滚动 + +- 代码: + + ```HTML + + + + + 自定义滚动条 + + + + + +
    +
    +
    +
    +
    +
    +
    +
    +
    + 值 描述 + normal 默认。空白会被浏览器忽略。 + pre 空白会被浏览器保留。其行为方式类似 HTML 中的 标签。inherit 规定应该从父元素继承 white-space 属性的值。 + nowrap 文本不会换行,文本会在在同一行上继续,直到遇到 标签为止。 + pre-wrap 保留空白符序列,但是正常地进行换行。 + pre-line 合并空白符序列,但是保留换行符。 + inherit 规定应该从父元素继承 white-space 属性的值。 + - 拖拽 + - 只有横向拖拽 + - 限制范围:范围的大小 + - 计算比例:当前值/最大值 + - 控制其他对象 + - 例子1:控制物体的大小 + - 例子2:控制物体的透明度 + - 例子3:控制文字滚动 + - 代码:- 拖拽 + - 只有横向拖拽 + - 限制范围:范围的大小 + - 计算比例:当前值/最大值 + - 控制其他对象 + - 例子1:控制物体的大小 + - 例子2:控制物体的透明度 + - 例子3:控制文字滚动 + - 代码:- 代码:- 拖拽 + - 只有横向拖拽 + - 限制范围:范围的大小 + - 计算比例:当前值/最大值 + - 控制其他对象 +
    +
    +
    + + + ``` + + + +## Ajax 基础 + +### Ajax 是什么 + +- 什么是服务器 + - 网页浏览过程分析 + - 如何配置自己的服务器程序 +- 什么是 **Ajax = Asynchronous JavaScript and XML**(异步的 JavaScript 和 XML) + - 无刷新数据读取 + - 用户注册、在线聊天室 + - 异步、同步 + +### 使用 Ajax + +- 基础:请求并显示静态 `txt `文件 + - 字符集编码:必须统一编码 + - 缓存、阻止缓存: + - 根据 `URL` 缓存:让 `URL` 一直在变化,在 URL 后加时间戳 +- 动态数据:请求 JS(或 json )文件,获取过来是字符串,需要解析 + - `eval` 的使用:解析成 JS 元素 + - DOM 创建元素 +- 局部刷新:请求并显示部分网页文件 + +### Ajax 原理 + +- HTTP 请求方法 + - `GET` ---- 用于获取数据(如:浏览帖子) + - `POST`---- 用于上传数据(如:用户注册) + - GET/POST 的区别 + - `GET` 是在 `url` 里传数据:安全性差、容量小、有缓存 + - `POST` 不通过 `url` :安全性较高,容量大(2G)、无缓存 + +## Ajax 中级 + +### 编写 Ajax + +- 创建 Ajax 对象 + + - `ActiveXObject("Microsoft.XMLHTTP)` +- `XMLHttpRequest()` + - 笔记:变量是 `Window` 的属性 + + - 使用未定义的变量 —— 报错 + - 使用未定义的属性 —— `undefined` + - 用 `window.XMLHttpRequest` 返回真则是 chrome FF IE7, + - 用 `window.ActiveXObject("Microsoft.XMLHTTP")` 返回真则是 IE6 + +- 连接服务器 + + - `open(方法,文件名,异步传输)` + - *method*:请求的类型;`GET` 或 `POST` ,**必须大写** + - *url*:文件在服务器上的位置,GET 请求要避免缓存,请向 URL 添加一个唯一的 ID + - *async*:true(异步)或 false(同步) + +- 发送请求 + + - `send()` + - *string*:仅用于 POST 请求 + +- 接收返回值 + +- 请求状态监控 + + - `onreadystatechange` 事件 + - `readyState` 属性:请求状态 + + - `0: 未初始化 ` 还没有调用 `open()` 方法 + - `1: 开始载入 ` 已调用 `send()` 方法,正在发送请求 + - `2: 载入完成 ` `send()` 发送完成,已收到全部响应内容 + - `3: 解析 ` 正在解析响应内容 + - `4: 完成` 响应内容解析完成,可以在客户端调用了 + + - `status` 属性( http 状态码):请求结果,`200: 成功` + + - `responseText` 获得字符串形式的响应数据 + + ```js + document.getElementById("myDiv").innerHTML=xmlhttp.responseText; + ``` + +> ## POST 请求 +> +> 一个简单 POST 请求: +> +> 实例 +> +> ```js +> xmlhttp.open("POST","/try/ajax/demo_post.php",true); xmlhttp.send(); +> ``` +> +> 如果需要像 HTML 表单那样 POST 数据,请使用 setRequestHeader() 来添加 HTTP 头。然后在 send() 方法中规定您希望发送的数据: +> +> 实例 +> +> ```js +> xmlhttp.open("POST","/try/ajax/demo_post2.php",true); xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded"); xmlhttp.send("fname=Henry&lname=Ford"); +> ``` +> +> | 方法 | 描述 | +> | :------------------------------- | :----------------------------------------------------------- | +> | setRequestHeader(*header,value*) | 向请求添加 HTTP 头。 *header*: 规定头的名称 *value*: 规定头的值 | + +- 代码: + + ```HTML + + + + + + +

    + + + + + ``` + + + +### Ajax 数据 + +- 数据类型 + - 什么叫数据类型——英语/中文 + - `XML` / `JSON` +- 字符集( 文件编码 ) + - 所有文件字符集相同 + +## XMLHttpRequest + +`XMLHttpRequest` 是一个内建的浏览器对象,它允许使用 JavaScript 发送 HTTP 请求。 + +虽然它的名字里面有 “XML” 一词,但它可以操作任何数据,而不仅仅是 XML 格式。我们可以用它来上传/下载文件,跟踪进度等。 + +现如今,我们有一个更为现代的方法叫做 `fetch`,它的出现使得 `XMLHttpRequest` 在某种程度上被弃用。 + +在现代 Web 开发中,出于以下三种原因,我们还在使用 `XMLHttpRequest`: + +1. 历史原因:我们需要支持现有的使用了 `XMLHttpRequest` 的脚本。 +2. 我们需要兼容旧浏览器,并且不想用 polyfill(例如为了使脚本更小)。 +3. 我们需要做一些 `fetch` 目前无法做到的事情,例如跟踪上传进度。 + +这些话听起来熟悉吗?如果是,那么请继续阅读下面的 `XMLHttpRequest` 相关内容吧。如果还不是很熟悉的话,那么请先阅读 [Fetch](https://zh.javascript.info/fetch) 一章的内容。 + +### [XMLHttpRequest 基础](https://zh.javascript.info/xmlhttprequest#xmlhttprequest-ji-chu) + +XMLHttpRequest 有两种执行模式:同步(synchronous)和异步(asynchronous)。 + +我们首先来看看最常用的异步模式: + +要发送请求,需要 3 个步骤: + +1. 创建 `XMLHttpRequest`: + + ```javascript + let xhr = new XMLHttpRequest(); + ``` + + 此构造器没有参数。 + +2. 初始化它,通常就在 `new XMLHttpRequest` 之后: + + ```javascript + xhr.open(method, URL, [async, user, password]) + ``` + + 此方法指定请求的主要参数: + + - `method` —— HTTP 方法。通常是 `"GET"` 或 `"POST"`。 + - `URL` —— 要请求的 URL,通常是一个字符串,也可以是 [URL](https://zh.javascript.info/url) 对象。 + - `async` —— 如果显式地设置为 `false`,那么请求将会以同步的方式处理,我们稍后会讲到它。 + - `user`,`password` —— HTTP 基本身份验证(如果需要的话)的登录名和密码。 + + 请注意,`open` 调用与其名称相反,不会建立连接。它仅配置请求,而网络活动仅以 `send` 调用开启。 + +3. 发送请求。 + + ```javascript + xhr.send([body]) + ``` + + 这个方法会建立连接,并将请求发送到服务器。可选参数 `body` 包含了 request body。 + + 一些请求方法,像 `GET` 没有 request body。还有一些请求方法,像 `POST` 使用 `body` 将数据发送到服务器。我们稍后会看到相应示例。 + +4. 监听 `xhr` 事件以获取响应。 + + 这三个事件是最常用的: + + - `load` —— 当请求完成(即使 HTTP 状态为 400 或 500 等),并且响应已完全下载。 + - `error` —— 当无法发出请求,例如网络中断或者无效的 URL。 + - `progress` —— 在下载响应期间定期触发,报告已经下载了多少。 + + ```javascript + xhr.onload = function() { + alert(`Loaded: ${xhr.status} ${xhr.response}`); + }; + + xhr.onerror = function() { // 仅在根本无法发出请求时触发 + alert(`Network Error`); + }; + + xhr.onprogress = function(event) { // 定期触发 + // event.loaded —— 已经下载了多少字节 + // event.lengthComputable = true,当服务器发送了 Content-Length header 时 + // event.total —— 总字节数(如果 lengthComputable 为 true) + alert(`Received ${event.loaded} of ${event.total}`); + }; + ``` + +下面是一个完整的示例。它从服务器加载 `/article/xmlhttprequest/example/load`,并打印加载进度: + +```javascript +// 1. 创建一个 new XMLHttpRequest 对象 +let xhr = new XMLHttpRequest(); + +// 2. 配置它:从 URL /article/.../load GET-request +xhr.open('GET', '/article/xmlhttprequest/example/load'); + +// 3. 通过网络发送请求 +xhr.send(); + +// 4. 当接收到响应后,将调用此函数 +xhr.onload = function() { + if (xhr.status != 200) { // 分析响应的 HTTP 状态 + alert(`Error ${xhr.status}: ${xhr.statusText}`); // 例如 404: Not Found + } else { // 显示结果 + alert(`Done, got ${xhr.response.length} bytes`); // response 是服务器响应 + } +}; + +xhr.onprogress = function(event) { + if (event.lengthComputable) { + alert(`Received ${event.loaded} of ${event.total} bytes`); + } else { + alert(`Received ${event.loaded} bytes`); // 没有 Content-Length + } + +}; + +xhr.onerror = function() { + alert("Request failed"); +}; +``` + +一旦服务器有了响应,我们可以在以下 `xhr` 属性中接收结果: + +- `status` + + HTTP 状态码(一个数字):`200`,`404`,`403` 等,如果出现非 HTTP 错误,则为 `0`。 + +- `statusText` + + HTTP 状态消息(一个字符串):状态码为 `200` 对应于 `OK`,`404` 对应于 `Not Found`,`403` 对应于 `Forbidden`。 + +- `response`(旧脚本可能用的是 `responseText`) + + 服务器 response body。 + +我们还可以使用相应的属性指定超时(timeout): + +```javascript +xhr.timeout = 10000; // timeout 单位是 ms,此处即 10 秒 +``` + +如果在给定时间内请求没有成功执行,请求就会被取消,并且触发 `timeout` 事件。 + +**URL 搜索参数(URL search parameters)** + +为了向 URL 添加像 `?name=value` 这样的参数,并确保正确的编码,我们可以使用 [URL](https://zh.javascript.info/url) 对象: + +```javascript +let url = new URL('https://google.com/search'); +url.searchParams.set('q', 'test me!'); + +// 参数 'q' 被编码 +xhr.open('GET', url); // https://google.com/search?q=test+me%21 +``` + +### [响应类型](https://zh.javascript.info/xmlhttprequest#xiang-ying-lei-xing) + +我们可以使用 `xhr.responseType` 属性来设置响应格式: + +- `""`(默认)—— 响应格式为字符串, +- `"text"` —— 响应格式为字符串, +- `"arraybuffer"` —— 响应格式为 `ArrayBuffer`(对于二进制数据,请参见 [ArrayBuffer,二进制数组](https://zh.javascript.info/arraybuffer-binary-arrays)), +- `"blob"` —— 响应格式为 `Blob`(对于二进制数据,请参见 [Blob](https://zh.javascript.info/blob)), +- `"document"` —— 响应格式为 XML document(可以使用 XPath 和其他 XML 方法), +- `"json"` —— 响应格式为 JSON(自动解析)。 + +例如,我们以 JSON 格式获取响应: + +```javascript +let xhr = new XMLHttpRequest(); + +xhr.open('GET', '/article/xmlhttprequest/example/json'); + +xhr.responseType = 'json'; + +xhr.send(); + +// 响应为 {"message": "Hello, world!"} +xhr.onload = function() { + let responseObj = xhr.response; + alert(responseObj.message); // Hello, world! +}; +``` + +**请注意:** + +在旧的脚本中,你可能会看到 `xhr.responseText`,甚至会看到 `xhr.responseXML` 属性。 + +它们是由于历史原因而存在的,以获取字符串或 XML 文档。如今,我们应该在 `xhr.responseType` 中设置格式,然后就能获取如上所示的 `xhr.response` 了。 + +### [readyState](https://zh.javascript.info/xmlhttprequest#readystate) + +`XMLHttpRequest` 的状态(state)会随着它的处理进度变化而变化。可以通过 `xhr.readyState` 来了解当前状态。 + +[规范](https://xhr.spec.whatwg.org/#states) 中提到的所有状态如下: + +```javascript +UNSENT = 0; // 初始状态 +OPENED = 1; // open 被调用 +HEADERS_RECEIVED = 2; // 接收到 response header +LOADING = 3; // 响应正在被加载(接收到一个数据包) +DONE = 4; // 请求完成 +``` + +`XMLHttpRequest` 对象以 `0` → `1` → `2` → `3` → … → `3` → `4` 的顺序在它们之间转变。每当通过网络接收到一个数据包,就会重复一次状态 `3`。 + +我们可以使用 `readystatechange` 事件来跟踪它们: + +```javascript +xhr.onreadystatechange = function() { + if (xhr.readyState == 3) { + // 加载中 + } + if (xhr.readyState == 4) { + // 请求完成 + } +}; +``` + +你可能在非常老的代码中找到 `readystatechange` 这样的事件监听器,它的存在是有历史原因的,因为曾经有很长一段时间都没有 `load` 以及其他事件。如今,它已被 `load/error/progress` 事件处理程序所替代。 + +### [中止请求(Aborting)](https://zh.javascript.info/xmlhttprequest#zhong-zhi-qing-qiu-aborting) + +我们可以随时终止请求。调用 `xhr.abort()` 即可: + +```javascript +xhr.abort(); // 终止请求 +``` + +它会触发 `abort` 事件,且 `xhr.status` 变为 `0`。 + +### [同步请求](https://zh.javascript.info/xmlhttprequest#tong-bu-qing-qiu) + +如果在 `open` 方法中将第三个参数 `async` 设置为 `false`,那么请求就会以同步的方式进行。 + +换句话说,JavaScript 执行在 `send()` 处暂停,并在收到响应后恢复执行。这有点儿像 `alert` 或 `prompt` 命令。 + +下面是重写的示例,`open` 的第三个参数为 `false`: + +```javascript +let xhr = new XMLHttpRequest(); + +xhr.open('GET', '/article/xmlhttprequest/hello.txt', false); + +try { + xhr.send(); + if (xhr.status != 200) { + alert(`Error ${xhr.status}: ${xhr.statusText}`); + } else { + alert(xhr.response); + } +} catch(err) { // 代替 onerror + alert("Request failed"); +} +``` + +这看起来好像不错,但是很少使用同步调用,因为它们会阻塞页面内的 JavaScript,直到加载完成。在某些浏览器中,滚动可能无法正常进行。如果一个同步调用执行时间过长,浏览器可能会建议关闭“挂起(hanging)”的网页。 + +`XMLHttpRequest` 的很多高级功能在同步请求中都不可用,例如向其他域发起请求或者设置超时。并且,正如你所看到的,没有进度指示。 + +基于这些原因,同步请求使用的非常少,几乎从不使用。在这我们就不再讨论它了。 + +### [HTTP-header](https://zh.javascript.info/xmlhttprequest#httpheader) + +`XMLHttpRequest` 允许发送自定义 header,并且可以从响应中读取 header。 + +HTTP-header 有三种方法: + +- `setRequestHeader(name, value)` + + 使用给定的 `name` 和 `value` 设置 request header。例如:`xhr.setRequestHeader('Content-Type', 'application/json');`**Header 的限制**一些 header 是由浏览器专门管理的,例如 `Referer` 和 `Host`。 完整列表请见 [规范](http://www.w3.org/TR/XMLHttpRequest/#the-setrequestheader-method)。为了用户安全和请求的正确性,`XMLHttpRequest` 不允许更改它们。**不能移除 header**`XMLHttpRequest` 的另一个特点是不能撤销 `setRequestHeader`。一旦设置了 header,就无法撤销了。其他调用会向 header 中添加信息,但不会覆盖它。例如:`xhr.setRequestHeader('X-Auth', '123'); xhr.setRequestHeader('X-Auth', '456'); // header 将是: // X-Auth: 123, 456` + +- `getResponseHeader(name)` + + 获取具有给定 `name` 的 header(`Set-Cookie` 和 `Set-Cookie2` 除外)。例如:`xhr.getResponseHeader('Content-Type')` + +- `getAllResponseHeaders()` + + 返回除 `Set-Cookie` 和 `Set-Cookie2` 外的所有 response header。header 以单行形式返回,例如:`Cache-Control: max-age=31536000 Content-Length: 4260 Content-Type: image/png Date: Sat, 08 Sep 2012 16:53:16 GMT`header 之间的换行符始终为 `"\r\n"`(不依赖于操作系统),所以我们可以很容易地将其拆分为单独的 header。name 和 value 之间总是以冒号后跟一个空格 `": "` 分隔。这是标准格式。因此,如果我们想要获取具有 name/value 对的对象,则需要用一点 JavaScript 代码来处理它们。像这样(假设如果两个 header 具有相同的名称,那么后者就会覆盖前者):`let headers = xhr .getAllResponseHeaders() .split('\r\n') .reduce((result, current) => { let [name, value] = current.split(': '); result[name] = value; return result; }, {}); // headers['Content-Type'] = 'image/png'` + +### [POST,FormData](https://zh.javascript.info/xmlhttprequest#postformdata) + +要建立一个 POST 请求,我们可以使用内建的 [FormData](https://developer.mozilla.org/zh/docs/Web/API/FormData) 对象。 + +语法为: + +```javascript +let formData = new FormData([form]); // 创建一个对象,可以选择从
    中获取数据 +formData.append(name, value); // 附加一个字段 +``` + +我们创建它,可以选择从一个表单中获取数据,如果需要,还可以 `append` 更多字段,然后: + +1. `xhr.open('POST', ...)` —— 使用 `POST` 方法。 +2. `xhr.send(formData)` 将表单发送到服务器。 + +例如: + +```javascript + + + + + + +``` + +以 `multipart/form-data` 编码发送表单。 + +或者,如果我们更喜欢 JSON,那么可以使用 `JSON.stringify` 并以字符串形式发送。 + +只是,不要忘记设置 header `Content-Type: application/json`,只要有了它,很多服务端框架都能自动解码 JSON: + +```javascript +let xhr = new XMLHttpRequest(); + +let json = JSON.stringify({ + name: "John", + surname: "Smith" +}); + +xhr.open("POST", '/submit') +xhr.setRequestHeader('Content-type', 'application/json; charset=utf-8'); + +xhr.send(json); +``` + +`.send(body)` 方法就像一个非常杂食性的动物。它几乎可以发送任何 `body`,包括 `Blob` 和 `BufferSource` 对象。 + +### [上传进度](https://zh.javascript.info/xmlhttprequest#shang-chuan-jin-du) + +`progress` 事件仅在下载阶段触发。 + +也就是说:如果我们 `POST` 一些内容,`XMLHttpRequest` 首先上传我们的数据(request body),然后下载响应。 + +如果我们要上传的东西很大,那么我们肯定会对跟踪上传进度感兴趣。但是 `xhr.onprogress` 在这里并不起作用。 + +这里有另一个对象,它没有方法,它专门用于跟踪上传事件:`xhr.upload`。 + +它会生成事件,类似于 `xhr`,但是 `xhr.upload` 仅在上传时触发它们: + +- `loadstart` —— 上传开始。 +- `progress` —— 上传期间定期触发。 +- `abort` —— 上传中止。 +- `error` —— 非 HTTP 错误。 +- `load` —— 上传成功完成。 +- `timeout` —— 上传超时(如果设置了 `timeout` 属性)。 +- `loadend` —— 上传完成,无论成功还是 error。 + +handler 示例: + +```javascript +xhr.upload.onprogress = function(event) { + alert(`Uploaded ${event.loaded} of ${event.total} bytes`); +}; + +xhr.upload.onload = function() { + alert(`Upload finished successfully.`); +}; + +xhr.upload.onerror = function() { + alert(`Error during the upload: ${xhr.status}`); +}; +``` + +这是一个真实示例:带有进度指示的文件上传: + +```javascript + + + +``` + +### [跨源请求](https://zh.javascript.info/xmlhttprequest#kua-yuan-qing-qiu) + +`XMLHttpRequest` 可以使用和 [fetch](https://zh.javascript.info/fetch-crossorigin) 相同的 CORS 策略进行跨源请求。 + +就像 `fetch` 一样,默认情况下不会将 cookie 和 HTTP 授权发送到其他域。要启用它们,可以将 `xhr.withCredentials` 设置为 `true`: + +```javascript +let xhr = new XMLHttpRequest(); +xhr.withCredentials = true; + +xhr.open('POST', 'http://anywhere.com/request'); +... +``` + +有关跨源 header 的详细信息,请见 [Fetch:跨源请求](https://zh.javascript.info/fetch-crossorigin) 一章。 + +### [总结](https://zh.javascript.info/xmlhttprequest#zong-jie) + +使用 `XMLHttpRequest` 的 GET 请求的典型代码: + +```javascript +let xhr = new XMLHttpRequest(); + +xhr.open('GET', '/my/url'); + +xhr.send(); + +xhr.onload = function() { + if (xhr.status != 200) { // HTTP error? + // 处理 error + alert( 'Error: ' + xhr.status); + return; + } + + // 获取来自 xhr.response 的响应 +}; + +xhr.onprogress = function(event) { + // 报告进度 + alert(`Loaded ${event.loaded} of ${event.total}`); +}; + +xhr.onerror = function() { + // 处理非 HTTP error(例如网络中断) +}; +``` + +实际上还有很多事件,在 [现代规范](http://www.w3.org/TR/XMLHttpRequest/#events) 中有详细列表(按生命周期排序): + +- `loadstart` —— 请求开始。 +- `progress` —— 一个响应数据包到达,此时整个 response body 都在 `response` 中。 +- `abort` —— 调用 `xhr.abort()` 取消了请求。 +- `error` —— 发生连接错误,例如,域错误。不会发生诸如 404 这类的 HTTP 错误。 +- `load` —— 请求成功完成。 +- `timeout` —— 由于请求超时而取消了该请求(仅发生在设置了 timeout 的情况下)。 +- `loadend` —— 在 `load`,`error`,`timeout` 或 `abort` 之后触发。 + +`error`,`abort`,`timeout` 和 `load` 事件是互斥的。其中只有一种可能发生。 + +最常用的事件是加载完成(`load`),加载失败(`error`),或者我们可以使用单个 `loadend` 处理程序并检查请求对象 `xhr` 的属性,以查看发生了什么。 + +我们还了解了另一个事件:`readystatechange`。由于历史原因,它早在规范制定之前就出现了。如今我们已经无需使用它了,我们可以用新的事件代替它,但通常可以在旧的代码中找到它。 + +如果我们需要专门跟踪上传,那么我们应该在 `xhr.upload` 对象上监听相同的事件。 + + + +## JS 面对对象基础 + +### 面对对象是什么 + +- 什么是对象 + - 什么是收音机,许多成分构成的整体,提供一些功能 + - 对象是一个整体,对外界提供一些操作 +- 什么是面对对象 + - 使用对象时,只关注对象提供的功能,不关注其内部细节 + - 比如 JQuery +- 面向对象是一种通用思想,并非只有编程中能用,任何事情都可以面对对象 + +### JS 中的面对对象 + +- 面对对象编程(OOP)的特点 + - 抽象:抓住核心问题,把主要特征、相关特征抽出来 + - 封装:不考虑内部实现,只考虑功能使用 + - 继承:基于已有对象,继承出新的对象 + - 多态继承:同时具有几个父对象的特性 + - 多态:JAVA 等强类型语言常用,JS 不常用 +- 对象的组成 + - 方法——函数:过程、动态的 + - 函数:不属于对象 + - 方法:属于对象的函数 + - 属性——变量:状态、静态的 + - 变量:不属于对象 + - 属性:属于对象的变量 + +### 第一个面对对象的程序 + +- 为对象添加方法和属性 + - `this` 详解,事件处理中 `this` 的本质 + - `window` + - `this` —— 函数属于谁 + - 不能在系统对象中随意附加方法、属性,否则会覆盖已有方法、属性 + - `Object` 对象:系统空白对象 + +### 工厂方式 + +- 工厂方式 + - 用构造函数创建一个类 + - 什么是类、对象(实例):模具和零件 + - 笔记:构造函数/工厂函数 + - 构建对象的函数 + - `constructor` 属性 返回所有 `JavaScript` 变量的构造器函数。 +- 工厂方式的问题 + - 没有 new + - 函数重复定义:函数内容一样却不相等,浪费大量系统资源 +- 问题解决:**构造函数加上** `new` , **然后用原型**`Prototype` 为对象添加**方法** + - `new` 做了两件事 + - **替你创建了一个空白对象**:`var this = new Object()` + - **替你返回了这个空白对象**:`return this ` + - `new` 和 `this` + +### 原型:Prototype + +- 原型是什么 + - 原型是 `class`,修改它可以影响一类元素 + - 在已有对象中加入自己的属性、方法 + +- 为所有 `Array` 添加 `Sum` 方法:`Array.prototype.sum = function () {} ` + - 给对象添加方法,类似于行间样式 + - **给原型添加方法,类似于 `class`** + +- 原型的小缺陷 + + - 无法限制覆盖 + +- 类和对象的区别 + - 类:生产对象的模板 `Array` + - `var arr = new Array()` + - 对象:产品 `arr` + +- 总结:**用构造函数加属性,用原型加方法,叫做混合方式构造对象** + +- 代码: + + ```HTML + + + + + 面对对象基础 + + + + + + + ``` + + + +### 面对对象编程方式 + +- 用混合方式构造对象 + - 混合的构造函数 / 原型方式 + - `Mixed Constructor Function` / `Prototype Method` +- 原则 + - 构造函数:加属性 + - 原型:加方法 +- 对象命名规范 + - 类名首字母大写 + +## JS 面对对象实例 + +### 面对对象的选项卡 + +- 把面向过程的程序,改写成面向对象的形式 + + - 原则:不能有函数套函数,但可以有全局变量 + - 过程: + - `onload`:构造函数 + - 全局变量:属性 + - 函数:方法 + - 改错: + - `this`、事件、闭包、传参 + +- 对象与闭包 + + - 通过闭包传递 `this` + +- 代码: + + ```HTML + + + + + 面对对象的选项卡 + + + + +
    +
    + 11 + 22 + 33 + 44 +
    +
    +
      +
    • 1
    • +
    +
      +
    • 2
    • +
    +
      +
    • 3
    • +
    +
      +
    • 4
    • +
    +
    +
    + + + ``` + + + +## JS 面对对象高级 + +### Json 方式的面向对象 + +- 把方法包在一个 `Json` 里:简单 单体 不适合多个对象 + - 有人管它叫:**命名空间** + - 把同一类方法,放在一起 + +- 代码: + + ```js + var json = { + name: 'zhangsan', + QQ: 34543643, + age: 23, + showName: function () { + console.log(this.name); + }, + showQQ: function () { + console.log(this.QQ); + } + } + json.showName(); + json.showQQ(); + ``` + + + +### 拖拽和继承 + +- 面向对象的拖拽 + - 改写原有拖拽,代码同下 +- 对象的继承 + - 什么是继承 + - 在原有类的基础上略作修改,得到一个新类 + - 不影响原有类的功能 + - `instanceof` 运算符:返回 `true`,如果对象是对象类型的实例。 + - **查看对象是否是某个类的实例** + +### 使用继承 + +- 限制范围的拖拽类 + + - 构造函数的伪装 + + - 属性的继承 + + - 原理 + + - `call` 的使用 + + ```js + function A() { + this.abc = 12; + } + A.rototype.show = { + alert(this.abc); + } + function B() { + A.call(this); // 用 call 继承属性,把B传入A函数内 + } + // B.prototype = A.prototype; // 浅复制方法是引用,指向同一个内存空间 + for (var i in A.prototype) { + B.prototype[i] = A.ptoyotype[i]; // 深度复制就不会引用,直接复制内容 + } + var obj = new B(); + alert(obj.abc); + obj.show.call(); // call 一般省略 + ``` + +- 原型链 + + - 方法的继承 + - 原理:**复制方法是引用,指向同一个内存空间** + - 覆盖原型的方法复制 + - `for in` 深度复制就不会引用,直接复制内容 + +- 代码:拖拽改写为面对对象并继承一个新的对象 + + ```HTML + + + + + 面对对象的拖拽 + + + + + + + +
    普通拖拽
    +
    限制范围的拖拽
    + + + ``` + + ```JS + function Drag(id) { + this.disX = ''; + this.disY = ''; + this.oDiv = document.getElementById(id); + var _this = this; + this.oDiv.onmousedown = function (ev) { + _this.fnDown(ev); + return false; + }; + } + Drag.prototype.fnDown = function (ev) { + var ev = event||ev; + var _this = this; + // 鼠标可视区位置 - div左边距 = 鼠标在div内的位置 + this.disX = ev.clientX - this.oDiv.offsetLeft; + this.disY = ev.clientY - this.oDiv.offsetTop; + console.log(this.disX,'可视区鼠标X:', ev.clientX, '鼠标Y:',ev.clientY); + document.onmousemove = function (ev) { + _this.mouseMove(ev); + } + document.onmouseup = function (ev) { + _this.mouseUp(ev); + } + } + Drag.prototype.mouseMove = function(ev) { + // 不断获取Event 对象,坐标才会不断更新 + var ev = event||ev; + // console.log('可视区鼠标X:', ev.clientX, '鼠标Y:',ev.clientY); + // div位置 = 鼠标可视区新的位置 - 鼠标与div的距离 + this.oDiv.style.left = ev.clientX - this.disX + 'px'; + this.oDiv.style.top = ev.clientY - this.disY + 'px'; + } + Drag.prototype.mouseUp = function () { + document.onmousemove = ''; + document.onmouseup = ''; + } + ``` + + ```JS + // 继承属性 + function LimitDrag(id) { + Drag.call(this, id); + } + // 继承原型 + for (var i in Drag.prototype) { + LimitDrag.prototype[i] = Drag.prototype[i]; + } + + LimitDrag.prototype.mouseMove = function(ev) { + // 不断获取Event 对象,坐标才会不断更新 + var ev = event||ev; + // console.log('可视区鼠标X:', ev.clientX, '鼠标Y:',ev.clientY); + // div位置 = 鼠标可视区新的位置 - 鼠标与div的距离 + var l = ev.clientX - this.disX; + var t = ev.clientY - this.disY; + if (l < 0) { + l = 0; + } else if (l > document.documentElement.clientWidth - this.oDiv.offsetWidth) { + l = document.documentElement.clientWidth - this.oDiv.offsetWidth; + } + if ( t < 0) { + t = 0; + } else if (t > document.documentElement.clientHeight - this.oDiv.offsetHeight) { + t = document.documentElement.clientHeight - this.oDiv.offsetHeight; + } + this.oDiv.style.top = t + 'px'; + this.oDiv.style.left = l + 'px'; + } + ``` + + +### 系统对象 + +- 本地对象 + - 什么是本地对象 + - 常用对象:可以实例化( `new` ) + - `Object` / `Function` / `Array` / `String` / `Boolean` / `Number` / `Date` / `RegExp` / `Error` +- 内置对象(静态对象):不能实例化 + - 什么是本地对象 + - `Global(无法使用)` / `Math` +- 宿主对象(由浏览器提供的对象) + - `DOM` / `BOM` + +## JavaScript 对象定义 + +在 JavaScript 中,几乎“所有事物”都是对象。 + +- 布尔是对象(如果用 *new* 关键词定义) +- 数字是对象(如果用 *new* 关键词定义) +- 字符串是对象(如果用 *new* 关键词定义) +- 日期永远都是对象 +- 算术永远都是对象 +- 正则表达式永远都是对象 +- 数组永远都是对象 +- 函数永远都是对象 +- 对象永远都是对象 + +所有 JavaScript 值,除了原始值,都是对象。 + +### JavaScript 原始值 + +*原始值*指的是没有属性或方法的值。 + +*原始数据类型*指的是拥有原始值的数据。 + +JavaScript 定义了 5 种原始数据类型: + +- string +- number +- boolean +- null +- undefined + +原始值是一成不变的(它们是硬编码的,因此不能改变)。 + +假设 x = 3.14,您能够改变 x 的值。但是您无法改变 3.14 的值。 + +| 值 | 类型 | 注释 | +| :-------- | :-------- | :------------------------- | +| "Hello" | string | "Hello" 始终是 "Hello" | +| 3.14 | number | 3.14 始终是 3.14 | +| true | boolean | true 始终是 true | +| false | boolean | false 始终是 false | +| null | null | (object) null 始终是 null | +| undefined | undefined | undefined 始终是 undefined | + +### 对象是包含变量的变量 + +JavaScript 变量能够包含单个的值: + +```javascript +var person = "Bill Gates"; +``` + +对象也是变量。但是对象能够包含很多值。 + +值按照*名称 : 值*对的形式编写(名称和值以冒号分隔)。 + +```javascript +var person = {firstName:"Bill", lastName:"Gates", age:62, eyeColor:"blue"}; +``` + +JavaScript 对象是*命名值*的集合。 + +### 对象属性 + +JavaScript 对象中的命名值,被称为**属性**。 + +| 属性 | 值 | +| :-------- | :---- | +| firstName | Bill | +| lastName | Gates | +| age | 62 | +| eyeColor | blue | + +以名称值对书写的对象类似于: + +- PHP 中的关联数组 +- Python 中的字典 +- C 中的哈希表 +- Java 中的哈希映射 +- Ruby 和 Perl 中的散列 + +### 对象方法 + +方法是可以在对象上执行的*动作*。 + +对象属性可以是原始值、其他对象以及函数。 + +**对象方法**是包含**函数定义**的对象属性。 + +| 属性 | 值 | +| :-------- | :---------------------------------------------------------- | +| firstName | Bill | +| lastName | Gates | +| age | 62 | +| eyeColor | blue | +| fullName | `function() {return this.firstName + " " + this.lastName;}` | + +JavaScript 对象是被称为属性和方法的命名值的容器。 + +您将在下一章中学到更多有关方法的知识。 + +### 创建 JavaScript 对象 + +通过 JavaScript,您能够定义和创建自己的对象。 + +有不同的方法来创建对象: + +- 定义和创建单个对象,使用对象文字。 +- 定义和创建单个对象,通过关键词 new。 +- 定义对象构造器,然后创建构造类型的对象。 + +在 ECMAScript 5 中,也可以通过函数 `Object.create()` 来创建对象。 + +### 使用对象字面量 + +这是创建对象最简答的方法。 + +使用对象文字,您可以在一条语句中定义和创建对象。 + +对象文字指的是花括号 `{}` 中的 名称:值对(比如 `age:62`)。 + +下面的例子创建带有四个属性的新的 JavaScript 对象: + +```javascript +var person = {firstName:"Bill", lastName:"Gates", age:62, eyeColor:"blue"}; +``` + +空格和折行不重要。对象定义可横跨多行: + +```javascript +var person = { + firstName:"Bill", + lastName:"Gates", + age:62, + eyeColor:"blue" +}; +``` + +### 使用 JavaScript 关键词 new + +下面的例子也创建了带有四个属性的新的 JavaScript 对象: + +```javascript +var person = new Object(); +person.firstName = "Bill"; +person.lastName = "Gates"; +person.age = 50; +person.eyeColor = "blue"; +``` + +上面的两个例子结果是一样的。无需使用 `new Object()`。 + +出于简易性、可读性和执行速度的考虑,请使用第一种创建方法(对象文字方法)。 + +### JavaScript 对象是易变的 + +对象是易变的:它们**通过引用来寻址**,而非值。 + +如果 person 是一个对象,下面的语句不会创建 person 的副本: + +```javascript +var x = person; // 这不会创建 person 的副本。 +``` + +对象 x **并非** person 的副本。它**就是** person。x 和 person 是同一个对象。 + +对 x 的任何改变都将改变 person,因为 x 和 person 是相同的对象。 + +```javascript +var person = {firstName:"Bill", lastName:"Gates", age:62, eyeColor:"blue"} + +var x = person; +x.age = 10; // 这将同时改变 both x.age 和 person.age +``` + +**注释:**JavaScript 变量不是易变的。只有 JavaScript 对象如此。 + +## JavaScript 对象方法 + +### JavaScript 方法 + +JavaScript 方法是能够在对象上执行的动作。 + +JavaScript **方法**是包含**函数定义**的属性。 + +| 属性 | 值 | +| :-------- | :---------------------------------------------------------- | +| firstName | Bill | +| lastName | Gates | +| age | 62 | +| eyeColor | blue | +| fullName | `function() {return this.firstName + " " + this.lastName;}` | + +方法是存储为对象属性的函数。 + +### *this* 关键词 + +在 JavaScript 中,被称为 this 的事物,指的是拥有该 JavaScript 代码的对象。 + +this 的值,在函数中使用时,是“拥有”该函数的对象。 + +请注意 this 并非变量。它是关键词。您无法改变 this 的值。 + +### 访问对象方法 + +请使用如下语法创建对象方法: + +```javascript +methodName : function() { 代码行 } +``` + +请通过如下语法来访问对象方法: + +```javascript +objectName.methodName() +``` + +您通常会把 `fullName()` 描述为 person 对象的方法,把 fullName 描述为属性。 + +fullName 属性在被通过 () 调用后会以函数形式执行。 + +此例访问 person 对象的 `fullName()` *方法*: + +```javascript +name = person.fullName(); +``` + +如果您访问 fullName **属性**时没有使用 (),则将返回**函数定义**: + +```javascript +name = person.fullName; +``` + +### 使用内建方法 + +此例使用 String 对象的 toUpperCase() 方法,把文本转换为大写: + +```javascript +var message = "Hello world!"; +var x = message.toUpperCase(); +``` + +x 的值,在以上代码执行后将是: + +```javascript +HELLO WORLD! +``` + +### 添加新的方法 + +向对象添加方法是在构造器函数内部完成的: + +```javascript +function person(firstName, lastName, age, eyeColor) { + this.firstName = firstName; + this.lastName = lastName; + this.age = age; + this.eyeColor = eyeColor; + this.changeName = function (name) { + this.lastName = name; + }; +} +``` + +changeName() 函数 name 的值赋给了 person 的 lastName 属性。 + +现在您可以尝试: + +```javascript +myMother.changeName("Jobs"); +``` + + + +## JavaScript 对象属性 + +属性指的是与 JavaScript 对象相关的值。 + +JavaScript 对象是无序属性的集合。 + +属性通常可以被修改、添加和删除,但是某些属性是只读的。 + +### 访问 JavaScript 属性 + +访问对象属性的语法是: + +```javascript +objectName.property // person.age +``` + +或者: + +```javascript +objectName["property"] // person["age"] +``` + +或者: + +```javascript +objectName[expression] // x = "age"; person[x] +``` + +表达式必须计算为属性名。 + +```javascript +person.firstname + " is " + person.age + " years old."; + +person["firstname"] + " is " + person["age"] + " years old."; +``` + +### JavaScript for...in 循环 + +JavaScript for...in 语句遍历对象的属性。 + +```javascript +for (variable in object) { + 要执行的代码 +} +``` + +for...in 循环中的代码块会为每个属性执行一次。 + +### 循环对象的属性: + +```javascript +var person = {fname:"Bill", lname:"Gates", age:62}; + +for (x in person) { + txt += person[x]; +} +``` + +### 添加新属性 + +您可以通过简单的赋值,向已存在的对象添加新属性。 + +假设 person 对象已存在 - 那么您可以为其添加新属性: + +```javascript +person.nationality = "English"; +``` + +您不能使用预留词作为属性名(或方法名)。请使用 JavaScript 命名规则。 + +### 删除属性 + +delete 关键词从对象中删除属性: + +```javascript +var person = {firstName:"Bill", lastName:"Gates", age:62, eyeColor:"blue"}; +delete person.age; // 或 delete person["age"]; +``` + +delete 关键词会同时删除属性的值和属性本身。 + +删除完成后,属性在被添加回来之前是无法使用的。 + +delete 操作符被设计用于对象属性。它对变量或函数没有影响。 + +delete 操作符不应被用于预定义的 JavaScript 对象属性。这样做会使应用程序崩溃。 + +### 属性值 + +所有属性都有名称。此外它们还有值。 + +值是属性的特性之一。 + +其他特性包括:可列举、可配置、可写。 + +这些特性定义了属性被访问的方式(是可读的还是可写的?) + +在 JavaScript 中,所有属性都是可读的,但是只有值是可修改的(只有当属性为可写时)。 + +(ECMAScript 5 拥有获取和设置所有属性特性的方法) + +### 原型属性 + +JavaScript 对象继承了它们的原型的属性。 + +delete 关键词不会删除被继承的属性,但是如果您删除了某个原型属性,则将影响到所有从原型继承的对象。 + +## JavaScript 对象访问器 + +ECMAScript 5 (2009) 引入了 Getter 和 Setter。 + +Getter 和 Setter 允许您定义对象访问器(被计算的属性)。 + +### JavaScript Getter + +本例使用 lang 属性来获取 language 属性的值。 + +**实例** + +```javascript +// 创建对象: +var person = { + firstName: "Bill", + lastName : "Gates", + language : "en", + get lang() { + return this.language; + } +}; + +// 使用 getter 来显示来自对象的数据: +document.getElementById("demo").innerHTML = person.lang; +``` + +### JavaScript Setter + +本例使用 lang 属性来设置 language 属性的值。 + +**实例** + +```javascript +var person = { + firstName: "Bill", + lastName : "Gates", + language : "", + set lang(lang) { + this.language = lang; + } +}; + +// 使用 setter 来设置对象属性: +person.lang = "en"; + +// 显示来自对象的数据: +document.getElementById("demo").innerHTML = person.language; +``` + +**例子 1** + +```javascript +var person = { + firstName: "Bill", + lastName : "Gates", + fullName : function() { + return this.firstName + " " + this.lastName; + } +}; + +// 使用方法来显示来自对象的数据: +document.getElementById("demo").innerHTML = person.fullName(); +``` + +**例子2** + +```javascript +var person = { + firstName: "Bill", + lastName : "Gates", + get fullName() { + return this.firstName + " " + this.lastName; + } +}; + +// 使用 getter 来显示来自对象的数据: +document.getElementById("demo").innerHTML = person.fullName; +``` + +例子 1 以函数形式访问 fullName:person.fullName()。 + +例子 2 以属性形式访问 fullName:person.fullName。 + +**第二个例子提供了更简洁的语法。** + +省略写法: + +```javascript +// 创建对象: +var person = { + firstName: "Bill", + lastName: "Gates", + id: 12345, + fullName() { // 省略 fullName:fullName(){} + return this.firstName + " " + this.lastName; + } +} + +// 显示对象中的数据: +console.log(person.fullName()); +``` + + + +### 数据质量 + +使用 getter 和 setter 时,JavaScript 可以确保更好的数据质量。 + +在本例中,使用 lang 属性以大写形式返回 language 属性的值: + +```javascript +// Create an object: +var person = { + firstName: "Bill", + lastName : "Gates", + language : "en", + get lang() { + return this.language.toUpperCase(); + } +}; + +// 使用 getter 来显示来自对象的数据: +document.getElementById("demo").innerHTML = person.lang; +``` + +```javascript +var person = { + firstName: "Bill", + lastName : "Gates", + language : "", + set lang(lang) { + this.language = lang.toUpperCase(); + } +}; + +// 使用 getter 来设置对象属性: +person.lang = "en"; + +// 显示来自对象的数据: +document.getElementById("demo").innerHTML = person.language; +``` + +### 为什么使用 Getter 和 Setter? + +- 它提供了更简洁的语法 +- 它允许属性和方法的语法相同 +- 它可以确保更好的数据质量 +- 有利于后台工作 + +### 一个计数器实例 + +**实例** + +```javascript +var obj = { + counter : 0, + get reset() { + this.counter = 0; + }, + get increment() { + this.counter++; + }, + get decrement() { + this.counter--; + }, + set add(value) { + this.counter += value; + }, + set subtract(value) { + this.counter -= value; + } +}; + +// 操作计数器: +obj.reset; +obj.add = 5; +obj.subtract = 1; +obj.increment; +obj.decrement; +Object.defineProperty() +``` + +### Object.defineProperty() 方法也可用于添加 Getter 和 Setter: + +```javascript +// 定义对象 +var obj = {counter : 0}; + +// 定义 setters +Object.defineProperty(obj, "reset", { + get : function () {this.counter = 0;} +}); +Object.defineProperty(obj, "increment", { + get : function () {this.counter++;} +}); +Object.defineProperty(obj, "decrement", { + get : function () {this.counter--;} +}); +Object.defineProperty(obj, "add", { + set : function (value) {this.counter += value;} +}); +Object.defineProperty(obj, "subtract", { + set : function (value) {this.counter -= value;} +}); + +// 操作计数器: +obj.reset; +obj.add = 5; +obj.subtract = 1; +obj.increment; +obj.decrement; +``` + +## JavaScript 对象构造器 + +### 对象类型(蓝图)(类) + +前一章的实例是有限制的。它们只创建单一对象。 + +有时我们需要创建相同“类型”的许多对象的“*蓝图*”。 + +创建一种“对象类型”的方法,是使用*对象构造器函数*。 + +在上面的例子中,**函数 Person()** 就是对象构造器函数。 + +通过 **new** 关键词调用构造器函数可以创建相同类型的对象: + +```javascript +function Person(first, last, age, eye) { + this.firstName = first; + this.lastName = last; + this.age = age; + this.eyeColor = eye; +} + +var myFather = new Person("Bill", "Gates", 62, "blue"); +var myMother = new Person("Steve", "Jobs", 56, "green"); +``` + +### *this* 关键词 + +在 JavaScript 中,被称为 this 的事物是代码的“拥有者”。 + +this 的值,在对象中使用时,就是对象本身。 + +在构造器函数中,this 是没有值的。它是新对象的替代物。 当一个新对象被创建时,this 的值会成为这个新对象。 + +请注意 this 并不是变量。它是关键词。您无法改变 this 的值。 + +### 为构造器添加属性 + +与向已有对象添加新属性不同,您无法为对象构造器添加新属性: + +如需向构造器添加一个新属性,您必须添加到构造器函数: + +```javascript +Person.nationality = "English"; //The nationality of my friend is undefined + +function Person(first, last, age, eyecolor) { + this.firstName = first; + this.lastName = last; + this.age = age; + this.eyeColor = eyecolor; + this.nationality = "English"; +} +``` + +### 为构造器添加方法 + +您的构造器函数也可以定义方法: + +```javascript +function Person(first, last, age, eyecolor) { + this.firstName = first; + this.lastName = last; + this.age = age; + this.eyeColor = eyecolor; + this.name = function() {return this.firstName + " " + this.lastName;}; +} +``` + +与向已有对象添加新方法不同,您无法为对象构造器添加新方法。 + +必须在构造器函数内部向一个对象添加方法。 + +### 内建 JavaScript 构造器 + +JavaScript 提供用于原始对象的构造器: + +```javascript +var x1 = new Object(); // 一个新的 Object 对象 +var x2 = new String(); // 一个新的 String 对象 +var x3 = new Number(); // 一个新的 Number 对象 +var x4 = new Boolean(); // 一个新的 Boolean 对象 +var x5 = new Array(); // 一个新的 Array 对象 +var x6 = new RegExp(); // 一个新的 RegExp 对象 +var x7 = new Function(); // 一个新的 Function 对象 +var x8 = new Date(); // 一个新的 Date 对象 +``` + +Math() 对象不再此列。Math 是全局对象。new 关键词不可用于 Math。 + +### 更快创建对象的方式 + +正如以上所见,JavaScript 提供原始数据类型字符串、数字和布尔的对象版本。但是并无理由创建复杂的对象。原始值快得多! + +请使用对象字面量 `{}` 代替 `new Object()`。 + +请使用字符串字面量 `""` 代替 `new String()`。 + +请使用数值字面量代替 `Number()`。 + +请使用布尔字面量代替 `new Boolean(`)。 + +请使用数组字面量 `[]` 代替 `new Array()`。 + +请使用模式字面量代替 `new RexExp()`。 + +请使用函数表达式 `() {}` 代替 `new Function()`。 + +```javascript +var x1 = {}; // 新对象 +var x2 = ""; // 新的原始字符串 +var x3 = 0; // 新的原始数值 +var x4 = false; // 新的原始逻辑值 +var x5 = []; // 新的数组对象 +var x6 = /()/ // 新的正则表达式对象 +var x7 = function(){}; // 新的函数对象 +``` + +## JavaScript 对象原型 + +我们已经认识到,您*无法*为已有的对象构造器添加新属性,如需向构造器添加一个新属性,则必须把它添加到构造器函数 + +### 原型继承 + +所有 JavaScript 对象都从原型继承属性和方法。 + +日期对象继承自 Date.prototype。数组对象继承自 Array.prototype。Person 对象继承自 Person.prototype。 + +Object.prototype 位于原型继承链的顶端: + +日期对象、数组对象和 Person 对象都继承自 Object.prototype。 + +### 使用 prototype 属性 + +JavaScript prototype 属性允许您为对象构造器添加新属性: + +```javascript +function Person(first, last, age, eyecolor) { + this.firstName = first; + this.lastName = last; + this.age = age; + this.eyeColor = eyecolor; +} +Person.prototype.nationality = "English"; +``` + +JavaScript prototype 属性也允许您为对象构造器添加新方法: + +```javascript +function Person(first, last, age, eyecolor) { + this.firstName = first; + this.lastName = last; + this.age = age; + this.eyeColor = eyecolor; +} +Person.prototype.name = function() { + return this.firstName + " " + this.lastName; +}; +``` + +## ECMAScript 5 特性 + +这些是 2009 年发布的新特性: + +- "use strict" 指令 +- String.trim() +- Array.isArray() +- Array.forEach() +- Array.map() +- Array.filter() +- Array.reduce() +- Array.reduceRight() +- Array.every() +- Array.some() +- Array.indexOf() +- Array.lastIndexOf() +- JSON.parse() +- JSON.stringify() +- Date.now() +- 属性 Getter 和 Setter +- 新的对象属性和方法 + +### ECMAScript 5 语法更改 + +- 对字符串的属性访问 [ ] +- 数组和对象字面量中的尾随逗号 +- 多行字符串字面量 +- 作为属性名称的保留字 + +### "use strict" 指令 + +“use strict” 定义 JavaScript 代码应该以“严格模式”执行。 + +例如,使用严格模式,不能使用未声明的变量。 + +您可以在所有程序中使用严格模式。它可以帮助您编写更清晰的代码,例如阻止您使用未声明的变量。 + +“use strict” 只是一个字符串表达式。旧浏览器如果不理解它们就不会抛出错误。 + +### String.trim() + +String.trim() 删除字符串两端的空白字符。 + +```javascript +let str = " \n\n Hello World! \n \x11 \r ? \t\ "; +console.log(str.trim()); +``` + +### Array.isArray() + +isArray() 方法检查对象是否为数组。 + +```javascript +let a = [], + b = {}; +console.log(Array.isArray(a), Array.isArray(b)); +``` + +### Array.forEach() + +forEach() 方法为每个数组元素调用一次函数。不支持 break、continue 等。 + +```javascript +arr.forEach(function(elem, index, array) { + if (arr[i] == 2) { + continue + } + console.log(elem, index) +}) + +[1, 2, 3, 4, 5].forEach(function(i) { + if (i === 2) { + return; + } else { + console.log(i) + } +}) +``` + +- 这段代码的"本意"是从第一个元素开始遍历,遇到数组项 2 之后就结束遍历,不然打印出所遍历过的数值项。可是,事实让你大跌眼镜,因为它的输出是 1, 3, 4, 5。 + +### Array.map() + +这个例子给每个数组值乘以 2: + +```javascript +var numbers1 = [45, 4, 9, 16, 25]; +var numbers2 = numbers1.map(myFunction); + +function myFunction(value) { + return value * 2; +} +``` + +### Array.filter() + +此例用值大于 18 的元素创建一个新数组: + +```javascript +var numbers = [45, 4, 9, 16, 25]; +var over18 = numbers.filter(myFunction); + +function myFunction(value) { + return value > 18; +} +``` + +### Array.reduce() + +这个例子确定数组中所有数的总和: + +```javascript +var numbers1 = [45, 4, 9, 16, 25]; +var sum = numbers1.reduce(myFunction); + +function myFunction(total, value) { + return total + value; +} +``` + +### Array.reduceRight() + +这个例子同样是确定数组中所有数的总和: + +```javascript +var numbers1 = [45, 4, 9, 16, 25]; +var sum = numbers1.reduceRight(myFunction); + +function myFunction(total, value) { + return total + value; +} +``` + +### Array.every() + +这个例子检查是否所有值都超过 18: + +```javascript +var numbers = [45, 4, 9, 16, 25]; +var allOver18 = numbers.every(myFunction); + +function myFunction(value) { + return value > 18; +} +``` + +### Array.some() + +这个例子检查某些值是否超过 18: + +```javascript +var numbers = [45, 4, 9, 16, 25]; +var allOver18 = numbers.some(myFunction); + +function myFunction(value) { + return value > 18; +} +``` + +### Array.indexOf() + +检索数组中的某个元素值并返回其位置: + +```javascript +var fruits = ["Banana", "Orange", "Apple", "Mango"]; +var a = fruits.indexOf("Apple"); +``` + +### Array.lastIndexOf() + +Array.lastIndexOf() 与 Array.indexOf() 类似,但是从数组结尾处开始检索。 + +```javascript +var fruits = ["Banana", "Orange", "Apple", "Mango"]; +var a = fruits.lastIndexOf("Apple"); +``` + +### JSON.parse() + +JSON 的一个常见用途是从 Web 服务器接收数据。 + +想象一下,您从Web服务器收到这条文本字符串: + +```javascript +'{"name":"Bill", "age":62, "city":"Seatle"}' +``` + +JavaScript 函数 JSON.parse() 用于将文本转换为 JavaScript 对象: + +```javascript +var obj = JSON.parse('{"name":"Bill", "age":62, "city":"Seatle"}'); +``` + +### JSON.stringify() + +JSON 的一个常见用途是将数据发送到Web服务器。 + +将数据发送到 Web 服务器时,数据必须是字符串。 + +想象一下,我们在 JavaScript 中有这个对象: + +```javascript +var obj = {"name":"Bill", "age":62, "city":"Seatle"}; +``` + +请使用 JavaScript 函数 JSON.stringify() 将其转换为字符串。 + +```javascript +var myJSON = JSON.stringify(obj); +``` + +结果将是遵循 JSON 表示法的字符串。 + +myJSON 现在是一个字符串,准备好发送到服务器: + +```javascript +var obj = {"name":"Bill", "age":62, "city":"Seatle"}; +var myJSON = JSON.stringify(obj); +document.getElementById("demo").innerHTML = myJSON; +``` + +### Date.now() + +Date.now() 返回自零日期(1970 年 1 月 1 日 00:00:00:00)以来的毫秒数。 + +```javascript +var timInMSs = Date.now(); +``` + +Date.now() 的返回与在 Date 对象上执行 getTime() 的结果相同。 + +### 属性 Getter 和 Setter + +ES5 允许您使用类似于获取或设置属性的语法来定义对象方法。 + +这个例子为名为 fullName 的属性创建一个 *getter*: + +```javascript +// 创建对象: +var person = { + firstName: "Bill", + lastName : "Gates", + get fullName() { + return this.firstName + " " + this.lastName; + } +}; + +// 使用 getter 显示来自对象的数据: +document.getElementById("demo").innerHTML = person.fullName; +``` + +这个例子为语言属性创建一个 *setter* 和一个 *getter*: + +```javascript +var person = { + firstName: "Bill", + lastName : "Gates", + language : "NO", + get lang() { + return this.language; + }, + set lang(value) { + this.language = value; + } +}; + +// 使用 setter 设置对象属性: +person.lang = "en"; + +// 使用 getter 显示来自对象的数据: +document.getElementById("demo").innerHTML = person.lang; +``` + +这个例子使用 setter 来确保语言的大写更新: + +```javascript +var person = { + firstName: "Bill", + lastName : "Gates", + language : "NO", + set lang(value) { + this.language = value.toUpperCase(); + } +}; + +// 使用 setter 设置对象属性: +person.lang = "en"; + +// 显示来自对象的数据: +document.getElementById("demo").innerHTML = person.language; +``` + +### 新的对象属性和方法 + +**`Object.defineProperty()`** 是 ES5 中的新对象方法。 + +它允许您定义对象属性和/或更改属性的值和/或元数据。 + +```javascript +// 创建对象: +var person = { + firstName: "Bill", + lastName : "Gates", + language : "NO", +}; + +// 更改属性: +Object.defineProperty(person, "language", { + value: "EN", + writable : true, + enumerable : true, + configurable : true +}); + +// 枚举属性 +var txt = ""; +for (var x in person) { + txt += person[x] + "
    "; +} +document.getElementById("demo").innerHTML = txt; +``` + +下一个例子是相同的代码,但它隐藏了枚举中的语言属性: + +```javascript +// 创建对象: +var person = { + firstName: "Bill", + lastName : "Gates", + language : "NO", +}; + +// 更改属性: +Object.defineProperty(person, "language", { + value: "EN", + writable : true, + enumerable : false, + configurable : true +}); + +// 枚举属性 +var txt = ""; +for (var x in person) { + txt += person[x] + "
    "; +} +document.getElementById("demo").innerHTML = txt; +``` + +此例创建一个 **setter 和 getter** 来确保语言的大写更新: + +```javascript +// 创建对象: +var person = { + firstName: "Bill", + lastName : "Gates", + language : "NO" +}; + +// 更改属性: +Object.defineProperty(person, "language", { + get : function() { return language }, + set : function(value) { language = value.toUpperCase()} +}); + +// 更改语言 +person.language = "en"; + +// 显示语言 +document.getElementById("demo").innerHTML = person.language; +``` + +ECMAScript 5 对象方法: + +```javascript +ES5 新的对象方法 + +// 添加或更改对象属性 +Object.defineProperty(object, property, descriptor) + +// 添加或更改多个对象属性 +Object.defineProperties(object, descriptors) + +// 访问属性 +Object.getOwnPropertyDescriptor(object, property) + +// 将所有属性作为数组返回 +Object.getOwnPropertyNames(object) + +// 将可枚举属性作为数组返回 +Object.keys(object) + +// 访问原型 +Object.getPrototypeOf(object) + +// 防止向对象添加属性 +Object.preventExtensions(object) + +// 如果可以将属性添加到对象,则返回 true +Object.isExtensible(object) + +// 防止更改对象属性(而不是值) +Object.seal(object) + +// 如果对象被密封,则返回 true +Object.isSealed(object) + +// 防止对对象进行任何更改 +Object.freeze(object) + +// 如果对象被冻结,则返回 true +Object.isFrozen(object) +``` + +### 对字符串的属性访问 + +**`charAt()`** 方法返回字符串中指定索引(位置)的字符: + +```javascript +var str = "HELLO WORLD"; +str.charAt(0); // 返回 H +``` + +ECMAScript 5 允许对字符串进行属性访问: + +```javascript +var str = "HELLO WORLD"; +str[0]; // 返回 H +``` + +对字符串的属性访问可能有点不可预测。 + +### 尾随逗号(Trailing Commas) + +ECMAScript 5 允许在对象和数组定义中使用尾随逗号: + +#### Object 实例 + +```javascript +person = { + firstName: "Bill", + lastName: " Gates", + age: 62, +} +``` + +#### Array 实例 + +```javascript +points = [ + 1, + 5, + 10, + 25, + 40, + 100, +]; +``` + +警告!!! + +Internet Explorer 8 将崩溃。 + +JSON 不允许使用尾随逗号。 + +#### JSON 对象: + +```javascript +// 允许: +var person = '{"firstName":"Bill", "lastName":"Gates", "age":62}' +JSON.parse(person) + +// 不允许: +var person = '{"firstName":"Bill", "lastName":"Gates", "age":62,}' +JSON.parse(person) +``` + +#### JSON 数组: + +```javascript +// 允许: +points = [40, 100, 1, 5, 25, 10] + +// 不允许: +points = [40, 100, 1, 5, 25, 10,] +``` + +### 多行字符串 + +如果使用反斜杠转义,ECMAScript 5 允许多行的字符串文字(字面量): + +```javascript +"Hello \ +Kitty!"; +``` + +\ 方法可能没有得到普遍的支持。 + +较旧的浏览器可能会以不同的方式处理反斜杠周围的空格。 + +一些旧的浏览器不允许 \ 字符后面的空格。 + +分解字符串文字的一种更安全的方法是使用字符串添加: + +```javascript +"Hello " + +"Kitty!"; +``` + +### 保留字作为属性名称 + +ECMAScript 5允许保留字作为属性名称: + +```javascript +var obj = {name: "Bill", new: "yes"} +``` + +## ES5 新的对象方法 + +```javascript +// 添加或更改对象属性 +Object.defineProperty(object, property, descriptor) + +// 添加或更改多个对象属性 +Object.defineProperties(object, descriptors) + +// 访问属性 +Object.getOwnPropertyDescriptor(object, property) + +// 以数组返回所有属性 +Object.getOwnPropertyNames(object) + +// 以数组返回所有可枚举的属性 +Object.keys(object) + +// 访问原型 +Object.getPrototypeOf(object) + +// 阻止向对象添加属性 +Object.preventExtensions(object) + +// 如果可将属性添加到对象,则返回 true +Object.isExtensible(object) + +// 防止更改对象属性(而不是值) +Object.seal(object) + +// 如果对象被密封,则返回 true +Object.isSealed(object) + +// 防止对对象进行任何更改 +Object.freeze(object) + +// 如果对象被冻结,则返回 true +Object.isFrozen(object) +``` + +### 更改属性值 + +```javascript +Object.defineProperty(object, property, {value : value}) +``` + +本例更改了属性值: + +```javascript +var person = { + firstName: "Bill", + lastName : "Gates", + language : "EN" +}; + +// 更改属性 +Object.defineProperty(person, "language", {value : "ZH"}); +``` + +### 更改元数据 + +ES5 允许更改以下属性元数据: + +```javascript +writable : true // 属性值可修改 +enumerable : true // 属性可枚举 +configurable : true // 属性可重新配置 +writable : false // 属性值不可修改 +enumerable : false // 属性不可枚举 +configurable : false // 属性不可重新配置 +``` + +ES5 允许更改 getter 和 setter: + +```javascript +// 定义 getter +get: function() { return language } +// 定义 setter +set: function(value) { language = value } +``` + +此例使语言为只读: + +```javascript +Object.defineProperty(person, "language", {writable:false}); +``` + +此例使语言不可枚举: + +```javascript +Object.defineProperty(person, "language", {enumerable:false}); +``` + +### 列出所有属性 + +此例列出对象的所有属性: + +```javascript +var person = { + firstName: "Bill", + lastName : "Gates" + language : "EN" +}; + +Object.defineProperty(person, "language", {enumerable:false}); +Object.getOwnPropertyNames(person); // 返回属性数组 +``` + +### 列出可枚举的属性 + +此例只列出对象的所有可枚举属性: + +```javascript +var person = { + firstName: "Bill", + lastName : "Gates" + language : "EN" +}; + +Object.defineProperty(person, "language", {enumerable:false}); +Object.keys(person); // 返回可枚举属性的数组 +``` + +### 添加属性 + +此例向对象添加新属性: + +```javascript +// 创建对象 +var person = { + firstName: "Bill", + lastName : "Gates", + language : "EN" +}; + +// 添加属性 +Object.defineProperty(person, "year", {value:"2008"}); +``` + +### 添加 Getter 和 Setter + +Object.defineProperty() 方法也可以用于添加 Getter 和 Setter: + +```javascript +// 创建对象 +var person = {firstName:"Bill", lastName:"Gates"}; + +// 定义 getter +Object.defineProperty(person, "fullName", { + get : function () {return this.firstName + " " + this.lastName;} +}); +``` + + + +## BOM 应用 + +### BOM 基础 + +- 打开、关闭窗口 + - `open(url, 打开方式)`:`open('ablout.blank', '_blank')` + - 例子:页面内运行代码功能 + - `close(url, 打开方式)`:`window.close()` 关闭当前窗口 + - 例子:关闭时提示问题 + - 只能关闭自己 `open` 的窗口 +- 常用属性 + - `window.navigator.userAgent` + - `navigator`:包含大量信息 + - `userAgent`:浏览器信息 + - `window.location` + - `href`:当前网页地址 + - `hostname`:主机域名 + - `pathname`:页面路径和文件名 + - `port`:端口 + - `protocol`:http协议 + - `assign`:加载新文档,url + - `window.history` + - `back()`:后退 + - `forward()`:前进 + - `go()`:历史中某个页面,-1 用于登陆后回跳 + +### 尺寸及坐标 + +- 窗口尺寸、工作区尺寸 + - 可视区尺寸 + - `document.documentElement.clientWidth` + - `document.documentElement.clientHeight` + - 滚动距离 + - `document.body.scrollTop`:旧版本 chrome 和没有 DOCTYPE 声明的 IE + - `document.documentElement.scrollTop`:IE FF + - 完美的获取 `scrollTop` 赋值短语 : + `var scrollTop = document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop;` + +### 常用方法和事件 + +- 系统对话框 + + - 警告框:`alert("内容")`,没有返回值 + - 选择框:`confirm("提问的内容")`,返回 `boolean` + - 输入框:`prompt()`,返回字符串或 `null` + +- `window` 对象常用事件 + + - `onload`:页面加载完发生 + - `onscroll`:页面滚动时发生 + - `onresize`:事件会在窗口或框架被调整大小时发生 + - 例子:回到顶部按钮、侧边栏广告 + - 闪烁问题 + - `userAgent > IE6` 用 `position:fixed;` + - `userAgent < IE6` 用运动; + +- 代码: + + ```HTML + + + + + Bom应用 + + + + + + + + + ``` + + + +## COOKIE 基础与应用 + +### 什么是 cookie + +- 页面用来保存信息 + - 比如:自动登录、记住用户名 +- `cookie` 的特征 + - 同一网站中所有页面共享一套 `cookie` + - 数量、大小有限 + - 过期时间 +- JS 中使用 `cookie` + - `document.cookie` + +### 使用 cookie + +- 设置 `cookie` + + - 格式:`名字 = 值` + + - 赋值时不会覆盖 + + - 过期时间:`expires = 时间` + + - 设置前一个 cookie 数据的过期时间,expires 放在数据后面: + - `document.cookie = 'password=123;expires='+ oDate;` + - 日期对象的使用 + + - 封装函数 + + ```js + // 封装 setCookie 函数 + function setCookie(name, value, iTime) { + var oDate = new Date(); + oDate.setTime(oDate.getTime() + iTime); // 毫秒 + document.cookie = name + '=' + value + ';expires=' + oDate; + } + setCookie('username', '张三', 1000*60*60); + ``` + + + +- 读取 `cookie` + + - 字符串分割 + + ```js + // 封装 getCookie 函数 + getCookie(name) { + var arr = document.cookie.split('; '); + for (var i in arr) { + var arr2 = arr[i].split('='); + if (arr2[0] === name){ + return arr2[1]; + } + } + return ''; + } + console.log(getCookie('username')); + ``` + + + +- 删除 `cookie` + + - 已经过期 + + ```js + // 封装 removeCookie 函数 + function removeCookie(name) { + setCookie(name, '', -1) + } + removeCookie('username'); + ``` + + + +- 例子:使用 `cookie` 记录上次登陆的用户名 + + - 提交时:记录用户名 + + - `window.onload`:读取用户名 + + - 代码: + + ```HTML + + + + + 28.1.登陆后cookie读取用户名 + + + + +
    + + + + + + + ``` + + + +## JS 中的正则表达式 + +### 正则表达式基础 + +- 复习字符串操作:`var str = 'asdf1234';` + - `search`:**查找位置** `str.search('3')` + - `substring`:获取子字符串, + - **截取某段**字符串, **不包含结束位**: `str.substring(2,5)` + - 获取起点以后的字符串:`str.substring(2)` + - `charAt`:**获取某个**字符串 `str.charAt(2)` + - `split`:**分割**某个字符串 ` str.split('-')` +- 找出字符串中所有的数字 + - 用传统字符串操作完成 + - 用正则表达式完成 +- 什么是正则表达式 + - 什么叫正则? + - 规则、模式 + - 强大的**字符串匹配工具** + - 是一种人类很难读懂的文字 + - `RegExp` 对象 + - `JS` 风格:`new RegExp( "a" , "i" )` + - `perl` 风格:`/a/i` + +### 字符串与正则配合 + +- `search`:字符串搜索,返回位置或 -1 + - 返回出现的位置 + - 忽略大小写:`i`:ignore + - 判断浏览器类型 + +- `match`:获取匹配的项目,返回元素或 + - 量词:`+` (若干个) + - 量词变化:`\d`(单个数字一组) `\d\d`(两个数字一组) 和 `\d+`(若干连续数字) + - 全局匹配:`g`:global + - 例子:找出所有数字 + +- `replace(reg/str,replacement)`:替换所有匹配 + - 返回替换后的字符串 + - 例子:敏感词过滤 + +- `reg.test()` 的问题 + + - 一次是true, 一次是false. 原因在于正则表达式中的g, 使得搜索过程后, 如果匹配成功, 则记录上一次的位置, 如果匹配不成功, 则会归零. + + ```javascript + // 人工将位置归零, 防止这个 "错误" 的发生: + var re = /^\w$/g; + re.test('a'); //返回true + re.lastIndex = 0; //归零搜索的位置 + re.test('b'); //返回true + + // 或者我们可以更简单地直接将g去掉: + var re = /^\w$/; + re.test('a'); //返回true + re.test('b'); //返回true + ``` + +- `exec()` 方法用于检索字符串中的正则表达式的匹配。 + + ```javascript + RegExpObject.exec(string) + ``` + + | 参数 | 描述 | + | :------- | :------------------- | + | *string* | 必需。要检索的字符串 | + + 如果 exec() 找到了匹配的文本,则返回一个结果数组。否则,返回 null。此数组的第 0 个元素是与正则表达式相匹配的文本,第 1 个元素是与 RegExpObject 的第 1 个子表达式相匹配的文本(如果有的话),第 2 个元素是与 RegExpObject 的第 2 个子表达式相匹配的文本(如果有的话),以此类推。除了数组元素和 length 属性之外,exec() 方法还返回两个属性。index 属性声明的是匹配文本的第一个字符的位置。input 属性则存放的是被检索的字符串 string。我们可以看得出,在调用非全局的 RegExp 对象的 exec() 方法时,返回的数组与调用方法 `String.match()` 返回的数组是相同的。 + + 但是,当 RegExpObject 是一个全局正则表达式时,exec() 的行为就稍微复杂一些。它会在 RegExpObject 的 lastIndex 属性指定的字符处开始检索字符串 string。当 exec() 找到了与表达式相匹配的文本时,在匹配后,它将把 RegExpObject 的 lastIndex 属性设置为匹配文本的最后一个字符的下一个位置。这就是说,您可以通过反复调用 exec() 方法来遍历字符串中的所有匹配文本。当 exec() 再也找不到匹配的文本时,它将返回 null,并把 lastIndex 属性重置为 0。 + + **重要事项:**如果在一个字符串中完成了一次模式匹配之后要开始检索新的字符串,就必须手动地把 lastIndex 属性重置为 0。 + + **提示:**请注意,无论 RegExpObject 是否是全局模式,exec() 都会把完整的细节添加到它返回的数组中。这就是 exec() 与 String.match() 的不同之处,后者在全局模式下返回的信息要少得多。因此我们可以这么说,在循环中反复地调用 exec() 方法是唯一一种获得全局模式的完整模式匹配信息的方法。 + + ```javascript + var str = "Visit W3School"; + var patt = new RegExp("W3School","g"); + var result; + + while ((result = patt.exec(str)) != null) { + document.write(result); + document.write("
    "); + document.write(patt.lastIndex); + } + ``` + + + +### 字符串 + +- 任意字符:`[]`方括号(元字符) + - `[abc]` + - 例子:`a[usb]t`:`obt` `ost` `out` +- 范围 + - `[a-z]` `[0-9]` + - 例子:`id[0-9]`:`id0` `id5` +- 排除 + - `[^a]` + - 例子:`o[^0-9]`:`oat ` `o?t` `ot` +- 组合 + - `[a-z0-9A-Z]` +- 实例:偷小说 + - 过滤 HTML 标签, + - 正则贪婪特性,从最长的内容开始过滤 + - 自定义 `innerText` 方法 + - 代码:同下 +- 转义字符 + - `.`(点) :除换行任意字符 + - `.+[\s\S].+`:任意字符 + - `\d` (数字):`[0-9] ` + - `\w` (数字、英文、下划线) :`[a-z0-9_]` + - `\s` (空白字符):`[ ]` + - `\D` (除了数字):`[^0-9]` + - `\W` (除了数字英文下划线) :`[^a-z0-9_]` + - `\S` (除了空白字符):`[^ ]` +- 行首、行尾 + - `^` :行首 + - `$`:行尾 +- 逻辑 + - `|` : 将两个匹配条件进行逻辑“或”(or)运算 + +### 量词 + +- 什么是量词 + + - `{n}`:刚好出现 n 次 + - `{n,m}` 至少出现 n 次,最多 m 次 + - 例子:查找 QQ 号 + +- 常用量词 + + - `{n,}` 至少 n 次,无上限 + + - `*` 任意次 `{0,}` 可以为0次,不建议使用 + + - `?` 零次或一次 `{0,1}` + + ``` + 固定电话:010-23456789-1234 或 23456789 + (0\d{2,3}-)?[1-9]\d{7}(-\d{1,5})? + ``` + + - `+` 一次或任意次`{1,}` + + - `{n}` 正好 n 次 + +### 常用正则例子 + +- 表单校验实例 + + - 检验邮箱 + - 行首行尾 + +- ```HTML + + + + + 正则表达式应用 + + + + + +
    + + + + +
    + + + + ``` + +## RegExp 对象 + +RegExp 对象表示正则表达式,它是对字符串执行模式匹配的强大工具。 + +### 直接量语法 + +``` +/pattern/attributes +``` + +### 创建 RegExp 对象的语法: + +``` +new RegExp(pattern, attributes); +``` + +### 参数 + +参数 ***pattern*** 是一个字符串,指定了**正则表达式的模式或其他正则表达式**。 + +参数 ***attributes*** 是一个可选的字符串,包含**属性** "g"、"i" 和 "m",分别用于指定全局匹配、区分大小写的匹配和多行匹配。ECMAScript 标准化之前,不支持 m 属性。如果 *pattern* 是正则表达式,而不是字符串,则必须省略该参数。 + +### 返回值 + +一个新的 RegExp 对象,具有指定的模式和标志。如果参数 *pattern* 是正则表达式而不是字符串,那么 RegExp() 构造函数将用与指定的 RegExp 相同的模式和标志创建一个新的 RegExp 对象。 + +如果不用 new 运算符,而将 RegExp() 作为函数调用,那么它的行为与用 new 运算符调用时一样,只是当 *pattern* 是正则表达式时,它只返回 *pattern*,而不再创建一个新的 RegExp 对象。 + +### 抛出 + +SyntaxError - 如果 *pattern* 不是合法的正则表达式,或 *attributes* 含有 "g"、"i" 和 "m" 之外的字符,抛出该异常。 + +TypeError - 如果 *pattern* 是 RegExp 对象,但没有省略 *attributes* 参数,抛出该异常。 + +### 修饰符 + +| 修饰符 | 描述 | +| :-------------------------------------------------------- | :------------------------------------------------------- | +| [i](https://www.w3school.com.cn/jsref/jsref_regexp_i.asp) | 执行对大小写不敏感的匹配。 | +| [g](https://www.w3school.com.cn/jsref/jsref_regexp_g.asp) | 执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。 | +| m | 执行多行匹配。 | + +### 方括号 + +方括号用于查找某个范围内的字符: + +| 表达式 | 描述 | +| :----------------------------------------------------------- | :--------------------------------- | +| [[abc\]](https://www.w3school.com.cn/jsref/jsref_regexp_charset.asp) | 查找方括号之间的任何字符。 | +| [[^abc\]](https://www.w3school.com.cn/jsref/jsref_regexp_charset_not.asp) | 查找任何不在方括号之间的字符。 | +| [0-9] | 查找任何从 0 至 9 的数字。 | +| [a-z] | 查找任何从小写 a 到小写 z 的字符。 | +| [A-Z] | 查找任何从大写 A 到大写 Z 的字符。 | +| [A-z] | 查找任何从大写 A 到小写 z 的字符。 | +| [adgk] | 查找给定集合内的任何字符。 | +| [^adgk] | 查找给定集合外的任何字符。 | +| (red\|blue\|green) | 查找任何指定的选项。 | + +### 元字符 + +元字符(Metacharacter)是拥有特殊含义的字符: + +| 元字符 | 描述 | +| :----------------------------------------------------------- | :------------------------------------------ | +| [.](https://www.w3school.com.cn/jsref/jsref_regexp_dot.asp) | 查找单个字符,除了换行和行结束符。 | +| [\w](https://www.w3school.com.cn/jsref/jsref_regexp_wordchar.asp) | 查找单词字符。 | +| [\W](https://www.w3school.com.cn/jsref/jsref_regexp_wordchar_non.asp) | 查找非单词字符。 | +| [\d](https://www.w3school.com.cn/jsref/jsref_regexp_digit.asp) | 查找数字。 | +| [\D](https://www.w3school.com.cn/jsref/jsref_regexp_digit_non.asp) | 查找非数字字符。 | +| [\s](https://www.w3school.com.cn/jsref/jsref_regexp_whitespace.asp) | 查找空白字符。 | +| [\S](https://www.w3school.com.cn/jsref/jsref_regexp_whitespace_non.asp) | 查找非空白字符。 | +| [\b](https://www.w3school.com.cn/jsref/jsref_regexp_begin.asp) | 匹配单词边界。 | +| [\B](https://www.w3school.com.cn/jsref/jsref_regexp_begin_not.asp) | 匹配非单词边界。 | +| \0 | 查找 NUL 字符。 | +| [\n](https://www.w3school.com.cn/jsref/jsref_regexp_newline.asp) | 查找换行符。 | +| \f | 查找换页符。 | +| \r | 查找回车符。 | +| \t | 查找制表符。 | +| \v | 查找垂直制表符。 | +| [\xxx](https://www.w3school.com.cn/jsref/jsref_regexp_octal.asp) | 查找以八进制数 xxx 规定的字符。 | +| [\xdd](https://www.w3school.com.cn/jsref/jsref_regexp_hex.asp) | 查找以十六进制数 dd 规定的字符。 | +| [\uxxxx](https://www.w3school.com.cn/jsref/jsref_regexp_unicode_hex.asp) | 查找以十六进制数 xxxx 规定的 Unicode 字符。 | + +### 量词 + +| 量词 | 描述 | +| :----------------------------------------------------------- | :------------------------------------------ | +| [n+](https://www.w3school.com.cn/jsref/jsref_regexp_onemore.asp) | 匹配任何包含至少一个 n 的字符串。 | +| [n*](https://www.w3school.com.cn/jsref/jsref_regexp_zeromore.asp) | 匹配任何包含零个或多个 n 的字符串。 | +| [n?](https://www.w3school.com.cn/jsref/jsref_regexp_zeroone.asp) | 匹配任何包含零个或一个 n 的字符串。 | +| [n{X}](https://www.w3school.com.cn/jsref/jsref_regexp_nx.asp) | 匹配包含 X 个 n 的序列的字符串。 | +| [n{X,Y}](https://www.w3school.com.cn/jsref/jsref_regexp_nxy.asp) | 匹配包含 X 至 Y 个 n 的序列的字符串。 | +| [n{X,}](https://www.w3school.com.cn/jsref/jsref_regexp_nxcomma.asp) | 匹配包含至少 X 个 n 的序列的字符串。 | +| [n$](https://www.w3school.com.cn/jsref/jsref_regexp_ndollar.asp) | 匹配任何结尾为 n 的字符串。 | +| [^n](https://www.w3school.com.cn/jsref/jsref_regexp_ncaret.asp) | 匹配任何开头为 n 的字符串。 | +| [?=n](https://www.w3school.com.cn/jsref/jsref_regexp_nfollow.asp) | 匹配任何其后紧接指定字符串 n 的字符串。 | +| [?!n](https://www.w3school.com.cn/jsref/jsref_regexp_nfollow_not.asp) | 匹配任何其后没有紧接指定字符串 n 的字符串。 | + +### RegExp 对象属性 + +| 属性 | 描述 | FF | IE | +| :----------------------------------------------------------- | :--------------------------------------- | :--- | :--- | +| [global](https://www.w3school.com.cn/jsref/jsref_regexp_global.asp) | RegExp 对象是否具有标志 g。 | 1 | 4 | +| [ignoreCase](https://www.w3school.com.cn/jsref/jsref_regexp_ignorecase.asp) | RegExp 对象是否具有标志 i。 | 1 | 4 | +| [lastIndex](https://www.w3school.com.cn/jsref/jsref_lastindex_regexp.asp) | 一个整数,标示开始下一次匹配的字符位置。 | 1 | 4 | +| [multiline](https://www.w3school.com.cn/jsref/jsref_multiline_regexp.asp) | RegExp 对象是否具有标志 m。 | 1 | 4 | +| [source](https://www.w3school.com.cn/jsref/jsref_source_regexp.asp) | 正则表达式的源文本。 | 1 | 4 | + +### RegExp 对象方法 + +| 方法 | 描述 | FF | IE | +| :----------------------------------------------------------- | :------------------------------------------------- | :--- | :--- | +| [compile](https://www.w3school.com.cn/jsref/jsref_regexp_compile.asp) | 编译正则表达式。 | 1 | 4 | +| [exec](https://www.w3school.com.cn/jsref/jsref_exec_regexp.asp) | 检索字符串中指定的值。返回找到的值,并确定其位置。 | 1 | 4 | +| [test](https://www.w3school.com.cn/jsref/jsref_test_regexp.asp) | 检索字符串中指定的值。返回 true 或 false。 | 1 | 4 | + +### 支持正则表达式的 String 对象的方法 + +| 方法 | 描述 | FF | IE | +| :----------------------------------------------------------- | :------------------------------- | :--- | :--- | +| [search](https://www.w3school.com.cn/jsref/jsref_search.asp) | 检索与正则表达式相匹配的值。 | 1 | 4 | +| [match](https://www.w3school.com.cn/jsref/jsref_match.asp) | 找到一个或多个正则表达式的匹配。 | 1 | 4 | +| [replace](https://www.w3school.com.cn/jsref/jsref_replace.asp) | 替换与正则表达式匹配的子串。 | 1 | 4 | +| [split](https://www.w3school.com.cn/jsref/jsref_split.asp) | 把字符串分割为字符串数组。 | 1 | 4 | + +- [JS Number](https://www.w3school.com.cn/jsref/jsref_obj_number.asp) +- [JS String](https://www.w3school.com.cn/jsref/jsref_obj_string.asp) + + + +## JS Template 模板引擎 + +> https://www.jb51.net/article/100095.htm + +### 1、特性 + +(1)、性能卓越,执行速度通常是 Mustache 与 tmpl 的 20 多倍(性能测试) + +(2)、支持运行时调试,可精确定位异常模板所在语句(演示) + +(3)、对 NodeJS Express 友好支持 + +(4)、安全,默认对输出进行转义、在沙箱中运行编译后的代码(Node版本可以安全执行用户上传的模板) + +(5)、支持include语句 + +(6)、可在浏览器端实现按路径加载模板(详情) + +(7)、支持预编译,可将模板转换成为非常精简的 js 文件 + +(8)、模板语句简洁,无需前缀引用数据,有简洁版本与原生语法版本可选 + +(9)、支持所有流行的浏览器 + +### 2、语法 + +(1)、使用 + +引用简洁语法的引擎版本,例如:` ` + +(2)、表达式 + +{{ 与 }} 符号包裹起来的语句则为模板的逻辑表达式。 + +`template('test', data)` : 渲染 + +(3)、输出表达式 + +对内容编码(转义)输出:` {{content}} ` +不编码(转义)输出:` {{#content}} ` +编码可以防止数据中含有 HTML 字符串,避免引起 XSS 攻击。 + +(4)、条件表达式 + +```html +{{if admin}} +

    admin

    +{{else if code > 0}} +

    master

    +{{else}} +

    error!

    +{{/if}} +``` + +(5)、遍历表达式 + +无论数组或者对象都可以用 each 进行遍历。 + +```html +{{each list as value index}} +
  • {{index}} - {{value.user}}
  • +{{/each}} +// 亦可以被简写:$ 特指当前函数中的变量 +{{each list}} +
  • {{$index}} - {{$value.user}}
  • +{{/each}} +``` + +(6)、模板包含表达式 + +用于嵌入子模板。 + +`{{include 'template_name'}} ` + +子模板默认共享当前数据,亦可以指定数据:`{{include 'template_name' news_list}} ` + +(7)、辅助方法 + +使用 `template.defaults.imports.dateFormat = function(arg1,arg2){} `注册公用辅助方法: + +```js +template.defaults.imports.dateFormat = function(arg1,arg2) { + // .. + return value; +}); +``` + +模板中使用的方式:` {{time | dateFormat:'yyyy-MM-dd hh:mm:ss'}} ` +支持传入参数与嵌套使用: `{{time | say:'cd' | ubb | link}} ` + +### 3、实例 + +```html + + + + + + + + Document + + + + +
    + + + + + + + + +``` + +![image-20200126152808449](readme.assets/image-20200126152808449.png) + + + +```html + + + + +no escape-demo + + + + +

    不转义HTML

    +
    + + + + + +``` + +![image-20200126152827260](readme.assets/image-20200126152827260.png) + +```html + + + + +include-demo + + + + +
    + + + + + + +``` + +![image-20200126152842459](readme.assets/image-20200126152842459.png) + +```html + +``` + +![image-20200126152920878](readme.assets/image-20200126152920878.png) + + + +## 表达式和运算符分类 + +左侧工具栏是按字母表排序的列表。 + +### 主要表达式 + + + +JavaScript中基本关键字和常用表达式。 + +- [`this`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/this) + + `this` 关键字指向函数的执行上下文。 + +- [`function`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/function) + + `function` 关键字定义了函数表达式。 + +- [`class`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/class) + + `class` 关键字定义了类表达式。 + +- [`function*`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/function*) + + `function*` 关键字定义了一个 generator 函数表达式。 + +- [`yield`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/yield) + + 暂停和恢复 generator 函数。 + +- [`yield*`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/yield*) + + 委派给另外一个generator函数或可迭代的对象。 + +- `async function` + + `async function` 定义一个异步函数表达式。 + +- [`await`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/await) + + 暂停或恢复执行异步函数,并等待promise的resolve/reject回调。 + +- [`[\]`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array) + + 数组初始化/字面量语法。 + +- [`{}`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Object_initializer) + + 对象初始化/字面量语法。 + +- [`/ab+c/i`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/RegExp) + + 正则表达式字面量语法。 + +- [`( )`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Grouping) + + 分组操作符。 + +### 左表达式 + + + +左边的值是赋值的目标。 + +- [属性访问符](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Property_accessors) + + 成员运算符提供了对对象的属性或方法的访问 (`object.property` 和 `object["property"]`). + +- [`new`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/new) + + `new` 运算符创建了构造函数实例。 + +- [`new.target`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/new.target) + + 在构造器中,`new.target` 指向[`new`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/new)调用的构造器。 + +- [`super`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/super) + + `super` 关键字调用父类的构造器. + +- [`...obj`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Spread_operator) + + 展开运算符可以将一个可迭代的对象在函数调用的位置展开成为多个参数,或者在数组字面量中展开成多个数组元素。 + +### 自增和自减 + + + +前置/后置自增运算符和前置/后置自减运算符. + +- [`A++`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators#Increment) + + 后置自增运算符. + +- [`A--`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators#Decrement) + + 后置自减运算符. + +- [`++A`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators#Increment) + + 前置自增运算符. + +- [`--A`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators#Decrement) + + 前置自减运算符. + +### 一元运算符 + + + +一元运算符只有一个操作数. + +- [`delete`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/delete) + + `delete` 运算符用来删除对象的属性. + +- [`void`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/void) + + `void` 运算符表示表达式放弃返回值. + +- [`typeof`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/typeof) + + `typeof` 运算符用来判断给定对象的类型. + +- [`+`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators#Unary_plus) + + 一元加运算符将操作转换为Number类型. + +- [`-`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators#Unary_negation) + + 一元减运算符将操作转换为Number类型并取反. + +- [`~`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators#Bitwise_NOT) + + 按位非运算符. + +- [`!`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Logical_Operators#Logical_NOT) + + 逻辑非运算符. + +### 算术运算符 + + + +算术运算符以二个数值(字面量或变量)作为操作数,并返回单个数值。 + +- [`+`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators#Addition) + + 加法运算符. + +- [`-`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators#Subtraction) + + 减法运算符. + +- [`/`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators#Division) + + 除法运算符. + +- [`*`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators#Multiplication) + + 乘法运算符. + +- [`%`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators#Remainder) + + 取模运算符. + +### 关系运算符 + + + +比较运算符比较二个操作数并返回基于比较结果的`Boolean`值。 + +- [`in`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/in) + + `in运算符用来判断对象是否拥有给定属性`. + +- [`instanceof`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/instanceof) + + `instanceof` 运算符判断一个对象是否是另一个对象的实例. + +- [`<`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Comparison_Operators#Less_than_operator) + + 小于运算符 + +- [`>`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Comparison_Operators#Greater_than_operator) + + 大于运算符. + +- [`<=`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Comparison_Operators#Less_than_or_equal_operator) + + 小于等于运算符. + +- [`>=`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Comparison_Operators#Greater_than_or_equal_operator) + + 大于等于运算符。 + +**注意: =>** 不是运算符,而是[`箭头函数`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Functions/Arrow_functions)的表示符。 + +### 相等运算符 + + + +如果相等,操作符返回的是Boolean(布尔)类型的true,否则是false。 + +- [`==`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Comparison_Operators#Equality) + + 相等 运算符. + +- [`!=`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Comparison_Operators#Inequality) + + 不等 运算符. + +- [`===`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Comparison_Operators#Identity) + + 全等 运算符. + +- [`!==`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Comparison_Operators#Nonidentity) + + 非全等 运算符. + +### 位移运算符 + + + +在二进制的基础上对数字进行移动操作 + +- [`<<`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators#Left_shift) + + 按位左移运算符。 + +- [`>>`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators#Right_shift) + + 按位右移运算符。 + +- [`>>>`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators#Unsigned_right_shift) + + 按位无符号右移运算符。 + +### 二进制位运算符 + + + +二进制运算符将它们的操作数作为32个二进制位(0或1)的集合,并返回标准的JavaScript数值。 + +- [`&`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators#Bitwise_AND) + + 二进制位与(AND)。 + +- [`|`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators#Bitwise_OR) + + 二进制位或(OR)。 + +- [`^`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators#Bitwise_XOR) + + 二进制位异或(XOR)。 + +### 二元逻辑运算符 + + + +逻辑运算符典型的用法是用于boolean(逻辑)值运算, 它们返回boolean值。 + +- [`&&`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Logical_Operators#Logical_AND) + + 逻辑与. + +- [`||`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Logical_Operators#Logical_OR) + + 逻辑或. + +### 条件(三元)运算符 + + + +- [`(condition ? ifTrue : ifFalse)`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Conditional_Operator) + + 条件元素运算符把两个结果中其中一个符合运算逻辑的值返回。 + +### 赋值运算符 + + + +赋值元素符会将右边的操作数的值分配给左边的操作数,并将其值修改为右边操作数相等的值。 + +- [`=`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Assignment_Operators#Assignment) + + 赋值运算符。 + +- [`*=`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Assignment_Operators#Multiplication_assignment) + + 赋值乘积。 + +- [`/=`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Assignment_Operators#Division_assignment) + + 赋值商。 + +- [`%=`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Assignment_Operators#Remainder_assignment) + + 赋值求余。 + +- [`+=`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Assignment_Operators#Addition_assignment) + + 赋值求和。 + +- [`-=`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Assignment_Operators#Subtraction_assignment) + + 赋值求差。 + +- [`<<=`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Assignment_Operators#Left_shift_assignment) + + 左位移。 + +- [`>>=`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Assignment_Operators#Right_shift_assignment) + + 右位移。 + +- [`>>>=`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Assignment_Operators#Unsigned_right_shift_assignment) + + 无符号右位移。 + +- [`&=`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Assignment_Operators#Bitwise_AND_assignment) + + 赋值与。 + +- [`^=`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Assignment_Operators#Bitwise_XOR_assignment) + + 赋值按位异或。 + +- [`|=`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Assignment_Operators#Bitwise_OR_assignment) + + 赋值或。 + +- [`[a, b\] = [1, 2]`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment) [`{a, b} = {a:1, b:2}`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment) + + 解构赋值允许你分配数组或者对象变量的属性通过使用规定的语法,其看起来和数组和对象字面量很相似。 + +- 逗号操作符 + +- [`,`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Comma_Operator) + + 逗号操作符允许在一个判断状态中有多个表达式去进行运算并且最后返回最后一个表达式的值。 + +## JavaScript 运算符优先级值 + +| 值 | 运算符 | 描述 | 实例 | +| :--- | :--------- | :--------------- | :--------------- | +| 20 | ( ) | 表达式分组 | (3 + 4) | +| | | | | +| 19 | . | 成员 | person.name | +| 19 | [] | 成员 | person["name"] | +| 19 | () | 函数调用 | myFunction() | +| 19 | new | 创建 | new Date() | +| | | | | +| 17 | ++ | 后缀递增 | i++ | +| 17 | -- | 后缀递减 | i-- | +| | | | | +| 16 | ++ | 前缀递增 | ++i | +| 16 | -- | 前缀递减 | --i | +| 16 | ! | 逻辑否 | !(x==y) | +| 16 | typeof | 类型 | typeof x | +| | | | | +| 15 | ** | 求幂 (ES7) | 10 ** 2 | +| | | | | +| 14 | * | 乘 | 10 * 5 | +| 14 | / | 除 | 10 / 5 | +| 14 | % | 模数除法 | 10 % 5 | +| | | | | +| 13 | + | 加 | 10 + 5 | +| 13 | - | 减 | 10 - 5 | +| | | | | +| 12 | << | 左位移 | x << 2 | +| 12 | >> | 右位移 | x >> 2 | +| 12 | >>> | 右位移(无符号) | x >>> 2 | +| | | | | +| 11 | < | 小于 | x < y | +| 11 | <= | 小于或等于 | x <= y | +| 11 | > | 大于 | x > y | +| 11 | >= | 大于或等于 | x >= y | +| 11 | in | 对象中的属性 | "PI" in Math | +| 11 | instanceof | 对象的实例 | instanceof Array | +| | | | | +| 10 | == | 相等 | x == y | +| 10 | === | 严格相等 | x === y | +| 10 | != | 不相等 | x != y | +| 10 | !== | 严格不相等 | x !== y | +| | | | | +| 9 | & | 按位与 | x & y | +| 8 | ^ | 按位 XOR | x ^ y | +| 7 | \| | 按位或 | x \| y | +| 6 | && | 逻辑与 | x && y | +| 5 | \|\| | 逻辑否 | x \|\| y | +| 4 | ? : | 条件 | ? "Yes" : "No" | +| | | | | +| 3 | = | 赋值 | x = y | +| 3 | += | 赋值 | x += y | +| 3 | -= | 赋值 | x -= y | +| 3 | *= | 赋值 | x *= y | +| 3 | %= | 赋值 | x %= y | +| 3 | <<= | 赋值 | x <<= y | +| 3 | >>= | 赋值 | x >>= y | +| 3 | >>>= | 赋值 | x >>>= y | +| 3 | &= | 赋值 | x &= y | +| 3 | ^= | 赋值 | x ^= y | +| 3 | \|= | 赋值 | x \|= y | +| | | | | +| 2 | yield | 暂停函数 | yield x | +| 1 | , | 逗号 | 7 , 8 | + +**注意:**淡红色指示实验性或建议性的技术(ECMASScript 2016 或 ES7) + +**提示:**括号中的表达式会在值在表达式的其余部分中被使用之前进行完全计算。 \ No newline at end of file diff --git "a/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.assets/image-20210605161656189.png" "b/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.assets/image-20210605161656189.png" new file mode 100644 index 0000000..10cbc1e Binary files /dev/null and "b/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.assets/image-20210605161656189.png" differ diff --git "a/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.assets/image-20210710161827359.png" "b/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.assets/image-20210710161827359.png" new file mode 100644 index 0000000..8b29f28 Binary files /dev/null and "b/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.assets/image-20210710161827359.png" differ diff --git "a/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.assets/image-20210710225957749.png" "b/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.assets/image-20210710225957749.png" new file mode 100644 index 0000000..619bdde Binary files /dev/null and "b/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.assets/image-20210710225957749.png" differ diff --git "a/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.assets/image-20210710232601499.png" "b/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.assets/image-20210710232601499.png" new file mode 100644 index 0000000..bdc867a Binary files /dev/null and "b/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.assets/image-20210710232601499.png" differ diff --git "a/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.assets/image-20210711153109588.png" "b/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.assets/image-20210711153109588.png" new file mode 100644 index 0000000..6afc06f Binary files /dev/null and "b/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.assets/image-20210711153109588.png" differ diff --git "a/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.assets/image-20210711153732577.png" "b/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.assets/image-20210711153732577.png" new file mode 100644 index 0000000..0a8cae6 Binary files /dev/null and "b/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.assets/image-20210711153732577.png" differ diff --git "a/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.assets/image-20210711154422125.png" "b/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.assets/image-20210711154422125.png" new file mode 100644 index 0000000..e6de075 Binary files /dev/null and "b/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.assets/image-20210711154422125.png" differ diff --git "a/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.assets/image-20210711160141212.png" "b/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.assets/image-20210711160141212.png" new file mode 100644 index 0000000..fa17213 Binary files /dev/null and "b/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.assets/image-20210711160141212.png" differ diff --git "a/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.assets/image-20210711193851091.png" "b/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.assets/image-20210711193851091.png" new file mode 100644 index 0000000..cafe0a3 Binary files /dev/null and "b/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.assets/image-20210711193851091.png" differ diff --git "a/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.assets/image-20210711205301182.png" "b/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.assets/image-20210711205301182.png" new file mode 100644 index 0000000..109d16b Binary files /dev/null and "b/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.assets/image-20210711205301182.png" differ diff --git "a/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.assets/image-20210711205332837.png" "b/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.assets/image-20210711205332837.png" new file mode 100644 index 0000000..dc8b82a Binary files /dev/null and "b/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.assets/image-20210711205332837.png" differ diff --git "a/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.assets/image-20210711205531624.png" "b/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.assets/image-20210711205531624.png" new file mode 100644 index 0000000..876504c Binary files /dev/null and "b/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.assets/image-20210711205531624.png" differ diff --git "a/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.assets/image-20210711210425719.png" "b/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.assets/image-20210711210425719.png" new file mode 100644 index 0000000..b4f0329 Binary files /dev/null and "b/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.assets/image-20210711210425719.png" differ diff --git "a/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.assets/image-20210712212850089.png" "b/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.assets/image-20210712212850089.png" new file mode 100644 index 0000000..c3e17aa Binary files /dev/null and "b/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.assets/image-20210712212850089.png" differ diff --git "a/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.assets/image-20210716163550713.png" "b/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.assets/image-20210716163550713.png" new file mode 100644 index 0000000..cb980e4 Binary files /dev/null and "b/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.assets/image-20210716163550713.png" differ diff --git "a/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.assets/image-20210716173022784.png" "b/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.assets/image-20210716173022784.png" new file mode 100644 index 0000000..a253bf6 Binary files /dev/null and "b/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.assets/image-20210716173022784.png" differ diff --git "a/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.assets/image-20210716211907832.png" "b/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.assets/image-20210716211907832.png" new file mode 100644 index 0000000..1e0c877 Binary files /dev/null and "b/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.assets/image-20210716211907832.png" differ diff --git "a/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.assets/image-20210718100442699.png" "b/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.assets/image-20210718100442699.png" new file mode 100644 index 0000000..9ef2576 Binary files /dev/null and "b/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.assets/image-20210718100442699.png" differ diff --git "a/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.assets/image-20210718102100840.png" "b/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.assets/image-20210718102100840.png" new file mode 100644 index 0000000..3e30edf Binary files /dev/null and "b/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.assets/image-20210718102100840.png" differ diff --git "a/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.assets/image-20210718162123729.png" "b/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.assets/image-20210718162123729.png" new file mode 100644 index 0000000..814b8f1 Binary files /dev/null and "b/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.assets/image-20210718162123729.png" differ diff --git "a/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.assets/image-20210718162138045.png" "b/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.assets/image-20210718162138045.png" new file mode 100644 index 0000000..66ee490 Binary files /dev/null and "b/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.assets/image-20210718162138045.png" differ diff --git "a/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.assets/image-20210726162710016.png" "b/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.assets/image-20210726162710016.png" new file mode 100644 index 0000000..0eb9d7a Binary files /dev/null and "b/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.assets/image-20210726162710016.png" differ diff --git "a/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.assets/image-20210726175624236.png" "b/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.assets/image-20210726175624236.png" new file mode 100644 index 0000000..70358ec Binary files /dev/null and "b/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.assets/image-20210726175624236.png" differ diff --git "a/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.assets/image-20210801162254455.png" "b/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.assets/image-20210801162254455.png" new file mode 100644 index 0000000..963822b Binary files /dev/null and "b/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.assets/image-20210801162254455.png" differ diff --git "a/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.assets/image-20210801163047155.png" "b/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.assets/image-20210801163047155.png" new file mode 100644 index 0000000..c31d9da Binary files /dev/null and "b/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.assets/image-20210801163047155.png" differ diff --git "a/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.assets/image-20210801163102430.png" "b/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.assets/image-20210801163102430.png" new file mode 100644 index 0000000..c0acfd2 Binary files /dev/null and "b/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.assets/image-20210801163102430.png" differ diff --git "a/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.assets/\345\233\276\347\211\207_55.Png" "b/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.assets/\345\233\276\347\211\207_55.Png" new file mode 100644 index 0000000..3e27bf0 Binary files /dev/null and "b/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.assets/\345\233\276\347\211\207_55.Png" differ diff --git "a/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.md" "b/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.md" new file mode 100644 index 0000000..e021b4c --- /dev/null +++ "b/JavaScript\351\253\230\347\272\247\347\250\213\345\272\217\350\256\276\350\256\241\347\254\254\345\233\233\347\211\210-\347\254\224\350\256\260.md" @@ -0,0 +1,13922 @@ +# **目录概要** + +> 第 1 章,介绍 JavaScript 的起源:从哪里来,如何发展,以及现今的状况。这一章会谈到 JavaScript与 ECMAScript 的关系、 DOM、 BOM,以及 Ecma 和 W3C 相关的标准。 +> +> 第 2 章,了解 JavaScript 如何与 HTML 结合来创建动态网页,主要介绍在网页中嵌入 JavaScript 的不同方式,还有 JavaScript 的内容类型及其与` + + + + + + + ``` + +2. 现代 Web 应用程序通常将所有 JavaScript 引用放在``元素中的页面内容后面: + + - 页面会在处理 JavaScript 代码之前完全渲染页面。 + + ```html + + + + Example HTML Page + + + + + + + + ``` + +### 2.1.2 推迟执行脚本 + +```html + + + +Example HTML Page + + + + + + + +``` + +- 虽然这个例子中的` + + + + + + +``` + +- async 属性的目的是告诉浏览器, 不必等脚本下载和执行完后再加载页面,同样也不必等到该异步脚本下载和执行后再加载其他脚本。正因为如此,异步脚本不应该在加载期间修改DOM。 +- 异步脚本保证会在页面的 load 事件前执行,但可能会在 DOMContentLoaded(参见第 17 章)之前或之后。 + +### 2.1.4 动态加载脚本 + +```javascript +let script = document.createElement('script'); +script.src = 'gibberish.js'; +document.head.appendChild(script); +``` + +- 默认情况下,以这种方式创建的` + ``` + + - 在兼容 XHTML 的浏览器中,这样能解决问题。但在不支持 CDATA 块的**非 XHTML 兼容浏览器**中则不行。为此, CDATA 标记必须使用 JavaScript 注释来抵消: + + ```XML + + ``` + +### 2.1.6 废弃的语法 + +- type 属性使用一个 MIME 类型字符串来标识` + + + + + + +``` + +- 这个例子是在脚本不可用时让浏览器显示一段话。如果浏览器支持脚本,则用户永远不会看到它。 + +## 2.5 小结 20 + +- 要包含外部 JavaScript 文件,必须将 src 属性设置为要包含文件的 URL。文件可以跟网页在同一台服务器上,也可以位于完全不同的域。 +- 所有` + + + + //使用 try/catch 语句或 typeof 操作符也不能解决,因为条件块中 let 声明的作用域仅限于该块。 + + + + ``` + +4. **for 循环中的 let 声明** + + 1. 在 let 出现之前, for 循环定义的迭代变量会渗透到循环体外部: + + ```javascript + for (var i = 0; i < 5; ++i) { + // 循环逻辑 + } + console.log(i); // 5 + + // 改成使用 let 之后,这个问题就消失了,因为迭代变量的作用域仅限于 for 循环块内部: + for (let i = 0; i < 5; ++i) { + // 循环逻辑 + } + console.log(i); // ReferenceError: i 没有定义 + ``` + + 2. 在使用 var 的时候,最常见的问题就是对**迭代变量**的奇特声明和修改: + + ```javascript + for (var i = 0; i < 5; ++i) { + setTimeout(() => console.log(i), 0) + } + // 你可能以为会输出 0、 1、 2、 3、 4 + // 实际上会输出 5、 5、 5、 5、 5 + // 退出循环时,迭代变量保存的是导致循环退出的值 + + // 使用 let 声明迭代变量时, JavaScript 引擎在后台会为每个迭代循环声明一个新的迭代变量。 + for (let i = 0; i < 5; ++i) { + setTimeout(() => console.log(i), 0) + } + // 会输出 0、 1、 2、 3、 4 + ``` + + - 每次迭代声明一个独立变量实例的行为适用于所有风格的 for 循环,包括 for-in 和 for-of 循环。 + +### 3.3.3 const 声明 + +- const 的行为与 let 基本相同,唯一一个重要的区别是用它声明变量时必须同时初始化变量,且尝试修改 const 声明的变量会导致运行时错误。 + + - const 声明的限制**只适用于它指向的变量的引用**。换句话说,如果 const 变量引用的是一个对象,那么修改这个对象内部的属性并不违反 const 的限制。 + + ```javascript + const person = {}; + person.name = 'Matt'; // ok + ``` + + - const 声明一个不会被修改的 for 循环变量 + + ```javascript + let i = 0; + for (const j = 7; i < 5; ++i) { + console.log(j); + } + // 7, 7, 7, 7, 7 + for (const key in {a: 1, b: 2}) { + console.log(key); + } + // a, b + for (const value of [1,2,3,4,5]) { + console.log(value); + } + // 1, 2, 3, 4, 5 + ``` + +### 3.3.4 声明风格及最佳实践 + +1. 不使用 var +2. const 优先, let 次之 + +## 3.4 数据类型 30 + +- ECMAScript 有 **6 种简单数据类型**(也称为原始类型): + - Undefined、 Null、 Boolean、 Number、String 和 Symbol。 + - 还有**一种复杂数据类型**叫 Object(对象)。 + - Object 是一种**无序名值对的集合**。 + +### 3.4.1 typeof 操作符 + +- 确定任意变量的数据类型。 + + - 对一个值使用 typeof 操作符会返回下列字符串之一: + + - "undefined"表示值未定义; + - "boolean"表示值为布尔值; + - "string"表示值为字符串; + - "number"表示值为数值; + - "object"表示值为对象(而不是函数)或 null; + - "function"表示值为函数; + - "symbol"表示值为符号。 + + - 下面是使用 typeof 操作符的例子: + + ```javascript + let message = "some string"; + console.log(typeof message); // "string" + console.log(typeof(message)); // "string" + console.log(typeof 95); // "number" + ``` + + - 注意,因为 typeof 是一个**操作符而不是函数**,所以**不需要参数**(但可以使用参数)。 + +### 3.4.2 Undefined 类型 + +- Undefined 类型只有一个值,就是特殊值 undefined。 + + - 当使用 var 或 let 声明了变量但没有初始化时,就相当于给变量赋予了 undefined 值。 + + ```javascript + let message; + console.log(message == undefined); // true + ``` + + - 在对**未初始化的变量**调用 typeof 时,返回的结果是"undefined",但对**未声明的变量**调用它时,返回的结果还是"undefined",这就有点让人看不懂了。比如下面的例子: + + ```javascript + let message; // 这个变量被声明了,只是值为 undefined + // 确保没有声明过这个变量 + // let age + console.log(typeof message); // "undefined" + console.log(typeof age); // "undefined" + ``` + + - 建议在声明变量的同时进行初始化,用来区分两种情况。 + +### 3.4.3 Null 类型 + +- Null 类型同样只有一个值,即特殊值 null。 + + - null 值表示一个**空对象指针**,这也是给typeof 传一个 null 会返回"object"的原因: + + ```javascript + let car = null; + console.log(typeof car); // "object" + ``` + + - 在定义将来要保存对象值的变量时,**建议使用 null 来初始化**。只要检查这个变量的值是不是 null 就可以知道这个变量是否在后来被重新赋予了一个对象的引用,比如: + + - 用 null 来填充该变量 ,这样就可以保持 null 是空对象指针的语义,并进一步将其与 undefined 区分开来。 + + ```javascript + if (car != null) { + // car 是一个对象的引用 + } + ``` + + - undefined 值是由 null 值派生而来的,因此 ECMA-262 将它们定义为表面上相等 + + ```javascript + console.log(null == undefined); // true + ``` + +### 3.4.4 Boolean 类型 + +- Boolean(布尔值)类型是 ECMAScript 中使用最频繁的类型之一,有两个字面值: true 和 false。 + + - 这两个布尔值不同于数值,因此 **true 不等于 1, false 不等于 0。** + + - 下面是给变量赋布尔值的例子: + + ```javascript + let found = true; + let lost = false; + ``` + +- 将一个其他类型的值转换为布尔值,可以调用特定的 `Boolean()` 转型函数: + + ```javascript + let message = "Hello world!"; + let messageAsBoolean = Boolean(message); + ``` + +- 下表总结了不同类型与布尔值之间的转换规则。 + + | 数据类型 | 转换为 true 的值 | 转换为 false 的值 | + | :-------: | :--------------------: | :---------------------------: | + | Boolean | true | false | + | String | 非空字符串 | `""`(空字符串) | + | Number | 非零数值(包括无穷值) | 0、 NaN(参见后面的相关内容) | + | Object | 任意对象 | null | + | Undefined | N/A(不存在) | undefined | + + - if 等流控制语句会**自动执行其他类型值到布尔值的转换**,例如: + + ```javascript + let message = "Hello world!"; + if (message) { + console.log("Value is true"); + } + ``` + +### 3.4.5 Number 类型 + +- Number 类型使用 IEEE 754 格式表示**整数和浮点值**(在某些语言中也叫双精度值)。 不同的数值类型相应地也有不同的数值字面量格式。 + + - **十进制**整数 :`let intNum = 55; // 整数 ` + + - **八进制**(以 8 为基数),第一个数字必须是零 ,后面数值 0~7 + + ```javascript + let octalNum1 = 070; // 八进制的 56 + let octalNum2 = 079; // 无效的八进制值,当成 79 处理 + let octalNum3 = 08; // 无效的八进制值,当成 8 处理 + ``` + + - 八进制字面量在严格模式下是无效的,会导致 JavaScript 引擎抛出语法错误。 + + - **十六进制**(以 16 为基数),数值前缀 0x(区分大小写),然后是十六进制数字( 0~9 以 + 及 A~F)。 + + ```javascript + let hexNum1 = 0xA; // 十六进制 10 + let hexNum2 = 0x1f; // 十六进制 31 + ``` + +1. **浮点值** + + - 定义浮点值,数值中必须包含小数点,而且小数点后面必须至少有一个数字。 + + ```javascript + let floatNum1 = 1.1; + let floatNum2 = 0.1; + let floatNum3 = .1; // 有效,但不推荐 + ``` + + - 浮点值使用的内存空间是存储整数值的两倍。 + - 小数点后面没有数字的情况下,数值就会变成整数。 类似地, 数值本身就是整数,只是小数点后面**跟着 0(如 1.0),那它也会被转换为整数。** + + ```javascript + let floatNum1 = 1.; // 小数点后面没有数字,当成整数 1 处理 + let floatNum2 = 10.0; // 小数点后面是零,当成整数 10 处理 + ``` + + - 非常大或非常小的数值,浮点值可以用科学记数法来表示。 + + - 一个数值(整数或浮点数)后跟一个大写或小写的字母 e,再加上一个要乘的 10 的多少次幂。比如: + + ```javascript + let floatNum = 3.125e7; // 等于 31250000 + ``` + + - 浮点值的精确度最高可达 17 位小数,但在算术计算中远不如整数精确。 + + - 例如, 0.1 加 0.2 得到的不是 0.3,而是 0.300 000 000 000 000 04。由于这种微小的舍入错误,导致很难测试特定的浮点值。比如下面的例子: + + ```javascript + if (a + b == 0.3) { // 别这么干! + console.log("You got 0.3."); + } + ``` + + - **永远不要测试某个特定的浮点值。** + +2. **值的范围** + + - ECMAScript 可以表示的最小数值保存在 `Number.MIN_VALUE` 中,这个值在多数浏览器中是 `5e-324`;可以表示的最大数值保存在`Number.MAX_VALUE` 中,这个值在多数浏览器中是 `1.797 693 134 862 315 7e+308`。 + + - 如果某个计算得到的数值结果超出了 JavaScript 可以表示的范围,那么这个数值会被自动转换为一个特殊的 Infinity(无穷)值。任何无法表示的负数以 **-Infinity(负无穷大)**表示,任何无法表示的正数以 **Infinity(正无穷大)**表示 。 + + - 要确定一个值是不是有限大(即介于 JavaScript 能表示的最小值和最大值之间),可以使用 `isFinite()` 函数,如下所示: + + ```javascript + let result = Number.MAX_VALUE + Number.MAX_VALUE; + console.log(isFinite(result)); // false + ``` + +3. **NaN** + + - **“不是数值”( Not a Number)**,用于表示本来要返回数值的操作失败了(而不是抛出错误)。 + + - 比如,用 0 除任意数值在其他语言中通常都会导致错误,从而中止代码执行。但在 ECMAScript 中, 0、 +0 或-0 相除会返回 NaN: + + ```javascript + console.log(0/0); // NaN + console.log(-0/+0); // NaN + + // 如果分子是非 0 值,分母是有符号 0 或无符号 0,则会返回 Infinity 或-Infinity: + console.log(5/0); // Infinity + console.log(5/-0); // -Infinity + ``` + + - **NaN 的属性:** + + - 任何涉及 NaN 的操作始终返回 NaN(如 NaN/10), + - **NaN 不等于包括 NaN 在内的任何值。** + - `console.log(NaN == NaN); // false ` + + - `isNaN()` 函数。 + + - 任何不能转换为数值的值都会导致这个函数返回 true。举例如下: + + ```javascript + console.log(isNaN(NaN)); // true + console.log(isNaN(10)); // false, 10 是数值 + console.log(isNaN("10")); // false,可以转换为数值 10 + console.log(isNaN("blue")); // true,不可以转换为数值 + console.log(isNaN(true)); // false,可以转换为数值 1 + ``` + +4. **数值转换** + + - 3 个函数可以将非数值转换为数值: `Number()`、 `parseInt()` 和 `parseFloat()`。 + + - **`Number()` 函数**基于如下规则执行转换: + + - 布尔值, true 转换为 1, false 转换为 0。 + - 数值,直接返回。 + - null,返回 0。 + - undefined,返回 NaN。 + - 字符串,应用以下规则: + - 如果字符串**包含数值字符**,包括数值字符前面带加、减号的情况,则转换为一个十进制数值。 + 因此, Number("1")返回 1, Number("123")返回 123, Number("011")返回 11(忽略前面 + 的零)。 + - 如果字符串**包含有效的浮点值**格式如"1.1",则会转换为相应的浮点值(同样,忽略前面的零)。 + - 如果字符串**包含有效的十六进制**格式如"0xf",则会转换为与该十六进制值**对应的十进制整** + **数值**。 + - 如果是空字符串(不包含字符),则返回 0。 + - 如果字符串包含除上述情况之外的其他字符,则返回 NaN。 + - 对象,调用 `valueOf()` 方法,并按照上述规则转换返回的值。如果转换结果是 NaN,则调用`toString()` 方法,再按照转换字符串的规则转换。 + + ```javascript + let num1 = Number("Hello world!"); // NaN + let num2 = Number(""); // 0 + let num3 = Number("000011"); // 11 + let num4 = Number(true); // 1 + ``` + + - 需要得到整数时可以优先使用 **`parseInt()` 函数**。 + + - 字符串最前面的空格会被忽略,从第一个非空格字符开始转换。如果第一个字符不是数值字符、加号或减号, **`parseInt()` 立即返回 NaN**。这意味着**空字符串也会返回 NaN**(这一点跟 `Number()` 不一样,它返回 0)。如果第一个字符是数值字符、加号或减号,则继续依次检测每个字符,直到字符串末尾,或碰到非数值字符。 + + ```javascript + let num1 = parseInt("1234blue"); // 1234 + let num2 = parseInt(""); // NaN + let num3 = parseInt("0xA"); // 10,解释为十六进制整数 + let num4 = parseInt(22.5); // 22 + let num5 = parseInt("70"); // 70,解释为十进制值 + let num6 = parseInt("0xf"); // 15,解释为十六进制整数 + ``` + + - 不同的数值格式很容易混淆,因此 `parseInt()` 也接收第二个参数,用于指定底数(进制数)。如果知道要解析的值是十六进制,那么可以传入 16 作为第二个参数,以便正确解析: + + - 为避免解析出错,建议始终传给它第二个参数。 + + ```javascript + let num = parseInt("0xAF", 16); // 175 + + // 事实上,如果提供了十六进制参数,那么字符串前面的"0x"可以省掉: + let num1 = parseInt("AF", 16); // 175 + let num2 = parseInt("AF"); // NaN + + // 通过第二个参数,可以极大扩展转换后获得的结果类型。比如: + let num1 = parseInt("10", 2); // 2,按二进制解析 + let num2 = parseInt("10", 8); // 8,按八进制解析 + let num3 = parseInt("10", 10); // 10,按十进制解析 + let num4 = parseInt("10", 16); // 16,按十六进制解析 + ``` + + - **`parseFloat()` 函数**的工作方式跟 `parseInt()` 函数类似,都是从位置 0 开始检测每个字符。同样,它也是解析到字符串末尾或者解析到一个无效的浮点数值字符为止。这意味着第一次出现的小数点是有效的,但第二次出现的小数点就无效了,此时字符串的剩余字符都会被忽略。 + + - `"22.34.5"将转换成 22.34 ` + - parseFloat() 函数的另一个不同之处在于,它始终忽略字符串开头的零。 + - 十六进制数值始终会返回 0。因为 parseFloat() **只解析十进制值**,因此不能指定底数。 + - 如果字符串表示整数(没有小数点或者小数点后面只有一个零),则 parseFloat() 返回整数。 + + ```javascript + let num1 = parseFloat("1234blue"); // 1234,按整数解析 + let num2 = parseFloat("0xA"); // 0 + let num3 = parseFloat("22.5"); // 22.5 + let num4 = parseFloat("22.34.5"); // 22.34 + let num5 = parseFloat("0908.5"); // 908.5 + let num6 = parseFloat("3.125e7"); // 31250000 + ``` + +### 3.4.6 String 类型 + +- **String(字符串)**数据类型表示零或多个 16 位 Unicode 字符序列。 + + - 字符串可以使用双引号( `"`)、单引号( `'`)或反引号( `)标示。 + - ECMAScript 语法中表示字符串的引号没有区别。 + - 以某种引号作为字符串开头,必须仍然以该种引号作为字符串结尾。 + + ```javascript + let firstName = "John"; + let lastName = 'Jacob'; + let lastName = `Jingleheimerschmidt` + ``` + +1. **字符字面量** + + - 字符串数据类型包含一些字符字面量,用于表示非打印字符或有其他用途的字符,如下表所示: + + | 字 面 量 | 含 义 | + | -------- | ------------------------------------------------------------ | + | `\n` | 换行 | + | `\t` | 制表 | + | `\b` | 退格 | + | `\r` | 回车 | + | `\f` | 换页 | + | `\\` | 反斜杠 | + | `\'` | 单引号(`‘`),在字符串以单引号标示时使用,例如 `'He said, \'hey.\''` | + | `\"` | 双引号( `"`),在字符串以双引号标示时使用,例如 `"He said, \"hey.\""` | + | `` \` `` | 反引号( `` ` ``),在字符串以反引号标示时使用,例如 `` `He said, \`hey.\` ` `` | + | `\xnn` | 以十六进制编码 `nn` 表示的字符(其中 n 是十六进制数字 `0~F`),例如 `\x41` 等于"A" | + | `\unnnn` | 以十六进制编码 `nnnn` 表示的 Unicode 字符(其中 n 是十六进制数字 `0~F`),例如 `\u03a3` 等于希腊字符 "Σ" | + + - 这些字符字面量**可以出现在字符串中的任意位置**,且可以**作为单个字符被解释**: + + ```javascript + let text = "This is the letter sigma: \u03a3."; + + // 因为转义序列表示一个字符,所以只算一个字符 + console.log(text.length); // 28 + + // 如果字符串中包含双字节字符,那么 length 属性返回的值可能不是准确的字符数。 + ``` + +2. **字符串的特点** + + - ECMAScript 中的字符串是**不可变的( immutable)**,意思是一旦创建,它们的值就不能变了。 + + - 要修改某个变量中的字符串值,必须先销毁原始的字符串,然后将包含新值的另一个字符串保存到该变量 + + ```javascript + let lang = "Java"; + lang = lang + "Script"; + ``` + +3. **转换为字符串** + + - 有两种方式把一个值转换为字符串。 + + - 首先是使用几乎所有值都有的 **`toString()`** 方法。这个方法唯一的用途就是返回当前值的字符串等价物。 + + ```javascript + let age = 11; + let ageAsString = age.toString(); // 字符串"11" + let found = true; + let foundAsString = found.toString(); // 字符串"true" + ``` + + - toString() 方法可见于数值、布尔值、对象和字符串值。(没错,字符串值也有 toString()方法,该方法只是简单地返回自身的一个副本。) null 和 undefined 值没有 toString()方法。 + + - 在对数值调用这个方法时, **toString()可以接收一个底数参数**,即以什么底数来输出数值的字符串表示。 + + ```javascript + let num = 10; + console.log(num.toString()); // "10" + console.log(num.toString(2)); // "1010" + console.log(num.toString(8)); // "12" + console.log(num.toString(10)); // "10" + console.log(num.toString(16)); // "a" + ``` + + - 如果你不确定一个值是不是 null 或 undefined,可以使用 **`String()` 转型函数**,它始终会返回表示相应类型值的字符串。 `String()` 函数遵循如下规则。 + + - 如果值有 toString() 方法,则调用该方法(不传参数)并返回结果。 + - 如果值是 null,返回 "null"。 + - 如果值是 undefined,返回 "undefined"。 + + ```javascript + let value1 = 10; + let value2 = true; + let value3 = null; + let value4; + console.log(String(value1)); // "10" + console.log(String(value2)); // "true" + console.log(String(value3)); // "null" + console.log(String(value4)); // "undefined" + ``` + +4. **模板字面量** + + - ECMAScript 6 新增了使用模板字面量定义字符串的能力。与使用单引号或双引号不同,模板字面量保留换行字符,可以跨行定义字符串: + + ```javascript + let myMultiLineString = 'first line\nsecond line'; + let myMultiLineTemplateLiteral = `first line + second line`; + + console.log(myMultiLineString); + // first line + // second line" + + console.log(myMultiLineTemplateLiteral); + // first line + // second line + + console.log(myMultiLineString === myMultiLinetemplateLiteral); // true + ``` + + - 顾名思义,模板字面量在定义模板时特别有用,比如下面这个 HTML 模板: + + ```javascript + let pageHTML = ` + `; + ``` + + - 由于模板字面量会**保持反引号内部的空格**,因此在使用时要格外注意。格式正确的模板字符串看起来可能会缩进不当: + + ```javascript + // 这个模板字面量在换行符之后有 25 个空格符 + let myTemplateLiteral = `first line + second line`; + console.log(myTemplateLiteral.length); // 47 + + // 这个模板字面量以一个换行符开头 + let secondTemplateLiteral = ` + first line + second line`; + console.log(secondTemplateLiteral[0] === '\n'); // true + + // 这个模板字面量没有意料之外的字符 + let thirdTemplateLiteral = `first line + second line`; + console.log(thirdTemplateLiteral); + // first line + // second line + ``` + +5. **字符串插值** + + - 模板字面量最常用的一个特性是支持字符串插值,也就是可以在一个连续定义中插入一个或多个值。 + + ```javascript + // 字符串插值通过在${}中使用一个 JavaScript 表达式实现: + let value = 5; + let exponent = 'second'; + + // 以前,字符串插值是这样实现的: + let interpolatedString = + value + ' to the ' + exponent + ' power is ' + (value * value); + + // 现在,可以用模板字面量这样实现: + let interpolatedTemplateLiteral = + `${ value } to the ${ exponent } power is ${ value * value }`; + + console.log(interpolatedString); // 5 to the second power is 25 + console.log(interpolatedTemplateLiteral); // 5 to the second power is 25 + ``` + + - **所有插入的值都会使用 toString() 强制转型为字符串,而且任何 JavaScript 表达式都可以用于插值。**嵌套的模板字符串无须转义: + + ```javascript + console.log(`Hello, ${ `World` }!`); // Hello, World! + + // 将表达式转换为字符串时会调用 toString(): + let foo = { toString: () => 'World' }; + console.log(`Hello, ${ foo }!`); // Hello, World! + + // 在插值表达式中可以调用函数和方法: + function capitalize(word) { + return `${ word[0].toUpperCase() }${ word.slice(1) }`; + } + console.log(`${ capitalize('hello') }, ${ capitalize('world') }!`); // Hello, World! + + // 此外,模板也可以插入自己之前的值: + let value = ''; + function append() { + value = `${value}abc` + console.log(value); + } + append(); // abc + append(); // abcabc + append(); // abcabcabc + ``` + +6. **模板字面量标签函数** + + - 模板字面量也支持定义**标签函数( tag function)**,而通过标签函数可以**自定义插值**行为。标签函数会接收被插值记号分隔后的模板和对每个表达式求值的结果。 + + ```javascript + let a = 6; + let b = 9; + + function simpleTag(strings, aValExpression, bValExpression, sumExpression) { + console.log(strings); + console.log(aValExpression); + console.log(bValExpression); + console.log(sumExpression); + return 'foobar'; + } + + let untaggedResult = `${ a } + ${ b } = ${ a + b }`; + let taggedResult = simpleTag`${ a } + ${ b } = ${ a + b }`; + // ["", " + ", " = ", ""] + // 6 + // 9 + // 15 + + console.log(untaggedResult); // "6 + 9 = 15" + console.log(taggedResult); // "foobar" + ``` + + - 因为表达式参数的数量是可变的,所以通常应该使用**剩余操作符( rest operator)**将它们收集到一个数组中:`function zipTag(strings, ...expressions)` + + - 对于有 n 个插值的模板字面量,传给标签函数的表达式参数的个数始终是 n,而传给标签函数的第一个参数所包含的字符串个数则始终是 n+1。因此,如果你想把这些字符串和对表达式求值的结果拼接起来作为默认返回的字符串,可以这样做: + + ```javascript + let a = 6; + let b = 9; + + function zipTag(strings, ...expressions) { + return strings[0] + + expressions.map((e, i) => `${e}${strings[i + 1]}`).join(''); + } + + let untaggedResult = `${ a } + ${ b } = ${ a + b }`; + let taggedResult = zipTag`${ a } + ${ b } = ${ a + b }`; + + console.log(untaggedResult); // "6 + 9 = 15" + console.log(taggedResult); // "6 + 9 = 15" + + // 等价于 + let a = 6; + let b = 9; + + function zipTag(strings, ...expressions) { + let c = expressions.map((e, i) => { + return `${e}${strings[i + 1]}`; + }); + //"" a + b = 15 "" + return strings[0] + c.join(''); + } + + let untaggedResult = `${ a } + ${ b } = ${ a + b }`; + let taggedResult = zipTag `${ a } + ${ b } = ${ a + b }`; + + console.log(untaggedResult); // "6 + 9 = 15" + console.log(taggedResult); // "6 + 9 = 15" + ``` + +7. **原始字符串** + + - 使用模板字面量也可以直接获取原始的模板字面量内容(如换行符或 Unicode 字符),而不是被转换后的字符表示。为此,可以使用默认的 **String.raw 标签函数**: + + - 实际的换行符不行。 + + ```javascript + // Unicode 示例 + // \u00A9 是版权符号 + console.log(`\u00A9`); // © + console.log(String.raw `\u00A9`); // \u00A9 + + // 换行符示例 + console.log(`first line\nsecond line`); + // first line + // second line + + console.log(String.raw `first line\nsecond line`); // "first line\nsecond line" + + // 对实际的换行符来说是不行的 + // 它们不会被转换成转义序列的形式 + console.log(`first line + second line`); + // first line + // second line + + console.log(String.raw `first line + second line`); + // first line + // second line + + + // 另外,也可以通过标签函数的第一个参数,即字符串数组的.raw 属性取得每个字符串的原始内容: + function printRaw(strings) { + console.log('Actual characters:'); + for (const string of strings) { + console.log(string); + } + console.log('Escaped characters;'); + for (const rawString of strings.raw) { + console.log(rawString); + } + } + printRaw `\u00A9${ 'and' }\n`; + // Actual characters: + // © + //(换行符) + // Escaped characters: + // \u00A9 + // \n + ``` + +### 3.4.7 Symbol 类型 + +- Symbol(符号)是 ECMAScript 6 新增的数据类型。符号是原始值,且符号实例是**唯一、不可变的**。符号的用途是**确保对象属性使用唯一标识符**,不会发生属性冲突的危险。 + - **符号就是用来创建唯一记号,进而用作非字符串形式的对象属性。** + +1. **符号的基本用法** + + 1. 符号需要使用 `Symbol()` 函数初始化。因为符号本身是原始类型,所以 `typeof` 操作符对符号返回 `symbol`。 + + ```javascript + let sym = Symbol(); + console.log(typeof sym); // symbol + ``` + + 2. 调用 `Symbol()` 函数时,也可以传入一个字符串参数作为对符号的描述( `description`),将来可以通过这个字符串来调试代码。但是,这个字符串参数与符号定义或标识完全无关: + + ```javascript + let genericSymbol = Symbol(); + let otherGenericSymbol = Symbol(); + let fooSymbol = Symbol('foo'); + let otherFooSymbol = Symbol('foo'); + console.log(genericSymbol == otherGenericSymbol); // false + console.log(fooSymbol == otherFooSymbol); // false + ``` + + 3. 符号没有字面量语法,这也是它们发挥作用的关键。按照规范,你只要创建 Symbol() 实例并将其用作对象的新属性,就可以保证它不会覆盖已有的对象属性,无论是符号属性还是字符串属性。 + + ```javascript + let genericSymbol = Symbol(); + console.log(genericSymbol); // Symbol() + let fooSymbol = Symbol('foo'); + console.log(fooSymbol); // Symbol(foo); + ``` + + 4. 最重要的是, **Symbol() 函数不能与 new 关键字一起作为构造函数使用**。这样做是为了避免创建符号包装对象,像使用 Boolean、 String 或 Number 那样,它们都支持构造函数且可用于初始化包含原始值的包装对象: + + ```javascript + let myBoolean = new Boolean(); + console.log(typeof myBoolean); // "object" + let myString = new String(); + console.log(typeof myString); // "object" + let myNumber = new Number(); + console.log(typeof myNumber); // "object" + let mySymbol = new Symbol(); // TypeError: Symbol is not a constructor + + // 如果你确实想使用符号包装对象,可以借用 Object()函数: + let mySymbol = Symbol(); + let myWrappedSymbol = Object(mySymbol); + console.log(typeof myWrappedSymbol); // "object" + ``` + +2. **使用全局符号注册表** + + 1. 如果运行时的不同部分需要共享和重用符号实例,那么可以用一个字符串作为键,在全局符号注册表中创建并重用符号。 + + - 需要使用 `Symbol.for()` 方法: + + ```javascript + let fooGlobalSymbol = Symbol.for('foo'); + console.log(typeof fooGlobalSymbol); // symbol + ``` + + 2. `Symbol.for()` 对每个字符串键都执行幂等操作。第一次使用某个字符串调用时,它会检查全局运行时注册表,发现不存在对应的符号,于是就会生成一个新符号实例并添加到注册表中。后续使用相同字符串的调用同样会检查注册表,发现存在与该字符串对应的符号,然后就会返回该符号实例。 + + ```javascript + let fooGlobalSymbol = Symbol.for('foo'); // 创建新符号 + let otherFooGlobalSymbol = Symbol.for('foo'); // 重用已有符号 + + console.log(fooGlobalSymbol === otherFooGlobalSymbol); // true + ``` + + 3. 即使采用相同的符号描述,在**全局注册表**中定义的符号跟使用 `Symbol()` 定义的符号也并不等同: + + ```javascript + let localSymbol = Symbol('foo'); + let globalSymbol = Symbol.for('foo'); + + console.log(localSymbol === globalSymbol); // false + ``` + + 4. **全局注册表中的符号必须使用字符串键**来创建,因此作为参数传给 `Symbol.for()`的任何值都会被转换为字符串。此外,注册表中使用的键同时也会被用作符号描述。 + + ```javascript + let emptyGlobalSymbol = Symbol.for(); + console.log(emptyGlobalSymbol); // Symbol(undefined) + ``` + + 5. 还可以使用 **`Symbol.keyFor()`来查询全局注册表**,这个方法接收符号,返回该全局符号对应的字符串键。如果查询的不是全局符号,则返回 undefined。 + + ```javascript + // 创建全局符号 + let s = Symbol.for('foo'); + console.log(Symbol.keyFor(s)); // foo + + // 创建普通符号 + let s2 = Symbol('bar'); + console.log(Symbol.keyFor(s2)); // undefined + + // 如果传给 Symbol.keyFor()的不是符号,则该方法抛出 TypeError: + Symbol.keyFor(123); // TypeError: 123 is not a symbol + ``` + +3. **使用符号作为属性** + + 1. 凡是可以使用字符串或数值作为属性的地方,都可以使用符号。这就包括了对象字面量属性和`Object.defineProperty()/Object.defineProperties()`定义的属性。对象字面量只能在计算属性语法中使用符号作为属性。 + + ```javascript + let s1 = Symbol('foo'), + s2 = Symbol('bar'), + s3 = Symbol('baz'), + s4 = Symbol('qux'); + let o = { + [s1]: 'foo val' + }; + // 这样也可以: o[s1] = 'foo val'; + console.log(o); + // {Symbol(foo): foo val} + Object.defineProperty(o, s2, { + value: 'bar val' + }); + console.log(o); + // {Symbol(foo): foo val, Symbol(bar): bar val} + Object.defineProperties(o, { + [s3]: { + value: 'baz val' + }, + [s4]: { + value: 'qux val' + } + }); + console.log(o); + // {Symbol(foo): foo val, Symbol(bar): bar val, + // Symbol(baz): baz val, Symbol(qux): qux val} + ``` + + 2. 类似于 `Object.getOwnPropertyNames()`返回对象实例的常规属性数组, `Object.getOwnPropertySymbols()`返回对象实例的符号属性数组。这两个方法的返回值彼此互斥。 `Object.getOwnPropertyDescriptors()`会返回同时包含常规和符号属性描述符的对象。 `Reflect.ownKeys()`会返回两种类型的键: + + ```javascript + let s1 = Symbol('foo'), + s2 = Symbol('bar'); + let o = { + [s1]: 'foo val', + [s2]: 'bar val', + baz: 'baz val', + qux: 'qux val' + }; + console.log(Object.getOwnPropertySymbols(o)); + // [Symbol(foo), Symbol(bar)] + console.log(Object.getOwnPropertyNames(o)); + // ["baz", "qux"] + console.log(Object.getOwnPropertyDescriptors(o)); + // {baz: {...}, qux: {...}, Symbol(foo): {...}, Symbol(bar): {...}} + console.log(Reflect.ownKeys(o)); + // ["baz", "qux", Symbol(foo), Symbol(bar)] + ``` + + 3. 因为符号属性是对内存中符号的一个引用,所以直接创建并用作属性的符号不会丢失。但是,如果没有显式地保存对这些属性的引用,那么必须遍历对象的所有符号属性才能找到相应的属性键: + + ```javascript + let o = { + [Symbol('foo')]: 'foo val', + [Symbol('bar')]: 'bar val' + }; + console.log(o); + // {Symbol(foo): "foo val", Symbol(bar): "bar val"} + let barSymbol = Object.getOwnPropertySymbols(o) + .find((symbol) => symbol.toString().match(/bar/)); + console.log(barSymbol); + // Symbol(bar) + ``` + + + +4. **常用内置符号** + + 1. 常用内置符号( **well-known symbol**),用于暴露语言内部行为,开发者可以直接访问、重写或模拟这些行为。这些内置符号都以 Symbol 工厂函数字符串属性的形式存在。 + 2. 这些内置符号最重要的用途之一是重新定义它们,从而改变原生结构的行为。比如,我们知道 for-of 循环会在相关对象上使用 Symbol.iterator 属性,那么就可以通过在自定义对象上重新定义 Symbol.iterator 的值,来改变 for-of 在迭代该对象时的行为。 + 3. 这些内置符号也没有什么特别之处,它们就是全局函数 Symbol 的普通字符串属性,指向一个符号的实例。所有内置符号属性都是不可写、不可枚举、不可配置的。 + 4. @@iterator 指的就是 Symbol.iterator + +5. **`Symbol.asyncIterator`** + + 1. 这个符号作为一个属性表示“一个方法, 该方法返回对象默认的 AsyncIterator。由 for-await-of 语句使用”。换句话说,这个符号表示实现异步迭代器 API 的函数。 + +6. **`Symbol.hasInstance`** + + 1. 这个符号作为一个属性表示“一个方法,该方法决定一个构造器对象是否认可一个对象是它的实例。由 instanceof 操作符使用”。 instanceof 操作符可以用来确定一个对象实例的原型链上是否有原型。 + +7. **`Symbol.isConcatSpreadable`** + + 1. 这个符号作为一个属性表示“一个布尔值,如果是 true,则意味着对象应该用 `Array.prototype.concat()`打平其数组元素”。 ES6 中的 `Array.prototype.concat()`方法会根据接收到的对象类型选择如何将一个类数组对象拼接成数组实例。覆盖 `Symbol.isConcatSpreadable` 的值可以修改这个行为。 + +8. **`Symbol.iterator `** + + 1. 这个符号作为一个属性表示“一个方法,该方法返回对象默认的迭代器。由 for-of 语句使用”。换句话说,这个符号表示实现迭代器 API 的函数。 + +9. **`Symbol.match `** + + 1. 这个符号作为一个属性表示“一个正则表达式方法,该方法用正则表达式去匹配字符串。由 `String.prototype.match()`方法使用”。 `String.prototype.match()`方法会使用以 `Symbol.match` 为键的函数来对正则表达式求值。 + + 2. 正则表达式的原型上默认有这个函数的定义,因此所有正则表达式实例默认是这个 String 方法的有效参数 + + ```javascript + console.log(RegExp.prototype[Symbol.match]); + // ƒ [Symbol.match]() { [native code] } + console.log('foobar'.match(/bar/)); + // ["bar", index: 3, input: "foobar", groups: undefined] + ``` + +10. **`Symbol.replace `** + + 1. 这个符号作为一个属性表示“一个正则表达式方法,该方法替换一个字符串中匹配的子串。由 String.prototype.replace()方法使用”。 String.prototype.replace() 方法会使用以 Symbol.replace 为键的函数来对正则表达式求值。 + +11. **`Symbol.search `** + + 1. 这个符号作为一个属性表示“一个正则表达式方法,该方法返回字符串中匹配正则表达式的索引。由 String.prototype.search()方法使用”。String.prototype.search()方法会使用以 Symbol.search 为键的函数来对正则表达式求值。 + +12. **`Symbol.species `** + + 1. 这个符号作为一个属性表示“一个函数值,该函数作为创建派生对象的构造函数”。这个属性在内置类型中最常用,用于对内置类型实例方法的返回值暴露实例化派生对象的方法。用 Symbol.species 定义静态的获取器( getter)方法,可以覆盖新创建实例的原型定义: + + ```javascript + class Bar extends Array {} + class Baz extends Array { + static get[Symbol.species]() { + return Array; + } + } + let bar = new Bar(); + console.log(bar instanceof Array); // true + console.log(bar instanceof Bar); // true + bar = bar.concat('bar'); + console.log(bar instanceof Array); // true + console.log(bar instanceof Bar); // true + let baz = new Baz(); + console.log(baz instanceof Array); // true + console.log(baz instanceof Baz); // true + baz = baz.concat('baz'); + console.log(baz instanceof Array); // true + console.log(baz instanceof Baz); // false + ``` + +13. **`Symbol.split `** + + 1. 这个符号作为一个属性表示“一个正则表达式方法,该方法在匹配正则表达式的索引位置拆分字符串。由 String.prototype.split()方法使用” 。 String.prototype.split()方法会使用以 Symbol.split 为键的函数来对正则表达式求值。 + +14. **`Symbol.toPrimitive `** + + 1. 这个符号作为一个属性表示“一个方法,该方法将对象转换为相应的原始值。由 ToPrimitive 抽象操作使用”。很多内置操作都会尝试强制将对象转换为原始值,包括字符串、数值和未指定的原始类型。对于一个自定义对象实例,通过在这个实例的Symbol.toPrimitive 属性上定义一个函数可以改变默认行为。 + +15. **`Symbol.toStringTag `** + + 1. 这个符号作为一个属性表示“一个字符串,该字符串用于创建对象的默认字符串描述。由内置方法 Object.prototype.toString()使用”。 + +16. **`Symbol.unscopables `** + + 1. 这个符号作为一个属性表示“一个对象,该对象所有的以及继承的属性,都会从关联对象的 with 环境绑定中排除”。设置这个符号并让其映射对应属性的键值为 true,就可以阻止该属性出现在 with 环境绑定中,如下例所示: + 2. 注意 不推荐使用 with,因此也不推荐使用 Symbol.unscopables。 + + + +### 3.4.8 Object 类型 + +1. Object 的实例本身并不是很有用,但理解与它相关的概念非常重要。类似 Java 中的java.lang.Object, ECMAScript 中的 Object 也是派生其他对象的基类。 Object 类型的所有属性和方法在派生的对象上同样存在。 +2. 每个 Object 实例都有如下属性和方法。 + 1. **constructor**:用于创建当前对象的函数。在前面的例子中,这个属性的值就是 Object() + 函数。 + 2. **hasOwnProperty(propertyName)**:用于判断当前对象实例(不是原型)上是否存在给定的属性。要检查的属性名必须是字符串(如 o.hasOwnProperty("name"))或符号。 + 3. **isPrototypeOf(object)**:用于判断当前对象是否为另一个对象的原型。(第 8 章将详细介绍原型。) + 4. **propertyIsEnumerable(propertyName)**:用于判断给定的属性是否可以使用(本章稍后讨论的) for-in 语句枚举。与 **hasOwnProperty()**一样,属性名必须是字符串。 + 5. **toLocaleString()**:返回对象的字符串表示,该字符串反映对象所在的本地化执行环境。 + 6. **toString()**:返回对象的字符串表示。 + 7. **valueOf()**:返回对象对应的字符串、数值或布尔值表示。通常与 toString()的返回值相同。 +3. 因为在 ECMAScript 中 Object 是所有对象的基类,所以任何对象都有这些属性和方法。第 8 章将介绍对象间的继承机制。 +4. 注意:严格来讲, ECMA-262 中对象的行为不一定适合 JavaScript 中的其他对象。比如浏览器环境中的 BOM 和 DOM 对象,都是由宿主环境定义和提供的宿主对象。而宿主对象不受 ECMA-262 约束,所以它们可能会也可能不会继承 Object。 + + + +## 3.5 操作符 56 + +### 3.5.1 一元操作符 + +只操作一个值的操作符叫一元操作符( **unary operator**)。一元操作符是 ECMAScript 中最简单的操作符。 + +1. 递增/递减操作符 + + - 递增和递减操作符直接照搬自 C 语言 + + - 这 4 个操作符**可以作用于任何值**,意思是不限于整数——字符串、布尔值、浮点值,甚至对象都可以。递增和递减操作符遵循如下规则。 + + 1. 对于字符串,如果是有效的数值形式,则转换为数值再应用改变。变量类型从字符串变成数值。 + 2. 对于字符串,如果不是有效的数值形式,则将变量的值设置为 NaN 。变量类型从字符串变成数值。 + 3. 对于布尔值,如果是 false,则转换为 0 再应用改变。变量类型从布尔值变成数值。 + 4. 对于布尔值,如果是 true,则转换为 1 再应用改变。变量类型从布尔值变成数值。 + 5. 对于浮点值,加 1 或减 1。 + 6. 如果是对象,则调用其(第 5 章会详细介绍的) valueOf()方法取得可以操作的值。对得到的值应用上述规则。如果是 NaN,则调用 toString()并再次应用其他规则。变量类型从对象变成数值。 + + ```javascript + let s1 = "2"; + let s2 = "z"; + let b = false; + let f = 1.1; + let o = { + valueOf() { + return -1; + } + }; + s1++; // 值变成数值 3 + s2++; // 值变成 NaN + b++; // 值变成数值 1 + f--; // 值变成 0.10000000000000009(因为浮点数不精确) + o--; // 值变成-2 + ``` + +2. 一元加和减 + + 1. 如果将一元加应用到非数值,则会执行与使用 Number()转型函数一样的类型转换:布尔值 false和 true 转换为 0 和 1,字符串根据特殊规则进行解析,对象会调用它们的 valueOf() 和/或 toString() 方法以得到可以转换的值。 + + 下面的例子演示了一元加在应用到不同数据类型时的行为: + + ```javascript + let s1 = "01"; + let s2 = "1.1"; + let s3 = "z"; + let b = false; + let f = 1.1; + let o = { + valueOf() { + return -1; + } + }; + s1 = +s1; // 值变成数值 1 + s2 = +s2; // 值变成数值 1.1 + s3 = +s3; // 值变成 NaN + b = +b; // 值变成数值 0 + f = +f; // 不变,还是 1.1 + o = +o; // 值变成数值-1 + ``` + + + +### 3.5.2 位操作符 + +1. 按位非 + 1. 按位非操作符用波浪符( `~`)表示,它的作用是返回数值的一补数。按位非是ECMAScript 中为数不多的几个二进制数学操作符之一。 +2. 按位与 + 1. 按位与操作符用和号( `&`)表示,有两个操作数。本质上,按位与就是将两个数的每一个位对齐,然后基于真值表中的规则,对每一位执行相应的与操作。 +3. 按位或 + 1. 按位或操作符用管道符( `|`)表示,同样有两个操作数。 +4. 按位异或 + 1. 按位异或用脱字符( `^`)表示,同样有两个操作数。 +5. 左移 + 1. 左移操作符用两个小于号( `<<`)表示,会按照指定的位数将数值的所有位向左移动。 +6. 有符号右移 + 1. 有符号右移由两个大于号( `>>`)表示,会将数值的所有 32 位都向右移,同时保留符号(正或负)。有符号右移实际上是左移的逆运算。 +7. 无符号右移 + 1. 无符号右移用 3 个大于号表示( `>>>`),会将数值的所有 32 位都向右移。对于正数,无符号右移与有符号右移结果相同。 + +### 3.5.3 布尔操作符 + +布尔操作符一共有 3 个:逻辑非、逻辑与和逻辑或。 + +1. 逻辑非 + + 1. 逻辑非操作符由一个叹号( `!`)表示,可应用给 ECMAScript 中的任何值。这个操作符始终返回布尔值,无论应用到的是什么数据类型。逻辑非操作符首先将操作数转换为布尔值,然后再对其取反。 + + 2. 逻辑非操作符也可以用于把任意值转换为布尔值。同时使用两个叹号( `!!`),相当于调用了转型函数 `Boolean()`。无论操作数是什么类型,**第一个叹号总会返回布尔值**。**第二个叹号对该布尔值取反**,从而给出变量真正对应的布尔值。结果与对同一个值使用 `Boolean()`函数是一样的: + + ```javascript + console.log(!!"blue"); // true + console.log(!!0); // false + console.log(!!NaN); // false + console.log(!!""); // false + console.log(!!12345); // true + ``` + + + +2. 逻辑与 + + 1. 逻辑与操作符由两个和号( `&&`)表示 + 2. 逻辑与操作符**可用于任何类型的操作数**,不限于布尔值。如果有操作数不是布尔值,则逻辑与并不一定会返回布尔值,而是遵循如下规则: + 1. 如果第一个操作数是对象,则返回第二个操作数。 + 2. 如果第二个操作数是对象,则只有第一个操作数求值为 true 才会返回该对象。 + 3. 如果两个操作数都是对象,则返回第二个操作数。 + 4. 如果有一个操作数是 null,则返回 null。 + 5. 如果有一个操作数是 NaN,则返回 NaN。 + 6. 如果有一个操作数是 undefined,则返回 undefined。 + 3. 逻辑与操作符是一种**短路操作符**,意思就是如果第一个操作数决定了结果,那么永远不会对第二个操作数求值。 + +3. 逻辑或 + + 1. 逻辑或操作符由两个管道符( `||`)表示 + 2. 与逻辑与类似,如果有一个操作数不是布尔值,那么逻辑或操作符也不一定返回布尔值。它遵循如下规则: + 1. 如果第一个操作数是对象,则返回第一个操作数。 + 2. 如果第一个操作数求值为 false,则返回第二个操作数。 + 3. 如果两个操作数都是对象,则返回第一个操作数。 + 4. 如果两个操作数都是 null,则返回 null。 + 5. 如果两个操作数都是 NaN,则返回 NaN。 + 6. 如果两个操作数都是 undefined,则返回 undefined。 + 3. 同样与逻辑与类似,逻辑或操作符也具有**短路的特性**。只不过对逻辑或而言,第一个操作数求值为true,第二个操作数就不会再被求值了。 + +### 3.5.4 乘性操作符 + +ECMAScript 定义了 3 个乘性操作符:乘法、除法和取模。这些操作符跟它们在 Java、 C 语言及 Perl 中对应的操作符作用一样,但在处理非数值时,它们也会包含一些自动的类型转换。如果乘性操作符有不是数值的操作数,则该操作数会在后台被使用 Number()转型函数转换为数值。这意味着空字符串会被当成 0,而布尔值 true 会被当成 1。 + +1. 乘法操作符 + 1. 乘法操作符由一个星号( *)表示,可以用于计算两个数值的乘积。 + 2. 如果有任一操作数是 NaN,则返回 NaN。 + 3. 如果是 Infinity 乘以 0,则返回 NaN。 + 4. 如果是 Infinity 乘以非 0 的有限数值,则根据第二个操作数的符号返回 Infinity 或-Infinity。 + 5. 如果是 Infinity 乘以 Infinity,则返回 Infinity。 + 6. 如果有不是数值的操作数,则先在后台用 Number()将其转换为数值,然后再应用上述规则。 +2. 除法操作符 + 1. 除法操作符由一个斜杠( /)表示,用于计算第一个操作数除以第二个操作数的商。 + 2. 如果 ECMAScript不能表示商, 则返回Infinity 或-Infinity。 + 3. 如果有任一操作数是 NaN,则返回 NaN。 + 4. 如果是 Infinity 除以 Infinity,则返回 NaN。 + 5. 如果是 0 除以 0,则返回 NaN。 + 6. 如果是非 0 的有限值除以 0,则根据第一个操作数的符号返回 Infinity 或-Infinity。 + 7. 如果是 Infinity 除以任何数值,则根据第二个操作数的符号返回 Infinity 或-Infinity。 + 8. 如果有不是数值的操作数,则先在后台用 Number()函数将其转换为数值,然后再应用上述规则。 +3. 取模操作符 + 1. 取模(余数)操作符由一个百分比符号( %)表示 。 + 2. 如果被除数是无限值,除数是有限值,则返回 NaN。 + 3. 如果被除数是有限值,除数是 0,则返回 NaN。 + 4. 如果是 Infinity 除以 Infinity,则返回 NaN。 + 5. 如果被除数是有限值,除数是无限值,则返回被除数。 + 6. 如果被除数是 0,除数不是 0,则返回 0。 + 7. 如果有不是数值的操作数,则先在后台用 Number()函数将其转换为数值,然后再应用上述规则。 + +### 3.5.5 指数操作符 + +ECMAScript 7 新增了指数操作符, `Math.pow()` 现在有了自己的操作符 `**`,结果是一样的: + +```javascript +console.log(Math.pow(3, 2); // 9 +console.log(3 ** 2); // 9 +console.log(Math.pow(16, 0.5); // 4 +console.log(16** 0.5); // 4 +``` + +不仅如此,指数操作符也有自己的**指数赋值操作符** `**=`,该操作符执行指数运算和结果的赋值操作: + +```javascript +let squared = 3; +squared **= 2; +console.log(squared); // 9 +sqrt = 16; +sqrt **= 0.5; +console.log(sqrt); // 4 +``` + + + +### 3.5.6 加性操作符 + +加法和减法操作符, 在 ECMAScript 中,这两个操作符拥有一些特殊的行为。与乘性操作符类似,加性操作符在后台会发生不同数据类型的转换。只不过对这两个操作符来说,转换规则不是那么直观。 + +1. 加法操作符 + 1. 如果两个操作数都是数值,加法操作符执行加法运算并根据如下规则返回结果: + - 如果有任一操作数是 NaN,则返回 NaN; + - 如果是 Infinity 加 Infinity,则返回 Infinity; + - 如果是-Infinity 加-Infinity,则返回-Infinity; + - 如果是 Infinity 加-Infinity,则返回 NaN; + - 如果是+0 加+0,则返回+0; + - 如果是-0 加+0,则返回+0; + - 如果是-0 加-0,则返回-0。 + 2. 如果有一个操作数是字符串,则要应用如下规则: + - 如果两个操作数都是字符串,则将第二个字符串**拼接**到第一个字符串后面; + - 如果只有一个操作数是字符串,则将另一个操作数转换为字符串,再将两个字符串**拼接**在一起。 + 3. 如果有任一操作数是对象、数值或布尔值,则调用它们的 toString()方法以获取字符串,然后再应用前面的关于字符串的规则。对于 undefined 和 null,则调用 String()函数,分别获取"undefined"和"null"。 +2. 减法操作符 + 1. 如果有任一操作数是字符串、布尔值、 null 或 undefined,则先在后台使用 `Number()`将其转换为数值,然后再根据前面的规则执行数学运算。如果转换结果是 NaN,则减法计算的结果是NaN。 + 2. 如果有任一操作数是对象,则调用其 `valueOf()`方法取得表示它的数值。如果该值是 NaN,则减法计算的结果是 NaN。如果对象没有 `valueOf()`方法,则调用其`toString()`方法,然后再将得到的字符串转换为数值。 + +### 3.5.7 关系操作符 + +关系操作符执行比较两个值的操作,包括小于( `<`)、大于( `>`)、小于等于( `<=`)和大于等于( `>=`),用法跟数学课上学的一样。这几个操作符都返回布尔值。 + +1. 与 ECMAScript 中的其他操作符一样,在将它们应用到不同数据类型时也会发生类型转换和其他行为。 + - 如果操作数都是数值,则执行数值比较。 + - 如果操作数都是字符串,则逐个比较字符串中对应字符的编码。 + - 如果有任一操作数是数值,则将另一个操作数转换为数值,执行数值比较。 + - 如果有任一操作数是对象,则调用其 valueOf()方法,取得结果后再根据前面的规则执行比较。 + 如果没有 valueOf()操作符,则调用 toString()方法,取得结果后再根据前面的规则执行比较。 + - 如果有任一操作数是布尔值,则将其转换为数值再执行比较。 + +2. 在使用关系操作符比较两个字符串时,会发生一个有趣的现象。很多人认为小于意味着“字母顺序靠前”,而大于意味着“字母顺序靠后”,实际上不是这么回事。对字符串而言,关系操作符会比较字符串中对应字符的编码,而这些编码是数值。比较完之后,会返回布尔值。问题的关键在于,大写字母的编码都小于小写字母的编码,因此以下这种情况就会发生: + + ```javascript + let result = "Brick" < "alphabet"; // true + ``` + + 1. 在这里,字符串"Brick"被认为小于字符串"alphabet",因为字母 B 的编码是 66,字母 a 的编码是 97。要得到确实按字母顺序比较的结果,就必须把两者都**转换为相同的大小写形式**(全大写或全小写),然后再比较。 + + ```javascript + let result = "23" < "3"; // true + ``` + + 1. 因为两个操作数都是字符串,所以会逐个比较它们的字符编码(字符"2"的编码是 50,而字符"3"的编码是 51)。不过,如果有一个操作数是数值,那么比较的结果就对了 。 + +### 3.5.8 相等操作符 + +判断两个变量是否相等是编程中最重要的操作之一。在比较字符串、数值和布尔值是否相等时,过程都很直观。但是在比较两个对象是否相等时,情形就比较复杂了。 ECMAScript 中的相等和不相等操作符,原本在比较之前会执行类型转换,但很快就有人质疑这种转换是否应该发生。最终, ECMAScript 提供了两组操作符。第一组是等于和不等于,它们在比较之前执行转换。第二组是全等和不全等,它们在比较之前不执行转换。 + +1. 等于和不等于( `==`) ( `!=`) + + 1. 这两个操作符都会先进行类型转换(通常称为强制类型转换)再确定操作数是否相等。 + + 2. 在转换操作数的类型时,相等和不相等操作符遵循如下规则。 + - 如果任一操作数是布尔值,则将其转换为数值再比较是否相等。 false 转换为 0, true 转换为 1。 + - 如果一个操作数是字符串,另一个操作数是数值,则尝试将字符串转换为数值,再比较是否相等。 + - 如果一个操作数是对象,另一个操作数不是,则调用对象的 valueOf()方法取得其原始值,再根据前面的规则进行比较。 + + 3. 在进行比较时,这两个操作符会遵循如下规则。 + - null 和 undefined 相等。 + - null 和 undefined 不能转换为其他类型的值再进行比较。 + - 如果有任一操作数是 NaN,则相等操作符返回 false,不相等操作符返回 true。记住:即使两个操作数都是 NaN,相等操作符也返回 false,因为按照规则, NaN 不等于 NaN。 + - 如果两个操作数都是对象,则比较它们是不是同一个对象。如果两个操作数都指向同一个对象,则相等操作符返回 true。否则,两者不相等。 + + 4. 一些特殊情况及比较的结果: + + ![image-20210710161827359](JavaScript高级程序设计第四版-笔记.assets/image-20210710161827359.png) + +2. 全等和不全等( `=== 、!==` ) + + 1. 全等和不全等操作符与相等和不相等操作符类似,只不过它们在比较相等时不转换操作数。 + 2. 虽然 null == undefined 是 true(因为这两个值类似),但 null === undefined 是 false,因为它们不是相同的数据类型。 + +### 3.5.9 条件操作符 + +条件操作符是 ECMAScript 中用途最为广泛的操作符之一,语法跟 Java 中一样: + +```javascript +variable = boolean_expression ? true_value : false_value; +``` + + + +### 3.5.10 赋值操作符 + +1. 简单赋值用等于号( =)表示,将右手边的值赋给左手边的变量 。 + +2. 复合赋值使用乘性、加性或位操作符后跟等于号( =)表示。 + +3. 每个数学操作符以及其他一些操作符都有对应的复合赋值操作符: + + - 乘后赋值( `*=`) + - 除后赋值( `/=`) + - 取模后赋值( `%=`) + - 加后赋值( `+=`) + - 减后赋值( `-=`) + - 左移后赋值( `<<=`) + - 右移后赋值( `>>=`) + - 无符号右移后赋值( `>>>=`) + + + +### 3.5.11 逗号操作符 + +逗号操作符可以用来在一条语句中执行多个操作,如下所示: + +```javascript +let num1 = 1, num2 = 2, num3 = 3; +``` + +在一条语句中同时声明多个变量是逗号操作符最常用的场景。不过,也可以使用逗号操作符来辅助 +赋值。在赋值时使用逗号操作符分隔值,最终会返回表达式中最后一个值: + +```javascript +let num = (5, 1, 4, 8, 0); // num 的值为 0 +``` + + + +## 3.6 语句 73 + +ECMA-262 描述了一些语句(也称为**流控制语句**),而 ECMAScript 中的大部分语法都体现在语句中。语句通常使用一或多个关键字完成既定的任务。语句可以简单,也可以复杂。简单的如告诉函数退出,复杂的如列出一堆要重复执行的指令。 + +### 3.6.1 if 语句 + +1. 这里的条件( condition)**可以是任何表达式**,并且求值结果不一定是布尔值。 ECMAScript 会自动调用 `Boolean()`函数将这个表达式的值转换为布尔值。 + +### 3.6.2 do-while 语句 + +1. do-while 语句是一种后测试循环语句,即循环体中的代码执行后才会对退出条件进行求值。换句话说,循环体内的代码至少执行一次。 + +### 3.6.3 while 语句 + +1. while 语句是一种先测试循环语句,即先检测退出条件,再执行循环体内的代码。因此, while 循环体内的代码有可能不会执行。 + +### 3.6.4 for 语句 + +1. for 语句也是先测试语句,只不过增加了进入循环之前的初始化代码,以及循环执行后要执行的表达式。 + +2. 初始化、条件表达式和循环后表达式都不是必需的。因此,下面这种写法可以创建一个无穷循环: + + ```javascript + for (;;) { // 无穷循环 + doSomething(); + } + + + // 如果只包含条件表达式,那么 for 循环实际上就变成了 while 循环: + let count = 10; + let i = 0; + for (; i < count; ) { + console.log(i); + i++; + } + ``` + + + +### 3.6.5 for-in 语句 + +for-in 语句是一种严格的迭代语句,用于枚举对象中的非符号键属性,语法如下: + +```javascript +for (property in expression) statement +``` + +下面是一个例子: + +```javascript +for (const propName in window) { + document.write(propName); +} +``` + +1. 与 for 循环一样,这里控制语句中的 const 也不是必需的。但为了确保这个局部变量不被修改,推荐使用 const。 +2. ECMAScript 中对象的属性是无序的,因此 for-in 语句不能保证返回对象属性的顺序。 +3. 如果 for-in 循环要迭代的变量是 null 或 undefined,则不执行循环体。 + +### 3.6.6 for-of 语句 + +for-of 语句是一种严格的迭代语句,用于遍历可迭代对象的元素,语法如下: + +```javascript +for (property of expression) statement + +// 下面是示例: +for (const el of [2,4,6,8]) { + document.write(el); +} +``` + +1. 在这个例子中,我们使用 for-of 语句显示了一个包含 4 个元素的数组中的所有元素。循环会一直持续到将所有元素都迭代完。与 for 循环一样,这里控制语句中的 const 也不是必需的。但为了确保这个局部变量不被修改,推荐使用 const。 +2. for-of 循环会按照可迭代对象的 `next()`方法产生值的顺序迭代元素。关于可迭代对象,本书将在第 7 章详细介绍。 +3. 注意 **ES2018** 对 for-of 语句进行了扩展,增加了 `for-await-of` 循环,以支持生成期约( promise)的异步可迭代对象。相关内容将在附录 A 介绍。 + +### 3.6.7 标签语句 + +标签语句用于给语句加标签,语法如下: + +```javascript +label: statement + +// 下面是一个例子: +start: for (let i = 0; i < count; i++) { + console.log(i); +} +``` + +在这个例子中, start 是一个标签,可以在后面通过 break 或 continue 语句引用。标签语句的典型应用场景是嵌套循环。 + +### 3.6.8 break 和 continue 语句 + +break 和 continue 语句为执行循环代码提供了更严格的控制手段。其中, break 语句用于立即退出循环,强制执行循环后的下一条语句。而 continue 语句也用于立即退出循环,但会再次从循环顶部开始执行。 + +break 和 continue 都可以与标签语句一起使用,返回代码中特定的位置。这通常是在嵌套循环中,如下面的例子所示: + +```javascript +let num = 0; +outermost: + for (let i = 0; i < 10; i++) { + for (let j = 0; j < 10; j++) { + if (i == 5 && j == 5) { + break outermost; + } + num++; + } + } +console.log(num); // 55 +``` + +在这个例子中, outermost 标签标识的是第一个 for 语句。正常情况下,每个循环执行 10 次,意味着 num++语句会执行 100 次,而循环结束时 console.log 的结果应该是 100。但是, break 语句带来了一个变数,即要退出到的标签。添加标签不仅让 break 退出(使用变量 j 的)内部循环,也会退出(使用变量 i 的)外部循环。当执行到 i 和 j 都等于 5 时,循环停止执行,此时 num 的值是 55。 + +组合使用标签语句和 break、 continue 能实现复杂的逻辑,但也容易出错。注意标签要使用描述性强的文本,而嵌套也不要太深。 + + + +### 3.6.9 with 语句 + +警告:由于 with 语句影响性能且难于调试其中的代码,通常不推荐在产品代码中使用 with语句。 + +with 语句的用途是将代码作用域设置为特定的对象,其语法是: +`with (expression) statement;` +使用 with 语句的主要场景是针对一个对象反复操作,这时候将代码作用域设置为该对象能提供便利,如下面的例子所示: + +```javascript +let qs = location.search.substring(1); +let hostName = location.hostname; +let url = location.href; +``` + +上面代码中的每一行都用到了 location 对象。如果使用 with 语句,就可以少写一些代码: + +```javascript +with(location) { + let qs = search.substring(1); + let hostName = hostname; + let url = href; +} +``` + +这里, with 语句用于连接 location 对象。这意味着在这个语句内部,每个变量首先会被认为是一个局部变量。如果没有找到该局部变量,则会搜索 location 对象,看它是否有一个同名的属性。如果有,则该变量会被求值为 location 对象的属性。 +严格模式不允许使用 with 语句,否则会抛出错误。 + +### 3.6.10 switch 语句 + +switch 语句是与 if 语句紧密相关的一种流控制语句,从其他语言借鉴而来。 ECMAScript 中 switch语句跟 C 语言中 switch 语句的语法非常相似 。 + +1. 首先,switch 语句**可以用于所有数据类型**(在很多语言中,它只能用于数值),因此可以使用字符串甚至对象。其次,**条件的值不需要是常量,也可以是变量或表达式。** +2. 注意 switch 语句在比较每个条件的值时会**使用全等操作符**,因此不会强制转换数据类型(比如,字符串"10"不等于数值 10)。 + +```javascript +let num = 25; +switch (true) { + case num < 0: + console.log("Less than 0."); + break; + case num >= 0 && num <= 10: + console.log("Between 0 and 10."); + break; + case num > 10 && num <= 20: + console.log("Between 10 and 20."); + break; + default: + console.log("More than 20."); +} +``` + + + +## 3.7 函数 80 + +函数对任何语言来说都是核心组件,因为它们可以封装语句,然后在任何地方、任何时间执行。 +ECMAScript 中的函数使用 function 关键字声明,后跟一组参数,然后是函数体。 + +1. 严格模式对函数也有一些限制: + - 函数不能以 eval 或 arguments 作为名称; + - 函数的参数不能叫 eval 或 arguments; + - 两个命名参数不能拥有同一个名称。 + 如果违反上述规则,则会导致语法错误,代码也不会执行。 + + +# 第4章 变量、作用域与内存 + +## 4.1 原始值与引用值 + +1. ECMAScript 变量可以包含两种不同类型的数据:原始值和引用值。 原始值( primitive value)就是最简单的数据, 引用值( reference value)则是由多个值构成的对象。 +2. 在把一个值赋给变量时, JavaScript 引擎必须确定这个值是原始值还是引用值。上一章讨论了 **6 种原始值**: `Undefined、 Null、 Boolean、 Number、 String 和 Symbol`。保存原始值的变量是按值( by value)访问的,因为我们操作的就是存储在变量中的实际值。 +3. **引用值是保存在内存中的对象**。与其他语言不同, JavaScript 不允许直接访问内存位置,因此也就不能直接操作对象所在的内存空间。在操作对象时,实际上操作的是对该对象的引用(reference)而非实际的对象本身。为此,保存引用值的变量是按引用( by reference)访问的。 + +### 4.1.1 动态属性 + +1. 对于引用值而言,可以随时添加、修改和删除其属性和方法。 + +2. 原始值不能有属性,尽管尝试给原始值添加属性不会报错。 + +3. 注意,原始类型的初始化可以只使用原始字面量形式。如果使用的是 new 关键字,则 JavaScript 会创建一个 Object 类型的实例,但其行为类似原始值。下面来看看这两种初始化方式的差异: + + ```javascript + let name1 = "Nicholas"; + let name2 = new String("Matt"); + name1.age = 27; + name2.age = 26; + console.log(name1.age); // undefined + console.log(name2.age); // 26 + console.log(typeof name1); // string + console.log(typeof name2); // object + ``` + + + +### 4.1.2 复制值 + +1. 除了存储方式不同,原始值和引用值在通过变量复制时也有所不同。在通过变量把一个原始值赋值到另一个变量时,原始值会被复制到新变量的位置。 + +2. 在把引用值从一个变量赋给另一个变量时,存储在变量中的值也会被复制到新变量所在的位置。 + + - 区别在于,这里复制的值实际上是一个**指针**,它指向存储在堆内存中的对象。 + - 操作完成后,两个变量实际上指向同一个对象,因此一个对象上面的变化会在另一个对象上反映出来。 + + ![image-20210710225957749](JavaScript高级程序设计第四版-笔记.assets/image-20210710225957749.png) + + + +### 4.1.3 传递参数 + +1. ECMAScript 中**所有函数的参数都是按值传递的**。 + + - 这意味着函数外的值会被复制到函数内部的参数中,就像从一个变量复制到另一个变量一样。 + - 如果是原始值,那么就跟原始值变量的复制一样,如果是引用值,那么就跟引用值变量的复制一样。 + +2. 很多开发者错误地认为,当在局部作用域中修改对象而变化反映到全局时,就意味着参数是按引用传递的。为证明对象是按值传递的,我们再来看看下面这个修改后的例子: + + ```javascript + function setName(obj) { + obj.name = "Nicholas"; + obj = new Object(); + obj.name = "Greg"; + } + let person = new Object(); + setName(person); + console.log(person.name); // "Nicholas" + ``` + + - 这个例子前后唯一的变化就是 setName()中多了两行代码,将 obj 重新定义为一个有着不同 name的新对象。 + - 当 person 传入 setName()时,其 name 属性被设置为"Nicholas"。然后变量 obj 被设置为一个新对象且 name 属性被设置为"Greg"。 + - 如果 person 是按引用传递的,那么 person 应该自动将指针改为指向 name 为"Greg"的对象。 + - 可是,当我们再次访问 person.name 时, 它的值是"Nicholas",这表明函数中参数的值改变之后,原始的引用仍然没变。 + - 当 obj 在函数内部被重写时,它变成了一个指向本地对象的指针。而那个本地对象在函数执行结束时就被销毁了。 + +3. **注意** ECMAScript 中函数的参数就是局部变量。 + + + +### 4.1.4 确定类型 + +1. typeof 虽然对原始值很有用,但它对引用值的用处不大。我们通常不关心一个值是不是对象,而是想知道它是什么类型的对象。 + + - 为了解决这个问题, ECMAScript 提供了 instanceof 操作符,语法如下: + - `result = variable instanceof constructor ` + - 如果变量是给定引用类型(由其原型链决定,将在第 8 章详细介绍)的实例,则 instanceof 操作符返回 true。 + + ```javascript + console.log(person instanceof Object); // 变量 person 是 Object 吗? + console.log(colors instanceof Array); // 变量 colors 是 Array 吗? + console.log(pattern instanceof RegExp); // 变量 pattern 是 RegExp 吗? + ``` + + - 按照定义,所有引用值都是 Object 的实例,因此通过 instanceof 操作符检测任何引用值和 Object 构造函数都会返回 true。 + - 类似地,如果用 instanceof 检测原始值,则始终会返回 false,因为原始值不是对象。 + +## 4.2 执行上下文与作用域 + +1. 变量或函数的上下文决定了它们可以访问哪些数据,以及它们的行为。 + + - **每个上下文都有一个关联的变量对象( variable object)**, + - 而这个上下文中定义的**所有变量和函数都存在于这个对象上**。 + +2. 根据 ECMAScript 实现的宿主环境,表示全局上下文的对象可能不一样。 + + - 在浏览器中,全局上下文就是我们常说的 window 对象(第 12 章会详细介绍),因此所有通过 var 定义的全局变量和函数都会成为 window 对象的属性和方法。 + - 使用 let 和 const 的顶级声明不会定义在全局上下文中,但在作用域链解析上效果是一样的。 + +3. 上下文中的代码在执行的时候,会创建变量对象的一个**作用域链( scope chain)**。 + + - 这个作用域链决定了各级上下文中的代码在访问变量和函数时的顺序。代码**正在执行的上下文的变量对象始终位于作用域链的最前端。** + - 如果上下文是函数,则其**活动对象( activation object)用作变量对象**。活动对象最初只有一个定义变量: arguments。(全局上下文中没有这个变量。)作用域链中的下一个变量对象来自包含上下文,再下一个对象来自再下一个包含上下文。以此类推直至全局上下文;**全局上下文的变量对象始终是作用域链的最后一个变量对象。** + - 代码执行时的标识符解析是通过沿作用域链逐级搜索标识符名称完成的。搜索过程始终从作用域链的最前端开始,然后逐级往后,直到找到标识符。(如果没有找到标识符,那么通常会报错。) + + ![image-20210710232601499](JavaScript高级程序设计第四版-笔记.assets/image-20210710232601499.png) + + + +### 4.2.1 作用域链增强 + +1. 某些语句会导致在作用域链前端临时添加一个上下文,这个上下文在代码执行后会被删除。通常在两种情况下会出现这个现象,即代码执行到下面任意一种情况时: + + - try/catch 语句的 catch 块 + - with 语句 + - 这两种情况下,都会在作用域链前端添加一个变量对象。对 with 语句来说,会向作用域链前端添加指定的对象; + - 对 catch 语句而言,则会创建一个新的变量对象,这个变量对象会包含要抛出的错误对象的声明。看下面的例子: + + ```javascript + function buildUrl() { + let qs = "?debug=true"; + with(location){ + let url = href + qs; + } + return url; + } + ``` + + + +### 4.2.2 变量声明 + +1. 使用 var 的函数作用域声明 + - 变量提升( hoisting) +2. 使用 let 的块级作用域声明 + - 作用域是块级的,这也是 JavaScript 中的新概念。块级作用域由最近的一对包含花括号{}界定。 +3. 使用 const的块级作用域声明 + - 如果想让整个对象都不能修改,可以使用 Object.freeze(),这样再给属性赋值时虽然不会报错,但会静默失败。 +4. 标识符查找 + - 当在特定上下文中为读取或写入而引用一个标识符时,必须通过搜索确定这个标识符表示什么。搜索开始于作用域链前端,以给定的名称搜索对应的标识符。如果在局部上下文中找到该标识符,则搜索停止,变量确定;如果没有找到变量名,则继续沿作用域链搜索。(注意,作用域链中的对象也有一个原型链,因此搜索可能涉及每个对象的原型链。)这个过程一直持续到搜索至全局上下文的变量对象。如果仍然没有找到标识符,则说明其未声明。 + - 标识符查找并非没有代价。**访问局部变量比访问全局变量要快**,因为不用切换作用域。不过, JavaScript 引擎在优化标识符查找上做了很多工作,将来这个差异可能就微不足道了。 + + + +## 4.3 垃圾回收 + +JavaScript 是使用垃圾回收的语言,也就是说执行环境负责在代码执行时管理内存。在 C 和 C++等语言中,跟踪内存使用对开发者来说是个很大的负担,也是很多问题的来源。 JavaScript 为开发者卸下了这个负担,通过自动内存管理实现内存分配和闲置资源回收。基本思路很简单:确定哪个变量不会再使用,然后释放它占用的内存。这个过程是周期性的,即垃圾回收程序每隔一定时间(或者说在代码执行过程中某个预定的收集时间)就会自动运行。垃圾回收过程是一个近似且不完美的方案,因为某块内存是否还有用,属于“不可判定的”问题,意味着靠算法是解决不了的。 + +在浏览器的发展史上,用到过两种主要的标记策略:标记清理和引用计数。 + +### 4.3.1 标记清理 + +JavaScript 最常用的垃圾回收策略是**标记清理( mark-and-sweep)**。当变量进入上下文,比如在函数内部声明一个变量时,这个变量会被加上存在于上下文中的标记。而在上下文中的变量,逻辑上讲,永远不应该释放它们的内存,因为只要上下文中的代码在运行,就有可能用到它们。当变量离开上下文时,也会被加上离开上下文的标记。 + +垃圾回收程序运行的时候,会标记内存中存储的所有变量(记住,标记方法有很多种)。然后,它会将所有在上下文中的变量,以及被在上下文中的变量引用的变量的标记去掉。在此之后再被加上标记的变量就是待删除的了,原因是任何在上下文中的变量都访问不到它们了。随后垃圾回收程序做一次内存清理,销毁带标记的所有值并收回它们的内存。 + +### 4.3.2 引用计数 + +另一种没那么常用的垃圾回收策略是**引用计数( reference counting)**。其思路是对每个值都记录它被引用的次数。声明变量并给它赋一个引用值时,这个值的引用数为 1。如果同一个值又被赋给另一个变量,那么引用数加 1。类似地,如果保存对该值引用的变量被其他值给覆盖了,那么引用数减 1。当一个值的引用数为 0 时,就说明没办法再访问到这个值了,因此可以安全地收回其内存了。垃圾回收程序下次运行的时候就会释放引用数为 0 的值的内存。 + +### 4.3.3 性能 + +垃圾回收程序会周期性运行,如果内存中分配了很多变量,则可能造成性能损失,因此垃圾回收的时间调度很重要。 + +因此最好的办法是在写代码时就要做到:无论什么时候开始收集垃圾,都能让它尽快结束工作。 + +现代垃圾回收程序会基于对 JavaScript 运行时环境的探测来决定何时运行。探测机制因引擎而异,但基本上都是根据已分配对象的大小和数量来判断的。比如,根据 V8 团队 2016 年的一篇博文的说法:“在一次完整的垃圾回收之后, V8 的堆增长策略会根据活跃对象的数量外加一些余量来确定何时再次垃圾回收。” + +### 4.3.4 内存管理 + +JavaScript 运行在一个内存管理与垃圾回收都很特殊的环境。分配给浏览器的内存通常比分配给桌面软件的要少很多,分配给移动浏览器的就更少了。这更多出于安全考虑而不是别的,就是为了避免运行大量 JavaScript 的网页耗尽系统内存而导致操作系统崩溃。这个内存限制不仅影响变量分配,也影响调用栈以及能够同时在一个线程中执行的语句数量。 + +将内存占用量保持在一个较小的值可以让页面性能更好。优化内存占用的最佳手段就是保证在执行代码时只保存必要的数据。如果数据不再必要,那么**把它设置为 null**,从而释放其引用。这也可以叫作**解除引用**。这个建议最适合全局变量和全局对象的属性。 + +1. 通过 const 和 let 声明提升性能 + + - 使用这两个新关键字可能会更早地让垃圾回收程序介入,尽早回收应该回收的内存。 + +2. 隐藏类和删除操作 + + - V8 在将解释后的 JavaScript代码编译为实际的机器码时会利用“隐藏类”。如果你的代码非常注重性能,那么这一点可能对你很重要。 + + - 运行期间, V8 会将创建的对象与隐藏类关联起来,以跟踪它们的属性特征。能够共享相同隐藏类的对象性能会更好, V8 会针对这种情况进行优化,但不一定总能够做到。比如下面的代码: + + ```javascript + function Article() { + this.title = 'Inauguration Ceremony Features Kazoo Band'; + } + let a1 = new Article(); + let a2 = new Article(); + + // 自动转换后的类 + class Article { + constructor() { + this.title = 'Inauguration Ceremony Features Kazoo Band'; + } + } + let a1 = new Article(); + let a2 = new Article(); + ``` + + - V8 会在后台配置,让这两个类实例共享相同的隐藏类,因为这两个实例共享同一个构造函数和原型。假设之后又添加了下面这行代码: + + ```javascript + a2.author = 'Jake'; + ``` + + - 此时两个 Article 实例就会对应两个不同的隐藏类。根据这种操作的频率和隐藏类的大小,这有可能对性能产生明显影响。 + + - 当然,解决方案就是**避免 JavaScript 的“先创建再补充”( ready-fire-aim)式的动态属性赋值,并在构造函数中一次性声明所有属性。** + + - 使用 delete 关键字会导致生成相同的隐藏类片段。看一下这个例子: + + ```javascript + function Article() { + this.title = 'Inauguration Ceremony Features Kazoo Band'; + this.author = 'Jake'; + } + let a1 = new Article(); + let a2 = new Article(); + // delete a1.author; + + // 保持隐藏类不变和继续共享 + a1.author = null; + ``` + + - 在代码结束后,即使两个实例使用了同一个构造函数,它们也不再共享一个隐藏类。动态删除属性与动态添加属性导致的后果一样。**最佳实践是把不想要的属性设置为 null。**这样可以保持隐藏类不变和继续共享,同时也能达到删除引用值供垃圾回收程序回收的效果。 + +3. 内存泄漏 + + - JavaScript 中的内存泄漏大部分是由不合理的引用导致的。 + + - 意外声明全局变量是最常见但也最容易修复的内存泄漏问题。 + + - 定时器也可能会悄悄地导致内存泄漏。下面的代码中,定时器的回调通过闭包引用了外部变量: + + ```javascript + let name = 'Jake'; + setInterval(() => { + console.log(name); + }, 100); + ``` + + - 使用 JavaScript 闭包很容易在不知不觉间造成内存泄漏。请看下面的例子: + + ```javascript + let outer = function () { + let name = 'Jake'; + return function () { + return name; + }; + }; + ``` + + - 调用 outer()会导致分配给 name 的内存被泄漏。以上代码执行后创建了一个内部闭包,只要返回的函数存在就不能清理 name,因为闭包一直在引用着它。假如 name 的内容很大(不止是一个小字符串),那可能就是个大问题了。 + +4. 静态分配与对象池 + + - 为了提升 JavaScript 性能,最后要考虑的一点往往就是压榨浏览器了。此时,一个关键问题就是如何减少浏览器执行垃圾回收的次数。开发者无法直接控制什么时候开始收集垃圾,但可以间接控制触发垃圾回收的条件。理论上,如果能够合理使用分配的内存,同时避免多余的垃圾回收,那就可以保住因释放内存而损失的性能。 + + - 浏览器决定何时运行垃圾回收程序的一个标准就是对象更替的速度。如果有很多对象被初始化,然后一下子又都超出了作用域,那么浏览器就会采用更激进的方式调度垃圾回收程序运行,这样当然会影响性能。看一看下面的例子,这是一个计算二维矢量加法的函数: + + ```javascript + function addVector(a, b) { + let resultant = new Vector(); + resultant.x = a.x + b.x; + resultant.y = a.y + b.y; + return resultant; + } + ``` + + - 假如这个矢量加法函数频繁被调用,那么垃圾回收调度程序会发现这里对象更替的速度很快,从而会更频繁地安排垃圾回收。 + - 该问题的解决方案是不要动态创建矢量对象,比如可以修改上面的函数,让它使用一个已有的矢量对象: + + ```javascript + function addVector(a, b, resultant) { + resultant.x = a.x + b.x; + resultant.y = a.y + b.y; + return resultant; + } + ``` + + - 那么在哪里创建矢量可以不让垃圾回收调度程序盯上呢?一个策略是使用对象池。在初始化的某一时刻,可以创建一个对象池,用来管理一组可回收的对象。应用程序可以向这个对象池请求一个对象、设置其属性、使用它,然后在操作完成后再把它还给对象池。由于没发生对象初始化,垃圾回收探测就不会发现有对象更替,因此垃圾回收程序就不会那么频繁地运行。 + + ```javascript + // vectorPool 是已有的对象池 + let v1 = vectorPool.allocate(); + let v2 = vectorPool.allocate(); + let v3 = vectorPool.allocate(); + v1.x = 10; + v1.y = 5; + v2.x = -3; + v2.y = -6; + addVector(v1, v2, v3); + console.log([v3.x, v3.y]); // [7, -1] + vectorPool.free(v1); + vectorPool.free(v2); + vectorPool.free(v3); + // 如果对象有属性引用了其他对象 + // 则这里也需要把这些属性设置为 null + v1 = null; + v2 = null; + v3 = null; + ``` + + - 如果对象池只按需分配矢量(在对象不存在时创建新的,在对象存在时则复用存在的),那么这个实现本质上是一种贪婪算法,有单调增长但为静态的内存。这个对象池必须使用某种结构维护所有对象,数组是比较好的选择。不过,使用数组来实现,必须留意不要招致额外的垃圾回收。 + + + +# 第5章 基本引用类型 + +引用值(或者对象)是某个特定引用类型的实例。在 ECMAScript 中,引用类型是把数据和功能组织到一起的结构,经常被人错误地称作“类”。虽然从技术上讲 JavaScript 是一门面向对象语言,但ECMAScript 缺少传统的面向对象编程语言所具备的某些基本结构,包括类和接口。引用类型有时候也被称为对象定义,因为它们描述了自己的对象应有的属性和方法。 + +- 注意 引用类型虽然有点像类,但跟类并不是一个概念。为避免混淆,本章后面不会使用术语“类”。 + +**对象被认为是某个特定引用类型的实例。新对象通过使用 new 操作符后跟一个构造函数( constructor)来创建。**构造函数就是用来创建新对象的函数,比如下面这行代码: +`let now = new Date();` +这行代码创建了引用类型 Date 的一个新实例,并将它保存在变量 now 中。 Date()在这里就是构造函数,它负责创建一个只有默认属性和方法的简单对象。 ECMAScript 提供了很多像 Date 这样的原生引用类型,帮助开发者实现常见的任务。 + +- 注意 函数也是一种引用类型,但有关函数的内容太多了,一章放不下,所以本书专门用第 10 章来介绍函数。 + +## 5.1 Date + +Date 类型将日期保存为自协调世界时( UTC, Universal Time Coordinated)时间 1970 年 1 月 1 日午夜(零时)至今所经过的毫秒数。 + +在不给 Date 构造函数传参数的情况下,创建的对象将保存当前日期和时间。要基于其他日期和时间创建日期对象,必须传入其毫秒表示( UNIX 纪元 1970 年 1 月 1 日午夜之后的毫秒数)。 ECMAScript为此提供了两个辅助方法: `Date.parse()和 Date.UTC()`。 + +1. `Date.parse()`方法接收一个表示日期的字符串参数,尝试将这个字符串转换为表示该日期的毫秒数。 + + ECMA-262 第 5 版定义了 Date.parse()应该支持的日期格式,填充了第 3 版遗留的空白。所有实现都必须支持下列日期格式: + + ``` + “月/日/年”,如"5/23/2019"; + “月名 日, 年”,如"May 23, 2019"; + “周几 月名 日 年 时:分:秒 时区”,如"Tue May 23 2019 00:00:00 GMT-0700"; + ISO 8601 扩展格式“YYYY-MM-DDTHH:mm:ss.sssZ”,如 2019-05-23T00:00:00(只适用于兼容 ES5 的实现)。 + ``` + + - 比如,要创建一个表示“2019 年 5 月 23 日”的日期对象,可以使用以下代码: + + `let someDate = new Date(Date.parse("May 23, 2019")); ` + + - 如果传给 Date.parse()的字符串并不表示日期,则该方法会返回 NaN。如果直接把表示日期的字符串传给 Date 构造函数,那么 **Date 会在后台调用 Date.parse()**。 + + `let someDate = new Date("May 23, 2019");` + +2. `Date.UTC()`方法也返回日期的毫秒表示,但使用的是跟 Date.parse() 不同的信息来生成这个值。 + + 传给 Date.UTC()的参数是年、零起点月数( 1 月是 0, 2 月是 1,以此类推)、日( 1~31)、时( 0~23)、分、秒和毫秒。这些参数中,只有前两个(年和月)是必需的。如果不提供日,那么默认为 1 日。其他参数的默认值都是 0。下面是使用 Date.UTC() 的两个例子: + + ```javascript + // GMT 时间 2000 年 1 月 1 日零点 + let y2k = new Date(Date.UTC(2000, 0)); + // GMT 时间 2005 年 5 月 5 日下午 5 点 55 分 55 秒 + let allFives = new Date(Date.UTC(2005, 4, 5, 17, 55, 55)); + ``` + + - 与 Date.parse() 一样, Date.UTC() 也会被 Date 构造函数隐式调用,但有一个区别:这种情况下创建的是本地日期,不是 GMT 日期。 + + ```javascript + // 本地时间 2000 年 1 月 1 日零点 + let y2k = new Date(2000, 0); + // 本地时间 2005 年 5 月 5 日下午 5 点 55 分 55 秒 + let allFives = new Date(2005, 4, 5, 17, 55, 55); + ``` + +3. `Date.now()` 方法,返回表示方法执行时日期和时间的毫秒数。 + + + +### 5.1.1 继承的方法 + +Date 类型重写了 `toLocaleString()、 toString() 和 valueOf()` 方法。但与其他类型不同,重写后这些方法的返回值不一样。 + +- Date 类型的 **`toLocaleString()`** 方法返回与浏览器运行的本地环境一致的日期和时间。这通常意味着格式中包含针对时间的 AM(上午)或 PM(下午),但不包含时区信息(具体格式可能因浏览器而不同)。 + +- **`toString()`** 方法通常返回带时区信息的日期和时间,而时间也是以 24 小时制( 0~23)表示的。 + + - 下面给出了 toLocaleString() 和 toString() 返回的2019 年 2 月 1 日零点的示例(地区为"en-US"的 PST,即 Pacific Standard Time,太平洋标准时间): + + ```javascript + toLocaleString() - 2/1/2019 12:00:00 AM + toString() - Thu Feb 1 2019 00:00:00 GMT-0800 (Pacific Standard Time) + ``` + +- Date 类型的 valueOf() 方法根本就不返回字符串,这个方法被重写后返回的是日期的**毫秒**表示。因此,操作符(如小于号和大于号)可以直接使用它返回的值。比如下面的例子: + + ```javascript + let date1 = new Date(2019, 0, 1); // 2019 年 1 月 1 日 + let date2 = new Date(2019, 1, 1); // 2019 年 2 月 1 日 + console.log(date1 < date2); // true + console.log(date1 > date2); // false + ``` + + + +### 5.1.2 日期格式化方法 + +- Date 类型有几个专门用于格式化日期的方法,它们都会返回字符串: + - **`toDateString()`** 显示日期中的周几、月、日、年(格式特定于实现); + - **`toTimeString()`** 显示日期中的时、分、秒和时区(格式特定于实现); + - **`toLocaleDateString()`** 显示日期中的周几、月、日、年(格式特定于实现和地区); + - **`toLocaleTimeString()`** 显示日期中的时、分、秒(格式特定于实现和地区); + - **`toUTCString()`** 显示完整的 UTC 日期(格式特定于实现)。 +- 这些方法的输出与 toLocaleString() 和 toString() 一样,会因浏览器而异。因此**不能用于在用户界面上一致地显示日期**。 + +### 5.1.3 日期/时间组件方法 + +Date 类型剩下的方法(见下表)直接涉及取得或设置日期值的特定部分。注意表中“UTC 日期”,指的是没有时区偏移(将日期转换为 GMT)时的日期。 + +![image-20210711153109588](JavaScript高级程序设计第四版-笔记.assets/image-20210711153109588.png) + +![image-20210711153732577](JavaScript高级程序设计第四版-笔记.assets/image-20210711153732577.png) + + + +## 5.2 RegExp + +ECMAScript 通过 RegExp 类型支持正则表达式。正则表达式使用类似 Perl 的简洁语法来创建: +`let expression = /pattern/flags;` + +- 下面给出了表示匹配模式的标记。 + + - g:全局模式,表示查找字符串的全部内容,而不是找到第一个匹配的内容就结束。 + - i:不区分大小写,表示在查找匹配时忽略 pattern 和字符串的大小写。 + - m:多行模式,表示查找到一行文本末尾时会继续查找。 + - y:粘附模式,表示只查找从 lastIndex 开始及之后的字符串。 + - u: Unicode 模式,启用 Unicode 匹配。 + - s: dotAll 模式,表示元字符`.`匹配任何字符(包括\n 或\r)。 + +- 与其他语言中的正则表达式类似,所有元字符在模式中也必须转义,包括: + + `( [ { \ ^ $ | ) ] } ? * + . ` + + - 元字符在正则表达式中都有一种或多种特殊功能,所以要匹配上面这些字符本身,就必须使用反斜杠来转义。 + +- 前面例子中的正则表达式都是使用字面量形式定义的。正则表达式也可以使用 RegExp 构造函数来创建,它接收两个参数:模式字符串和(可选的)标记字符串。任何使用字面量定义的正则表达式也可以通过构造函数来创建,比如: + + ```javascript + // 匹配第一个"bat"或"cat",忽略大小写 + let pattern1 = /[bc]at/i; + + // 跟 pattern1 一样,只不过是用构造函数创建的 + let pattern2 = new RegExp("[bc]at", "i"); + ``` + + - 注意, RegExp 构造函数的两个参数都是字符串。**因为 RegExp 的模式参数是字符串,所以在某些情况下需要二次转义。** + + ![image-20210711154422125](JavaScript高级程序设计第四版-笔记.assets/image-20210711154422125.png) + + - 此外,使用 RegExp 也可以基于已有的正则表达式实例,并可选择性地修改它们的标记: + + ```javascript + const re1 = /cat/g; + console.log(re1); // "/cat/g" + + const re2 = new RegExp(re1); + console.log(re2); // "/cat/g" + + const re3 = new RegExp(re1, "i"); + console.log(re3); // "/cat/i" + ``` + + + +### 5.2.1 RegExp 实例属性 + +- 每个 RegExp 实例都有下列属性,提供有关模式的各方面信息。 + - global:布尔值,表示是否设置了 g 标记。 + - ignoreCase:布尔值,表示是否设置了 i 标记。 + - unicode:布尔值,表示是否设置了 u 标记。 + - sticky:布尔值,表示是否设置了 y 标记。 + - lastIndex:整数,表示在源字符串中下一次搜索的开始位置,始终从 0 开始。 + - multiline:布尔值,表示是否设置了 m 标记。 + - dotAll:布尔值,表示是否设置了 s 标记。 + - source:正则表达式的字面量字符串(不是传给构造函数的模式字符串),没有开头和结尾的斜杠。 + - flags:正则表达式的标记字符串。始终以字面量而非传入构造函数的字符串模式形式返回(没有前后斜杠)。 + +### 5.2.2 RegExp 实例方法 + +RegExp 实例的主要方法是 `exec()`,主要用于配合捕获组使用。 + +- 这个方法只接收一个参数,即要应用模式的字符串。如果找到了匹配项,则返回包含第一个匹配信息的数组;如果没找到匹配项,则返回null。 + +- 返回的数组虽然是 Array 的实例,但包含两个额外的属性: index 和 input。 index 是字符串中匹配模式的起始位置, input 是要查找的字符串。 + +- 这个数组的第一个元素是匹配整个模式的字符串,其他元素是与表达式中的捕获组匹配的字符串。如果模式中没有捕获组,则数组只包含一个元素。 + +- 来看下面的例子: + + ```javascript + let text = "mom and dad and baby"; + let pattern = /mom( and dad( and baby)?)?/gi; + + let matches = pattern.exec(text); + console.log(matches.index); // 0 + console.log(matches.input); // "mom and dad and baby" + console.log(matches[0]); // "mom and dad and baby" + console.log(matches[1]); // " and dad and baby" + console.log(matches[2]); // " and baby" + ``` + +- 如果模式设置了全局标记,则每次调用 exec()方法会返回一个匹配的信息。如果没有设置全局标记,则无论对同一个字符串调用多少次 exec(),也只会返回第一个匹配的信息。 + + - 如果在这个模式上设置了 g 标记,则每次调用 exec()都会在字符串中向前搜索下一个匹配项。 + - 注意模式的 lastIndex 属性每次都会变化。在全局匹配模式下,每次调用 exec()都会更新 lastIndex 值,以反映上次匹配的最后一个字符的索引。 + + ```javascript + let text = "cat, bat, sat, fat"; + let pattern = /.at/g; + + let matches = pattern.exec(text); + console.log(matches.index); // 0 + console.log(matches[0]); // cat + console.log(pattern.lastIndex); // 3 + + matches = pattern.exec(text); + console.log(matches.index); // 5 + console.log(matches[0]); // bat + console.log(pattern.lastIndex); // 8 + + matches = pattern.exec(text); + console.log(matches.index); // 10 + console.log(matches[0]); // sat + console.log(pattern.lastIndex); // 13 + ``` + + - 如果模式设置了粘附标记 y,则每次调用 exec() 就只会在 lastIndex 的位置上寻找匹配项。粘附标记覆盖全局标记。 + + ```javascript + let text = "cat, bat, sat, fat"; + let pattern = /.at/y; + + let matches = pattern.exec(text); + console.log(matches.index); // 0 + console.log(matches[0]); // cat + console.log(pattern.lastIndex); // 3 + + // 以索引 3 对应的字符开头找不到匹配项,因此 exec()返回 null + // exec()没找到匹配项,于是将 lastIndex 设置为 0 + matches = pattern.exec(text); + console.log(matches); // null + console.log(pattern.lastIndex); // 0 + + // 向前设置 lastIndex 可以让粘附的模式通过 exec()找到下一个匹配项: + pattern.lastIndex = 5; + matches = pattern.exec(text); + console.log(matches.index); // 5 + console.log(matches[0]); // bat + console.log(pattern.lastIndex); // 8 + ``` + +- 正则表达式的另一个方法是 `test()`,接收一个字符串参数。如果输入的文本与模式匹配,则参数返回 true,否则返回 false。这个方法适用于只想测试模式是否匹配,而不需要实际匹配内容的情况。 + +- 无论正则表达式是怎么创建的,继承的方法 toLocaleString() 和 toString() 都返回正则表达式的字面量表示。 + + - valueOf() 方法返回正则表达式本身。 + +### 5.2.3 RegExp 构造函数属性 + +可以通过两种不同的方式访问它们。换句话说,每个属性都有一个全名和一个简写。 + +![image-20210711160141212](JavaScript高级程序设计第四版-笔记.assets/image-20210711160141212.png) + +通过这些属性可以提取出与 exec()和 test()执行的操作相关的信息。来看下面的例子: + +```javascript +let text = "this has been a short summer"; +let pattern = /(.)hort/g; +if (pattern.test(text)) { + console.log(RegExp.input); // this has been a short summer + console.log(RegExp.leftContext); // this has been a + console.log(RegExp.rightContext); // summer + console.log(RegExp.lastMatch); // short + console.log(RegExp.lastParen); // s +} +``` + +注意 RegExp 构造函数的所有属性都没有任何 Web 标准出处,因此不要在生产环境中使用它们。 + + + +### 5.2.4 模式局限 + +虽然 ECMAScript 对正则表达式的支持有了长足的进步,但仍然缺少 Perl 语言中的一些高级特性。下列特性目前还没有得到 ECMAScript 的支持(想要了解更多信息,可以参考 Regular-Expressions.info +网站): +- \A 和\Z 锚(分别匹配字符串的开始和末尾) +- 联合及交叉类 +- 原子组 +- x(忽略空格)匹配模式 +- 条件式匹配 +- 正则表达式注释 +虽然还有这些局限,但 ECMAScript 的正则表达式已经非常强大,可以用于大多数模式匹配任务。 + + + +## 5.3 原始值包装类型 + +- ECMAScript 提供了 3 种特殊的引用类型: Boolean、 Number 和 String。 +- 具有与各自原始类型对应的特殊行为。每当用到某个原始值的方法或属性时,后台都会创建一个相应原始包装类型的对象,从而暴露出操作原始值的各种方法。 +- 在以读模式访问字符串值的任何时候,后台都会执行以下 3 步: + 1. 创建一个 String 类型的实例; + 2. 调用实例上的特定方法; + 3. 销毁实例。 +- 可以把这 3 步想象成执行了如下 3 行 ECMAScript 代码: + +```javascript +let s1 = new String("some text"); +let s2 = s1.substring(2); +s1 = null; +``` + +- 这种行为可以让原始值拥有对象的行为。对布尔值和数值而言,以上 3 步也会在后台发生,只不过使用的是 Boolean 和 Number 包装类型而已。 + +- 引用类型与原始值包装类型的主要区别在于对象的生命周期。 + + - 在通过 new 实例化引用类型后,得到的实例会在离开作用域时被销毁,而自动创建的原始值包装对象则只存在于访问它的那行代码执行期间。 + - 这意味着不能在运行时给原始值添加属性和方法。 + +- 可以显式地使用 Boolean、 Number 和 String 构造函数创建原始值包装对象。不过应该在确实必要时再这么做,否则容易让开发者疑惑,分不清它们到底是原始值还是引用值。 + + - 在原始值包装类型的实例上调用 typeof 会返回"object",**所有原始值包装对象都会转换为布尔值 true**。 + +- Object 构造函数作为一个工厂方法,能够根据传入值的类型返回相应原始值包装类型的实例。 + +- 注意,使用 new 调用原始值包装类型的构造函数,与调用同名的转型函数并不一样。 + + ```javascript + let value = "25"; + let number = Number(value); // 转型函数 + console.log(typeof number); // "number" + let obj = new Number(value); // 构造函数 + console.log(typeof obj); // "object" + ``` + + + +### 5.3.1 Boolean + +- `let booleanObject = new Boolean(true);` +- Boolean 的实例会重写 valueOf() 方法,返回一个原始值 true 或 false。 +- toString() 方法被调用时也会被覆盖,返回字符串"true"或"false"。 +- 理解原始布尔值和 Boolean 对象之间的区别非常重要,**强烈建议永远不要使用后者。** + +### 5.3.2 Number + +- Number 是对应数值的引用类型。要创建一个 Number 对象,就使用 Number 构造函数并传入一个数值。 + + `let numberObject = new Number(10); ` + +- 与 Boolean 类型一样, Number 类型重写了 valueOf()、 toLocaleString()和 toString()方法。 + + - `valueOf()` 方法返回 Number 对象表示的原始数值,另外两个方法返回数值字符串。 + - `toString()` 方法可选地接收一个表示基数的参数,并返回相应基数形式的数值字符串 。 + + ```javascript + let num = 10; + console.log(num.toString()); // "10" + console.log(num.toString(2)); // "1010" + console.log(num.toString(8)); // "12" + console.log(num.toString(10)); // "10" + console.log(num.toString(16)); // "a" + ``` + +- 除了继承的方法, Number 类型还提供了几个用于将数值格式化为字符串的方法。 + + - `toFixed()` 方法返回包含指定小数点位数的数值字符串 + + ```javascript + let num = 10; + console.log(num.toFixed(2)); // "10.00" + ``` + + - 如果数值本身的小数位超过了参数指定的位数,则四舍五入 。 + - 注意 toFixed() 方法可以表示有 **0~20 个小数位的数值**。某些浏览器可能支持更大的范围,但这是通常被支持的范围。 + + - `toExponential()`,返回以科学记数法(也称为指数记数法)表示的数值字符串。 + + - 接收一个参数,表示结果中小数的位数。 + + ```javascript + let num = 10; + console.log(num.toExponential(1)); // "1.0e+1" + ``` + + - 这么小的数不用表示为科学记数法形式。如果想得到数值最适当的形式,那么可以使用 `toPrecision()`。 + + - `toPrecision()`方法会根据情况返回最合理的输出结果,可能是固定长度,也可能是科学记数法形式。 + + - 这个方法接收一个参数,表示结果中**数字的总位数(不包含指数)**。 + + ```javascript + let num = 99; + console.log(num.toPrecision(1)); // "1e+2" + console.log(num.toPrecision(2)); // "99" + console.log(num.toPrecision(3)); // "99.0" + ``` + + - 本质上, toPrecision() 方法会根据数值和精度来决定调用 toFixed()还是 toExponential()。 + - 为了以正确的小数位精确表示数值,这 3 个方法都会向上或向下舍入。 + - toPrecision()方法可以表示带 1~21 个小数位的数值。 + +- **不建议直接实例化 Number 对象。** + +- `isInteger()` 方法与 `Number.isSafeInteger()` + + - ES6 新增了 `Number.isInteger()`方法,用于辨别一个数值是否保存为整数。 + - 有时候,小数位的 0可能会让人误以为数值是一个浮点值: + + ```javascript + console.log(Number.isInteger(1)); // true + console.log(Number.isInteger(1.00)); // true + console.log(Number.isInteger(1.01)); // false + ``` + + - 这个数值范围从 `Number.MIN_SAFE_INTEGER`( $-2^{53} + 1$)到 `Number.MAX_SAFE_INTEGER`( $2^{53} -1$)。对超出这个范围的数值,即使尝试保存为整数, IEEE 754 编码格式也意味着二进制值可能会表示一个完全不同的数值。为了鉴别整数是否在这个范围内,可以使 `Number.isSafeInteger()`方法: + + ```javascript + console.log(Number.isSafeInteger(-1 * (2 ** 53))); // false + console.log(Number.isSafeInteger(-1 * (2 ** 53) + 1)); // true + console.log(Number.isSafeInteger(2 ** 53)); // false + console.log(Number.isSafeInteger((2 ** 53) - 1)); // true + ``` + + + +### 5.3.3 String + +- `let stringObject = new String("hello world"); ` + +- 3 个继承的方法 valueOf()、 toLocaleString() 和 toString() 都返回对象的原始字符串值。 + +- 每个 String 对象都有一个 length 属性,表示字符串中字符的数量。 + + ```javascript + let stringValue = "hello world"; + console.log(stringValue.length); // "11" + ``` + + - 注意,即使字符串中包含双字节字符(而不是单字节的 ASCII 字符),也仍然会按单字符来计数。 + +1. **JavaScript 字符** + + - JavaScript 字符串由 **16 位码元( code unit)**组成。对多数字符来说,每 16 位码元对应一个字符。 + + - **`charAt()`** 方法返回给定索引位置的字符,由传给方法的整数参数指定。具体来说,这个方法查找指定索引位置的 16 位码元,并返回该码元对应的字符。 + - **方括号是获取字符的一种现代化方法**,而 `charAt` 是历史原因才存在的。它们之间的唯一区别是,如果没有找到字符,`[]` 返回 `undefined`,而 `charAt` 返回一个空字符串: + - 使用 **`charCodeAt()`**方法可以查看指定码元的字符编码。这个方法返回指定索引位置的码元值,索引以整数指定。 + - **`fromCharCode()`**方法用于根据给定的 **UTF-16 码元**创建字符串中的字符。这个方法可以接受任意多个数值,并返回将所有数值对应的字符拼接起来的字符串。 + - 对于 U+0000~U+FFFF 范围内的字符, `length、 charAt()、charCodeAt()和 fromCharCode()`返回的结果都跟预期是一样的。这是因为在这个范围内,每个字符都是用 16 位表示的,而这几个方法也都基于 16 位码元完成操作。只要字符编码大小与码元大小一一对应这些方法就能如期工作。 + + - 16 位只能唯一表示65 536 个字符。这对于大多数语言字符集是足够了,在 Unicode 中称为**基本多语言平面( BMP)**。 + + - 为了表示更多的字符, Unicode 采用了一个策略,即每个字符使用另外 16 位去选择一个**增补平面**。 + - 这种每个字符使用两个 16 位码元的策略称为**代理对**。 + + - 在涉及增补平面的字符时,前面讨论的字符串方法就会出问题。比如,下面的例子中使用了一个笑脸表情符号,也就是一个使用代理对编码的字符: + + ```javascript + // "smiling face with smiling eyes" 表情符号的编码是 U+1F60A + // 0x1F60A === 128522 + let message = "ab😊de"; + console.log(message.length); // 6 + console.log(message.charAt(1)); // b + console.log(message.charAt(2)); // + console.log(message.charAt(3)); // + console.log(message.charAt(4)); // d + + console.log(message.charCodeAt(1)); // 98 + console.log(message.charCodeAt(2)); // 55357 + console.log(message.charCodeAt(3)); // 56842 + console.log(message.charCodeAt(4)); // 100 + + console.log(String.fromCodePoint(0x1F60A)); // ☺ + console.log(String.fromCharCode(97, 98, 55357, 56842, 100, 101)); // ab☺de + ``` + + - fromCharCode() 方法仍然返回正确的结果,因为它实际上是基于提供的二进制表示直接组合成字符串。浏览器可以正确解析代理对(由两个码元构成),并正确地将其识别为一个Unicode 笑脸字符。 + + - **`codePointAt()`** 接收 16 位码元的索引并返回该索引位置上的**码点( code point)**。 + + - **码点是 Unicode 中一个字符的完整标识。** + - 比如, "c"的码点是 0x0063,而"😊"的码点是 0x1F60A。 + - 码点可能是 16 位,也可能是 32 位,而 codePointAt()方法可以从指定码元位置识别完整的码点。 + + ```javascript + let message = "ab😊de"; + console.log(message.codePointAt(1)); // 98 + console.log(message.codePointAt(2)); // 128522 + console.log(message.codePointAt(3)); // 56842 + console.log(message.codePointAt(4)); // 100 + ``` + + - 注意,如果传入的码元索引并非代理对的开头,就会返回错误的码点。这种错误只有检测单个字符的时候才会出现,可以通过从左到右按正确的码元数遍历字符串来规避。 + + - fromCharCode() 也有一个对应的 **`fromCodePoint()`**。 + + ```javascript + console.log(String.fromCharCode(97, 98, 55357, 56842, 100, 101)); // ab😊de + console.log(String.fromCodePoint(97, 98, 128522, 100, 101)); // ab😊de + ``` + +2. **`normalize()方法`** + + 1. 某些 Unicode 字符可以有多种编码方式。有的字符既可以通过一个 BMP 字符表示,也可以通过一个代理对表示。 + + ```javascript + // U+00C5:上面带圆圈的大写拉丁字母 A + console.log(String.fromCharCode(0x00C5)); // Å + // U+212B:长度单位“埃” + console.log(String.fromCharCode(0x212B)); // Å + // U+004:大写拉丁字母 A + // U+030A:上面加个圆圈 + console.log(String.fromCharCode(0x0041, 0x030A)); // Å + + + // 比较操作符不在乎字符看起来是什么样的,因此这 3 个字符互不相等。 + let a1 = String.fromCharCode(0x00C5), + a2 = String.fromCharCode(0x212B), + a3 = String.fromCharCode(0x0041, 0x030A); + console.log(a1, a2, a3); // Å, Å, Å + console.log(a1 === a2); // false + console.log(a1 === a3); // false + console.log(a2 === a3); // false + ``` + + 2. Unicode 提供了 4 种规范化形式,可以将类似上面的字符规范化为一致的格式,无论底层字符的代码是什么。 + + 1. 这 4 种规范化形式是: `NFD( Normalization Form D)、 NFC( Normalization Form C)、NFKD( Normalization Form KD)和 NFKC( Normalization Form KC)`。 + 2. 可以使用 `normalize()` 方法对字符串应用上述规范化形式,使用时需要传入表示哪种形式的字符串: `"NFD"、 "NFC"、"NFKD"或"NFKC"`。 + + 3. 通过比较字符串与其调用 normalize()的返回值,就可以知道该字符串是否已经规范化了: + + ```javascript + let a1 = String.fromCharCode(0x00C5), + a2 = String.fromCharCode(0x212B), + a3 = String.fromCharCode(0x0041, 0x030A); + + // U+00C5 是对 0+212B 进行 NFC/NFKC 规范化之后的结果 + console.log(a1 === a1.normalize("NFD")); // false + console.log(a1 === a1.normalize("NFC")); // true + console.log(a1 === a1.normalize("NFKD")); // false + console.log(a1 === a1.normalize("NFKC")); // true + + // U+212B 是未规范化的 + console.log(a2 === a2.normalize("NFD")); // false + console.log(a2 === a2.normalize("NFC")); // false + console.log(a2 === a2.normalize("NFKD")); // false + console.log(a2 === a2.normalize("NFKC")); // false + + // U+0041/U+030A 是对 0+212B 进行 NFD/NFKD 规范化之后的结果 + console.log(a3 === a3.normalize("NFD")); // true + console.log(a3 === a3.normalize("NFC")); // false + console.log(a3 === a3.normalize("NFKD")); // true + console.log(a3 === a3.normalize("NFKC")); // false + + //选择同一种规范化形式可以让比较操作符返回正确的结果: + let a1 = String.fromCharCode(0x00C5), + a2 = String.fromCharCode(0x212B), + a3 = String.fromCharCode(0x0041, 0x030A); + console.log(a1.normalize("NFD") === a2.normalize("NFD")); // true + console.log(a2.normalize("NFKC") === a3.normalize("NFKC")); // true + console.log(a1.normalize("NFC") === a3.normalize("NFC")); // true + ``` + +3. **字符串操作方法** + + 1. concat(),用于将一个或多个字符串拼接成一个新字符串。 + + - 更常用的方式是使用加号操作符( +)。 + + ```javascript + let stringValue = "hello "; + let result = stringValue.concat("world", "!"); + + console.log(result); // "hello world!" + console.log(stringValue); // "hello" + ``` + + 2. **`slice()、 substr()和 substring()`** + + - 第一个参数表示子字符串开始的位置,第二个参数表示子字符串结束的位置。 + + ```javascript + let stringValue = "hello world"; + console.log(stringValue.slice(3)); // "lo world" + console.log(stringValue.substring(3)); // "lo world" + console.log(stringValue.substr(3)); // "lo world" + console.log(stringValue.slice(3, 7)); // "lo w" + console.log(stringValue.substring(3, 7)); // "lo w" + + // substr() 第二个参数对它而言表示返回的字符数。 + console.log(stringValue.substr(3, 7)); // "lo worl" + ``` + + - 当某个参数是负值时,这 3 个方法的行为又有不同。 + - `slice()` 方法将所有负值参数都当成字符串长度加上负参数值。 + - `substr()` 方法将第一个负参数值当成字符串长度加上该值,将第二个负参数值转换为 0。 + - `substring()`方法会将所有负参数值都转换为 0。 + + ```javascript + let stringValue = "hello world"; + console.log(stringValue.slice(-3)); // "rld" + console.log(stringValue.substring(-3)); // "hello world" + console.log(stringValue.substr(-3)); // "rld" + console.log(stringValue.slice(3, -4)); // "lo w" + console.log(stringValue.substring(3, -4)); // "hel" + console.log(stringValue.substr(3, -4)); // "" (empty string) + ``` + + - 在第二个参数是负值时,这 3 个方法各不相同。 + - slice()方法将第二个参数转换为 7 (11-4),实际上相当于调用 slice(3, 7),因此返回"lo w"。 + - 而 substring()方法会将第二个参数转换为 0,相当于调用substring(3, 0),等价于 substring(0, 3),这是因为这个方法会将较小的参数作为起点,将较大的参数作为终点。 + - 对 substr()来说,第二个参数会被转换为 0,意味着返回的字符串包含零个字符,因而会返回一个空字符串。 + +4. **字符串位置方法** + + - **`indexOf()和 lastIndexOf()`**。 + + - 这两个方法从字符串中搜索传入的字符串,并返回位置(如果没找到,则返回-1)。 + - 两者的区别在于, indexOf() 方法从字符串开头开始查找子字符串,而 lastIndexOf() 方法从字符串末尾开始查找子字符串。 + + - 这两个方法都可以接收可选的第二个参数,表示开始搜索的位置。这意味着, + + - indexOf() 会从这个参数指定的位置开始向字符串末尾搜索,忽略该位置之前的字符; + - lastIndexOf() 则会从这个参数指定的位置开始向字符串开头搜索,忽略该位置之后直到字符串末尾的字符。 + + ```javascript + let stringValue = "hello world"; + console.log(stringValue.indexOf("o", 6)); // 7 + console.log(stringValue.lastIndexOf("o", 6)); // 4 + ``` + +5. **字符串包含方法** + + ECMAScript 6 增加了 3 个用于判断字符串中是否包含另一个字符串的方法: `startsWith()、endsWith()和 includes()`。 + + - 这些方法都会从字符串中搜索传入的字符串,并返回一个表示是否包含 + 的布尔值。 + - 它们的区别在于: + 1. **`startsWith()`** 检查开始于索引 0 的匹配项。 + 2. **`endsWith()`** 检查开始于索引 `(string.length - substring.length)` 的匹配项。 + 3. **`includes()`** 检查整个字符串。 + + ```javascript + let message = "foobarbaz"; + + console.log(message.startsWith("foo")); // true + console.log(message.startsWith("bar")); // false + + console.log(message.endsWith("baz")); // true + console.log(message.endsWith("bar")); // false + + console.log(message.includes("bar")); // true + console.log(message.includes("qux")); // false + ``` + + - startsWith() 和 includes() 方法接收可选的第二个参数,表示开始搜索的位置。如果传入第二个参数,则意味着这两个方法会从指定位置向着字符串末尾搜索,忽略该位置之前的所有字符。 + +6. **`trim()方法`** + + - ECMAScript 在所有字符串上都提供了 trim()方法。这个方法会创建字符串的一个副本,删除前、后所有空格符(和末尾换行符),再返回结果。 + - `trimLeft() 和 trimRight()` 方法分别用于从字符串开始和末尾清理空格符。 + +7. **`repeat()方法`** + + - 这个方法接收一个整数参数,表示要将字符串复制多少次,然后返回拼接所有副本后的结果。 + +8. **`padStart()和 padEnd()方法 `** + + - padStart()和 padEnd()方法会复制字符串,如果小于指定长度,则在相应一边填充字符,直至满足长度条件。这两个方法的第一个参数是长度,第二个参数是可选的填充字符串,默认为空格( U+0020)。 + + ```javascript + let stringValue = "foo"; + console.log(stringValue.padStart(6)); // " foo" + console.log(stringValue.padStart(9, ".")); // "......foo" + console.log(stringValue.padEnd(6)); // "foo " + console.log(stringValue.padEnd(9, ".")); // "foo......" + ``` + + - 可选的第二个参数并不限于一个字符。如果提供了多个字符的字符串,则会将其拼接并截断以匹配指定长度。此外,如果长度小于或等于字符串长度,则会返回原始字符串。 + +9. **字符串迭代与解构** + + - 字符串的原型上暴露了一个`@@iterator` 方法,表示可以迭代字符串的每个字符。可以像下面这样手动使用迭代器: + + ```javascript + let message = "abc"; + let stringIterator = message[Symbol.iterator](); + + console.log(stringIterator.next()); // {value: "a", done: false} + console.log(stringIterator.next()); // {value: "b", done: false} + console.log(stringIterator.next()); // {value: "c", done: false} + console.log(stringIterator.next()); // {value: undefined, done: true} + ``` + + - 有了这个迭代器之后,字符串就可以通过解构操作符来解构了。比如,可以更方便地把字符串分割为字符数组: + + ```javascript + let message = "abcde"; + console.log([...message]); // ["a", "b", "c", "d", "e"] + ``` + +10. **字符串大小写转换** + + - 包括 4 个方法: `toLowerCase()、 toLocaleLowerCase()、 toUpperCase()和toLocaleUpperCase()` 。 + - toLowerCase()和toUpperCase()方法是原来就有的方法,与 java.lang.String 中的方法同名。 + - toLocaleLowerCase() 和 toLocaleUpperCase() 方法旨在基于特定地区实现。在很多地区,地区特定的方法与通用的方法是一样的。但在少数语言中(如土耳其语),Unicode 大小写转换需应用特殊规则,要使用地区特定的方法才能实现正确转换。 + - 通常,如果不知道代码涉及什么语言,则最好使用地区特定的转换方法。 + +11. **字符串模式匹配方法** + + - **`match() 方法`** + + - 这个方法本质上跟 RegExp 对象的 exec()方法相同。 match()方法接收一个参数,可以是一个正则表达式字符串,也可以是一个 RegExp 对象。 + - match() 方法返回的数组与 RegExp 对象的 exec() 方法返回的数组是一样的:第一个元素是与整个模式匹配的字符串,其余元素则是与表达式中的捕获组匹配的字符串(如果有的话)。 + - 不能直接匹配双引号内的元字符,需要正则表达式。 + + ```javascript + let text = "cat, bat, sat, fat"; + let pattern = /.at/; + + // 等价于 pattern.exec(text) + let matches = text.match(pattern); + console.log(matches.index); // 0 + console.log(matches[0]); // "cat" + console.log(pattern.lastIndex); // 0 + ``` + + - **`search()`** + + - 这个方法唯一的参数与 match()方法一样:正则表达式字符串或 RegExp 对象。这个方法返回模式第一个匹配的位置索引,如果没找到则返回 -1。 + - search() 始终从字符串开头向后匹配模式。 + + - **`replace()方法 `** + + - 这个方法接收两个参数,第一个参数可以是一个 RegExp 对象或一个字符串(这个字符串不会转换为正则表达式),第二个参数可以是一个字符串或一个函数。 + - 如果第一个参数是字符串,那么只会替换第一个子字符串。要想替换所有子字符串,第一个参数必须为正则表达式并且带全局标记。 + - 第二个参数是字符串的情况下,有几个特殊的字符序列,可以用来插入正则表达式操作的值。ECMA-262 中规定了下表中的值。 + - 使用这些特殊的序列,可以在替换文本中使用之前匹配的内容,如下面的例子所示: + + ![image-20210711193851091](JavaScript高级程序设计第四版-笔记.assets/image-20210711193851091.png) + + ```javascript + let text = "cat, bat, sat, fat"; + result = text.replace(/(.at)/g, "word ($1)"); + console.log(result); // word (cat), word (bat), word (sat), word (fat) + ``` + + - `replace()` 的第二个参数可以是一个函数。 + + - 在只有一个匹配项时,这个函数会收到 3 个参数:与整个模式匹配的字符串、匹配项在字符串中的开始位置,以及整个字符串。 + - 在有多个捕获组的情况下,每个匹配捕获组的字符串也会作为参数传给这个函数,但最后两个参数还是与整个模式匹配的开始位置和原始字符串。这个函数应该返回一个字符串,表示应该把匹配项替换成什么。使用函数作为第二个参数可以更细致地控制替换过程。 + + ```javascript + function htmlEscape(text) { + return text.replace(/[<>"&]/g, function (match, pos, originalText) { + switch (match) { + case "<": + return "<"; + case ">": + return ">"; + case "&": + return "&"; + case "\"": + return """; + } + }); + } + console.log(htmlEscape("

    Hello world!

    ")); + // "<p class="greeting">Hello world!

    " + ``` + + - 函数 htmlEscape()用于将一段 HTML 中的 4 个字符替换成对应的实体:小于号、大于号、和号,还有双引号(都必须经过转义)。 + + - **`split()`** + + - 这个方法会根据传入的分隔符将字符串拆分成数组。作为分隔符的参数可以是字符串,也可以是 RegExp 对象。(字符串分隔符不会被这个方法当成正则表达式。)还可以传入第二个参数,即数组大小,确保返回的数组不会超过指定大小。 + + ```javascript + let colorText = "red,blue,green,yellow"; + let colors1 = colorText.split(","); // ["red", "blue", "green", "yellow"] + let colors2 = colorText.split(",", 2); // ["red", "blue"] + let colors3 = colorText.split(/[^,]+/); // ["", ",", ",", ",", ""] + ``` + + + +12. **`localeCompare()方法 `** + + - 这个方法比较两个字符串,返回如下 3 个值中的一个。 + - 如果按照字母表顺序,字符串应该排在字符串参数前头,则返回负值。(通常是-1,具体还要看与实际值相关的实现。) + - 如果字符串与字符串参数相等,则返回 0。 + - 如果按照字母表顺序,字符串应该排在字符串参数后头,则返回正值。(通常是 1,具体还要看与实际值相关的实现。) + + ```javascript + let stringValue = "yellow"; + console.log(stringValue.localeCompare("brick")); // 1 + console.log(stringValue.localeCompare("yellow")); // 0 + console.log(stringValue.localeCompare("zoo")); // -1 + + function determineOrder(value) { + let result = stringValue.localeCompare(value); + if (result < 0) { + console.log(`The string 'yellow' comes before the string '${value}'.`); + } else if (result > 0) { + console.log(`The string 'yellow' comes after the string '${value}'.`); + } else { + console.log(`The string 'yellow' is equal to the string '${value}'.`); + } + } + determineOrder("brick"); + determineOrder("yellow"); + determineOrder("zoo"); + ``` + + - `localeCompare()` 的独特之处在于,实现所在的地区(国家和语言)决定了这个方法如何比较字符串。在美国,英语是 ECMAScript 实现的标准语言, `localeCompare()` 区分大小写,大写字母排在小写字母前面。但其他地区未必是这种情况。 + +13. **HTML 方法** + + - 这些方法基本上已经没有人使用了,因为结果通常不是语义化的标记。 + + + +## 5.4 单例内置对象 + +ECMA-262 对内置对象的定义是“任何由 ECMAScript 实现提供、与宿主环境无关,并在 ECMAScript 程序开始执行时就存在的对象”。这就意味着,开发者不用显式地实例化内置对象,因为它们已经实例化好了。前面我们已经接触了大部分内置对象,包括 Object、 Array 和 String。本节介绍 ECMA-262定义的另外两个单例内置对象: Global 和 Math。 + +### 5.4.1 Global + +ECMA-262 规定 Global 对象为一种兜底对象,它所针对的是不属于任何对象的属性和方法。事实上,不存在全局变量或全局函数这种东西。在全局作用域中定义的变量和函数都会变成 Global 对象的属性 。本书前面介绍的函数,包括 `isNaN()、 isFinite()、 parseInt() 和 parseFloat()`,实际上都是 Global 对象的方法。除了这些, Global 对象上还有另外一些方法。 + +1. **URL 编码方法** + + - `encodeURI()和 encodeURIComponent()方法` + + - 用于编码统一资源标识符( URI),以便传给浏览器。有效的 URI 不能包含某些字符,比如空格。使用 URI 编码方法来编码 URI 可以让浏览器能够理解它们,同时又以特殊的 UTF-8 编码替换掉所有无效字符。 + + - `decodeURI()和 decodeURIComponent()。` + + - decodeURI() 只对使用 encodeURI() 编码过的字符解码。 + + ```javascript + let uri = "http://www.wrox.com/illegal value.js#start"; + // "http://www.wrox.com/illegal%20value.js#start" + console.log(encodeURI(uri)); + // "http%3A%2F%2Fwww.wrox.com%2Fillegal%20value.js%23start" + console.log(encodeURIComponent(uri)); + ``` + + - decodeURIComponent() 解码所有被 encodeURIComponent() 编码的字符,基本上就是解码所有特殊值。 + + ```javascript + let uri = "http%3A%2F%2Fwww.wrox.com%2Fillegal%20value.js%23start"; + // http%3A%2F%2Fwww.wrox.com%2Fillegal value.js%23start + console.log(decodeURI(uri)); + // http:// www.wrox.com/illegal value.js#start + console.log(decodeURIComponent(uri)); + ``` + +2. **`eval()` 方法** + + - 最后一个方法可能是整个 ECMAScript 语言中最强大的了,它就是 eval()。 + - 这个方法就是一个完整的 ECMAScript 解释器,它接收一个参数,即一个要执行的 ECMAScript( JavaScript)字符串。 + - 当解释器发现 eval()调用时,会将参数解释为实际的 ECMAScript 语句,然后将其插入到该位置。通过 eval()执行的代码属于该调用所在上下文,被执行的代码与该上下文拥有相同的作用域链。这意味着定义在包含上下文中的变量可以在 eval()调用内部被引用 。 + - 通过 eval()定义的任何变量和函数都不会被提升,这是因为在解析代码的时候,它们是被包含在一个字符串中的。它们只是在 eval()执行的时候才会被创建。 + - 在严格模式下,在 eval()内部创建的变量和函数无法被外部访问。换句话说,最后两个例子会报错。同样,在严格模式下,赋值给 eval 也会导致错误 。 + - **总结:**调用 `eval(code)` 会运行代码字符串,并返回最后一条语句的结果。 + - 在现代 JavaScript 编程中,很少使用它,通常也不需要使用它。 + - 可以访问外部局部变量。这被认为是一个不好的编程习惯。 + - 要在全局作用域中 `eval` 代码,可以使用 `window.eval(code)` 进行替代。 + - 此外,如果你的代码需要从外部作用域获取数据,请使用 `new Function`,并将数据作为参数传递给函数。 + + > 注意 解释代码字符串的能力是非常强大的,但也非常危险。在使用 eval()的时候必须极为慎重,特别是在解释用户输入的内容时。因为这个方法会对 XSS 利用暴露出很大的攻击面。恶意用户可能插入会导致你网站或应用崩溃的代码。 + +3. **Global 对象属性** + + ![image-20210711205301182](JavaScript高级程序设计第四版-笔记.assets/image-20210711205301182.png) + + ![image-20210711205332837](JavaScript高级程序设计第四版-笔记.assets/image-20210711205332837.png) + + + +4. **window 对象** + + - 虽然 ECMA-262 没有规定直接访问 Global 对象的方式,但浏览器将 window 对象实现为 Global 对象的代理。因此,所有全局作用域中声明的变量和函数都变成了 window 的属性。 + - 当一个函数在没有明确(通过成为某个对象的方法,或者通过 call()/apply())指定 this 值的情况下执行时, this 值等于 Global 对象。因此,调用一个简单返回 this 的函数是在任何执行上下文中获取 Global 对象的通用方式。 + + > 注意 window 对象在 JavaScript 中远不止实现了 ECMAScript 的 Global 对象那么简单。关于 window 对象的更多介绍,请参考第 12 章。 + + + +### 5.4.2 Math + +ECMAScript 提供了 Math 对象作为保存数学公式、信息和计算的地方。 Math 对象提供了一些辅助计算的属性和方法。 + +> 注意:Math 对象上提供的计算要比直接在 JavaScript 实现的快得多,因为 Math 对象上的计算使用了 JavaScript 引擎中更高效的实现和处理器指令。但使用 Math 计算的问题是精度会因浏览器、操作系统、指令集和硬件而异。 + +1. **Math 对象属性** + + ![image-20210711205531624](JavaScript高级程序设计第四版-笔记.assets/image-20210711205531624.png) + + + +2. **`min()和 max()方法`** + + - min()和 max()方法用于确定一组数值中的最小值和最大值。这两个方法都接收任意多个参数,如下面的例子所示: + + ```javascript + let max = Math.max(3, 54, 32, 16); + console.log(max); // 54 + + let min = Math.min(3, 54, 32, 16); + console.log(min); // 3 + ``` + + - 要知道数组中的最大值和最小值,可以像下面这样使用扩展操作符: + + ```javascript + let values = [1, 2, 3, 4, 5, 6, 7, 8]; + let max = Math.max(...values); + console.log(max); + ``` + + + +3. **舍入方法** + + - 把小数值舍入为整数的 4 个方法: `Math.ceil()、 Math.floor()、 Math.round()和 Math.fround()`。 + - Math.ceil()方法始终向上舍入为最接近的整数。 + - Math.floor()方法始终向下舍入为最接近的整数。 + - Math.round()方法执行四舍五入。 + - Math.fround()方法返回数值最接近的单精度( 32 位)浮点值表示。 + + ```javascript + console.log(Math.ceil(25.9)); // 26 + console.log(Math.ceil(25.5)); // 26 + console.log(Math.ceil(25.1)); // 26 + + console.log(Math.round(25.9)); // 26 + console.log(Math.round(25.5)); // 26 + console.log(Math.round(25.1)); // 25 + + console.log(Math.fround(0.4)); // 0.4000000059604645 + console.log(Math.fround(0.5)); // 0.5 + console.log(Math.fround(25.9)); // 25.899999618530273 + + console.log(Math.floor(25.9)); // 25 + console.log(Math.floor(25.5)); // 25 + console.log(Math.floor(25.1)); // 25 + ``` + + + +4. **`random()方法`** + + - Math.random() 方法返回一个 0~1 范围内的随机数,其中**包含 0 但不包含 1**。 + - 可以基于如下公式使用 Math.random()从一组整数中随机选择一个数: + - `number = Math.floor(Math.random() * total_number_of_choices + first_possible_value) ` + - 从 1~10 范围内随机选择一个数 + - `let num = Math.floor(Math.random() * 10 + 1); ` + + > 注意 Math.random()方法在这里出于演示目的是没有问题的。如果是为了加密而需要生成随机数(传给生成器的输入需要较高的不确定性),那么建议使用 window.crypto.getRandomValues()。 + +5. **其他方法** + + ![image-20210711210425719](JavaScript高级程序设计第四版-笔记.assets/image-20210711210425719.png) + + + +# 第6章 集合引用类型 + +## 6.1 Object + +虽然 Object 的实例没有多少功能,但很适合存储和在应用程序间交换数据。 + +- 显式地创建 Object 的实例有两种方式。 + + 1. 第一种是使用 new 操作符和 Object 构造函数 : + + ```javascript + let person = new Object(); + person.name = "Nicholas"; + person.age = 29; + ``` + + 2. 另一种方式是使用**对象字面量( object literal)表示法**。 + + ```javascript + let person = { + name: "Nicholas", + age: 29 + }; + ``` + + - 在这个例子中,左大括号( `{`)表示对象字面量开始,因为它出现在一个**表达式上下文( expression context)**中。 + - 在 ECMAScript 中,表达式上下文指的是期待返回值的上下文。赋值操作符表示后面要期待一个值,因此左大括号表示一个表达式的开始。 + - 同样是左大括号,如果出现在**语句上下文( statement context)**中,比如 if 语句的条件后面,则表示一个语句块的开始。 + +- 属性名可以是字符串或数值 + + - 数值属性会自动转换为字符串。 + +- **注意:在使用对象字面量表示法定义对象时,并不会实际调用 Object 构造函数。** + +- 虽然属性一般是通过**点语法**来存取的,这也是面向对象语言的惯例,但也可以使用**中括号**来存取属性。 + + - 从功能上讲,这两种存取属性的方式没有区别。使用中括号的主要优势就是可以通过变量访问属性。 + - 如果属性名中包含可能会导致语法错误的字符,或者包含关键字/保留字时,也可以使用中括号语法。 + + ```javascript + person["first name"] = "Nicholas"; + ``` + + + +## 6.2 Array + +ECMAScript 数组也是一组有序的数据,但跟其他语言不同的是,**数组中每个槽位可以存储任意类型的数据。**这意味着可以创建一个数组,它的第一个元素是字符串,第二个元素是数值,第三个是对象。 + +### 6.2.1 创建数组 + +- 一种是使用 Array 构造函数: + + - `let colors = new Array(); ` + - `let colors = new Array(20); ` + - `let colors = new Array("red", "blue", "green"); ` + - 创建数组时可以给构造函数传一个值。这时候就有点问题了,因为如果这个值是数值,则会创建一个长度为指定数值的数组;而如果这个值是其他类型的,则会创建一个只包含该特定值的数组。 + + ```javascript + let colors = new Array(3); // 创建一个包含 3 个元素的数组 + let names = new Array("Greg"); // 创建一个只包含一个元素,即字符串"Greg"的数组 + + //在使用 Array 构造函数时,也可以省略 new 操作符。结果是一样的,比如: + let colors = Array(3); // 创建一个包含 3 个元素的数组 + let names = Array("Greg"); // 创建一个只包含一个元素,即字符串"Greg"的数组 + ``` + +- 另一种创建数组的方式是使用**数组字面量( array literal)表示法**。数组字面量是在中括号中包含以逗号分隔的元素列表。 + + ```javascript + let colors = ["red", "blue", "green"]; // 创建一个包含 3 个元素的数组 + let names = []; // 创建一个空数组 + let values = [1,2,]; // 创建一个包含 2 个元素的数组 + ``` + + > 注意 与对象一样,在使用数组字面量表示法创建数组不会调用 Array 构造函数。 + +- Array 构造函数还有两个 **ES6 新增**的用于创建数组的静态方法: + + - **`from()`** 用于将**类数组结构转换为数组实例**, + + - `Array.from()`的第一个参数是一个类数组对象,即任何可迭代的结构,或者有一个 length 属性和可索引元素的结构。 + + ```javascript + // 字符串会被拆分为单字符数组 + console.log(Array.from("Matt")); // ["M", "a", "t", "t"] + + // 可以使用 from()将集合和映射转换为一个新数组 + const m = new Map().set(1, 2) + .set(3, 4); + const s = new Set().add(1) + .add(2) + .add(3) + .add(4); + + console.log(Array.from(m)); // [[1, 2], [3, 4]] + console.log(Array.from(s)); // [1, 2, 3, 4] + + // Array.from()对现有数组执行浅复制 + const a1 = [1, 2, 3, 4]; + const a2 = Array.from(a1); + console.log(a1); // [1, 2, 3, 4] + alert(a1 === a2); // false + + // 可以使用任何可迭代对象 + const iter = { + *[Symbol.iterator]() { + yield 1; + yield 2; + yield 3; + yield 4; + } + }; + console.log(Array.from(iter)); // [1, 2, 3, 4] + + // arguments 对象可以被轻松地转换为数组 + function getArgsArray() { + return Array.from(arguments); + } + console.log(getArgsArray(1, 2, 3, 4)); // [1, 2, 3, 4] + + // from()也能转换带有必要属性的自定义对象 + const arrayLikeObject = { + 0: 1, + 1: 2, + 2: 3, + 3: 4, + length: 4 + }; + console.log(Array.from(arrayLikeObject)); // [1, 2, 3, 4] + ``` + + - `Array.from()` 还接收第二个可选的映射函数参数。这个函数可以直接增强新数组的值,而无须像调用 `Array.from().map()`那样先创建一个中间数组。还可以接收第三个可选参数,用于指定映射函数中 this 的值。但这个重写的 this 值在箭头函数中不适用。 + + ```javascript + const a1 = [1, 2, 3, 4]; + const a2 = Array.from(a1, x => x**2); + const a3 = Array.from(a1, function(x) {return x**this.exponent}, {exponent: 2}); + console.log(a2); // [1, 4, 9, 16] + console.log(a3); // [1, 4, 9, 16] + ``` + + - **`of()`** 用于将**一组参数转换为数组实例**。 + + - `Array.of()`可以把一组参数转换为数组。这个方法用于替代在 ES6 之前常用的 `Array.prototype.slice.call(arguments)`,一种异常笨拙的将 arguments 对象转换为数组的写法: + + ```javascript + console.log(Array.of(1, 2, 3, 4)); // [1, 2, 3, 4] + console.log(Array.of(undefined)); // [undefined] + ``` + +### 6.2.2 数组空位 + +- 使用数组字面量初始化数组时,可以使用一串逗号来创建**空位( hole)**。 ECMAScript 会将逗号之间相应索引位置的值当成空位, ES6 规范重新定义了该如何处理这些空位。 + + ```javascript + const options = [,,,,,]; // 创建包含 5 个元素的数组 + console.log(options.length); // 5 + console.log(options); // [,,,,,] + ``` + + - ES6 新增的方法和迭代器与早期 ECMAScript 版本中存在的方法行为不同。 + - ES6 新增方法普遍将这些空位当成**存在的元素( empty )**,只不过值为 `undefined` 。 + - ES6 之前的方法则会忽略这个空位,但具体的行为也会因方法而异。 + + 注意:由于行为不一致和存在性能隐患,因此实践中要**避免使用数组空位。如果确实需要空位,则可以显式地用 undefined 值代替。** + +### 6.2.3 数组索引 + +- 在中括号中提供的索引表示要访问的值。 +- 设置数组的值方法也是一样的,就是替换指定位置的值。 + - 如果把一个值设置给超过数组最大索引的索引, 数组长度会自动扩展到该索引值加 1。 +- 数组中元素的数量保存在 length 属性中,这个属性始终返回 0 或大于 0 的值 。 + - 通过修改 length 属性,可以从数组末尾删除或添加元素。 + +- **注意:**数组最多可以包含 `4 294 967 295` 个元素,这对于大多数编程任务应该足够了。 + - 如果尝试添加更多项,则会导致抛出错误。以这个最大值作为初始值创建数组,可能导致脚本运行时间过长的错误。 + +### 6.2.4 检测数组 + +- 判断一个对象是不是数组。在只有一个网页(因而只有一个全局作用域)的情况下,使用 `instanceof` 操作符就足矣: + + ```javascript + if (value instanceof Array){ + // 操作数组 + } + ``` + + - 使用 instanceof 的问题是假定只有一个全局执行上下文。如果网页里有多个框架,则可能涉及两个不同的全局执行上下文,因此就会有两个不同版本的 Array 构造函数。如果要把数组从一个框架传给另一个框架,则这个数组的构造函数将有别于在第二个框架内本地创建的数组。 + +- **`Array.isArray()`方法**。 + + - 为解决上述问题 。 + - 这个方法的目的就是确定一个值是否为数组,而不用管它是在哪个全局执行上下文中创建的。 + + ```javascript + if (Array.isArray(value)){ + // 操作数组 + } + ``` + + + +### 6.2.5 迭代器方法 + +Array 的原型上暴露了 3 个用于检索数组内容的方法: keys()、 values()和 +entries()。 + +1. **`keys()`**返回数组索引的迭代器 +2. **`values()`**返回数组元素的迭代器 +3. **`entries()`**返回索引/值对的迭代器 + +```javascript +const a = ["foo", "bar", "baz", "qux"]; + +// 因为这些方法都返回迭代器,所以可以将它们的内容 +// 通过 Array.from()直接转换为数组实例 +const aKeys = Array.from(a.keys()); +const aValues = Array.from(a.values()); +const aEntries = Array.from(a.entries()); + +console.log(aKeys); // [0, 1, 2, 3] +console.log(aValues); // ["foo", "bar", "baz", "qux"] +console.log(aEntries); // [[0, "foo"], [1, "bar"], [2, "baz"], [3, "qux"]] + +// 使用 ES6 的解构可以非常容易地在循环中拆分键/值对: +// const a = ["foo", "bar", "baz", "qux"]; +for (const [idx, element] of a.entries()) { + console.log(idx); + console.log(element); +} +// 0 +// foo +// 1 +// bar +// 2 +// baz +// 3 +// qux + +console.log(...a.keys()); // 0 1 2 3 +console.log(...a.values()); // foo bar baz qux +console.log(...a.entries()); // [0, "foo"] [1, "bar"] [3, "qux"] +``` + + + +### 6.2.6 复制和填充方法 + +ES6 新增了两个方法:批量复制方法 `copyWithin()`,以及填充数组方法 `fill()`。这两个方法的函数签名类似,都需要指定既有数组实例上的一个范围,包含开始索引,不包含结束索引。使用这个方法不会改变数组的大小。 + +- **`fill()`**方法可以向一个已有的数组中插入全部或部分相同的值。 + + - 开始索引用于指定开始填充的位置,它是可选的。 + - 如果不提供结束索引,则一直填充到数组末尾。负值索引从数组末尾开始计算。也可以将负索引想象成数组长度加上它得到的一个正索引。 + + ```javascript + const zeroes = [0, 0, 0, 0, 0]; + + // 用 5 填充整个数组 + zeroes.fill(5); + console.log(zeroes); // [5, 5, 5, 5, 5] + zeroes.fill(0); // 重置 + + // 用 6 填充索引大于等于 3 的元素 + zeroes.fill(6, 3); + console.log(zeroes); // [0, 0, 0, 6, 6] + zeroes.fill(0); // 重置 + + // 用 7 填充索引大于等于 1 且小于 3 的元素 + zeroes.fill(7, 1, 3); + console.log(zeroes); // [0, 7, 7, 0, 0]; + zeroes.fill(0); // 重置 + + // 用 8 填充索引大于等于 1 且小于 4 的元素 + // (-4 + zeroes.length = 1) + // (-1 + zeroes.length = 4) + zeroes.fill(8, -4, -1); + console.log(zeroes); // [0, 8, 8, 8, 0]; + + // fill()静默忽略超出数组边界、零长度及方向相反的索引范围: + const zeroes = [0, 0, 0, 0, 0]; + + // 索引过低,忽略 + zeroes.fill(1, -10, -6); + console.log(zeroes); // [0, 0, 0, 0, 0] + + // 索引过高,忽略 + zeroes.fill(1, 10, 15); + console.log(zeroes); // [0, 0, 0, 0, 0] + + // 索引反向,忽略 + zeroes.fill(2, 4, 2); + console.log(zeroes); // [0, 0, 0, 0, 0] + + // 索引部分可用,填充可用部分 + zeroes.fill(4, 3, 10) + console.log(zeroes); // [0, 0, 0, 4, 4] + ``` + +- **`copyWithin()`** 会按照指定范围浅复制数组中的部分内容,然后将它们插入到指定索引开始的位置。开始索引和结束索引则与 `fill()`使用同样的计算方法: + + ```javascript + let ints, + reset = () => ints = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; + reset(); + + // 从 ints 中复制索引 0 开始的内容,插入到索引 5 开始的位置 + // 在源索引或目标索引到达数组边界时停止 + ints.copyWithin(5); + console.log(ints); // [0, 1, 2, 3, 4, 0, 1, 2, 3, 4] + reset(); + + // 从 ints 中复制索引 5 开始的内容,插入到索引 0 开始的位置 + ints.copyWithin(0, 5); + console.log(ints); // [5, 6, 7, 8, 9, 5, 6, 7, 8, 9] + reset(); + + // 从 ints 中复制索引 0 开始到索引 3 结束的内容 + // 插入到索引 4 开始的位置 + ints.copyWithin(4, 0, 3); + console.log(ints); // [0, 1, 2, 3, 0, 1, 2, 7, 8, 9] + reset(); + + // JavaScript 引擎在插值前会完整复制范围内的值 + // 因此复制期间不存在重写的风险 + ints.copyWithin(2, 0, 6); + console.log(ints); // [0, 1, 0, 1, 2, 3, 4, 5, 8, 9] + reset(); + + // 支持负索引值,与 fill()相对于数组末尾计算正向索引的过程是一样的 + ints.copyWithin(-4, -7, -3); + console.log(ints); // [0, 1, 2, 3, 4, 5, 3, 4, 5, 6] + + + // copyWithin() 静默忽略超出数组边界、 零长度及方向相反的索引范围: + // let ints, + // reset = () => ints = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; + // reset(); + + // 索引过低,忽略 + ints.copyWithin(1, -15, -12); + console.log(ints); // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; + reset() + + // 索引过高,忽略 + ints.copyWithin(1, 12, 15); + console.log(ints); // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; + reset(); + + // 索引反向,忽略 + ints.copyWithin(2, 4, 2); + console.log(ints); // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; + reset(); + + // 索引部分可用,复制、填充可用部分 + ints.copyWithin(4, 7, 10) + console.log(ints); // [0, 1, 2, 3, 7, 8, 9, 7, 8, 9]; + ``` + + + +### 6.2.7 转换方法 + +所有对象都有 `toLocaleString()、 toString()和 valueOf()`方法。 + +- `valueOf()`返回的还是数组本身。而 `toString()`返回由数组中每个值的等效字符串拼接而成的一个逗号分隔的字符串。 +- `toLocaleString()`方法也可能返回跟 toString()和 valueOf()相同的结果,但也不一定。在调用数组的 toLocaleString()方法时,会得到一个逗号分隔的数组值的字符串。 + - 它与另外两个方法唯一的区别是,为了得到最终的字符串,会调用数组每个值的 toLocaleString()方法,而不是toString()方法。 +- 如果想使用不同的分隔符,则可以使用 **`join()`**方法。 + - `join()` 方法接收一个参数,即字符串分隔符,返回包含所有项的字符串。 + - 如果不给 join()传入任何参数,或者传入 undefined,则仍然使用逗号作为分隔符。 +- **注意:** 如果数组中某一项是 `null 或 undefined`,则在 `join()、 toLocaleString()、toString()和 valueOf()`返回的结果中会以空字符串表示。 + +### 6.2.8 栈方法 + +数组对象可以像栈一样,也就是一种限制插入和删除项的数据结构。 + +- 栈是一种**后进先出( LIFO, Last-In-First-Out)的结构**,也就是最近添加的项先被删除。 +- 数据项的**插入(称为推入, push)**和**删除(称为弹出, pop)**只在栈的一个地方发生,即**栈顶**。 +- ECMAScript 数组提供了 push() 和 pop() 方法,以实现类似栈的行为。 + - **`push()`**方法接收任意数量的参数,并将它们添加到数组末尾,返回数组的最新长度。 + - **`pop()`**方法则用于删除数组的最后一项,同时减少数组的 length 值,返回被删除的项。 + +### 6.2.9 队列方法 + +- 队列以**先进先出( FIFO, First-In-First-Out)**形式限制访问。 + - 队列在列表末尾添加数据,但从列表开头获取数据。因为有了在数据末尾添加数据的 push() 方法,所以要模拟队列就差一个从数组开头取得数据的方法了。 +- 这个数组方法叫 **`shift()`**,它会删除数组的第一项并返回它,然后数组长度减 1。 + - 使用 shift() 和 push(),可以把数组当成队列来使用。 +- **`unshift() 方法`**。 + - `unshift()` 就是执行跟 `shift()` 相反的操作:在数组开头添加任意多个值,然后返回新的数组长度。 + - 通过使用 unshift() 和 pop() ,可以在相反方向上模拟队列,即在数组开头添加新数据,在数组末尾取得数据。 + +### 6.2.10 排序方法 + +数组有两个方法可以用来对元素重新排序: reverse() 和 sort()。 + +- 顾名思义, **`reverse() 方法`**就是将数组元素反向排列。比如: + + ```javascript + let values = [1, 2, 3, 4, 5]; + values.reverse(); + alert(values); // 5,4,3,2,1 + ``` + +- 默认情况下, **`sort()`** 会按照升序重新排列数组元素,即最小的值在前面,最大的值在后面。 + + - 为此,**sort() 会在每一项上调用 String() 转型函数,然后比较字符串来决定顺序**。 + - 即使数组的元素都是数值,也会先把数组转换为字符串再比较、排序。比如: + + ```javascript + let values = [0, 1, 5, 10, 15]; + values.sort(); + alert(values); // 0,1,10,15,5 + ``` + + - sort() 方法可以接收一个比较函数,用于判断哪个值应该排在前面。 + + - 比较函数接收两个参数: + - 如果第一个参数应该排在第二个参数前面,就返回负值;如果两个参数相等,就返回 0; + - 如果第一个参数应该排在第二个参数后面,就返回正值。 + + ```javascript + function compare(value1, value2) { + if (value1 < value2) { + return -1; + } else if (value1 > value2) { + return 1; + } else { + return 0; + } + } + + let values = [0, 1, 5, 10, 15]; + // values.sort(compare); + // alert(values); // 0,1,5,10,15 + + values.sort((a, b) => a < b ? 1 : a > b ? -1 : 0); + alert(values); // 15,10,5,1,0 + ``` + +- **注意:**reverse()和 sort()都返回调用它们的数组的引用。 + +- 如果数组的元素是数值,比较函数就是要返回小于 0、 0 和大于 0 的数值,因此减法操作完全可以满足要求。 + + ```javascript + function compare(value1, value2){ + return value2 - value1; + } + ``` + + + +### 6.2.11 操作方法 + +- **`concat()方法`**可以在现有数组全部元素基础上创建一个新数组。 + + - 它首先会创建一个当前数组的副本,然后再把它的参数添加到副本末尾,最后返回这个新构建的数组。 + + - 如果传入一个或多个数组,则 concat()会把这些数组的每一项都添加到结果数组。 + + - 如果参数不是数组,则直接把它们添加到结果数组末尾。 + + - 打平数组参数的行为可以重写,方法是在参数数组上指定一个特殊的符号: `Symbol.isConcatSpreadable`。 + + - 这个符号能够阻止 `concat()`打平参数数组。 + - 相反,把这个值设置为 true 可以强制打平类数组对象。 + + ```javascript + let colors = ["red", "green", "blue"]; + let newColors = ["black", "brown"]; + let moreNewColors = { + [Symbol.isConcatSpreadable]: true, + length: 2, + 0: "pink", + 1: "cyan" + }; + + newColors[Symbol.isConcatSpreadable] = false; + + // 强制不打平数组 + let colors2 = colors.concat("yellow", newColors); + + // 强制打平类数组对象 + let colors3 = colors.concat(moreNewColors); + + console.log(colors); // ["red", "green", "blue"] + console.log(colors2); // ["red", "green", "blue", "yellow", ["black", "brown"]] + console.log(colors3); // ["red", "green", "blue", "pink", "cyan"] + ``` + +- **`方法 slice()`** 用于创建一个包含原有数组中一个或多个元素的新数组。 + + - `slice()`方法可以接收一个或两个参数:返回元素的开始索引和结束索引。 + - 如果只有一个参数,则 `slice()`会返回该索引到数组末尾的所有元素。 + - 如果有两个参数,则 `slice()`返回从开始索引到结束索引对应的所有元素,其中不包含结束索引对应的元素。 + - 记住,这个操作不影响原始数组。 + + ```javascript + 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 + ``` + + - **注意:** 如果 slice() 的参数有负值,那么就以数值长度加上这个负值的结果确定位置。比如,在包含 5 个元素的数组上调用 slice(-2,-1),就相当于调用 slice(3,4)。如果结束位置小于开始位置,则返回空数组。 + +- **`splice()`** 的主要目的是在数组中间插入元素,但有 3 种不同的方式使用这个方法。 + + 1. **删除。** + - 需要给 splice() 传 2 个参数:要删除的第一个元素的位置和要删除的元素数量。 + - 可以从数组中删除任意多个元素,比如 splice(0, 2)会删除前两个元素。 + 2. **插入。** + - 需要给 splice() 传 3 个参数:开始位置、 0(要删除的元素数量)和要插入的元素,可以在数组中指定的位置插入元素。 + - 第三个参数之后还可以传第四个、第五个参数,乃至任意多个要插入的元素。 + - 比如, splice(2, 0, "red", "green")会从数组位置 2 开始插入字符串"red"和"green"。 + 3. **替换。** + - splice() 在删除元素的同时可以在指定位置插入新元素,同样要传入 3 个参数:开始位置、要删除元素的数量和要插入的任意多个元素。要插入的元素数量不一定跟删除的元素数量一致。 + - 比如, `splice(2, 1, "red", "green")`会在位置 2 删除一个元素,然后从该位置开始向数组中插入"red"和"green"。 + + `splice()` 方法始终返回一个数组,它包含从数组中被删除的元素(如果没有删除元素,则返回空数组)。 + + ```javascript + let colors = ["red", "green", "blue"]; + let removed = colors.splice(0, 1); // 删除第一项 + + alert(colors); // green,blue + alert(removed); // red,只有一个元素的数组 + + removed = colors.splice(1, 0, "yellow", "orange"); // 在位置 1 插入两个元素 + alert(colors); // green,yellow,orange,blue + alert(removed); // 空数组 + + removed = colors.splice(1, 1, "red", "purple"); // 插入两个值,删除一个元素 + alert(colors); // green,red,purple,orange,blue + alert(removed); // yellow,只有一个元素的数组 + ``` + + + +### 6.2.12 搜索和位置方法 + +ECMAScript 提供两类搜索数组的方法:按严格相等搜索和按断言函数搜索。 + +1. **严格相等** + + - ECMAScript 提供了 3 个严格相等的搜索方法: `indexOf()、lastIndexOf()和 includes()`。 + - 其中,前两个方法在所有版本中都可用,而第三个方法是 ECMAScript 7 新增的。 + - 这些方法都接收两个参数: + - 要查找的元素和 + - 一个可选的起始搜索位置。 + - `indexOf()和 includes()`方法从数组前头(第一项)开始向后搜索,而 `lastIndexOf()`从数组末尾(最后一项)开始向前搜索。 + - `indexOf()和 lastIndexOf()`都返回要查找的元素在数组中的位置,如果没找到则返回 -1。 + - `includes()`返回布尔值,表示是否至少找到一个与指定元素匹配的项。 + - 在比较第一个参数跟数组每一项时,会使用全等( `===`)比较,也就是说两项**必须严格相等**。 + + ```javascript + let numbers = [1, 2, 3, 4, 5, 4, 3, 2, 1]; + + console.log(numbers.indexOf(4)); // 3 + console.log(numbers.lastIndexOf(4)); // 5 + console.log(numbers.includes(4)); // true + + console.log(numbers.indexOf(4, 4)); // 5 + console.log(numbers.lastIndexOf(4, 4)); // 3 + console.log(numbers.includes(4, 7)); // false + + let person = { + name: "Nicholas" + }; + let people = [{ + name: "Nicholas" + }]; + let morePeople = [person]; + + console.log(people.indexOf(person)); // -1 + console.log(morePeople.indexOf(person)); // 0 + console.log(people.includes(person)); // false + console.log(morePeople.includes(person)); // true + console.log(morePeople, people, person); + ``` + + + +2. **断言函数** + + - ECMAScript 也允许按照定义的断言函数搜索数组,每个索引都会调用这个函数。断言函数的返回值决定了相应索引的元素是否被认为匹配。 + - 断言函数接收 3 个参数:元素、索引和数组本身。 + - 其中元素是数组中当前搜索的元素,索引是当前元素的索引,而数组就是正在搜索的数组。 + - 断言函数返回真值,表示是否匹配。 + - **`find() 和 findIndex()`** 方法使用了断言函数。这两个方法都从数组的最小索引开始。 + - find() 返回第一个匹配的元素, + - findIndex() 返回第一个匹配元素的索引。 + - 这两个方法也都接收第二个可选的参数,用于指定断言函数内部 this 的值。 + - 找到匹配项后,这两个方法都不再继续搜索。 + + ```javascript + const people = [{ + name: "Matt", + age: 27 + }, + { + name: "Nicholas", + age: 29 + } + ]; + + console.log(people.find((element, index, array) => element.age < 28)); + // {name: "Matt", age: 27} + + console.log(people.findIndex((element, index, array) => element.age < 28)); + // 0 + ``` + + + +### 6.2.13 迭代方法 + +ECMAScript 为数组定义了 5 个迭代方法。 + +- 每个方法接收两个参数: + + - 以每一项为参数运行的函数, + - 以及可选的作为函数运行上下文的作用域对象(影响函数中 this 的值)。 + +- 传给每个方法的函数接收 3 个参数:数组元素、元素索引和数组本身。 + + - 因具体方法而异,这个函数的执行结果可能会也可能不会影响方法的返回值。 + +- 数组的 5 个迭代方法如下。 + + 1. **`every()`**: 对数组每一项都运行传入的函数,如果对每一项函数都返回 true, 则这个方法返回 true。 + 2. **`filter()`**:对数组每一项都运行传入的函数,函数返回 true 的项会组成数组之后返回。 + 3. **`forEach()`**:对数组每一项都运行传入的函数,没有返回值。 + 4. **`map()`**:对数组每一项都运行传入的函数,返回由每次函数调用的结果构成的数组。 + 5. **`some()`**:对数组每一项都运行传入的函数,如果有一项函数返回 true,则这个方法返回 true。 + + 这些方法都不改变调用它们的数组。 + + ```javascript + let numbers = [1, 2, 3, 4, 5, 4, 3, 2, 1]; + + let everyResult = numbers.every((item, index, array) => item > 2); + console.log(everyResult); // false + + let someResult = numbers.some((item, index, array) => item > 2); + console.log(someResult); // true + + let filterResult = numbers.filter((item, index, array) => item > 2); + console.log(filterResult); // 3,4,5,4,3 + + let mapResult = numbers.map((item, index, array) => item * 2); + console.log(mapResult); // 2,4,6,8,10,8,6,4,2 + + numbers.forEach((item, index, array) => { + // 执行某些操作 + }); + ``` + + + +### 6.2.14 归并方法 + +ECMAScript 为数组提供了两个归并方法: **`reduce()`** 和 **`reduceRight()`**。 + +- 这两个方法都会迭代数组的所有项,并在此基础上构建一个最终返回值。 + +- `reduce()` 方法从数组第一项开始遍历到最后一项。 + +- 而 `reduceRight()` 从最后一项开始遍历至第一项。 + + - 这两个方法都接收两个参数:对每一项都会运行的**归并函数**,以及可选的以之为归并的**初始值**。 + - 传给 `reduce()` 和 `reduceRight()` 的函数接收 4 个参数: + - **上一个归并值**、**当前项**、**当前项的索引**和**数组本身**。 + - `accumulator 累计器` + - `currentValue 当前值` + - `currentIndex 当前索引` + - `array 数组` + - 这个函数**返回的任何值**都会作为下一次调用同一个函数的第一个参数。 + - 如果没有给这两个方法传入可选的第二个参数(作为归并起点值),则第一次迭代将从数组的第二项开始,因此传给归并函数的第一个参数是数组的第一项,第二个参数是数组的第二项。 + + ```javascript + let values = [1, 2, 3, 4, 5]; + let sum = values.reduce((prev, cur, index, array) => { + console.log(prev, cur); + return cur; + }); + + sum = values.reduceRight(function (prev, cur, index, array) { + return prev + cur; + }); + alert(sum); // 15 + ``` + + + +## 6.3 定型数组 + +**定型数组( typed array)**是 ECMAScript 新增的结构,目的是提升向原生库传输数据的效率。 + +实际上,JavaScript 并没有“TypedArray”类型,它所指的其实是一种特殊的包含数值类型的数组。为理解如何使用定型数组,有必要先了解一下它的用途。 + +### 6.3.1 历史 + +其目标是开发一套 JavaScript API,从而充分利用 3D 图形 API 和 GPU 加速,以便在``元素上渲染复杂的图形。 + +1. WebGL + - JavaScript API 是基于 OpenGL ES( OpenGL for Embedded Systems) 2.0 规范的。 OpenGL ES是 OpenGL 专注于 2D 和 3D 计算机图形的子集。这个新 API 被命名为 WebGL( Web Graphics Library),于 2011 年发布 1.0 版。有了它,开发者就能够编写涉及复杂图形的应用程序,它会被兼容 WebGL 的浏览器原生解释执行。 +2. 定型数组 + - CanvasFloatArray。这是一个提供JavaScript 接口的、 C 语言风格的浮点值数组。 JavaScript 运行时使用这个类型可以分配、读取和写入数组。这个数组可以直接传给底层图形驱动程序 API,也可以直接从底层获取到。最终, CanvasFloatArray变成了 Float32Array,也就是今天定型数组中可用的第一个“类型”。 + +### 6.3.2 ArrayBuffer + +- Float32Array 实际上是一种“视图”,可以允许 JavaScript 运行时访问一块名为 ArrayBuffer 的预分配内存。 ArrayBuffer 是所有定型数组及视图引用的基本单位。 +- `ArrayBuffer()`是一个普通的 JavaScript 构造函数,可用于在内存中分配特定数量的字节空间。 +- ArrayBuffer 一经创建就不能再调整大小。不过,可以使用 slice()复制其全部或部分到一个新实例中。 +- ArrayBuffer 某种程度上类似于 C++的 malloc(),但也有几个明显的区别。 + - malloc()在分配失败时会返回一个 null 指针。 ArrayBuffer 在分配失败时会抛出错误。 + - malloc()可以利用虚拟内存,因此最大可分配尺寸只受可寻址系统内存限制。 ArrayBuffer分配的内存不能超过 Number.MAX_SAFE_INTEGER( 253 -1)字节。 + - malloc()调用成功不会初始化实际的地址。声明 ArrayBuffer 则会将所有二进制位初始化为 0。 + - 通过 malloc() 分配的堆内存除非调用 free()或程序退出,否则系统不能再使用。而通过声明 ArrayBuffer 分配的堆内存可以被当成垃圾回收,不用手动释放。 +- 不能仅通过对 ArrayBuffer 的引用就读取或写入其内容。要读取或写入 ArrayBuffer,就必须通过视图。视图有不同的类型,但引用的都是 ArrayBuffer 中存储的二进制数据。 + +### 6.3.3 DataView + +第一种允许你读写 ArrayBuffer 的视图是 DataView。这个视图专为文件 I/O 和网络 I/O 设计,其API 支持对缓冲数据的高度控制,但相比于其他类型的视图性能也差一些。 DataView 对缓冲内容没有任何预设,也不能迭代。 + +必须在对已有的 ArrayBuffer 读取或写入时才能创建 DataView 实例。这个实例可以使用全部或部分 ArrayBuffer,且维护着对该缓冲实例的引用,以及视图在缓冲中开始的位置。 + +```javascript +const buf = new ArrayBuffer(16); + +// DataView 默认使用整个 ArrayBuffer +const fullDataView = new DataView(buf); +alert(fullDataView.byteOffset); // 0 +alert(fullDataView.byteLength); // 16 +alert(fullDataView.buffer === buf); // true + +// 构造函数接收一个可选的字节偏移量和字节长度 +// byteOffset=0 表示视图从缓冲起点开始 +// byteLength=8 限制视图为前 8 个字节 +const firstHalfDataView = new DataView(buf, 0, 8); +alert(firstHalfDataView.byteOffset); // 0 +alert(firstHalfDataView.byteLength); // 8 +alert(firstHalfDataView.buffer === buf); // true + +// 如果不指定,则 DataView 会使用剩余的缓冲 +// byteOffset=8 表示视图从缓冲的第 9 个字节开始 +// byteLength 未指定,默认为剩余缓冲 +const secondHalfDataView = new DataView(buf, 8); +alert(secondHalfDataView.byteOffset); // 8 +alert(secondHalfDataView.byteLength); // 8 +alert(secondHalfDataView.buffer === buf); // true +``` + +要通过 DataView 读取缓冲,还需要几个组件。 + +- 首先是要读或写的字节偏移量。可以看成 DataView 中的某种“地址”。 +- DataView 应该使用 ElementType 来实现 JavaScript 的 Number 类型到缓冲内二进制格式的转换。 +- 最后是内存中值的字节序。默认为大端字节序。 + + + +1. **ElementType** + + - DataView 对存储在缓冲内的数据类型没有预设。它暴露的 API 强制开发者在读、写时指定一个ElementType,然后 DataView 就会忠实地为读、写而完成相应的转换。 + - ECMAScript 6 支持 8 种不同的 ElementType(见下表)。 + + ![image-20210712212850089](JavaScript高级程序设计第四版-笔记.assets/image-20210712212850089.png) + + - DataView 为上表中的每种类型都暴露了 get 和 set 方法,这些方法使用 byteOffset(字节偏移量)定位要读取或写入值的位置。类型是可以互换使用的,如下例所示: + + ```javascript + // 在内存中分配两个字节并声明一个 DataView + const buf = new ArrayBuffer(2); + const view = new DataView(buf); + + // 说明整个缓冲确实所有二进制位都是 0 + // 检查第一个和第二个字符 + alert(view.getInt8(0)); // 0 + alert(view.getInt8(1)); // 0 + + // 检查整个缓冲 + alert(view.getInt16(0)); // 0 + + // 将整个缓冲都设置为 1 + // 255 的二进制表示是 11111111( 2^8 - 1) + view.setUint8(0, 255); + + // DataView 会自动将数据转换为特定的 ElementType + // 255 的十六进制表示是 0xFF + view.setUint8(1, 0xFF); + + // 现在,缓冲里都是 1 了 + // 如果把它当成二补数的有符号整数,则应该是-1 + alert(view.getInt16(0)); // -1 + ``` + + + +2. **字节序** + + - DataView 只支持两种约定:大端字节序和小端字节序。 + - 大端字节序也称为“网络字节序”,意思是最高有效位保存在第一个字节,而最低有效位保存在最后一个字节。 + - 小端字节序正好相反,即最低有效位保存在第一个字节,最高有效位保存在最后一个字节。 + - JavaScript 运行时所在系统的原生字节序决定了如何读取或写入字节,但 DataView 并不遵守这个约定。 + - 对一段内存而言, DataView 是一个中立接口,它会遵循你指定的字节序。 + - DataView 的所有 API 方法都以大端字节序作为默认值,但接收一个可选的布尔值参数,设置为 true 即可启用小端字节序。 + + ```javascript + // 在内存中分配两个字节并声明一个 DataView + const buf = new ArrayBuffer(2); + const view = new DataView(buf); + + // 填充缓冲,让第一位和最后一位都是 1 + view.setUint8(0, 0x80); // 设置最左边的位等于 1 + view.setUint8(1, 0x01); // 设置最右边的位等于 1 + + // 缓冲内容(为方便阅读,人为加了空格) + // 0x8 0x0 0x0 0x1 + // 1000 0000 0000 0001 + // 按大端字节序读取 Uint16 + // 0x80 是高字节, 0x01 是低字节 + // 0x8001 = 2^15 + 2^0 = 32768 + 1 = 32769 + alert(view.getUint16(0)); // 32769 + + // 按小端字节序读取 Uint16 + // 0x01 是高字节, 0x80 是低字节 + // 0x0180 = 2^8 + 2^7 = 256 + 128 = 384 + alert(view.getUint16(0, true)); // 384 + + // 按大端字节序写入 Uint16 + view.setUint16(0, 0x0004); + + // 缓冲内容(为方便阅读,人为加了空格) + // 0x0 0x0 0x0 0x4 + // 0000 0000 0000 0100 + alert(view.getUint8(0)); // 0 + alert(view.getUint8(1)); // 4 + + // 按小端字节序写入 Uint16 + view.setUint16(0, 0x0002, true); + + // 缓冲内容(为方便阅读,人为加了空格) + // 0x0 0x2 0x0 0x0 + // 0000 0010 0000 0000 + alert(view.getUint8(0)); // 2 + alert(view.getUint8(1)); // 0 + ``` + +3. **边界情形** + + - DataView 完成读、写操作的前提是必须有充足的缓冲区,否则就会抛出 RangeError: + + ```javascript + const buf = new ArrayBuffer(6); + const view = new DataView(buf); + + // 尝试读取部分超出缓冲范围的值 + view.getInt32(4); + // RangeError + + // 尝试读取超出缓冲范围的值 + view.getInt32(8); + // RangeError + + // 尝试读取超出缓冲范围的值 + view.getInt32(-1); + // RangeError + + // 尝试写入超出缓冲范围的值 + view.setInt32(4, 123); + // RangeError + ``` + + + + - DataView 在写入缓冲里会尽最大努力把一个值转换为适当的类型,后备为 0。如果无法转换,则抛出错误: + + ```javascript + const buf = new ArrayBuffer(1); + const view = new DataView(buf); + + view.setInt8(0, 1.5); + alert(view.getInt8(0)); // 1 + + view.setInt8(0, [4]); + alert(view.getInt8(0)); // 4 + + view.setInt8(0, 'f'); + alert(view.getInt8(0)); // 0 + + view.setInt8(0, Symbol()); // TypeError + ``` + + + +### 6.3.4 定型数组 + +定型数组是另一种形式的 ArrayBuffer 视图。 + +- 虽然概念上与 DataView 接近,但定型数组的区别在于,它特定于一种 ElementType 且遵循系统原生的字节序。 + +- 相应地,定型数组提供了适用面更广的API 和更高的性能。 + +- 设计定型数组的目的就是提高与 WebGL 等原生库交换二进制数据的效率。 + +- 由于定型数组的二进制表示对操作系统而言是一种容易使用的格式, JavaScript 引擎可以重度优化算术运算、按位运算和其他对定型数组的常见操作,因此使用它们速度极快。 + +- 创建定型数组的方式包括**读取已有的缓冲、使用自有缓冲、填充可迭代结构,以及填充基于任意类型的定型数组**。 + +- 另外,通过**`.from()`**和**`.of()`**也可以创建定型数组: + + ```javascript + // 创建一个 12 字节的缓冲 + const buf = new ArrayBuffer(12); + // 创建一个引用该缓冲的 Int32Array + const ints = new Int32Array(buf); + // 这个定型数组知道自己的每个元素需要 4 字节 + // 因此长度为 3 + alert(ints.length); // 3 + + // 创建一个长度为 6 的 Int32Array + const ints2 = new Int32Array(6); + // 每个数值使用 4 字节,因此 ArrayBuffer 是 24 字节 + alert(ints2.length); // 6 + // 类似 DataView,定型数组也有一个指向关联缓冲的引用 + alert(ints2.buffer.byteLength); // 24 + + // 创建一个包含[2, 4, 6, 8]的 Int32Array + const ints3 = new Int32Array([2, 4, 6, 8]); + alert(ints3.length); // 4 + alert(ints3.buffer.byteLength); // 16 + alert(ints3[2]); // 6 + + // 通过复制 ints3 的值创建一个 Int16Array + const ints4 = new Int16Array(ints3); + // 这个新类型数组会分配自己的缓冲 + // 对应索引的每个值会相应地转换为新格式 + alert(ints4.length); // 4 + alert(ints4.buffer.byteLength); // 8 + alert(ints4[2]); // 6 + + // 基于普通数组来创建一个 Int16Array + const ints5 = Int16Array.from([3, 5, 7, 9]); + alert(ints5.length); // 4 + alert(ints5.buffer.byteLength); // 8 + alert(ints5[2]); // 7 + + // 基于传入的参数创建一个 Float32Array + const floats = Float32Array.of(3.14, 2.718, 1.618); + alert(floats.length); // 3 + alert(floats.buffer.byteLength); // 12 + alert(floats[2]); // 1.6180000305175781 + ``` + +- 定型数组的构造函数和实例都有一个 **BYTES_PER_ELEMENT** 属性,返回该类型数组中每个元素的大小: + + ```javascript + alert(Int16Array.BYTES_PER_ELEMENT); // 2 + alert(Int32Array.BYTES_PER_ELEMENT); // 4 + + const ints = new Int32Array(1), + floats = new Float64Array(1); + + alert(ints.BYTES_PER_ELEMENT); // 4 + alert(floats.BYTES_PER_ELEMENT); // 8 + + // 如果定型数组没有用任何值初始化,则其关联的缓冲会以 0 填充: + const ints = new Int32Array(4); + alert(ints[0]); // 0 + alert(ints[1]); // 0 + alert(ints[2]); // 0 + alert(ints[3]); // 0 + ``` + + + +1. **定型数组行为** + + - 从很多方面看,定型数组与普通数组都很相似。定型数组支持如下操作符、方法和属性: + + - `[]` + - `copyWithin()` + - `entries()` + + - `every()` + - `fill()` + - `filter()` + - `find()` + - `findIndex()` + - `forEach()` + - `indexOf()` + - `join()` + - `keys()` + - `lastIndexOf()` + - `length` + - `map()` + - `reduce()` + - `reduceRight()` + - `reverse()` + - `slice()` + - `some()` + - `sort()` + - `toLocaleString()` + - `toString()` + - `values()` + + - 其中,返回新数组的方法也会返回包含同样元素类型( element type)的新定型数组: + + ```javascript + const ints = new Int16Array([1, 2, 3]); + const doubleints = ints.map(x => 2*x); + alert(doubleints instanceof Int16Array); // true + ``` + + - 定型数组有一个 `Symbol.iterator` 符号属性,因此可以通过 `for..of` 循环和扩展操作符来操作 + +2. **合并、复制和修改定型数组** + + - **`set()`** + + - 从提供的**数组或定型数组**中把值复制到当前定型数组中指定的索引位置。 + + ```javascript + // 创建长度为 8 的 int16 数组 + const container = new Int16Array(8); + + // 把定型数组复制为前 4 个值 + // 偏移量默认为索引 0 + container.set(Int8Array.of(1, 2, 3, 4)); + console.log(container); // [1,2,3,4,0,0,0,0] + + // 把普通数组复制为后 4 个值 + // 偏移量 4 表示从索引 4 开始插入 + container.set([5,6,7,8], 4); + console.log(container); // [1,2,3,4,5,6,7,8] + + // 溢出会抛出错误 + container.set([5,6,7,8], 7); + // RangeError + ``` + + - **`subarray()`** 执行与 `set()` 相反的操作, + + - 它会基于从原始定型数组中复制的值返回一个新定型数组。 + - 复制值时的开始索引和结束索引是可选的: + + ```javascript + const source = Int16Array.of(2, 4, 6, 8); + + // 把整个数组复制为一个同类型的新数组 + const fullCopy = source.subarray(); + console.log(fullCopy); // [2, 4, 6, 8] + + // 从索引 2 开始复制数组 + const halfCopy = source.subarray(2); + console.log(halfCopy); // [6, 8] + + // 从索引 1 开始复制到索引 3 + const partialCopy = source.subarray(1, 3); + console.log(partialCopy); // [4, 6] + + // 定型数组没有原生的拼接能力, 但使用定型数组 API 提供的很多工具可以手动构建: + // 第一个参数是应该返回的数组类型 + // 其余参数是应该拼接在一起的定型数组 + function typedArrayConcat(typedArrayConstructor, ...typedArrays) { + // 计算所有数组中包含的元素总数 + const numElements = typedArrays.reduce((x, y) => (x.length || x) + y.length); + + // 按照提供的类型创建一个数组,为所有元素留出空间 + const resultArray = new typedArrayConstructor(numElements); + + // 依次转移数组 + let currentOffset = 0; + typedArrays.map(x => { + resultArray.set(x, currentOffset); + currentOffset += x.length; + }); + return resultArray; + } + + const concatArray = typedArrayConcat(Int32Array, + Int8Array.of(1, 2, 3), + Int16Array.of(4, 5, 6), + Float32Array.of(7, 8, 9)); + console.log(concatArray); // [1, 2, 3, 4, 5, 6, 7, 8, 9] + console.log(concatArray instanceof Int32Array); // true + ``` + + + +3. **下溢和上溢** + + - 定型数组中值的下溢和上溢不会影响到其他索引,但仍然需要考虑数组的元素应该是什么类型。 + + - 定型数组对于可以存储的每个索引只接受一个相关位,而不考虑它们对实际数值的影响。 + - 以下代码演示了如何处理下溢和上溢: + + ```javascript + // 长度为 2 的有符号整数数组 + // 每个索引保存一个二补数形式的有符号整数 + // 范围是-128( -1 * 2^7) ~127( 2^7 - 1) + const ints = new Int8Array(2); + + // 长度为 2 的无符号整数数组 + // 每个索引保存一个无符号整数 + // 范围是 0~255( 2^7 - 1) + const unsignedInts = new Uint8Array(2); + + // 上溢的位不会影响相邻索引 + // 索引只取最低有效位上的 8 位 + unsignedInts[1] = 256; // 0x100 + console.log(unsignedInts); // [0, 0] + unsignedInts[1] = 511; // 0x1FF + console.log(unsignedInts); // [0, 255] + + // 下溢的位会被转换为其无符号的等价值 + // 0xFF 是以二补数形式表示的-1(截取到 8 位) , + // 但 255 是一个无符号整数 + unsignedInts[1] = -1 // 0xFF (truncated to 8 bits) + console.log(unsignedInts); // [0, 255] + + // 上溢自动变成二补数形式 + // 0x80 是无符号整数的 128,是二补数形式的-128 + ints[1] = 128; // 0x80 + console.log(ints); // [0, -128] + + // 下溢自动变成二补数形式 + // 0xFF 是无符号整数的 255,是二补数形式的-1 + ints[1] = 255; // 0xFF + console.log(ints); // [0, -1] + ``` + + - 除了 8 种元素类型,还有一种“夹板”数组类型: Uint8ClampedArray,不允许任何方向溢出。超出最大值 255 的值会被向下舍入为 255,而小于最小值 0 的值会被向上舍入为 0。 + + - 按照 JavaScript 之父 Brendan Eich 的说法:“Uint8ClampedArray 完全是 HTML5canvas 元素的历史留存。除非真的做跟 canvas 相关的开发,否则不要使用它。” + + + +## 6.4 Map + +Map 是一种新的集合类型,为这门语言带来了真正的键/值存储机制。 Map 的大多数特性都可以通过 Object 类型实现,但二者之间还是存在一些细微的差异。 + +我们已经了解了以下复杂的数据结构: + +- 存储带键的数据(keyed)集合的对象。 +- 存储有序集合的数组。 + +但这还不足以应对现实情况。这就是为什么存在 `Map` 和 `Set`。 + +[Map](https://developer.mozilla.org/zh/docs/Web/JavaScript/Reference/Global_Objects/Map) 是一个带键的数据项的集合,就像一个 `Object` 一样。 但是它们最大的差别是 `Map` 允许任何类型的键(key)。 + +### 6.4.1 基本 API + +- `const m = new Map(); ` + +- 如果想在创建的同时初始化实例,可以给 Map 构造函数传入一个可迭代对象,需要包含键/值对数组。 + + - 可迭代对象中的每个键/值对都会按照迭代顺序插入到新映射实例中。 + + ```javascript + // 使用嵌套数组初始化映射 + const m1 = new Map([ + ["key1", "val1"], + ["key2", "val2"], + ["key3", "val3"] + ]); + alert(m1.size); // 3 + + // 使用自定义迭代器初始化映射 + const m2 = new Map({ + [Symbol.iterator]: function* () { + yield ["key1", "val1"]; + yield ["key2", "val2"]; + yield ["key3", "val3"]; + } + }); + alert(m2.size); // 3 + + // 映射期待的键/值对,无论是否提供 + const m3 = new Map([ + [] + ]); + alert(m3.has(undefined)); // true + alert(m3.get(undefined)); // undefined + ``` + +- 初始化之后,可以使用 **`set()`** 方法再添加键/值对。 + + - 另外,可以使用 **`get()`** 和 **`has()`**进行查询, + - 可以通过 **`size`** 属性获取映射中的键/值对的数量, + - 还可以使用 **`delete()`**和 **`clear()`** 删除值。 + + ```javascript + const m = new Map(); + + alert(m.has("firstName")); // false + alert(m.get("firstName")); // undefined + + alert(m.size); // 0 + + // set()方法返回映射实例,因此可以把多个操作连缀起来,包括初始化声明 + m.set("firstName", "Matt") + .set("lastName", "Frisbie"); + + alert(m.has("firstName")); // true + alert(m.get("firstName")); // Matt + alert(m.size); // 2 + + m.delete("firstName"); // 只删除这一个键/值对 + + alert(m.has("firstName")); // false + alert(m.has("lastName")); // true + alert(m.size); // 1 + + m.clear(); // 清除这个映射实例中的所有键/值对 + + alert(m.has("firstName")); // false + alert(m.has("lastName")); // false + alert(m.size); // 0 + ``` + +- 与 Object 只能使用数值、字符串或符号作为键不同, Map 可以使用任何 JavaScript 数据类型作为键。 + + - Map 内部使用 **SameValueZero** 比较操作( ECMAScript 规范内部定义,语言中不能使用),基本上相当于使用严格对象相等的标准来检查键的匹配性。 + - 与 Object 类似,映射的值是没有限制的。 + +- 与严格相等一样,在映射中用作键和值的对象及其他“集合”类型,在自己的内容或属性被修改时仍然保持不变。 + + ```javascript + const m = new Map(); + const objKey = {}, + objVal = {}, + arrKey = [], + arrVal = []; + m.set(objKey, objVal); + m.set(arrKey, arrVal); + objKey.foo = "foo"; + objVal.bar = "bar"; + arrKey.push("foo"); + arrVal.push("bar"); + console.log(m.get(objKey)); // {bar: "bar"} + console.log(m.get(arrKey)); // ["bar"] + + // SameValueZero 比较也可能导致意想不到的冲突: + // const m = new Map(); + const a = 0 / "", // NaN + b = 0 / "", // NaN + pz = +0, + nz = -0; + alert(a === b); // false + alert(pz === nz); // true + m.set(a, "foo"); + m.set(pz, "bar"); + alert(m.get(b)); // foo + alert(m.get(nz)); // bar + ``` + + + +### 6.4.2 顺序与迭代 + +- 与 Object 类型的一个主要差异是, Map 实例会维护键值对的插入顺序,因此可以根据插入顺序执行迭代操作。 + + - 映射实例可以提供一个迭代器( Iterator),能以插入顺序生成`[key, value]`形式的数组。 + - 可以通过 `entries()`方法(或者 `Symbol.iterator` 属性,它引用 `entries()`)取得这个迭代器。 + + ```javascript + const m = new Map([ + ["key1", "val1"], + ["key2", "val2"], + ["key3", "val3"] + ]); + alert(m.entries === m[Symbol.iterator]); // true + + for (let pair of m.entries()) { + alert(pair); + } + // [key1,val1] + // [key2,val2] + // [key3,val3] + + for (let pair of m[Symbol.iterator]()) { + alert(pair); + } + // [key1,val1] + // [key2,val2] + // [key3,val3] + ``` + + + +- 如果不使用迭代器,而是使用回调方式,则可以调用映射的 `forEach(callback, opt_thisArg)` 方法并传入回调,依次迭代每个键/值对。传入的回调接收可选的第二个参数,这个参数用于重写回调内部 `this` 的值。 + + ```javascript + const m = new Map([ + ["key1", "val1"], + ["key2", "val2"], + ["key3", "val3"] + ]); + + m.forEach((val, key) => alert(`${key} -> ${val}`)); + // key1 -> val1 + // key2 -> val2 + // key3 -> val3 + + + // keys() 和 values() 分别返回以插入顺序生成键和值的迭代器: + for (let key of m.keys()) { + alert(key); + } + // key1 + // key2 + // key3 + for (let key of m.values()) { + alert(key); + } + // value1 + // value2 + // value3 + ``` + + + +- 键和值在迭代器遍历时是可以修改的,但映射内部的引用则无法修改。当然,这并不妨碍修改作为键或值的对象内部的属性,因为这样并不影响它们在映射实例中的身份。 + + ```javascript + const m1 = new Map([ + ["key1", "val1"] + ]); + + // 作为键的字符串原始值是不能修改的 + for (let key of m1.keys()) { + key = "newKey"; + alert(key); // newKey + alert(m1.get("key1")); // val1 + } + const keyObj = { + id: 1 + }; + const m = new Map([ + [keyObj, "val1"] + ]); + + // 修改了作为键的对象的属性,但对象在映射内部仍然引用相同的值 + for (let key of m.keys()) { + key.id = "newKey"; + alert(key); // {id: "newKey"} + alert(m.get(keyObj)); // val1 + } + alert(keyObj); // {id: "newKey"} + ``` + + + +### 6.4.3 选择 Object 还是 Map + +对于多数 Web 开发任务来说,选择 Object 还是 Map 只是个人偏好问题,影响不大。不过,对于在乎内存和性能的开发者来说,对象和映射之间确实存在显著的差别。 + +1. **内存占用** + - Object 和 Map 的工程级实现在不同浏览器间存在明显差异,但存储单个键/值对所占用的内存数量都会随键的数量线性增加。批量添加或删除键/值对则取决于各浏览器对该类型内存分配的工程实现。 + - 不同浏览器的情况不同,但给定固定大小的内存, Map 大约可以比Object 多存储 50%的键/值对。 +2. **插入性能** + - 向 Object 和 Map 中插入新键/值对的消耗大致相当,不过插入 Map 在所有浏览器中一般会稍微快一点儿。 + - 对这两个类型来说,插入速度并不会随着键/值对数量而线性增加。如果代码涉及大量插入操作,那么显然 Map 的性能更佳。 +3. **查找速度** + - 与插入不同,从大型 Object 和 Map 中查找键/值对的性能差异极小,但如果只包含少量键/值对,则 Object 有时候速度更快。在把 Object 当成数组使用的情况下(比如使用连续整数作为属性),浏览器引擎可以进行优化,在内存中使用更高效的布局。 + - 这对 Map 来说是不可能的。对这两个类型而言,查找速度不会随着键/值对数量增加而线性增加。如果代码涉及大量查找操作,那么某些情况下可能选择 Object 更好一些。 +4. **删除性能** + - 使用 delete 删除 Object 属性的性能一直以来饱受诟病,目前在很多浏览器中仍然如此。为此,出现了一些伪删除对象属性的操作,包括把属性值设置为 undefined 或 null。但很多时候,这都是一种讨厌的或不适宜的折中。 + - 而对大多数浏览器引擎来说, Map 的 delete()操作都比插入和查找更快。如果代码涉及大量删除操作,那么毫无疑问应该选择 Map。 + +## 6.5 WeakMap + +ECMAScript 6 新增的**“弱映射”( WeakMap)**是一种新的集合类型,为这门语言带来了增强的键/值对存储机制。 + +WeakMap 是 Map 的“兄弟”类型,其 API 也是 Map 的子集。 + +WeakMap 中的 “weak”(弱),描述的是 JavaScript **垃圾回收程序对待“弱映射”中键的方式**。 + +### 6.5.1 基本 API + +- `const wm = new WeakMap(); ` + + - 弱映射中的**键**只能是 **Object 或者继承自 Object 的类型**,尝试使用非对象设置键会抛出TypeError。值的类型没有限制。 + +- 如果想在初始化时填充弱映射,则构造函数可以接收一个可迭代对象,其中需要包含键/值对数组。 + + - 可迭代对象中的每个键/值都会按照迭代顺序插入新实例中。 + + ```javascript + const key1 = { + id: 1 + }, + key2 = { + id: 2 + }, + key3 = { + id: 3 + }; + + // 使用嵌套数组初始化弱映射 + const wm1 = new WeakMap([ + [key1, "val1"], + [key2, "val2"], + [key3, "val3"] + ]); + alert(wm1.get(key1)); // val1 + alert(wm1.get(key2)); // val2 + alert(wm1.get(key3)); // val3 + + // 初始化是全有或全无的操作 + // 只要有一个键无效就会抛出错误,导致整个初始化失败 + const wm2 = new WeakMap([ + [key1, "val1"], + ["BADKEY", "val2"], + [key3, "val3"] + ]); + // TypeError: Invalid value used as WeakMap key + typeof wm2; + + // ReferenceError: wm2 is not defined + // 原始值可以先包装成对象再用作键 + const stringKey = new String("key1"); + const wm3 = new WeakMap([ + stringKey, "val1" + ]); + alert(wm3.get(stringKey)); // "val1" + ``` + +- 初始化之后可以使用 set() 再添加键/值对,可以使用 get() 和 has() 查询, 还可以使用 delete() 删除: + + ```javascript + const wm = new WeakMap(); + + const key1 = { + id: 1 + }, + key2 = { + id: 2 + }; + alert(wm.has(key1)); // false + alert(wm.get(key1)); // undefined + + // set()方法返回弱映射实例,因此可以把多个操作连缀起来,包括初始化声明: + wm.set(key1, "Matt") + .set(key2, "Frisbie"); + alert(wm.has(key1)); // true + alert(wm.get(key1)); // Matt + + wm.delete(key1); // 只删除这一个键/值对 + alert(wm.has(key1)); // false + alert(wm.has(key2)); // true + ``` + + + +### 6.5.2 弱键 + +WeakMap 中“weak”表示弱映射的键是“弱弱地拿着”的。意思就是,这些键不属于正式的引用,不会阻止垃圾回收。 + +但要注意的是,弱映射中值的引用可不是“弱弱地拿着”的。 + +**只要键存在,键/值对就会存在于映射中,并被当作对值的引用,因此就不会被当作垃圾回收**。 + +```javascript +const wm = new WeakMap(); +wm.set({}, "val"); +``` + +- `set()` 方法初始化了一个新对象并将它用作一个字符串的键。因为没有指向这个对象的其他引用,所以当这行代码执行完成后,这个对象键就会被当作垃圾回收。 +- 然后,这个键/值对就从弱映射中消失了,使其成为一个空映射。 +- 在这个例子中,因为值也没有被引用,所以这对键/值被破坏以后,值本身也会成为垃圾回收的目标。 + +```javascript +const wm = new WeakMap(); +const container = { + key: {} +}; +wm.set(container.key, "val"); + +function removeReference() { + container.key = null; +} +``` + +这一次, container 对象维护着一个对弱映射键的引用,因此这个对象键不会成为垃圾回收的目标。不过,如果调用了 `removeReference()`,就会摧毁键对象的最后一个引用,垃圾回收程序就可以把这个键/值对清理掉。 + + + +### 6.5.3 不可迭代键 + +- 因为 WeakMap 中的键/值对任何时候都可能被销毁,所以没必要提供迭代其键/值对的能力。 +- 当然,也用不着像 clear()这样一次性销毁所有键/值的方法。 WeakMap 确实没有这个方法。 +- 因为不可能迭代,所以也不可能在不知道对象引用的情况下从弱映射中取得值。即便代码可以访问 WeakMap 实例,也没办法看到其中的内容。 +- WeakMap 实例之所以限制只能用对象作为键,是为了保证只有通过键对象的引用才能取得值。 +- 如果允许原始值,那就没办法区分初始化时使用的字符串字面量和初始化之后使用的一个相等的字符串了。 + + + +### 6.5.4 使用弱映射 + +1. **私有变量** + + - 弱映射造就了在 JavaScript 中实现真正私有变量的一种新方式。 + - 私有变量会存储在弱映射中,以对象实例为键,以私有成员的字典为值。 + + ```javascript + const wm = new WeakMap(); + + class User { + constructor(id) { + this.idProperty = Symbol('id'); + this.setId(id); + } + setPrivate(property, value) { + const privateMembers = wm.get(this) || {}; + privateMembers[property] = value; + wm.set(this, privateMembers); + } + getPrivate(property) { + return wm.get(this)[property]; + } + setId(id) { + this.setPrivate(this.idProperty, id); + } + getId() { + return this.getPrivate(this.idProperty); + } + } + + const user = new User(123); + alert(user.getId()); // 123 + user.setId(456); + alert(user.getId()); // 456 + + // 并不是真正私有的 + alert(wm.get(user)[user.idProperty]); // 456 + ``` + + - 慧眼独具的读者会发现,对于上面的实现,外部代码只需要拿到对象实例的引用和弱映射,就可以取得“私有”变量了。为了避免这种访问,可以用一个闭包把 WeakMap 包装起来,这样就可以把弱映射与外界完全隔离开了: + + ```javascript + const User = (() => { + const wm = new WeakMap(); + class User { + constructor(id) { + this.idProperty = Symbol('id'); + this.setId(id); + } + setPrivate(property, value) { + const privateMembers = wm.get(this) || {}; + privateMembers[property] = value; + wm.set(this, privateMembers); + } + getPrivate(property) { + return wm.get(this)[property]; + } + setId(id) { + this.setPrivate(this.idProperty, id); + } + getId(id) { + return this.getPrivate(this.idProperty); + } + } + return User; + })(); + + const user = new User(123); + alert(user.getId()); // 123 + user.setId(456); + alert(user.getId()); // 456 + ``` + + - 这样拿不到弱映射中的健,也就无法取得弱映射中对应的值。 + - 虽然这防止了前面提到的访问,但整个代码也完全陷入了 ES6 之前的闭包私有变量模式。 + +2. **DOM 节点元数据** + + - 因为 WeakMap 实例不会妨碍垃圾回收,所以非常适合保存关联元数据。 + + - Map 例子: + + ```javascript + const m = new Map(); + const loginButton = document.querySelector('#login'); + + // 给这个节点关联一些元数据 + m.set(loginButton, { + disabled: true + }); + ``` + + - 假设在上面的代码执行后,页面被 JavaScript 改变了,原来的登录按钮从 DOM 树中被删掉了。 + - **但由于映射中还保存着按钮的引用**,所以对应的 DOM 节点仍然会逗留在内存中,除非明确将其从映射中删除或者等到映射本身被销毁。 + + - 如果这里使用的是弱映射,如以下代码所示,**那么当节点从 DOM 树中被删除后,垃圾回收程序就可以立即释放其内存**(假设没有其他地方引用这个对象): + + ```javascript + const wm = new WeakMap(); + const loginButton = document.querySelector('#login'); + + // 给这个节点关联一些元数据 + wm.set(loginButton, { + disabled: true + }); + ``` + + + +## 6.6 Set + +ECMAScript 6 新增的 Set 是一种新集合类型,为这门语言带来集合数据结构。 Set 在很多方面都像是加强的 Map,这是因为它们的大多数 API 和行为都是共有的。 + +`Set` 是一个特殊的类型集合 —— “**值的集合**”(没有键),它的**每一个值只能出现一次**。 + +### 6.6.1 基本 API + +- `const m = new Set(); ` + +- 在创建的同时初始化实例,则可以给 Set 构造函数传入一个可迭代对象,其中需要包含插入到新集合实例中的元素。 + + - 使用 `add()` 增加值, + - 使用 `has()` 查询, + - 通过 `size` 取得元素数量, + - 使用 `delete()` 和 `clear()` 删除元素: + + ```javascript + // 使用数组初始化集合 + const s1 = new Set(["val1", "val2", "val3"]); + alert(s1.size); // 3 + + // 使用自定义迭代器初始化集合 + const s2 = new Set({ + [Symbol.iterator]: function* () { + yield "val1"; + yield "val2"; + yield "val3"; + } + }); + alert(s2.size); // 3 + + + const s = new Set(); + + alert(s.has("Matt")); // false + alert(s.size); // 0 + + // add()返回集合的实例,所以可以将多个添加操作连缀起来,包括初始化 + s.add("Matt") + .add("Frisbie"); + alert(s.has("Matt")); // true + alert(s.size); // 2 + + s.delete("Matt"); + alert(s.has("Matt")); // false + alert(s.has("Frisbie")); // true + alert(s.size); // 1 + + s.clear(); // 销毁集合实例中的所有值 + + alert(s.has("Matt")); // false + alert(s.has("Frisbie")); // false + alert(s.size); // 0 + ``` + +- 与 Map 类似, Set 可以包含任何 JavaScript 数据类型作为值。集合也使用 SameValueZero 操作( ECMAScript 内部定义,无法在语言中使用),基本上相当于使用严格对象相等的标准来检查值的匹配性。 + +- 与严格相等一样,用作值的对象和其他“集合”类型在自己的内容或属性被修改时也不会改变。 + + ```javascript + const s = new Set(); + + const objVal = {}, + arrVal = []; + + s.add(objVal); + s.add(arrVal); + + objVal.bar = "bar"; + arrVal.push("bar"); + + alert(s.has(objVal)); // true + alert(s.has(arrVal)); // true + + s.clear(); // 销毁集合实例中的所有值 + + // add() 和 delete() 操作是幂等的。 delete() 返回一个布尔值, 表示集合中是否存在要删除的值: + + s.add('foo'); + alert(s.size); // 1 + s.add('foo'); + alert(s.size); // 1 + + // 集合里有这个值 + alert(s.delete('foo')); // true + + // 集合里没有这个值 + alert(s.delete('foo')); // false + ``` + +- 它的主要特点是,**重复使用同一个值调用 `set.add(value)` 并不会发生什么改变**。这就是 `Set` 里面的每一个值只出现一次的原因。 + +### 6.6.2 顺序与迭代 + +Set 会维护值插入时的顺序,因此支持按顺序迭代。 + +- 集合实例可以提供一个迭代器( Iterator),能以插入顺序生成集合内容。 + + - 可以通过 `values()` 方法及其别名方法 `keys()`(或者 `Symbol.iterator` 属性,它引用 `values()`)取得这个迭代器。 + - 同 Map。 + +- 因为 `values()` 是默认迭代器,所以可以直接对集合实例使用扩展操作,把集合转换为数组: + + ```javascript + const s = new Set(["val1", "val2", "val3"]); + console.log([...s]); // ["val1", "val2", "val3"] + ``` + +- 如果不使用迭代器,而是使用回调方式,则可以调用集合的 `forEach()`方法并传入回调,依次迭代每个键/值对。传入的回调接收可选的第二个参数,这个参数用于重写回调内部 this 的值。 + + - 修改集合中值的属性不会影响其作为集合值的身份。 + - 同 Map。 + +### 6.6.3 定义正式集合操作 + +从各方面来看, Set 跟 Map 都很相似,只是 API 稍有调整。 + +- 唯一需要强调的就是集合的 API 对自身的简单操作。 + +- 很多开发者都喜欢使用 Set 操作, + + - 但需要手动实现:或者是子类化 Set,或者是定义一个实用函数库。 + - 要把两种方式合二为一,可以在子类上实现静态方法,然后在实例方法中使用这些静态方法。 + +- 在实现这些操作时,需要考虑几个地方。 + + - 某些 Set 操作是有关联性的,因此最好让实现的方法能支持处理任意多个集合实例。 + - Set 保留插入顺序,所有方法返回的集合必须保证顺序。 + - 尽可能高效地使用内存。扩展操作符的语法很简洁,但尽可能避免集合和数组间的相互转换能够节省对象初始化成本。 + - 不要修改已有的集合实例。 `union(a, b)`或 `a.union(b)`应该返回包含结果的新集合实例。 + + ```javascript + class XSet extends Set { + union(...sets) { + return XSet.union(this, ...sets) + } + intersection(...sets) { + return XSet.intersection(this, ...sets); + } + difference(set) { + return XSet.difference(this, set); + } + symmetricDifference(set) { + return XSet.symmetricDifference(this, set); + } + cartesianProduct(set) { + return XSet.cartesianProduct(this, set); + } + powerSet() { + return XSet.powerSet(this); + } + + // 返回两个或更多集合的并集 + static union(a, ...bSets) { + const unionSet = new XSet(a); + for (const b of bSets) { + for (const bValue of b) { + unionSet.add(bValue); + } + } + return unionSet; + } + + // 返回两个或更多集合的交集 + static intersection(a, ...bSets) { + const intersectionSet = new XSet(a); + for (const aValue of intersectionSet) { + for (const b of bSets) { + if (!b.has(aValue)) { + intersectionSet.delete(aValue); + } + } + } + return intersectionSet; + } + + // 返回两个集合的差集 + static difference(a, b) { + const differenceSet = new XSet(a); + for (const bValue of b) { + if (a.has(bValue)) { + differenceSet.delete(bValue); + } + } + return differenceSet; + } + + // 返回两个集合的对称差集 + static symmetricDifference(a, b) { + // 按照定义,对称差集可以表达为 + return a.union(b).difference(a.intersection(b)); + } + + // 返回两个集合(数组对形式)的笛卡儿积 + // 必须返回数组集合,因为笛卡儿积可能包含相同值的对 + static cartesianProduct(a, b) { + const cartesianProductSet = new XSet(); + for (const aValue of a) { + for (const bValue of b) { + cartesianProductSet.add([aValue, bValue]); + } + } + return cartesianProductSet; + } + + // 返回一个集合的幂集 + static powerSet(a) { + const powerSet = new XSet().add(new XSet()); + for (const aValue of a) { + for (const set of new XSet(powerSet)) { + powerSet.add(new XSet(set).add(aValue)); + } + } + return powerSet; + } + } + ``` + + + +## 6.7 WeakSet + +ECMAScript 6 新增的“弱集合”( WeakSet)是一种新的集合类型,为这门语言带来了集合数据结构。 WeakSet 是 Set 的“兄弟”类型,其 API 也是 Set 的子集。 + +WeakSet 中的“weak”(弱),描述的是 JavaScript 垃圾回收程序对待“弱集合”中值的方式。 + +### 6.7.1 基本 API + +- `const ws = new WeakSet(); ` + +- 弱集合中的值只能是 Object 或者继承自 Object 的类型,尝试使用非对象设置值会抛出 TypeError。 + + - 如果想在初始化时填充弱集合,则构造函数可以接收一个可迭代对象,其中需要包含有效的值。 + - 可迭代对象中的每个值都会按照迭代顺序插入到新实例中。 + + ```javascript + const val1 = { + id: 1 + }, + val2 = { + id: 2 + }, + val3 = { + id: 3 + }; + + // 使用数组初始化弱集合 + const ws1 = new WeakSet([val1, val2, val3]); + alert(ws1.has(val1)); // true + alert(ws1.has(val2)); // true + alert(ws1.has(val3)); // true + + // 初始化是全有或全无的操作 + // 只要有一个值无效就会抛出错误,导致整个初始化失败 + const ws2 = new WeakSet([val1, "BADVAL", val3]); + // TypeError: Invalid value used in WeakSet + typeof ws2; + + // ReferenceError: ws2 is not defined + // 原始值可以先包装成对象再用作值 + const stringVal = new String("val1"); + const ws3 = new WeakSet([stringVal]); + alert(ws3.has(stringVal)); // true + ``` + +- 同 WeakMap。 + +### 6.7.2 弱值 + +```javascript +const ws = new WeakSet(); +ws.add({}); +``` + +- `add()`方法初始化了一个新对象,并将它用作一个值。因为没有指向这个对象的其他引用,所以当这行代码执行完成后,这个对象值就会被当作垃圾回收。然后,这个值就从弱集合中消失了,使其成为一个空集合。 + +```javascript +const ws = new WeakSet(); +const container = { + val: {} +}; +ws.add(container.val); + +function removeReference() { + container.val = null; +} +``` + +- 这一次, `container` 对象维护着一个对弱集合值的引用,因此这个对象值不会成为垃圾回收的目标。不过,如果调用了 `removeReference()`,就会摧毁值对象的最后一个引用,垃圾回收程序就可以把这个值清理掉。 + +### 6.7.3 不可迭代值 + +- 因为 WeakSet 中的值任何时候都可能被销毁,所以没必要提供迭代其值的能力。 + - 当然,也用不着像 `clear()`这样一次性销毁所有值的方法。 + - WeakSet 确实没有这个方法。因为不可能迭代,所以也不可能在不知道对象引用的情况下从弱集合中取得值。 + - 即便代码可以访问 WeakSet 实例,也没办法看到其中的内容。 + +- WeakSet 之所以限制只能用对象作为值,是为了保证只有通过值对象的引用才能取得值。 + - 如果允许原始值,那就没办法区分初始化时使用的字符串字面量和初始化之后使用的一个相等的字符串了。 + +### 6.7.4 使用弱集合 + +- 相比于 WeakMap 实例, WeakSet 实例的用处没有那么大。不过,弱集合在给对象打标签时还是有价值的。 + +```javascript +const disabledElements = new Set(); +const loginButton = document.querySelector('#login'); + +// 通过加入对应集合,给这个节点打上“禁用”标签 +disabledElements.add(loginButton); +``` + +- 这样,通过查询元素在不在 disabledElements 中,就可以知道它是不是被禁用了。不过,假如元素从 DOM 树中被删除了,它的引用却仍然保存在 Set 中,因此垃圾回收程序也不能回收它。 +- 为了让垃圾回收程序回收元素的内存,可以在这里使用 WeakSet: + +```javascript +const disabledElements = new WeakSet(); +const loginButton = document.querySelector('#login'); + +// 通过加入对应集合,给这个节点打上“禁用”标签 +disabledElements.add(loginButton); +``` + +- 这样,只要 WeakSet 中任何元素从 DOM 树中被删除,垃圾回收程序就可以忽略其存在,而立即释放其内存(假设没有其他地方引用这个对象)。 + +## 6.8 迭代与扩展操作 + +ECMAScript 6 新增的迭代器和扩展操作符对集合引用类型特别有用。这些新特性让集合类型之间相互操作、复制和修改变得异常方便。 + +> 注意 第 7 章会更详细地介绍迭代器和生成器。 + +- 如本章前面所示,有 4 种原生集合类型定义了默认迭代器: + + 1. Array + 2. 所有定型数组 + 3. Map + 4. Set + +- 很简单,这意味着上述所有类型都支持顺序迭代,都可以传入 for-of 循环。 + +- 这也意味着所有这些类型都兼容扩展操作符。 + + - 扩展操作符在对可迭代对象执行浅复制时特别有用,只需简单的语法就可以复制整个对象: + + ```javascript + let arr1 = [1, 2, 3]; + let arr2 = [...arr1]; + + console.log(arr1); // [1, 2, 3] + console.log(arr2); // [1, 2, 3] + console.log(arr1 === arr2); // false + ``` + +- 对于期待可迭代对象的构造函数,只要传入一个可迭代对象就可以实现复制: + + ```javascript + let map1 = new Map([ + [1, 2], + [3, 4] + ]); + let map2 = new Map(map1); + console.log(map1); // Map {1 => 2, 3 => 4} + console.log(map2); // Map {1 => 2, 3 => 4} + + // 当然, 也可以构建数组的部分元素: + let arr1 = [1, 2, 3]; + let arr2 = [0, ...arr1, 4, 5]; + console.log(arr2); // [0, 1, 2, 3, 4, 5] + + // 浅复制意味着只会复制对象引用: + arr1 = [{}]; + arr2 = [...arr1]; + arr1[0].foo = 'bar'; + console.log(arr2[0]); // { foo: 'bar' } + ``` + +- 上面的这些类型都支持多种构建方法,比如 `Array.of()` 和 `Array.from()` 静态方法。在与扩展操作符一起使用时,可以非常方便地实现互操作: + + ```javascript + let arr1 = [1, 2, 3]; + + // 把数组复制到定型数组 + let typedArr1 = Int16Array.of(...arr1); + let typedArr2 = Int16Array.from(arr1); + console.log(typedArr1); // Int16Array [1, 2, 3] + console.log(typedArr2); // Int16Array [1, 2, 3] + + // 把数组复制到映射 + let map = new Map(arr1.map((x) => [x, 'val' + x])); + console.log(map); // Map {1 => 'val 1', 2 => 'val 2', 3 => 'val 3'} + + // 把数组复制到集合 + let set = new Set(typedArr2); + console.log(set); // Set {1, 2, 3} + + // 把集合复制回数组 + let arr2 = [...set]; + console.log(arr2); // [1, 2, 3] + ``` + + + +# 第7章 迭代器与生成器 + +迭代的英文“iteration”源自拉丁文 itero,意思是“重复”或“再来”。 + +在软件开发领域,“迭代”的意思是按照顺序反复多次执行一段程序,通常会有明确的终止条件。 + +ECMAScript 6 规范新增了两个高级特性:迭代器和生成器。使用这两个特性,能够更清晰、高效、方便地实现迭代。 + +## 7.1 理解迭代 + +- 在 JavaScript 中,计数循环就是一种最简单的迭代: + + ```javascript + for (let i = 1; i <= 10; ++i) { + console.log(i); + } + ``` + +- 循环是迭代机制的基础,这是因为它可以指定迭代的次数,以及每次迭代要执行什么操作。每次循环都会在下一次迭代开始之前完成,而每次迭代的顺序都是事先定义好的。 + +- 迭代会在一个有序集合上进行。(“有序”可以理解为集合中所有项都可以按照既定的顺序被遍历到,特别是开始和结束项有明确的定义。)数组是 JavaScript 中有序集合的最典型例子。 + +- 因为数组有已知的长度,且数组每一项都可以通过索引获取,所以整个数组可以通过递增索引来遍历。由于如下原因,通过这种循环来执行例程并不理想。 + + 1. **迭代之前需要事先知道如何使用数据结构**。数组中的每一项都只能先通过引用取得数组对象,然后再通过`[]`操作符取得特定索引位置上的项。这种情况并**不适用于所有数据结构**。 + 2. **遍历顺序并不是数据结构固有的**。通过递增索引来访问数据是特定于数组类型的方式,并**不适用于其他具有隐式顺序的数据结构**。 + +- ES5 新增了 `Array.prototype.forEach()`方法,向通用迭代需求迈进了一步(但仍然不够理想) + + - 这个方法解决了单独记录索引和通过数组对象取得值的问题。不过,**没有办法标识迭代何时终止**。 + - 因此这个方法只适用于数组,而且回调结构也比较笨拙。 + +- 解决方案就是迭代器模式。 Python、 Java、 C++,还有其他很多语言都对这个模式提供了完备的支持。 JavaScript 在 ECMAScript 6 以后也支持了迭代器模式。 + +## 7.2 迭代器模式 + +可以把有些结构称为**“可迭代对象”( iterable)**,因为它们实现了正式的 Iterable 接口,而且可以通过迭代器 Iterator 消费。 + +- 可以把可迭代对象理解成数组或集合这样的集合类型的对象。它们包含的元素都是有限的,而且都具有无歧义的遍历顺序。 + +任何实现 Iterable 接口的数据结构都可以被实现 Iterator 接口的结构“消费”( consume)。 + +- **迭代器( iterator)**是按需创建的一次性对象。 +- 每个迭代器都会关联一个**可迭代对象**,而迭代器会暴露迭代其关联可迭代对象的 API。 +- 迭代器无须了解与其关联的可迭代对象的结构,只需要知道如何取得连续的值。 +- 这种概念上的分离正是 Iterable 和 Iterator 的强大之处。 + +**现代JavaScript教程:** + +- 可以应用 `for..of` 的对象被称为 **可迭代的**。 + - 技术上来说,可迭代对象必须实现 `Symbol.iterator` 方法。 + - `obj[Symbol.iterator]()` 的结果被称为 **迭代器(iterator)**。由它处理进一步的迭代过程。 + - 一个迭代器必须有 `next()` 方法,它返回一个 `{done: Boolean, value: any}` 对象,这里 `done:true` 表明迭代结束,否则 `value` 就是下一个值。 + - `Symbol.iterator` 方法会被 `for..of` 自动调用,但我们也可以直接调用它。 + - 内置的可迭代对象例如字符串和数组,都实现了 `Symbol.iterator`。 + - 字符串迭代器能够识别代理对(surrogate pair)。(译注:代理对也就是 UTF-16 扩展字符。) + +### 7.2.1 可迭代协议 + +- 实现 Iterable 接口(可迭代协议)要求同时具备两种能力: + + - 支持迭代的自我识别能力, + - 创建实现 Iterator 接口的对象的能力。 + +- 这意味着必须暴露一个属性作为“默认迭代器”,而且这个属性必须使用特殊的 `Symbol.iterator` 作为键。 + + - 这个默认迭代器属性必须引用一个迭代器工厂函数,调用这个工厂函数必须返回一个新迭代器。 + +- 很多内置类型都实现了 Iterable 接口: + + - 字符串 + - 数组 + - 映射 + - 集合 + - arguments 对象 + - NodeList 等 DOM 集合类型 + +- 检查是否存在默认迭代器属性可以暴露这个工厂函数: + + ```javascript + let num = 1; + let obj = {}; + + // 这两种类型没有实现迭代器工厂函数 + console.log(num[Symbol.iterator]); // undefined + console.log(obj[Symbol.iterator]); // undefined + + let str = 'abc'; + let arr = ['a', 'b', 'c']; + let map = new Map().set('a', 1).set('b', 2).set('c', 3); + let set = new Set().add('a').add('b').add('c'); + let els = document.querySelectorAll('div'); + + // 这些类型都实现了迭代器工厂函数 + console.log(str[Symbol.iterator]); // f values() { [native code] } + console.log(arr[Symbol.iterator]); // f values() { [native code] } + console.log(map[Symbol.iterator]); // f values() { [native code] } + console.log(set[Symbol.iterator]); // f values() { [native code] } + console.log(els[Symbol.iterator]); // f values() { [native code] } + + // 调用这个工厂函数会生成一个迭代器 + console.log(str[Symbol.iterator]()); // StringIterator {} + console.log(arr[Symbol.iterator]()); // ArrayIterator {} + console.log(map[Symbol.iterator]()); // MapIterator {} + console.log(set[Symbol.iterator]()); // SetIterator {} + console.log(els[Symbol.iterator]()); // ArrayIterator {} + ``` + +- 实际写代码过程中,不需要显式调用这个工厂函数来生成迭代器。实现可迭代协议的所有类型都会自动兼容接收可迭代对象的任何语言特性。接收可迭代对象的原生语言特性包括: + + - `for-of` 循环 + - 数组解构 + - 扩展操作符 + - `Array.from()` + - 创建集合 + - 创建映射 + - `Promise.all()` 接收由期约组成的可迭代对象 + - `Promise.race()` 接收由期约组成的可迭代对象 + - `yield*`操作符,在生成器中使用 + + ```javascript + let arr = ['foo', 'bar', 'baz']; + // for-of 循环 + for (let el of arr) { + console.log(el); + } + // foo + // bar + // baz + + // 数组解构 + let [a, b, c] = arr; + console.log(a, b, c); // foo, bar, baz + + // 扩展操作符 + let arr2 = [...arr]; + console.log(arr2); // ['foo', 'bar', 'baz'] + + // Array.from() + let arr3 = Array.from(arr); + console.log(arr3); // ['foo', 'bar', 'baz'] + + // Set 构造函数 + let set = new Set(arr); + console.log(set); // Set(3) {'foo', 'bar', 'baz'} + + // Map 构造函数 + let pairs = arr.map((x, i) => [x, i]); + console.log(pairs); // [['foo', 0], ['bar', 1], ['baz', 2]] + let map = new Map(pairs); + console.log(map); // Map(3) { 'foo'=>0, 'bar'=>1, 'baz'=>2 } + + // 如果对象原型链上的父类实现了 Iterable 接口, 那这个对象也就实现了这个接口: + class FooArray extends Array {} + let fooArr = new FooArray('foo', 'bar', 'baz'); + for (let el of fooArr) { + console.log(el); + } + // foo + // bar + // baz + ``` + + + +### 7.2.2 迭代器协议 + +- 迭代器是一种一次性使用的对象,用于迭代与其关联的可迭代对象。迭代器 API 使用 next() 方法在可迭代对象中遍历数据。每次成功调用 next(),都会返回一个 IteratorResult 对象,其中包含迭代器返回的下一个值。若不调用 next(),则无法知道迭代器的当前位置。 + +- next() 方法返回的迭代器对象 IteratorResult 包含两个属性: done 和 value。 + + - done 是一个布尔值,表示是否还可以再次调用 next()取得下一个值; done: true 状态称为“耗尽”。 + - value 包含可迭代对象的下一个值( done 为false),或者 undefined( done 为 true)。 + + ```javascript + // 可迭代对象 + let arr = ['foo', 'bar']; + + // 迭代器工厂函数 + console.log(arr[Symbol.iterator]); // f values() { [native code] } + + // 迭代器 + let iter = arr[Symbol.iterator](); + console.log(iter); // ArrayIterator {} + + // 执行迭代 + console.log(iter.next()); // { done: false, value: 'foo' } + console.log(iter.next()); // { done: false, value: 'bar' } + console.log(iter.next()); // { done: true, value: undefined } + ``` + + - 迭代器并不知道怎么从可迭代对象中取得下一个值,也不知道可迭代对象有多大。只要迭代器到达 done: true 状态,后续调用 next()就一直返回同样的值了。 + - 每个迭代器都表示对可迭代对象的一次性有序遍历。不同迭代器的实例相互之间没有联系 + +- 迭代器并不与可迭代对象某个时刻的快照绑定,而仅仅是使用游标来记录遍历可迭代对象的历程。如果可迭代对象在迭代期间被修改了,那么迭代器也会反映相应的变化。 + + ```javascript + let arr = ['foo', 'baz']; + let iter = arr[Symbol.iterator](); + + console.log(iter.next()); // { done: false, value: 'foo' } + + // 在数组中间插入值 + arr.splice(1, 0, 'bar'); + + console.log(iter.next()); // { done: false, value: 'bar' } + console.log(iter.next()); // { done: false, value: 'baz' } + console.log(iter.next()); // { done: true, value: undefined } + ``` + +- “迭代器”的概念有时候容易模糊,因为它可以指通用的迭代,也可以指接口,还可以指正式的迭代器类型。下面的例子比较了一个显式的迭代器实现和一个原生的迭代器实现。 + + ```javascript + // 这个类实现了可迭代接口( Iterable) + // 调用默认的迭代器工厂函数会返回 + // 一个实现迭代器接口( Iterator)的迭代器对象 + class Foo { + [Symbol.iterator]() { + return { + next() { + return { + done: false, + value: 'foo' + }; + } + } + } + } + let f = new Foo(); + + // 打印出实现了迭代器接口的对象 + console.log(f[Symbol.iterator]()); // { next: f() {} } + + // Array 类型实现了可迭代接口( Iterable) + // 调用 Array 类型的默认迭代器工厂函数 + // 会创建一个 ArrayIterator 的实例 + let a = new Array(); + + // 打印出 ArrayIterator 的实例 + console.log(a[Symbol.iterator]()); // Array Iterator {} + ``` + + + +### 7.2.3 自定义迭代器 + +- 与 Iterable 接口类似,任何实现 Iterator 接口的对象都可以作为迭代器使用。 + +- 下面这个例子中的 Counter 类只能被迭代一定的次数: + + ```javascript + class Counter { + // Counter 的实例应该迭代 limit 次 + constructor(limit) { + this.count = 1; + this.limit = limit; + } + next() { + if (this.count <= this.limit) { + return { + done: false, + value: this.count++ + }; + } else { + return { + done: true, + value: undefined + }; + } + } + [Symbol.iterator]() { + return this; + } + } + + let counter = new Counter(3); + + for (let i of counter) { + console.log(i); + } + // 1 + // 2 + // 3 + ``` + +- 为了让一个可迭代对象能够创建多个迭代器, 必须每创建一个迭代器就对应一个新计数器。为此,可以把计数器变量放到闭包里,然后通过闭包返回迭代器: + + ```javascript + class Counter { + constructor(limit) { + this.limit = limit; + } + [Symbol.iterator]() { + let count = 1, + limit = this.limit; + return { + next() { + if (count <= limit) { + return { + done: false, + value: count++ + }; + } else { + return { + done: true, + value: undefined + }; + } + } + }; + } + } + + let counter = new Counter(3); + for (let i of counter) { + console.log(i); + } + // 1 + // 2 + // 3 + + for (let i of counter) { + console.log(i); + } + // 1 + // 2 + // 3 + ``` + +- 每个以这种方式创建的迭代器也实现了 Iterable 接口。 Symbol.iterator 属性引用的工厂函数会返回相同的迭代器。 + +- 因为每个迭代器也实现了 Iterable 接口,所以它们可以用在任何期待可迭代对象的地方,比如for-of 循环 。 + + + +### 7.2.4 提前终止迭代器 + +- 可选的 `return()` 方法用于指定在迭代器**提前关闭**时执行的逻辑。执行迭代的结构在想让迭代器知道它不想遍历到可迭代对象耗尽时,就可以“关闭”迭代器。可能的情况包括: + + - for-of 循环通过 break、 continue、 return 或 throw 提前退出; + - 解构操作并未消费所有值。 + +- `return()` 方法必须返回一个有效的 IteratorResult 对象。简单情况下,可以只返回`{ done: true }`。 + + - 因为这个返回值只会用在生成器的上下文中,所以本章后面再讨论这种情况。 + +- 如下面的代码所示,内置语言结构在发现还有更多值可以迭代,但不会消费这些值时,会自动调用 `return()` 方法。 + + ```javascript + class Counter { + constructor(limit) { + this.limit = limit; + } + [Symbol.iterator]() { + let count = 1, + limit = this.limit; + return { + next() { + if (count <= limit) { + return { + done: false, + value: count++ + }; + } else { + return { + done: true + }; + } + }, + return () { + console.log('Exiting early'); + return { + done: true + }; + } + }; + } + } + + let counter1 = new Counter(5); + + for (let i of counter1) { + if (i > 2) { + break; + } + console.log(i); + } + // 1 + // 2 + // Exiting early + + + let counter2 = new Counter(5); + + try { + for (let i of counter2) { + if (i > 2) { + throw 'err'; + } + console.log(i); + } + } catch (e) {} + // 1 + // 2 + // Exiting early + + let counter3 = new Counter(5); + + let [a, b] = counter3; + // Exiting early + ``` + +- 如果迭代器没有关闭,则还可以继续从上次离开的地方继续迭代。比如,数组的迭代器就是不能关闭的。 + + ```javascript + let a = [1, 2, 3, 4, 5]; + let iter = a[Symbol.iterator](); + + for (let i of iter) { + console.log(i); + if (i > 2) { + break + } + } + // 1 + // 2 + // 3 + + for (let i of iter) { + console.log(i); + } + // 4 + // 5 + ``` + +- 因为 return() 方法是可选的,所以并非所有迭代器都是可关闭的。 + + - 要知道某个迭代器是否可关闭,可以测试这个迭代器实例的 return 属性是不是函数对象。 + - 不过,仅仅给一个不可关闭的迭代器增加这个方法**并不能让它变成可关闭的**。 + - 这是因为调用 return() 不会强制迭代器进入关闭状态。即便如此,return() 方法还是会被调用。 + + ```javascript + let a = [1, 2, 3, 4, 5]; + let iter = a[Symbol.iterator](); + + iter.return = function () { + console.log('Exiting early'); + return { + done: true + }; + }; + + for (let i of iter) { + console.log(i); + if (i > 2) { + break + } + } + // 1 + // 2 + // 3 + // 提前退出 + + for (let i of iter) { + console.log(i); + } + // 4 + // 5 + ``` + + + +## 7.3 生成器 + +生成器是 ECMAScript 6 新增的一个极为灵活的结构,拥有在一个函数块内暂停和恢复代码执行的能力。这种新能力具有深远的影响,比如,使用生成器可以自定义迭代器和实现协程。 + +### 7.3.1 生成器基础 + +生成器的形式是一个函数,函数名称前面加一个星号( *)表示它是一个生成器。只要是可以定义函数的地方,就可以定义生成器。 + +```javascript +// 生成器函数声明 +function* generatorFn() {} + +// 生成器函数表达式 +let generatorFn = function* () {} + +// 作为对象字面量方法的生成器函数 +let foo = { + * generatorFn() {} +} + +// 作为类实例方法的生成器函数 +class Foo { + * generatorFn() {} +} + +// 作为类静态方法的生成器函数 +class Bar { + static * generatorFn() {} +} +``` + +- 注意: 箭头函数不能用来定义生成器函数。 +- 标识生成器函数的星号不受两侧空格的影响。 + +调用生成器函数会产生一个**生成器对象**。生成器对象一开始处于暂停执行( suspended)的状态。与迭代器相似,生成器对象也实现了 Iterator 接口,因此具有 next() 方法。调用这个方法会让生成器开始或恢复执行。 + +```javascript +function* generatorFn() {} +const g = generatorFn(); +console.log(g); // generatorFn {} +console.log(g.next); // f next() { [native code] } +``` + +**next() 方法的返回值**类似于迭代器,有一个 done 属性和一个 value 属性。函数体为空的生成器函数中间不会停留,调用一次 next() 就会让生成器到达 `done: true` 状态。 + +- value 属性是生成器函数的返回值,默认值为 undefined,可以通过生成器函数的返回值指定: + +```javascript +function* generatorFn() { + return 'foo'; +} +let generatorObject = generatorFn(); +console.log(generatorObject); // generatorFn {} +console.log(generatorObject.next()); // { done: true, value: 'foo' } +``` + +- 生成器函数只会在初次调用 next() 方法后开始执行。 +- 生成器对象实现了 Iterable 接口,它们默认的迭代器是自引用的: + +```javascript +function* generatorFn() {} + +console.log(generatorFn); +// f* generatorFn() {} +console.log(generatorFn()[Symbol.iterator]); +// f [Symbol.iterator]() {native code} +console.log(generatorFn()); +// generatorFn {} +console.log(generatorFn()[Symbol.iterator]()); +// generatorFn {} + +const g = generatorFn(); + +console.log(g === g[Symbol.iterator]()); +// true +``` + + + +### 7.3.2 通过 yield 中断执行 + +**`yield`** 关键字可以让生成器停止和开始执行,也是生成器最有用的地方。 + +- 生成器函数在遇到 yield关键字之前会正常执行。遇到这个关键字后,执行会停止,函数作用域的状态会被保留。 + +- 停止执行的生成器函数只能通过在生成器对象上调用 next()方法来恢复执行。 + +- yield 关键字可以让生成器停止和开始执行,也是生成器最有用的地方。生成器函数在遇到 yield 关键字之前会正常执行。遇到这个关键字后,执行会停止,函数作用域的状态会被保留。停止执行的生成器函数只能通过在生成器对象上调用 next()方法来恢复执行: + +```javascript +function* generatorFn() { + yield 'foo'; + yield 'bar'; + return 'baz'; +} + +let generatorObject = generatorFn(); + +console.log(generatorObject.next()); // { done: false, value: 'foo' } +console.log(generatorObject.next()); // { done: false, value: 'bar' } +console.log(generatorObject.next()); // { done: true, value: 'baz' } +``` + +- 生成器函数内部的执行流程会针对每个生成器对象区分作用域。在一个生成器对象上调用 next() 不会影响其他生成器。 +- yield 关键字只能在生成器函数内部使用,用在其他地方会抛出错误。类似函数的 return 关键字,yield 关键字必须直接位于生成器函数定义中,出现在嵌套的非生成器函数中会抛出语法错误: + +```javascript +// 有效 +function* validGeneratorFn() { + yield; +} +// 无效 +function* invalidGeneratorFnA() { + function a() { + yield; + } +} +// 无效 +function* invalidGeneratorFnB() { + const b = () => { + yield; + } +} +// 无效 +function* invalidGeneratorFnC() { + (() => { + yield; + })(); +} +``` + + + +1. **生成器对象作为可迭代对象** + + - 在生成器对象上显式调用 next() 方法的用处并不大。其实,如果把生成器对象当成可迭代对象,那么使用起来会更方便: + + ```javascript + function* generatorFn() { + yield 1; + yield 2; + yield 3; + } + for (const x of generatorFn()) { + console.log(x); + } + // 1 + // 2 + // 3 + ``` + + - 在需要自定义迭代对象时,这样使用生成器对象会特别有用。比如,我们需要定义一个可迭代对象,而它会产生一个迭代器,这个迭代器会执行指定的次数。使用生成器,可以通过一个简单的循环来实现。 + + ```javascript + function* nTimes(n) { + while (n--) { + yield; + } + } + for (let _ of nTimes(3)) { + console.log('foo'); + } + // foo + // foo + // foo + ``` + + - 传给生成器的函数可以控制迭代循环的次数。在 n 为 0 时, while 条件为假,循环退出,生成器函数返回。 + + + +2. **使用 yield 实现输入和输出** + + - 除了可以作为函数的中间返回语句使用, yield 关键字还可以作为函数的中间参数使用。上一次让生成器函数暂停的 yield 关键字会接收到传给 next() 方法的第一个值。 + - 这里有个地方不太好理解——第一次调用 next() 传入的值不会被使用,因为这一次调用是为了开始执行生成器函数: + - 因为函数必须对整个表达式求值才能确定要返回的值,所以它在遇到 yield 关键字时暂停执行并计算出要产生的值: "foo"。下一次调用 next()传入了"bar",作为交给同一个 yield 的值。然后这个值被确定为本次生成器函数要返回的值。 + + ```javascript + function* generatorFn(initial) { + console.log(initial); + console.log(yield); + console.log(yield); + } + + let generatorObject = generatorFn('foo'); + + generatorObject.next('bar'); // foo + generatorObject.next('baz'); // baz + generatorObject.next('qux'); // qux + ``` + + - 这样使用生成器也可以实现范围和填充数组: + + ```javascript + function* range(start, end) { + while (end > start) { + yield start++; + } + } + for (const x of range(4, 7)) { + console.log(x); + } + // 4 + // 5 + // 6 + function* zeroes(n) { + while (n--) { + yield 0; + } + } + console.log(Array.from(zeroes(8))); // [0, 0, 0, 0, 0, 0, 0, 0] + ``` + + + +3. **产生可迭代对象** + + - 可以使用星号增强 yield 的行为,让它能够**迭代一个可迭代对象**,从而一次产出一个值: + + ```javascript + // 等价的 generatorFn: + // function* generatorFn() { + // for (const x of [1, 2, 3]) { + // yield x; + // } + // } + function* generatorFn() { + yield*[1, 2, 3]; + } + + let generatorObject = generatorFn(); + + for (const x of generatorFn()) { + console.log(x); + } + // 1 + // 2 + // 3 + ``` + + - `yield*`的值是关联迭代器返回 `done: true` 时的 value 属性。对于普通迭代器来说,这个值是`undefined`: + + ```javascript + function* generatorFn() { + console.log('iter value:', yield*[1, 2, 3]); + } + for (const x of generatorFn()) { + console.log('value:', x); + } + // value: 1 + // value: 2 + // value: 3 + // iter value: undefined + + // 对于生成器函数产生的迭代器来说, 这个值就是生成器函数返回的值: + function* innerGeneratorFn() { + yield 'foo'; + return 'bar'; + } + + function* outerGeneratorFn(genObj) { + console.log('iter value:', yield* innerGeneratorFn()); + } + for (const x of outerGeneratorFn()) { + console.log('value:', x); + } + // value: foo + // iter value: bar + ``` + + + +4. **使用 yield*实现递归算法** + + - **`yield*`**最有用的地方是实现递归操作,此时生成器可以产生自身。 + + ```javascript + function* nTimes(n) { + if (n > 0) { + yield* nTimes(n - 1); + yield n - 1; + } + } + for (const x of nTimes(3)) { + console.log(x); + } + // 0 + // 1 + // 2 + ``` + + - 从最顶层来看,这就相当于创建一个可迭代对象并返回递增的整数。 + - 使用递归生成器结构和 **`yield*`**可以优雅地表达递归算法。 + - 下面是一个图的实现,用于生成一个随机的双向图: + + ```javascript + class Node { + constructor(id) { + this.id = id; + this.neighbors = new Set(); + } + connect(node) { + if (node !== this) { + this.neighbors.add(node); + node.neighbors.add(this); + } + } + } + class RandomGraph { + constructor(size) { + this.nodes = new Set(); + + // 创建节点 + for (let i = 0; i < size; ++i) { + this.nodes.add(new Node(i)); + } + + // 随机连接节点 + const threshold = 1 / size; + for (const x of this.nodes) { + for (const y of this.nodes) { + if (Math.random() < threshold) { + x.connect(y); + } + } + } + } + + // 这个方法仅用于调试 + print() { + for (const node of this.nodes) { + const ids = [...node.neighbors] + .map((n) => n.id) + .join(','); + console.log(`${node.id}: ${ids}`); + } + } + } + const g = new RandomGraph(6); + + g.print(); + // 示例输出: + // 0: 2,3,5 + // 1: 2,3,4,5 + // 2: 1,3 + // 3: 0,1,2,4 + // 4: 2,3 + // 5: 0,4 + ``` + + - 图数据结构非常适合递归遍历,而递归生成器恰好非常合用。 + - 为此,生成器函数必须接收一个可迭代对象,产出该对象中的每一个值,并且对每个值进行递归。 + - 这个实现可以用来测试某个图是否连通,即是否没有不可到达的节点。 + - 只要从一个节点开始,然后尽力访问每个节点就可以了。 + - 结果就得到了一个非常简洁的深度优先遍历: + + ```javascript + class Node { + constructor(id) { + //... + } + connect(node) { + //... + } + } + class RandomGraph { + constructor(size) { + //... + } + print() { + //... + } + isConnected() { + const visitedNodes = new Set(); + + function* traverse(nodes) { + for (const node of nodes) { + if (!visitedNodes.has(node)) { + yield node; + yield* traverse(node.neighbors); + } + } + } + + // 取得集合中的第一个节点 + const firstNode = this.nodes[Symbol.iterator]().next().value; + + // 使用递归生成器迭代每个节点 + for (const node of traverse([firstNode])) { + visitedNodes.add(node); + } + + return visitedNodes.size === this.nodes.size; + } + } + ``` + + + +### 7.3.3 生成器作为默认迭代器 + +因为生成器对象实现了 Iterable 接口,而且生成器函数和默认迭代器被调用之后都产生迭代器,所以生成器格外适合作为默认迭代器。下面是一个简单的例子,这个类的默认迭代器可以用一行代码产出类的内容: + +```javascript +class Foo { + constructor() { + this.values = [1, 2, 3]; + } + *[Symbol.iterator]() { + yield* this.values; + } +} +const f = new Foo(); +for (const x of f) { + console.log(x); +} +// 1 +// 2 +// 3 +``` + +这里, for-of 循环调用了默认迭代器(它恰好又是一个生成器函数)并产生了一个生成器对象。这个生成器对象是可迭代的,所以完全可以在迭代中使用。 + +### 7.3.4 提前终止生成器 + +与迭代器类似,生成器也支持“可关闭”的概念。 + +一个实现 Iterator 接口的对象一定有 `next()`方法,还有一个可选的 `return()`方法用于提前终止迭代器,还有第三个方法: `throw()`。 + +1. **`return() `** + + - return()方法会强制生成器进入关闭状态。提供给 return()方法的值,就是终止迭代器对象的值: + + ```javascript + function* generatorFn() { + for (const x of [1, 2, 3]) { + yield x; + } + } + const g = generatorFn(); + console.log(g); // generatorFn {} + console.log(g.return(4)); // { done: true, value: 4 } + console.log(g); // generatorFn {} + ``` + + + + - 与迭代器不同,所有生成器对象都有 return()方法,只要通过它进入关闭状态,就无法恢复了。后续调用 next()会显示 done: true 状态,而提供的任何返回值都不会被存储或传播。 + - for-of 循环等内置语言结构会忽略状态为 `done: true` 的 IteratorObject 内部返回的值。 + + ```javascript + function* generatorFn() { + for (const x of [1, 2, 3]) { + yield x; + } + } + + const g = generatorFn(); + + for (const x of g) { + if (x > 1) { + g.return(4); + } + console.log(x); + } + // 1 + // 2 + ``` + + + +2. **`throw() `** + + - `throw()`方法会在暂停的时候将一个提供的错误注入到生成器对象中。如果错误未被处理,生成器就会关闭: + + ```javascript + function* generatorFn() { + for (const x of [1, 2, 3]) { + yield x; + } + } + + const g = generatorFn(); + + console.log(g); // generatorFn {} + try { + g.throw('foo'); + } catch (e) { + console.log(e); // foo + } + console.log(g); // generatorFn {} + ``` + + + + - 不过,假如生成器函数内部处理了这个错误,那么生成器就不会关闭,而且还可以恢复执行。错误处理会跳过对应的 `yield`,因此在这个例子中会跳过一个值。比如: + + ```javascript + function* generatorFn() { + for (const x of [1, 2, 3]) { + try { + yield x; + } catch (e) {} + } + } + const g = generatorFn(); + + console.log(g.next()); // { done: false, value: 1} + g.throw('foo'); + console.log(g.next()); // { done: false, value: 3} + ``` + + + + - 在这个例子中,生成器在 `try/catch` 块中的 `yield` 关键字处暂停执行。 + - 在暂停期间, `throw()` 方法向生成器对象内部注入了一个错误:字符串"foo"。 + - 这个错误会被 `yield` 关键字抛出。因为错误是在生成器的 `try/catch` 块中抛出的,所以仍然在生成器内部被捕获。 + - 可是,由于 `yield` 抛出了那个错误,生成器就不会再产出值 2。 + - 此时,生成器函数继续执行,在下一次迭代再次遇到 `yield` 关键字时产出了值 3。 + - **注意:** 如果生成器对象还没有开始执行,那么调用 `throw()`抛出的错误不会在函数内部被捕获,因为这相当于在函数块外部抛出了错误。 + + + +# 第8章 对象、类与面向对象编程 +## 8.1 理解对象 + +### 8.1.1 属性的类型 + +ECMA-262 使用一些内部特性来描述属性的特征。这些特性是由为 JavaScript 实现引擎的规范定义的。因此,开发者不能在 JavaScript 中直接访问这些特性。为了将某个特性标识为内部特性,规范会用两个中括号把特性的名称括起来,比如`[[Enumerable]]`。 + +属性分两种:数据属性和访问器属性。 + +1. **数据属性** + + - 数据属性包含一个保存数据值的位置。 + - 数据属性有 4 个特性描述它们的行为。 + 1. `[[Configurable]]`:表示属性是否可以通过 delete 删除并重新定义,是否可以修改它的特性,以及是否可以把它改为访问器属性。默认情况下,所有直接定义在对象上的属性的这个特性都是 true,如前面的例子所示。 + 2. `[[Enumerable]]`:表示属性是否可以通过 for-in 循环返回。默认情况下,所有直接定义在对象上的属性的这个特性都是 true,如前面的例子所示。 + 3. `[[Writable]]`:表示属性的值是否可以被修改。默认情况下,所有直接定义在对象上的属性的这个特性都是 true,如前面的例子所示。 + 4. `[[Value]]`:包含属性实际的值。这就是前面提到的那个读取和写入属性值的位置。这个特性的默认值为 undefined。 + + ```javascript + let person = {}; + Object.defineProperty(person, "name", { + writable: false, + value: "Nicholas" + }); + console.log(person.name); // "Nicholas" + person.name = "Greg"; + console.log(person.name); // "Nicholas" + ``` + + - 赋予了一个只读的值,这个属性的值就不能再修改了,在非严格模式下尝试给这个属性重新赋值会被忽略。在严格模式下,尝试修改只读属性的值会抛出错误。 + - 类似的规则也适用于创建不可配置的属性。 + + ```javascript + let person = {}; + Object.defineProperty(person, "name", { + configurable: false, + value: "Nicholas" + }); + console.log(person.name); // "Nicholas" + delete person.name; + console.log(person.name); // "Nicholas" + ``` + + - 把 `configurable` 设置为 false,意味着这个属性不能从对象上删除。非严格模式下对这个属性调用 delete 没有效果,严格模式下会抛出错误。 + - 此外,一个属性被定义为不可配置之后,就不能再变回可配置的了。 + - 虽然可以对同一个属性多次调用 `Object.defineProperty()`,但在把 `configurable` 设置为 false 之后就会受限制了。 + - 在调用 `Object.defineProperty()`时, `configurable、 enumerable 和 writable` 的值如果不指定,则都默认为 `false`。 + - 多数情况下,可能都不需要 `Object.defineProperty()`提供的这些强大的设置,但要理解 JavaScript 对象,就要理解这些概念。 + +2. **访问器属性** + + - 访问器属性不包含数据值。相反,它们包含一个获取( `getter`)函数和一个设置( `setter`)函数,不过这两个函数不是必需的。 + - 在读取访问器属性时,会调用获取函数,这个函数的责任就是返回一个有效的值。在写入访问器属性时,会调用设置函数并传入新值,这个函数必须决定对数据做出什么修改。 + - 访问器属性有 4 个特性描述它们的行为。 + 1. `[[Configurable]]`:表示属性是否可以通过 `delete` 删除并重新定义,是否可以修改它的特性,以及是否可以把它改为数据属性。 + - 默认情况下,所有直接定义在对象上的属性的这个特性都是 `true`。 + 2. `[[Enumerable]]`:表示属性是否可以通过 `for-in` 循环返回。 + - 默认情况下,所有直接定义在对象上的属性的这个特性都是 `true`。 + 3. `[[Get]]`:获取函数,在读取属性时调用。 + - 默认值为 `undefined`。 + 4. `[[Set]]`:设置函数,在写入属性时调用。 + - 默认值为 `undefined`。 + - ~~访问器属性是不能直接定义的,必须使用~~ **`Object.defineProperty()`**。 + - 可以直接定义: + + ```javascript + let user = { + name: "John", + surname: "Smith", + + get fullName() { + return `${this.name} ${this.surname}`; + }, + + set fullName(value) { + [this.name, this.surname] = value.split(" "); + } + }; + + // set fullName 将以给定值执行 + user.fullName = "Alice Cooper"; + + alert(user.name); // Alice + alert(user.surname); // Cooper + ``` + + - 不需要这样做: + + ```javascript + // 定义一个对象,包含伪私有成员 year_和公共成员 edition + let book = { + year_: 2017, + edition: 1 + }; + + Object.defineProperty(book, "year", { + get() { + return this.year_; + }, + set(newValue) { + if (newValue > 2017) { + this.year_ = newValue; + this.edition += newValue - 2017; + } + } + }); + + book.year = 2018; + console.log(book.edition); // 2 + ``` + + + +### 8.1.2 定义多个属性 + +- `Object.defineProperties()` 方法可以通过多个描述符一次性定义多个属性。它接收两个参数: + + - 要为之添加或修改属性的**对象**, + - 和另一个**描述符对象**, + + 其属性与要添加或修改的属性一一对应。 + + ```javascript + let book = {}; + Object.defineProperties(book, { + year_: { + value: 2017 + }, + edition: { + value: 1 + }, + year: { + get() { + return this.year_; + }, + set(newValue) { + if (newValue > 2017) { + this.year_ = newValue; + this.edition += newValue - 2017; + } + } + } + }); + ``` + + - 对象跟上一节示例中的一样。唯一的区别是所有属性都是同时定义的,并且数据属性的 `configurable、 enumerable 和 writable` 特性值都是 `false`。 + + + +### 8.1.3 读取属性的特性 + +- 使用 **`Object.getOwnPropertyDescriptor()`**方法可以取得指定属性的属性描述符。 + + - 这个方法接收两个参数:属性所在的对象和要取得其描述符的属性名。 + - 返回值是一个对象,对于访问器属性包含`configurable、 enumerable、 get 和 set` 属性,对于数据属性包含 `configurable、 enumerable、writable 和 value` 属性。 + + ```javascript + let book = {}; + Object.defineProperties(book, { + year_: { + value: 2017 + }, + edition: { + value: 1 + }, + year: { + get: function () { + return this.year_; + }, + set: function (newValue) { + if (newValue > 2017) { + this.year_ = newValue; + this.edition += newValue - 2017; + } + } + } + }); + + let descriptor = Object.getOwnPropertyDescriptor(book, "year_"); + console.log(descriptor.value); // 2017 + console.log(descriptor.configurable); // false + console.log(typeof descriptor.get); // "undefined" + + descriptor = Object.getOwnPropertyDescriptor(book, "year"); + console.log(descriptor.value); // undefined + console.log(descriptor.enumerable); // false + console.log(typeof descriptor.get); // "function" + + console.log(Object.getOwnPropertyDescriptors(book)); + // { + // edition: { + // configurable: false, + // enumerable: false, + // value: 1, + // writable: false + // }, + // year: { + // configurable: false, + // enumerable: false, + // get: f(), + // set: f(newValue), + // }, + // year_: { + // configurable: false, + // enumerable: false, + // value: 2017, + // writable: false + // } + // } + ``` + + - 对于数据属性 `year_`, `value` 等于原来的值, `configurable` 是 `false`, `get` 是 `undefined`。 + - 对于访问器属性 `year`, `value` 是 `undefined`, `enumerable` 是 false, get 是一个指向获取函数的指针。 + +- ECMAScript 2017 新增了 **`Object.getOwnPropertyDescriptors()`**静态方法。 + + - 这个方法实际上会在每个自有属性上调用 `Object.getOwnPropertyDescriptor()`并在一个新对象中返回它们。 + +### 8.1.4 合并对象 + +- 合并对象提供了 `Object.assign()`方法。 + + - 接收一个**目标对象** 和 一个或多个**源对象** 作为参数; + - 然后将每个源对象中可枚举( `Object.propertyIsEnumerable()`返回 true)和自有( `Object.hasOwnProperty()`返回 true)属性复制到目标对象。 + - 以字符串和符号为键的属性会被复制。对每个符合条件的属性,这个方法会使用源对象上的`[[Get]]`取得属性的值,然后使用目标对象上的`[[Set]]`设置属性的值。 + + ```javascript + let dest, src, result; + + /** + * 简单复制 + */ + dest = {}; + src = { + id: 'src' + }; + + result = Object.assign(dest, src); + + // Object.assign 修改目标对象 + // 也会返回修改后的目标对象 + console.log(dest === result); // true + console.log(dest !== src); // true + console.log(result); // { id: src } + console.log(dest); // { id: src } + + /** + * 多个源对象 + */ + dest = {}; + result = Object.assign(dest, { + a: 'foo' + }, { + b: 'bar' + }); + console.log(result); // { a: foo, b: bar } + + /** + * 获取函数与设置函数 + */ + dest = { + set a(val) { + console.log(`Invoked dest setter with param ${val}`); + } + }; + src = { + get a() { + console.log('Invoked src getter'); + return 'foo'; + } + }; + + Object.assign(dest, src); + // 调用 src 的获取方法 + // 调用 dest 的设置方法并传入参数"foo" + // 因为这里的设置函数不执行赋值操作 + // 所以实际上并没有把值转移过来 + console.log(dest); // { set a(val) {...} } + ``` + +- `Object.assign()` 实际上对每个源对象执行的是浅复制。 + + - 如果多个源对象都有相同的属性,则使用最后一个复制的值。 + - 此外,从源对象访问器属性取得的值,比如获取函数,会作为一个静态值赋给目标对象。 + - 换句话说,不能在两个对象间转移获取函数和设置函数。 + + ```javascript + let dest, src, result; + /** + * 覆盖属性 + */ + dest = { + id: 'dest' + }; + result = Object.assign(dest, { + id: 'src1', + a: 'foo' + }, { + id: 'src2', + b: 'bar' + }); + + // Object.assign 会覆盖重复的属性 + console.log(result); // { id: src2, a: foo, b: bar } + + // 可以通过目标对象上的设置函数观察到覆盖的过程: + dest = { + set id(x) { + console.log(x); + } + }; + Object.assign(dest, { + id: 'first' + }, { + id: 'second' + }, { + id: 'third' + }); + // first + // second + // third + + /** + * 对象引用 + */ + dest = {}; + src = { + a: {} + }; + Object.assign(dest, src); + + // 浅复制意味着只会复制对象的引用 + console.log(dest); // { a :{} } + console.log(dest.a === src.a); // true + ``` + +- 如果赋值期间出错,则操作会中止并退出,同时抛出错误。 `Object.assign()`没有“回滚”之前赋值的概念,因此它是一个尽力而为、可能只会完成部分复制的方法。 + +### 8.1.5 对象标识及相等判定 + +- 有些特殊情况即使是`===`操作符也无能为力: + + ```javascript + // 这些是===符合预期的情况 + console.log(true === 1); // false + console.log({} === {}); // false + console.log("2" === 2); // false + + // 这些情况在不同 JavaScript 引擎中表现不同,但仍被认为相等 + console.log(+0 === -0); // true + console.log(+0 === 0); // true + console.log(-0 === 0); // true + + // 要确定 NaN 的相等性,必须使用极为讨厌的 isNaN() + console.log(NaN === NaN); // false + console.log(isNaN(NaN)); // true + ``` + +- ECMAScript 6 规范新增了 **`Object.is()`**,这个方法与`===`很像,但同时也考虑到了上述边界情形。 + + ```javascript + console.log(Object.is(true, 1)); // false + console.log(Object.is({}, {})); // false + console.log(Object.is("2", 2)); // false + + // 正确的 0、 -0、 +0 相等/不等判定 + console.log(Object.is(+0, -0)); // false + console.log(Object.is(+0, 0)); // true + console.log(Object.is(-0, 0)); // false + + // 正确的 NaN 相等判定 + console.log(Object.is(NaN, NaN)); // true + + // 要检查超过两个值, 递归地利用相等性传递即可: + function recursivelyCheckEqual(x, ...rest) { + return Object.is(x, rest[0]) && + (rest.length < 2 || recursivelyCheckEqual(...rest)); + } + ``` + + + +### 8.1.6 增强的对象语法 + +ECMAScript 6 为定义和操作对象新增了很多极其有用的语法糖特性。这些特性都没有改变现有引擎的行为,但极大地提升了处理对象的方便程度。 + +1. **属性值简写** + + - 简写属性名只要使用变量名(不用再写冒号)就会自动被解释为同名的属性键。如果没有找到同名变量,则会抛出 `ReferenceError`。 + + ```javascript + function makePerson(name) { + return { + name + }; + } + let person = makePerson('Matt'); + console.log(person.name); // Matt + ``` + + - 即使参数标识符只限定于函数作用域,编译器也会保留初始的 name 标识符。如果使用Google Closure 编译器压缩,那么函数参数会被缩短,而属性名不变。 + +2. **可计算属性** + + - 有了可计算属性,就可以在对象字面量中完成动态属性赋值。 + - **中括号包围的对象属性键**告诉运行时将其作为 JavaScript 表达式而不是字符串来求值 。 + + ```javascript + const nameKey = 'name'; + const ageKey = 'age'; + const jobKey = 'job'; + let person = { + [nameKey]: 'Matt', + [ageKey]: 27, + [jobKey]: 'Software engineer' + }; + console.log(person); // { name: 'Matt', age: 27, job: 'Software engineer' } + + // 因为被当作 JavaScript 表达式求值,所以可计算属性本身可以是复杂的表达式,在实例化时再求值: + let uniqueToken = 0; + + function getUniqueKey(key) { + return `${key}_${uniqueToken++}`; + } + person = { + [getUniqueKey(nameKey)]: 'Matt', + [getUniqueKey(ageKey)]: 27, + [getUniqueKey(jobKey)]: 'Software engineer' + }; + console.log(person); // { name_0: 'Matt', age_1: 27, job_2: 'Software engineer' } + ``` + + - 可计算属性表达式中抛出任何错误都会中断对象创建。 + +3. **简写方法名** + + - 新的简写方法的语法遵循同样的模式,但开发者要放弃给函数表达式命名(不过给作为方法的函数命名通常没什么用)。相应地,这样也可以明显缩短方法声明。 + - 简写方法名对获取函数和设置函数也是适用的。 + - 简写方法名与可计算属性键相互兼容。 + + ```javascript + let person = { + name_: '', + get name() { + return this.name_; + }, + set name(name) { + this.name_ = name; + }, + sayName() { + console.log(`My name is ${this.name_}`); + } + }; + + person.name = 'Matt'; + person.sayName(); // My name is Matt + + // 与可计算属性键相互兼容 + const methodKey = 'sayName'; + person = { + [methodKey](name) { + console.log(`My name is ${name}`); + } + } + person.sayName('Matt'); // My name is Matt + ``` + + + +### 8.1.7 对象解构 + +ECMAScript 6 新增了对象解构语法,可以在一条语句中使用嵌套数据实现一个或多个赋值操作。 + +简单地说,对象解构就是使用与对象匹配的结构来实现对象属性赋值。 + +- 使用对象解构 + +```javascript +// 使用对象解构 +let person = { + name: 'Matt', + age: 27 +}; + +let { + name: personName, + age: personAge +} = person; + +console.log(personName); // Matt +console.log(personAge); // 27 +``` + +- 使用解构,可以在一个类似对象字面量的结构中,声明多个变量,同时执行多个赋值操作。 +- 如果想让变量直接使用属性的名称,那么可以使用简写语法。 + +```javascript +let person = { + name: 'Matt', + age: 27 +}; +let { + name, + age +} = person; + +console.log(name); // Matt +console.log(age); // 27 +``` + +- 解构赋值不一定与对象的属性匹配。赋值的时候可以忽略某些属性,而如果引用的属性不存在,则该变量的值就是 undefined。 + +```javascript +let person = { + name: 'Matt', + age: 27 +}; +let { + name, + job +} = person; + +console.log(name); // Matt +console.log(job); // undefined +``` + +- 也可以在解构赋值的同时定义默认值,这适用于前面刚提到的引用的属性不存在于源对象中的情况。 + +```javascript +let person = { + name: 'Matt', + age: 27 +}; +let { + name, + job = 'Software engineer' +} = person; + +console.log(name); // Matt +console.log(job); // Software engineer +``` + +- 解构在内部使用函数 `ToObject()`(不能在运行时环境中直接访问)把源数据结构转换为对象。这意味着在对象解构的上下文中,原始值会被当成对象。这也意味着(根据 `ToObject()`的定义), `null` 和 `undefined` 不能被解构,否则会抛出错误。 + +```javascript +let { + length +} = 'foobar'; +console.log(length); // 6 + +let { + constructor: c +} = 4; +console.log(c === Number); // true + +let { + _ +} = null; // TypeError + +let { + _ +} = undefined; // TypeError +``` + +- 解构并不要求变量必须在解构表达式中声明。不过,如果是给事先声明的变量赋值,则赋值表达式必须包含在一对括号中: + +```javascript +let personName, personAge; +let person = { + name: 'Matt', + age: 27 +}; + +({ + name: personName, + age: personAge +} = person); + +console.log(personName, personAge); // Matt, 27 +``` + + + +1. **嵌套解构** + + - 解构对于引用嵌套的属性或赋值目标没有限制。为此,可以通过解构来复制对象属性: + + ```javascript + let person = { + name: 'Matt', + age: 27, + job: { + title: 'Software engineer' + } + }; + let personCopy = {}; + + ({ + name: personCopy.name, + age: personCopy.age, + job: personCopy.job + } = person); + + // 因为一个对象的引用被赋值给 personCopy,所以修改 + // person.job 对象的属性也会影响 personCopy + person.job.title = 'Hacker' + + console.log(person); + // { name: 'Matt', age: 27, job: { title: 'Hacker' } } + + console.log(personCopy); + // { name: 'Matt', age: 27, job: { title: 'Hacker' } } + ``` + + - 解构赋值可以使用嵌套结构,以匹配嵌套的属性: + + ```javascript + let person = { + name: 'Matt', + age: 27, + job: { + title: 'Software engineer' + } + }; + + // 声明 title 变量并将 person.job.title 的值赋给它 + let { + job: { + title + } + } = person; + + console.log(title); // Software engineer + ``` + + - 在外层属性没有定义的情况下不能使用嵌套解构。无论源对象还是目标对象都一样: + + ```javascript + let person = { + job: { + title: 'Software engineer' + } + }; + let personCopy = {}; + + // foo 在源对象上是 undefined + ({ + foo: { + bar: personCopy.bar + } + } = person); + // TypeError: Cannot destructure property 'bar' of 'undefined' or 'null'. + + // job 在目标对象上是 undefined + ({ + job: { + title: personCopy.job.title + } + } = person); + // TypeError: Cannot set property 'title' of undefined + ``` + + + +2. **部分解构** + + - 需要注意的是,涉及多个属性的解构赋值是一个输出无关的顺序化操作。如果一个解构表达式涉及多个赋值,开始的赋值成功而后面的赋值出错,则整个解构赋值只会完成一部分: + + ```javascript + let person = { + name: 'Matt', + age: 27 + }; + + let personName, personBar, personAge; + try { + // person.foo 是 undefined,因此会抛出错误 + ({ + name: personName, + foo: { + bar: personBar + }, + age: personAge + } = person); + } catch (e) {} + + console.log(personName, personBar, personAge); + // Matt, undefined, undefined + ``` + + - 虽然我们在 Javascript 中还没有真正的**命名参数和可选参数**,使用ES6解构来获取功能上等同的行为。 + +3. **参数上下文匹配** + + - 在函数参数列表中也可以进行解构赋值。对参数的解构赋值不会影响`arguments` 对象,但可以在函数签名中声明在函数体内使用局部变量。 + + ```javascript + let person = { + name: 'Matt', + age: 27 + }; + + function printPerson(foo, { + name, + age + }, bar) { + console.log(arguments); + console.log(name, age); + } + + function printPerson2(foo, { + name: personName, + age: personAge + }, bar) { + console.log(arguments); + console.log(personName, personAge); + } + + printPerson('1st', person, '2nd'); + // ['1st', { name: 'Matt', age: 27 }, '2nd'] + // 'Matt', 27 + + printPerson2('1st', person, '2nd'); + // ['1st', { name: 'Matt', age: 27 }, '2nd'] + // 'Matt', 27 + ``` + + + +## 8.2 创建对象 + +虽然使用 Object 构造函数或对象字面量可以方便地创建对象,但这些方式也有明显不足:创建具有同样接口的多个对象需要重复编写很多代码。 + +### 8.2.1 概述 + +ECMAScript 5.1 并没有正式支持面向对象的结构,比如类或继承。正如接下来几节会介绍的,巧妙地运用原型式继承可以成功地模拟同样的行为。 + +ECMAScript 6 开始正式支持类和继承。 ES6 的类旨在完全涵盖之前规范设计的基于原型的继承模式。ES6 的类都仅仅是封装了 ES5.1 构造函数加原型继承的语法糖而已。 + +### 8.2.2 工厂模式 + +工厂模式是一种众所周知的设计模式,广泛应用于软件工程领域,用于抽象创建特定对象的过程。 + +```javascript +function createPerson(name, age, job) { + let o = new Object(); + o.name = name; + o.age = age; + o.job = job; + o.sayName = function () { + console.log(this.name); + }; + return o; +} +let person1 = createPerson("Nicholas", 29, "Software Engineer"); +let person2 = createPerson("Greg", 27, "Doctor"); +``` + +- 这种工厂模式虽然可以解决创建多个类似对象的问题,但没有解决对象标识问题(即新创建的对象是什么类型)。 + +### 8.2.3 构造函数模式 + +ECMAScript 中的构造函数是用于创建特定类型对象的。 + +像 Object 和 Array 这样的原生构造函数,运行时可以直接在执行环境中使用。 + +当然也可以自定义构造函数,以函数的形式为自己的对象类型定义属性和方法。 + +```javascript +function Person(name, age, job) { + this.name = name; + this.age = age; + this.job = job; + this.sayName = function () { + console.log(this.name); + }; +} +let person1 = new Person("Nicholas", 29, "Software Engineer"); +let person2 = new Person("Greg", 27, "Doctor"); +person1.sayName(); // Nicholas +person2.sayName(); // Greg + +// person1 和 person2 分别保存着 Person 的不同实例。这两个对象都有一个constructor 属性指向 Person,如下所示: +console.log(person1.constructor == Person); // true +console.log(person2.constructor == Person); // true +``` + +- 只是有如下区别。 + + 1. 没有显式地创建对象。 + 2. 属性和方法直接赋值给了 this。 + 3. 没有 return。 + +- 另外,要注意函数名 Person 的首字母大写了。按照惯例,**构造函数名称的首字母都是要大写的,非构造函数则以小写字母开头**。 + + - 这是从面向对象编程语言那里借鉴的,有助于在 ECMAScript 中区分构造函数和普通函数。毕竟 ECMAScript 的构造函数就是能创建对象的函数。 + +- 要创建 Person 的实例,应使用 new 操作符。以这种方式调用构造函数会执行如下操作。 + + 1. 在内存中创建一个新对象。 + 2. 这个新对象内部的`[[Prototype]]`特性被赋值为构造函数的 `prototype` 属性。 + 3. 构造函数内部的 this 被赋值为这个新对象(即 this 指向新对象)。 + 4. 执行构造函数内部的代码(给新对象添加属性)。 + 5. 如果构造函数返回非空对象,则返回该对象;否则,返回刚创建的新对象。 + +- constructor 本来是用于标识对象类型的。不过,一般认为 instanceof 操作符是确定对象类型更可靠的方式。前面例子中的每个对象都是 Object 的实例,同时也是 Person 的实例。 + + ```javascript + console.log(person1 instanceof Object); // true + console.log(person1 instanceof Person); // true + console.log(person2 instanceof Object); // true + console.log(person2 instanceof Person); // true + ``` + +- 构造函数后面的括号可加可不加。只要有 new 操作符,就可以调用相应的构造函数。 + + + +1. **构造函数也是函数** + + - 构造函数与普通函数唯一的区别就是调用方式不同。 + - 任何函数只要使用 new 操作符调用就是构造函数,而不使用 new 操作符调用的函数就是普通函数。 + + ```javascript + // 作为构造函数 + let person = new Person("Nicholas", 29, "Software Engineer"); + person.sayName(); // "Nicholas" + + // 作为函数调用 + Person("Greg", 27, "Doctor"); // 添加到 window 对象 + window.sayName(); // "Greg" + + // 在另一个对象的作用域中调用 + let o = new Object(); + Person.call(o, "Kristen", 25, "Nurse"); + o.sayName(); // "Kristen" + ``` + + - 这个例子一开始展示了典型的构造函数调用方式,即使用 new 操作符创建一个新对象。 + - 然后是普通函数的调用方式,这时候没有使用 new 操作符调用 `Person()`,结果会将属性和方法添加到 window 对象。 + - 这里要记住,在调用一个函数而**没有明确设置 `this` 值**的情况下(即没有作为对象的方法调用,或者没有使用 `call()/apply()`调用), **`this` 始终指向 Global 对象**(在浏览器中就是 window 对象)。 + - 因此在上面的调用之后, window 对象上就有了一个 `sayName()`方法,调用它会返回"Greg"。 + - 最后展示的调用方式是通过 `call()`(或 `apply()`)调用函数,同时将特定对象指定为作用域。 + - 这里的调用将对象 `o` 指定为 `Person()`内部的 `this` 值,因此执行完函数代码后,所有属性和 `sayName()`方法都会添加到对象 `o` 上面。 + + + +2. **构造函数的问题** + + - 构造函数的主要问题在于,其定义的方法会在每个实例上都创建一遍。 + - ECMAScript 中的函数是对象,因此每次定义函数时,都会初始化一个对象。 + + ```javascript + function Person(name, age, job) { + this.name = name; + this.age = age; + this.job = job; + this.sayName = new Function("console.log(this.name)"); // 逻辑等价 + } + + // 以这种方式创建函数会带来不同的作用域链和标识符解析。但创建新 Function实例的机制是一样的。因此不同实例上的函数虽然同名却不相等。 + console.log(person1.sayName == person2.sayName); // false + ``` + + - 要解决这个问题,可以把函数定义转移到构造函数外部。 + - `this` 对象可以把函数与对象的绑定推迟到运行时。 + + ```javascript + function Person(name, age, job) { + this.name = name; + this.age = age; + this.job = job; + this.sayName = sayName; + } + + function sayName() { + console.log(this.name); + } + + let person1 = new Person("Nicholas", 29, "Software Engineer"); + let person2 = new Person("Greg", 27, "Doctor"); + + person1.sayName(); // Nicholas + person2.sayName(); // Greg + ``` + + - 这一次 `sayName` 属性中包含的只是一个指向外部函数的指针,所以 `person1` 和 `person2` 共享了定义在全局作用域上的 `sayName()`函数。 + - 这样虽然解决了相同逻辑的函数重复定义的问题,但**全局作用域也因此被搞乱了**,因为那个函数实际上只能在一个对象上调用。 + - 如果这个对象需要多个方法,那么就要在全局作用域中定义多个函数。 + - 这会导致自定义类型引用的代码不能很好地聚集一起。这个新问题可以通过原型模式来解决。 + + + +### 8.2.4 原型模式 + +- 每个函数都会创建一个 prototype 属性,这个属性是一个对象,包含应该由特定引用类型的实例共享的属性和方法。 +- 这个对象就是通过调用构造函数创建的对象的原型。原型对象上面定义的属性和方法可以被对象实例共享。 +- 原来在构造函数中直接赋给对象实例的值,可以直接赋值给它们的原型 + +```javascript +function Person() {} +Person.prototype.name = "Nicholas"; +Person.prototype.age = 29; +Person.prototype.job = "Software Engineer"; +Person.prototype.sayName = function () { + console.log(this.name); +}; + +let person1 = new Person(); +person1.sayName(); // "Nicholas" + +let person2 = new Person(); +person2.sayName(); // "Nicholas" + +console.log(person1.sayName == person2.sayName); // true + +// 使用函数表达式也可以 +// let Person = function() {}; +``` + + + +1. **理解原型** + + - 只要创建一个函数,就会按照特定的规则为这个函数创建一个 prototype 属性(指向原型对象)。 + - 默认情况下,所有原型对象自动获得一个名为 constructor 的属性,指回与之关联的构造函数。 + - 对前面的例子而言, `Person.prototype.constructor` 指向 `Person`。然后,因构造函数而异,可能会给原型对象添加其他属性和方法。 + - 自定义构造函数时,原型对象默认只会获得 constructor 属性,其他的所有方法都继承自Object。 + - 每次调用构造函数创建一个新实例,这个实例的内部`[[Prototype]]`指针就会被赋值为构造函数的原型对象。 + - 脚本中没有访问这个`[[Prototype]]`特性的标准方式, 但 Firefox、Safari 和 Chrome会在每个对象上暴露`__proto__`属性,通过这个属性可以访问对象的原型。在其他实现中,这个特性完全被隐藏了。 + - 关键在于理解这一点:实例与构造函数原型之间有直接的联系,但实例与构造函数之间没有。 + + ```javascript + /** + * 构造函数可以是函数表达式 + * 也可以是函数声明,因此以下两种形式都可以: + * function Person() {} + * let Person = function() {} + */ + function Person() {} + + /** + * 声明之后,构造函数就有了一个 + * 与之关联的原型对象: + */ + console.log(typeof Person.prototype); + console.log(Person.prototype); + + // { + // constructor: f Person(), + // __proto__: Object + // } + + /** + * 如前所述,构造函数有一个 prototype 属性 + * 引用其原型对象,而这个原型对象也有一个 + * constructor 属性,引用这个构造函数 + * 换句话说,两者循环引用: + */ + console.log(Person.prototype.constructor === Person); // true + + /** + * 正常的原型链都会终止于 Object 的原型对象 + * Object 原型的原型是 null + */ + console.log(Person.prototype.__proto__ === Object.prototype); // true + console.log(Person.prototype.__proto__.constructor === Object); // true + console.log(Person.prototype.__proto__.__proto__ === null); // true + console.log(Person.prototype.__proto__); + + // { + // constructor: f Object(), + // toString: ... + // hasOwnProperty: ... + // isPrototypeOf: ... + // ... + // } + let person1 = new Person(), + person2 = new Person(); + + /** + * 构造函数、原型对象和实例 + * 是 3 个完全不同的对象: + */ + console.log(person1 !== Person); // true + console.log(person1 !== Person.prototype); // true + console.log(Person.prototype !== Person); // true + + /** + * 实例通过__proto__链接到原型对象, + * 它实际上指向隐藏特性[[Prototype]] + * + * 构造函数通过 prototype 属性链接到原型对象 + * + * 实例与构造函数没有直接联系,与原型对象有直接联系 + */ + console.log(person1.__proto__ === Person.prototype); // true + conosle.log(person1.__proto__.constructor === Person); // true + + /** + * 同一个构造函数创建的两个实例 + * 共享同一个原型对象: + */ + console.log(person1.__proto__ === person2.__proto__); // true + + /** + * instanceof 检查实例的原型链中 + * * 是否包含指定构造函数的原型: + */ + console.log(person1 instanceof Person); // true + console.log(person1 instanceof Object); // true + console.log(Person.prototype instanceof Object); // true + ``` + + - 各个对象之间的关系。 + + ![image-20210716163550713](JavaScript高级程序设计第四版-笔记.assets/image-20210716163550713.png) + + - 虽然不是所有实现都对外暴露了`[[Prototype]]`,但可以使用 isPrototypeOf()方法确定两个对象之间的这种关系。 + + - 本质上, `isPrototypeOf()`会在传入参数的`[[Prototype]]`指向调用它的对象时返回 true,如下所示: + + ```javascript + console.log(Person.prototype.isPrototypeOf(person1)); // true + console.log(Person.prototype.isPrototypeOf(person2)); // true + ``` + + - ECMAScript 的 Object 类型有一个方法叫 `Object.getPrototypeOf()`,返回参数的内部特性 `[[Prototype]]`的值。例如: + + ```javascript + console.log(Object.getPrototypeOf(person1) == Person.prototype); // true + console.log(Object.getPrototypeOf(person1).name); // "Nicholas" + ``` + + - 第一行代码简单确认了 `Object.getPrototypeOf()`返回的对象就是传入对象的原型对象。 + - 第二行代码则取得了原型对象上 name 属性的值,即"Nicholas"。 + - 使用 `Object.getPrototypeOf()`可以方便地取得一个对象的原型,而这在通过原型实现继承时显得尤为重要(本章后面会介绍)。 + + - Object 类型还有一个 `setPrototypeOf()`方法,可以向实例的私有特性`[[Prototype]]`写入一个新值。 + + - 这样就可以重写一个对象的原型继承关系: + + ```javascript + let biped = { + numLegs: 2 + }; + let person = { + name: 'Matt' + }; + + Object.setPrototypeOf(person, biped); + + console.log(person.name); // Matt + console.log(person.numLegs); // 2 + console.log(Object.getPrototypeOf(person) === biped); // true + console.log(person, biped); + ``` + + - **警告:** `Object.setPrototypeOf()`可能会严重影响代码性能。 + - 会涉及所有访问了那些修改过`[[Prototype]]`的对象的代码。 + - 为避免使用 `Object.setPrototypeOf()`可能造成的性能下降,可以通过 **`Object.create()`**来创建一个新对象,同时为其指定原型: + + ```javascript + let biped = { + numLegs: 2 + }; + + let person = Object.create(biped); + + person.name = 'Matt'; + console.log(person.name); // Matt + console.log(person.numLegs); // 2 + console.log(Object.getPrototypeOf(person) === biped); // true + ``` + + + +2. **原型层级** + + - 在通过对象访问属性时,会按照这个属性的名称开始搜索。 + 1. 搜索开始于对象实例本身。 + 2. 如果在这个实例上发现了给定的名称,则返回该名称对应的值。 + 3. **如果没有找到这个属性,则搜索会沿着指针进入原型对象,然后在原型对象上找到属性后,再返回对应的值。** + - 因此,在调用 `person1.sayName()`时,会发生两步搜索。 + 1. 首先, JavaScript 引擎会问:“person1 实例有 sayName 属性吗?”答案是没有。 + 2. 然后,继续搜索并问:“person1 的原型有 sayName 属性吗?”答案是有。 + 3. 于是就返回了保存在原型上的这个函数。 + - 在调用 `person2.sayName()`时,会发生同样的搜索过程,而且也会返回相同的结果。 + - 这就是原型用于在多个对象实例间共享属性和方法的原理。 + - **注意:** 前面提到的 constructor 属性只存在于原型对象,因此通过实例对象也是可以访问到的。 + - 虽然**可以通过实例读取原型对象上的值,但不可能通过实例重写这些值**。如果在实例上添加了一个与原型对象中同名的属性,那就会在实例上创建这个属性,这个属性会**遮住**原型对象上的属性。 + - **遮蔽( shadow)**原型对象上的同名属性。 + - 使用 **`delete`** 操作符可以完全删除实例上的这个属性,从而让标识符解析过程能够继续搜索原型对象。 + + ```javascript + function Person() {} + Person.prototype.name = "Nicholas"; + Person.prototype.age = 29; + Person.prototype.job = "Software Engineer"; + Person.prototype.sayName = function () { + console.log(this.name); + }; + + let person1 = new Person(); + let person2 = new Person(); + person1.name = "Greg"; + + console.log(person1.name); // "Greg",来自实例 + console.log(person2.name); // "Nicholas",来自原型 + + delete person1.name; + console.log(person1.name); // "Nicholas",来自原型 + ``` + + - **`hasOwnProperty()`**方法用于确定某个属性是在实例上还是在原型对象上。 + - 这个方法是继承自 Object 的,会在属性存在于调用它的对象实例上时返回 true。 + + ```javascript + function Person() {} + Person.prototype.name = "Nicholas"; + Person.prototype.age = 29; + Person.prototype.job = "Software Engineer"; + Person.prototype.sayName = function () { + console.log(this.name); + }; + + let person1 = new Person(); + let person2 = new Person(); + console.log(person1.hasOwnProperty("name")); // false + + person1.name = "Greg"; + console.log(person1.name); // "Greg",来自实例 + console.log(person1.hasOwnProperty("name")); // true + + console.log(person2.name); // "Nicholas",来自原型 + console.log(person2.hasOwnProperty("name")); // false + + delete person1.name; + console.log(person1.name); // "Nicholas",来自原型 + console.log(person1.hasOwnProperty("name")); // false + ``` + + - 通过调用 `hasOwnProperty()`能够清楚地看到访问的是实例属性还是原型属性。 + - 调用 `person1.hasOwnProperty("name")`只在重写 person1 上 name 属性的情况下才返回 true,表明此时 name 是一个实例属性,不是原型属性。 + + ![image-20210716173022784](JavaScript高级程序设计第四版-笔记.assets/image-20210716173022784.png) + + - 注意 ECMAScript 的 `Object.getOwnPropertyDescriptor()` 方法只对实例属性有效。要取得原型属性的描述符,就必须直接在原型对象上调用`Object.getOwnPropertyDescriptor()`。 + +3. **原型和 in 操作符** + + - 有两种方式使用 `in` 操作符: + 1. 单独使用和在 `for-in` 循环中使用。 + 2. 在单独使用时, `in` 操作符会在可以通过对象访问指定属性时返回 `true`,**无论该属性是在实例上还是在原型上**。 + + ```javascript + function Person() {} + + Person.prototype.name = "Nicholas"; + Person.prototype.age = 29; + Person.prototype.job = "Software Engineer"; + Person.prototype.sayName = function () { + console.log(this.name); + }; + + let person1 = new Person(); + let person2 = new Person(); + console.log(person1.hasOwnProperty("name")); // false + console.log("name" in person1); // true + + person1.name = "Greg"; + console.log(person1.name); // "Greg",来自实例 + console.log(person1.hasOwnProperty("name")); // true + console.log("name" in person1); // true + + console.log(person2.name); // "Nicholas",来自原型 + console.log(person2.hasOwnProperty("name")); // false + console.log("name" in person2); // true + + delete person1.name; + console.log(person1.name); // "Nicholas",来自原型 + console.log(person1.hasOwnProperty("name")); // false + console.log("name" in person1); // true + ``` + + - 如果要确定某个属性是否存在于原型上,则可以像下面这样同时使用 `hasOwnProperty()和 in` 操作符: + + ```javascript + function hasPrototypeProperty(object, name){ + return !object.hasOwnProperty(name) && (name in object); + } + ``` + + - 在 **`for-in`** 循环中使用 `in` 操作符时,可以通过对象访问且可以被枚举的属性都会返回,包括实例属性和原型属性。 + - 遮蔽原型中不可枚举( `[[Enumerable]]`特性被设置为 `false`)属性的实例属性也会在 `for-in` 循环中返回,因为默认情况下开发者定义的属性都是可枚举的。 + - 使用 **`Object.keys()`**方法获得对象上所有可枚举的实例属性。 + - 这个方法接收一个对象作为参数,返回包含该对象所有可枚举属性名称的字符串数组。 + + ```javascript + function Person() {} + Person.prototype.name = "Nicholas"; + Person.prototype.age = 29; + Person.prototype.job = "Software Engineer"; + Person.prototype.sayName = function () { + console.log(this.name); + }; + + let keys = Object.keys(Person.prototype); + console.log(keys); // "name,age,job,sayName" + let p1 = new Person(); + p1.name = "Rob"; + p1.age = 31; + let p1keys = Object.keys(p1); + console.log(p1keys); // "[name,age]" + ``` + + - 列出所有实例属性,无论是否可以枚举,都可以使用**`Object.getOwnPropertyNames()`**: + + ```javascript + let keys = Object.getOwnPropertyNames(Person.prototype); + console.log(keys); // "[constructor,name,age,job,sayName]" + ``` + + - `Object.keys()和 Object.getOwnPropertyNames()`在适当的时候都可用来代替 `for-in` 循环。 + - 因为以符号为键的属性没有名称的概念。因此, **`Object.getOwnPropertySymbols()`** 方法就出现了,这个方法与`Object.getOwnPropertyNames()`类似,只是针对符号而已: + + ```javascript + let k1 = Symbol('k1'), + k2 = Symbol('k2'); + let o = { + [k1]: 'k1', + [k2]: 'k2' + }; + console.log(Object.getOwnPropertySymbols(o)); + // [Symbol(k1), Symbol(k2)] + ``` + + + +4. **属性枚举顺序** + + - `for-in 循环、 Object.keys()、 Object.getOwnPropertyNames()、 Object.getOwnPropertySymbols()以及 Object.assign()`在属性枚举顺序方面有很大区别。 + - `for-in 循环和 Object.keys()` 的**枚举顺序是不确定的**,取决于 JavaScript 引擎,可能因浏览器而异。 + - `Object.getOwnPropertyNames()、 Object.getOwnPropertySymbols()和 Object.assign()` 的**枚举顺序是确定性的**。先以升序枚举数值键,然后以插入顺序枚举字符串和符号键。在对象字面量中定义的键以它们逗号分隔的顺序插入。 + + ```javascript + let k1 = Symbol('k1'), + k2 = Symbol('k2'); + let o = { + 1: 1, + first: 'first', + [k1]: 'sym2', + second: 'second', + 0: 0 + }; + + o[k2] = 'sym2'; + o[3] = 3; + o.third = 'third'; + o[2] = 2; + + console.log(Object.getOwnPropertyNames(o)); + // ["0", "1", "2", "3", "first", "second", "third"] + + console.log(Object.getOwnPropertySymbols(o)); + // [Symbol(k1), Symbol(k2)] + ``` + + + +### 8.2.5 对象迭代 + +- 迭代对象属性都是一个难题。 ECMAScript 2017 新增了两个静态方法,用于将对象内容转换为序列化的——更重要的是可迭代的——格式。 + +- 这两个静态方法 **`Object.values()`** 和 **`Object.entries()`** 接收一个对象,返回它们内容的数组。 + + - `Object.values()` 返回**对象值**的数组, + - `Object.entries()` 返回**键/值对**的数组。 + - 这两个方法执行对象的浅复制。 + - 符号属性会被忽略。 + + 注意,非字符串属性会被转换为字符串输出。 + + + +1. **其他原型语法** + + - 为了减少代码冗余,也为了从视觉上更好地封装原型功能,直接通过一个包含所有属性和方法的对象字面量来重写原型成为了一种常见的做法。 + + ```javascript + function Person() {} + + Person.prototype = { + name: "Nicholas", + age: 29, + job: "Software Engineer", + sayName() { + console.log(this.name); + } + }; + + let friend = new Person(); + console.log(friend instanceof Object); // true + console.log(friend instanceof Person); // true + + console.log(friend.constructor == Person); // false + console.log(friend.constructor == Object); // true + ``` + + - 这样重写之后, `Person.prototype` 的 constructor 属性就不指向 Person + 了。 + - 在创建函数时,也会创建它的 prototype 对象,同时会自动给这个原型的 constructor 属性赋值。 + - 而上面的写法完全重写了默认的 prototype 对象,因此其 constructor 属性也指向了完全不同的新对象( Object 构造函数),不再指向原来的构造函数。 + - 虽然 `instanceof` 操作符还能可靠地返回值,但我们不能再依靠 constructor 属性来识别类型了。 + - 在重写原型对象时专门设置一下 constructor 的值。 + + ```javascript + function Person() {} + + Person.prototype = { + constructor: Person, + name: "Nicholas", + age: 29, + job: "Software Engineer", + sayName() { + console.log(this.name); + } + }; + ``` + + - 注意,以这种方式恢复 `constructor` 属性会创建一个`[[Enumerable]]`为 `true` 的属性。而原生 `constructor` 属性默认是不可枚举的。因此,如果你使用的是兼容 ECMAScript 的 JavaScript 引擎,那可能会改为使用 **`Object.defineProperty()`** 方法来定义 `constructor` 属性: + + ```javascript + function Person() {} + + Person.prototype = { + name: "Nicholas", + age: 29, + job: "Software Engineer", + sayName() { + console.log(this.name); + } + }; + + // 恢复 constructor 属性 + Object.defineProperty(Person.prototype, "constructor", { + enumerable: false, + value: Person + }); + ``` + + + +2. **原型的动态性** + + - 从原型上搜索值的过程是动态的,所以即使实例在修改原型之前已经存在,任何时候对原型对象所做的修改也会在实例上反映出来。 因为实例和原型之间的链接就是简单的指针。 + - 虽然随时能给原型添加属性和方法,并能够立即反映在所有对象实例上,但这跟重写整个原型是两回事。 + - 实例的`[[Prototype]]`指针是在调用构造函数时自动赋值的,这个指针即使把原型修改为不同的对象也不会变。 + - 重写整个原型会切断最初原型与构造函数的联系,但实例引用的仍然是最初的原型。 + - 记住,**实例只有指向原型的指针,没有指向构造函数的指针。** + + ```javascript + function Person() {} + + let friend = new Person(); + Person.prototype = { + constructor: Person, + name: "Nicholas", + age: 29, + job: "Software Engineer", + sayName() { + console.log(this.name); + } + }; + + friend.sayName(); // 错误 + ``` + + - Person 的新实例是在重写原型对象之前创建的。在调用 `friend.sayName()`的时候,会导致错误。这是因为 firend 指向的原型还是最初的原型,而这个原型上并没有 sayName 属性。 + + ![image-20210716211907832](JavaScript高级程序设计第四版-笔记.assets/image-20210716211907832.png) + + - 重写构造函数上的原型之后再创建的实例才会引用新的原型。而在此之前创建的实例仍然会引用最初的原型。 + +3. **原生对象原型** + + - 原型模式之所以重要,不仅体现在自定义类型上,而且还因为它也是实现所有原生引用类型的模式。 + - 所有原生引用类型的构造函数(包括 Object、 Array、 String 等)都在原型上定义了实例方法。比如,数组实例的 `sort()` 方法就是 `Array.prototype` 上定义的,而字符串包装对象的 `substring()`方法也是在 `String.prototype` 上定义的,如下所示: + + ```javascript + console.log(typeof Array.prototype.sort); // "function" + console.log(typeof String.prototype.substring); // "function" + ``` + + - 通过原生对象的原型可以取得所有默认方法的引用,也可以给原生类型的实例定义新的方法。 + - 可以像修改自定义对象原型一样修改原生对象原型,因此随时可以添加方法。 + - 比如, 下面的代码就给 String 原始值包装类型的实例添加了一个 `startsWith()` 方法: + + ```javascript + String.prototype.startsWith = function (text) { + return this.indexOf(text) === 0; + }; + let msg = "Hello world!"; + console.log(msg.startsWith("Hello")); // true + ``` + + + +4. **原型的问题** + + - 弱化了向构造函数**传递初始化参数**的能力,会导致所有实例默认都取得相同的属性值。 + - 原型的最主要问题源自它的**共享特性**。 + - 真正的问题来自包含引用值的属性。 + + ```javascript + function Person() {} + Person.prototype = { + constructor: Person, + name: "Nicholas", + age: 29, + job: "Software Engineer", + friends: ["Shelby", "Court"], + sayName() { + console.log(this.name); + } + }; + + let person1 = new Person(); + let person2 = new Person(); + + person1.friends.push("Van"); + + console.log(person1.friends); // "Shelby,Court,Van" + console.log(person2.friends); // "Shelby,Court,Van" + console.log(person1.friends === person2.friends); // true + ``` + + - 由于这个 `friends` 属性存在于 `Person.prototype` 而非 `person1` 上,新加的这个字符串也会在(指向同一个数组的) `person2.friends` 上反映出来。如果这是有意在多个实例间共享数组,那没什么问题。 + - 但一般来说,**不同的实例应该有属于自己的属性副本**。这就是实际开发中通常不单独使用原型模式的原因。 + + + +## 8.3 继承 + +很多面向对象语言都支持两种继承:**接口继承和实现继承**。 + +- 前者只继承方法签名,后者继承实际的方法。 + +- 接口继承在 ECMAScript 中是不可能的,因为函数没有签名。 +- 实现继承是 ECMAScript 唯一支持的继承方式,而这主要是通过原型链实现的。 + +### 8.3.1 原型链 + +- 其基本思想就是通过原型继承多个引用类型的属性和方法。 +- 重温一下构造函数、原型和实例的关系:每个构造函数都有一个原型对象,原型有一个属性指回构造函数,而实例有一个内部指针指向原型。 +- 如果原型是另一个类型的实例呢? + - 那就意味着这个原型本身有一个内部指针指向另一个原型,相应地另一个原型也有一个指针指向另一个构造函数。 + - 这样就在实例和原型之间构造了一条**原型链**。这就是原型链的基本构想。 + +![image-20210718100442699](JavaScript高级程序设计第四版-笔记.assets/image-20210718100442699.png) + +- 这个例子中实现继承的关键,是 SubType 没有使用默认原型,而是将其替换成了一个新的对象。这个新的对象恰好是 SuperType 的实例。 +- 原型链扩展了前面描述的原型搜索机制。 + - 在读取实例上的属性时,首先会在实例上搜索这个属性。如果没找到,则会继承搜索实例的原型。 + - 在通过原型链实现继承之后,搜索就可以继承向上,搜索原型的原型。 + + + +1. **默认原型** + + - 实际上,原型链中还有一环。默认情况下,所有引用类型都继承自 Object,这也是通过原型链实现的。 + - 任何函数的默认原型都是一个 Object 的实例,这意味着这个实例有一个内部指针指向 `Object.prototype`。这也是为什么自定义类型能够继承包括 `toString()、 valueOf()`在内的所有默认方法的原因。 + - 因此前面的例子还有额外一层继承关系。 + + ![image-20210718102100840](JavaScript高级程序设计第四版-笔记.assets/image-20210718102100840.png) + + + +2. **原型与继承关系** + + - 原型与实例的关系可以通过两种方式来确定。 + - 第一种方式是使用 **`instanceof`** 操作符,如果一个实例的原型链中出现过相应的**构造函数**,则 instanceof 返回 true。 + - 确定这种关系的第二种方式是使用 **`isPrototypeOf()`**方法。 + - 原型链中的每个原型都可以调用这个方法,如下例所示,只要**原型链中包含这个原型**,这个方法就返回 true。 + + ```javascript + console.log(instance instanceof Object); // true + console.log(instance instanceof SuperType); // true + console.log(instance instanceof SubType); // true + + console.log(Object.prototype.isPrototypeOf(instance)); // true + console.log(SuperType.prototype.isPrototypeOf(instance)); // true + console.log(SubType.prototype.isPrototypeOf(instance)); // true + ``` + + + +3. **关于方法** + + - 子类有时候需要覆盖父类的方法,或者增加父类没有的方法。为此,这些方法必须在原型赋值之后再添加到原型上。 + - 另一个要理解的重点是,**以对象字面量方式创建原型方法会破坏之前的原型链,因为这相当于重写了原型链**。 + + ```javascript + function SuperType() { + this.property = true; + } + + SuperType.prototype.getSuperValue = function () { + return this.property; + }; + + function SubType() { + this.subproperty = false; + } + + // 继承 SuperType + SubType.prototype = new SuperType(); + + // 通过对象字面量添加新方法,这会导致上一行无效 + SubType.prototype = { + getSubValue() { + return this.subproperty; + }, + someOtherMethod() { + return false; + } + }; + + let instance = new SubType(); + console.log(instance.getSuperValue()); // 出错! + ``` + + + +4. **原型链的问题** + + - 原型中包含的引用值会在所有实例间共享,这也是为什么属性通常会在构造函数中定义而不会定义在原型上的原因。 + - 在使用原型实现继承时,原型实际上变成了另一个类型的实例。这意味着原先的实例属性摇身一变成为了原型属性。 + + ```javascript + function SuperType() { + this.colors = ["red", "blue", "green"]; + } + + function SubType() {} + + // 继承 SuperType + SubType.prototype = new SuperType(); + + let instance1 = new SubType(); + instance1.colors.push("black"); + console.log(instance1.colors); // "red,blue,green,black" + + let instance2 = new SubType(); + console.log(instance2.colors); // "red,blue,green,black" + ``` + + - 原型链的第二个问题是,子类型在实例化时不能给父类型的构造函数传参。 + - 事实上,我们无法在不影响所有对象实例的情况下把参数传进父类的构造函数。 + - 再加上之前提到的原型中包含引用值的问题,就导致原型链基本不会被单独使用。 + + + +### 8.3.2 盗用构造函数 + +为了解决原型包含引用值导致的继承问题,一种叫作**“盗用构造函数”( constructor stealing)**的技术在开发社区流行起来(这种技术有时也称作“对象伪装”或“经典继承”)。 + +- 基本思路很简单:**在子类构造函数中调用父类构造函数**。 +- 因为毕竟函数就是在特定上下文中执行代码的简单对象,所以可以使用 `apply()`和 `call()`方法以新创建的对象为上下文执行构造函数。 + - 通过使用 `call()`(或 `apply()`)方法, SuperType 构造函数在为 SubType 的实例创建的新对象的上下文中执行了。 + - 这相当于新的 SubType 对象上运行了`SuperType()` 函数中的所有初始化代码。结果就是每个实例都会有自己的 colors 属性。 + +```javascript +function SuperType() { + this.colors = ["red", "blue", "green"]; +} + +function SubType() { + // 继承 SuperType + SuperType.call(this); +} + +let instance1 = new SubType(); + +instance1.colors.push("black"); +console.log(instance1.colors); // "red,blue,green,black" + +let instance2 = new SubType(); +console.log(instance2.colors); // "red,blue,green" +``` + + + +1. **传递参数** + + - 相比于使用原型链,盗用构造函数的一个优点就是可以在子类构造函数中向父类构造函数传参。 + + ```javascript + function SuperType(name) { + this.name = name; + } + + function SubType() { + // 继承 SuperType 并传参 + SuperType.call(this, "Nicholas"); + // 实例属性 + this.age = 29; + } + + let instance = new SubType(); + console.log(instance.name); // "Nicholas"; + console.log(instance.age); // 29 + ``` + + - 为确保 SuperType 构造函数不会覆盖 SubType 定义的属性,可以在调用父类构造函数之后再给子类实例添加额外的属性。 + +2. **盗用构造函数的问题** + + - 盗用构造函数的主要缺点,也是使用构造函数模式自定义类型的问题: + - 必须在构造函数中定义方法, 因此函数不能重用。 + - 此外,子类也不能访问父类原型上定义的方法,因此所有类型只能使用构造函数模式。 + - 由于存在这些问题,盗用构造函数基本上也不能单独使用。 + + + +### 8.3.3 组合继承 + +**组合继承**(有时候也叫**伪经典继承**)综合了原型链和盗用构造函数,将两者的优点集中了起来。 + +- 基本的思路是使用原型链继承原型上的属性和方法,而通过盗用构造函数继承实例属性。 +- 这样既可以把方法定义在原型上以实现重用,又可以让每个实例都有自己的属性。 + +```javascript +function SuperType(name) { + this.name = name; + this.colors = ["red", "blue", "green"]; +} + +SuperType.prototype.sayName = function () { + console.log(this.name); +}; + +function SubType(name, age) { + // 继承属性 + SuperType.call(this, name); + this.age = age; +} + +// 继承方法 +SubType.prototype = new SuperType(); +SubType.prototype.sayAge = function () { + console.log(this.age); +}; + +let instance1 = new SubType("Nicholas", 29); +instance1.colors.push("black"); +console.log(instance1.colors); // "red,blue,green,black" +instance1.sayName(); // "Nicholas"; +instance1.sayAge(); // 29 + +let instance2 = new SubType("Greg", 27); +console.log(instance2.colors); // "red,blue,green" +instance2.sayName(); // "Greg"; +instance2.sayAge(); // 27 + +console.log(instance1 instanceof SuperType); +console.log(instance1 instanceof SubType); +console.log(Object.prototype.isPrototypeOf(instance1)); +console.log(SuperType.prototype.isPrototypeOf(instance2)); + +console.log(instance1); +``` + +- **组合继承弥补了原型链和盗用构造函数的不足,是 JavaScript 中使用最多的继承模式。** +- 而且组合继承也保留了 `instanceof` 操作符和 `isPrototypeOf()`方法识别合成对象的能力。 + + + +### 8.3.4 原型式继承 + +即使不自定义类型也可以通过原型实现对象之间的信息共享。 + +```javascript +function object(o) { + function F() {} + F.prototype = o; + return new F(); +} +``` + +- 这个 `object()` 函数会创建一个临时构造函数,将传入的对象赋值给这个构造函数的原型,然后返回这个临时类型的一个实例。 +- 本质上, `object()` 是对传入的对象执行了一次浅复制。 + +```javascript +function object(o) { + function F() {} + F.prototype = o; + return new F(); +} + +let person = { + name: "Nicholas", + friends: ["Shelby", "Court", "Van"] +}; + +let anotherPerson = object(person); +anotherPerson.name = "Greg"; +anotherPerson.friends.push("Rob"); + +let yetAnotherPerson = object(person); +yetAnotherPerson.name = "Linda"; +yetAnotherPerson.friends.push("Barbie"); + +console.log(person.friends); // "Shelby,Court,Van,Rob,Barbie" +``` + +- 在这个例子中, person 对象定义了另一个对象也应该共享的信息,把它传给 `object()` 之后会返回一个新对象。 + - 这个新对象的原型是 person,意味着它的原型上既有原始值属性又有引用值属性。 + - 这也意味着 `person.friends` 不仅是 `person` 的属性,也会跟 `anotherPerson` 和 `yetAnotherPerson` 共享。 + - 这里实际上克隆了两个 `person`。 +- ECMAScript 5 通过增加 **`Object.create()`**方法将原型式继承的概念规范化了。 + - 这个方法接收两个参数:作为新对象原型的对象,以及给新对象定义额外属性的对象(第二个可选)。 + - 在只有一个参数时,`Object.create()`与这里的 `object()`方法效果相同。 + +```javascript +let person = { + name: "Nicholas", + friends: ["Shelby", "Court", "Van"] +}; + +let anotherPerson = Object.create(person); +anotherPerson.name = "Greg"; +anotherPerson.friends.push("Rob"); + +let yetAnotherPerson = Object.create(person); +yetAnotherPerson.name = "Linda"; +yetAnotherPerson.friends.push("Barbie"); +console.log(person.friends); // "Shelby,Court,Van,Rob,Barbie" +``` + +- **`Object.create()`** 的第二个参数与 `Object.defineProperties()` 的第二个参数一样:每个新增属性都通过各自的描述符来描述。以这种方式添加的属性会遮蔽原型对象上的同名属性。 + +```javascript +let person = { + name: "Nicholas", + friends: ["Shelby", "Court", "Van"] +}; +let anotherPerson = Object.create(person, { + name: { + value: "Greg" + } +}); +console.log(anotherPerson.name); // "Greg" +``` + +- 原型式继承**非常适合不需要单独创建构造函数,但仍然需要在对象间共享信息的场合。** +- 但要记住,**属性中包含的引用值始终会在相关对象间共享,跟使用原型模式是一样的。** + + + +### 8.3.5 寄生式继承 + +- 与原型式继承比较接近的一种继承方式是**寄生式继承( parasitic inheritance)**,也是 Crockford 首倡的一种模式。 +- 寄生式继承背后的思路类似于寄生构造函数和工厂模式: + - 创建一个实现继承的函数,以某种方式增强对象,然后返回这个对象。 + +```javascript +function object(o) { + function F() {} + F.prototype = o; + return new F(); +} + +function createAnother(original) { + let clone = object(original); // 通过调用函数创建一个新对象 + clone.sayHi = function () { // 以某种方式增强这个对象 + console.log("hi"); + }; + return clone; // 返回这个对象 +} + +let person = { + name: "Nicholas", + friends: ["Shelby", "Court", "Van"] +}; +let anotherPerson = createAnother(person); +anotherPerson.sayHi(); // "hi" +``` + +- 这个例子基于 `person` 对象返回了一个新对象。 + - 新返回的 `anotherPerson` 对象具有 `person` 的所有属性和方法,还有一个新方法叫 `sayHi()`。 +- 寄生式继承同样适合主要关注对象,而**不在乎类型和构造函数的场景**。 + - `object()`函数不是寄生式继承所必需的,任何返回新对象的函数都可以在这里使用。 + +- 通过寄生式继承给对象添加函数会导致函数难以重用,与构造函数模式类似。 + + + +### 8.3.6 寄生式组合继承 + +- 组合继承其实也存在效率问题。 +- 最主要的效率问题就是父类构造函数始终会被调用两次: + - 一次在是创建子类原型时调用, + - 另一次是在子类构造函数中调用。 +- 本质上,子类原型最终是要包含超类对象的所有实例属性,子类构造函数只要在执行时重写自己的原型就行了。 + +```javascript +function SuperType(name) { + this.name = name; + this.colors = ["red", "blue", "green"]; +} +SuperType.prototype.sayName = function () { + console.log(this.name); +}; + +function SubType(name, age) { + SuperType.call(this, name); // 第二次调用 SuperType() + this.age = age; +} +SubType.prototype = new SuperType(); // 第一次调用 SuperType() +SubType.prototype.constructor = SubType; +SubType.prototype.sayAge = function () { + console.log(this.age); +}; +``` + +![image-20210718162123729](JavaScript高级程序设计第四版-笔记.assets/image-20210718162123729.png) + +![image-20210718162138045](JavaScript高级程序设计第四版-笔记.assets/image-20210718162138045.png) + +- 寄生式组合继承通过盗用构造函数继承属性,但使用混合式原型链继承方法。 + - 基本思路是不通过调用父类构造函数给子类原型赋值,而是取得父类原型的一个副本。 + - 说到底就是使用寄生式继承来继承父类原型,然后将返回的新对象赋值给子类原型。 +- 寄生式组合继承的基本模式: + +```javascript +function inheritPrototype(subType, superType) { + let prototype = object(superType.prototype); // 创建对象 + prototype.constructor = subType; // 增强对象 + subType.prototype = prototype; // 赋值对象 +} +``` + +- **`inheritPrototype()`** 函数实现了寄生式组合继承的核心逻辑。 + - 这个函数接收两个参数:子类构造函数和父类构造函数。 + - 在这个函数内部,第一步是创建父类原型的一个副本。 + - 然后,给返回的 prototype 对象设置 constructor 属性,解决由于重写原型导致默认 constructor 丢失的问题。 + - 最后将新创建的对象赋值给子类型的原型。 +- 如下例所示,调用 `inheritPrototype()` 就可以实现前面例子中的子类型原型赋值: + +```javascript +function object(o) { + function F() {} + F.prototype = o; + return new F(); +} + +function inheritPrototype(subType, superType) { + let prototype = object(superType.prototype); // 创建对象 + prototype.constructor = subType; // 增强对象 + subType.prototype = prototype; // 赋值对象 +} + +function SuperType(name) { + this.name = name; + this.colors = ["red", "blue", "green"]; +} +SuperType.prototype.sayName = function () { + console.log(this.name); +}; + +function SubType(name, age) { + SuperType.call(this, name); + this.age = age; +} +inheritPrototype(SubType, SuperType); +SubType.prototype.sayAge = function () { + console.log(this.age); +}; + +let sub = new SubType("王五", 11); +console.log(sub); +// SubType {name: "王五", colors: Array(3), age: 11} +// age: 11 +// colors: (3) ["red", "blue", "green"] +// name: "王五" +// __proto__: SuperType +// constructor: ƒ SubType(name, age) +// sayAge: ƒ () +// __proto__: +// sayName: ƒ () +// constructor: ƒ SuperType(name) +// __proto__: Object +``` + +- 这里只调用了一次 `SuperType` 构造函数,避免了 `SubType.prototype` 上不必要也用不到的属性,因此可以说这个例子的效率更高。 + - 而且,原型链仍然保持不变,因此 `instanceof` 操作符和 `isPrototypeOf()` 方法正常有效。 +- **寄生式组合继承可以算是引用类型继承的最佳模式。** + + + +## 8.4 类 + +前几节深入讲解了如何只使用 ECMAScript 5 的特性来模拟类似于**类( class-like)** 的行为。 不难看出,各种策略都有自己的问题,也有相应的妥协。正因为如此,实现继承的代码也显得非常冗长和混乱。 + +为解决这些问题, ECMAScript 6 新引入的 `class` 关键字具有**正式定义类的能力**。类( class)是ECMAScript 中新的基础性语法糖结构,因此刚开始接触时可能会不太习惯。 + +虽然 ECMAScript 6 类表面上看起来可以支持正式的面向对象编程,但实际上它背后使用的仍然是原型和构造函数的概念。 + +### 8.4.1 类定义 + +- 与函数类型相似,定义类也有两种主要方式:类声明和类表达式。这两种方式都使用 class 关键字加大括号: + +```javascript +// 类声明 +class Person {} + +// 类表达式 +const Animal = class {}; +``` + +- 与函数表达式类似,类表达式在它们被求值前也不能引用。 +- 与函数定义不同的是,虽然函数声明可以提升,但**类定义不能提升**。 + - **严格模式下不会提升!** + +```javascript +console.log(FunctionExpression); // undefined +var FunctionExpression = function () {}; +console.log(FunctionExpression); // function() {} +console.log(FunctionDeclaration); // FunctionDeclaration() {} +function FunctionDeclaration() {} +console.log(FunctionDeclaration); // FunctionDeclaration() {} + +console.log(ClassExpression); // undefined +var ClassExpression = class {}; +console.log(ClassExpression); // class {} + +// console.log(ClassDeclaration); // ReferenceError: ClassDeclaration is not defined +class ClassDeclaration {} +console.log(ClassDeclaration); // class ClassDeclaration {} +``` + +- 另一个跟函数声明不同的地方是,函数受函数作用域限制,而**类受块作用域限制** 。 + - **严格模式下相同!** + +```javascript +{ + function FunctionDeclaration() {} + class ClassDeclaration {} +} +console.log(FunctionDeclaration); // FunctionDeclaration() {} +console.log(ClassDeclaration); // ReferenceError: ClassDeclaration is not defined +``` + + + +- **类的构成** + + - 类可以包含**构造函数方法、实例方法、获取函数、设置函数和静态类方法**,但这些都不是必需的。空的类定义照样有效。 + - 默认情况下,类定义中的代码都在严格模式下执行。 + - 与函数构造函数一样,多数编程风格都建议类名的**首字母要大写**,以区别于通过它创建的实例(比如,通过 `class Foo {}`创建实例 `foo`) + + ```javascript + // 空类定义,有效 + class Foo {} + + // 有构造函数的类,有效 + class Bar { + constructor() {} + } + + // 有获取函数的类,有效 + class Baz { + get myBaz() {} + } + + // 有静态方法的类,有效 + class Qux { + static myQux() {} + } + ``` + + - 类表达式的名称是可选的。 + - 在把类表达式赋值给变量后,可以通过 **name 属性**取得类表达式的名称字符串。 + - 但不能在类表达式作用域外部访问这个标识符。 + + ```javascript + let Person = class PersonName { + identify() { + console.log(Person.name, PersonName.name); + } + } + + let p = new Person(); + p.identify(); // PersonName PersonName + + console.log(Person.name); // PersonName + console.log(PersonName); // ReferenceError: PersonName is not defined + ``` + + + +### 8.4.2 类构造函数 + +constructor 关键字用于在类定义块内部创建类的构造函数。 + +方法名 constructor 会告诉解释器在使用 new 操作符创建类的新实例时,应该调用这个函数。 + +构造函数的定义不是必需的,不定义构造函数相当于将构造函数定义为空函数。 + +1. **实例化** + + - 使用 new 操作符实例化 Person 的操作等于使用 new 调用其构造函数。 + - 唯一可感知的不同之处就是, JavaScript 解释器知道使用 new 和类意味着应该使用 constructor 函数进行实例化。 + - 使用 new 调用类的构造函数会执行如下操作。 + 1. 在内存中创建一个新对象。 + 2. 这个新对象内部的`[[Prototype]]`指针被赋值为构造函数的 `prototype` 属性。 + 3. 构造函数内部的 `this` 被赋值为这个新对象(即 `this` 指向新对象)。 + 4. 执行构造函数内部的代码(给新对象添加属性)。 + 5. 如果构造函数返回非空对象,则返回该对象;否则,返回刚创建的新对象。 + + ```javascript + class Animal {} + class Person { + constructor() { + console.log('person ctor'); + } + } + class Vegetable { + constructor() { + this.color = 'orange'; + } + } + let a = new Animal(); + let p = new Person(); // person ctor + + let v = new Vegetable(); + console.log(v.color); // orange + ``` + + - 类实例化时传入的参数会用作构造函数的参数。如果不需要参数,则类名后面的括号也是可选的。 + + ```javascript + class Person { + constructor(name) { + console.log(arguments.length); + this.name = name || null; + } + } + + let p1 = new Person; // 0 + console.log(p1.name); // null + + let p2 = new Person(); // 0 + console.log(p2.name); // null + + let p3 = new Person('Jake'); // 1 + console.log(p3.name); // Jake + ``` + + - 默认情况下,类构造函数会在执行之后返回 this 对象。构造函数返回的对象会被用作实例化的对象,如果没有什么引用新创建的 this 对象,那么这个对象会被销毁。 + - 不过,如果返回的不是 this 对象,而是其他对象,那么这个对象不会通过 instanceof 操作符检测出跟类有关联,因为这个对象的原型指针并没有被修改。 + + ```javascript + class Person { + constructor(override) { + this.foo = 'foo'; + if (override) { + return { + bar: 'bar' + }; + } + } + } + + let p1 = new Person(), + p2 = new Person(true); + + console.log(p1); // Person{ foo: 'foo' } + console.log(p1 instanceof Person); // true + + console.log(p2); // { bar: 'bar' } + console.log(p2 instanceof Person); // false + ``` + + - 类构造函数与构造函数的主要区别是,调用类构造函数必须使用 `new` 操作符。而普通构造函数如果不使用 `new` 调用,那么就会以全局的 `this`(通常是 window)作为内部对象。调用类构造函数时如果忘了使用 `new` 则会抛出错误: + + ```javascript + function Person() {} + class Animal {} + + // 把 window 作为 this 来构建实例 + let p = Person(); + let a = Animal(); + // TypeError: class constructor Animal cannot be invoked without 'new' + ``` + + - 类构造函数没有什么特殊之处,实例化之后,它会成为普通的实例方法(但作为类构造函数,仍然要使用 new 调用)。 + - `let p2 = new p1.constructor(); ` + +2. **把类当成特殊函数** + + - 通过 **`typeof`** 操作符检测类标识符,表明它是一个函数。 + - `console.log(typeof Person); // function ` + - 类标识符有 **`prototype`** 属性,而这个原型也有一个 `constructor` 属性指向类自身。 + - `console.log(Person.prototype); // { constructor: f() } ` + - 与普通构造函数一样, 可以使用 **`instanceof`** 操作符检查构造函数原型是否存在于实例的原型链中。 + - `console.log(p instanceof Person); // true ` + - 可以使用 `instanceof` 操作符检查一个对象与类构造函数,以确定这个对象是不是类的实例。只不过此时的类构造函数要使用类标识符。 + - 类本身具有与普通构造函数一样的行为。在类的上下文中,类本身在使用 `new` 调用时就会被当成构造函数。 + - 重点在于,类中定义的 `constructor` 方法不会被当成构造函数,在对它使用 `instanceof` 操作符时会返回 `false`。 + - 但是,如果在创建实例时直接将类构造函数当成普通构造函数来使用,那么 `instanceof` 操作符的返回值会反转。 + + ```javascript + class Person {} + + let p1 = new Person(); + + console.log(p1.constructor === Person); // true + console.log(p1 instanceof Person); // true + console.log(p1 instanceof Person.constructor); // false + + let p2 = new Person.constructor(); + + console.log(p2.constructor === Person); // false + console.log(p2 instanceof Person); // false + console.log(p2 instanceof Person.constructor); // true + ``` + + - 类是 JavaScript 的一等公民,因此可以像其他对象或函数引用一样把类作为参数传递。 + + ```javascript + // 类可以像函数一样在任何地方定义,比如在数组中 + let classList = [ + class { + constructor(id) { + this.id_ = id; + console.log(`instance ${this.id_}`); + } + } + ]; + + function createInstance(classDefinition, id) { + return new classDefinition(id); + } + + let foo = createInstance(classList[0], 3141); // instance 3141 + ``` + + - 与立即调用函数表达式相似,类也可以立即实例化: + + ```javascript + // 因为是一个类表达式,所以类名是可选的 + let p = new class Foo { + constructor(x) { + console.log(x); + } + }('bar'); // bar + console.log(p); // Foo {} + ``` + + + +### 8.4.3 实例、原型和类成员 + +1. **实例成员** + + - 每次通过`new` 调用类标识符时,都会执行类构造函数。 + - 在这个函数内部,可以为新创建的实例( `this`)添加“自有”属性。 + - 至于添加什么样的属性,则没有限制。 + - 另外,在构造函数执行完毕后,仍然可以给实例继续添加新成员。 + - 实例成员不在原型上共享。 + + ```javascript + class Person { + constructor() { + // 这个例子先使用对象包装类型定义一个字符串 + // 为的是在下面测试两个对象的相等性 + this.name = new String('Jack'); + this.sayName = () => console.log(this.name); + this.nicknames = ['Jake', 'J-Dog'] + } + } + + let p1 = new Person(), + p2 = new Person(); + + p1.sayName(); // Jack + p2.sayName(); // Jack + + console.log(p1.name === p2.name); // false + console.log(p1.sayName === p2.sayName); // false + console.log(p1.nicknames === p2.nicknames); // false + + p1.name = p1.nicknames[0]; + p2.name = p2.nicknames[1]; + + p1.sayName(); // Jake + p2.sayName(); // J-Dog + ``` + + + +2. **原型方法与访问器** + + - 为了在实例间共享方法,类定义语法把**在类块中定义的方法作为原型方法**。 + + ```javascript + class Person { + constructor() { + // 添加到 this 的所有内容都会存在于不同的实例上 + this.locate = () => console.log('instance'); + } + // 在类块中定义的所有内容都会定义在类的原型上 + locate() { + console.log('prototype'); + } + } + let p = new Person(); + + p.locate(); // instance + Person.prototype.locate(); // prototype + ``` + + - 可以把方法定义在类构造函数中或者类块中,但**不能在类块中给原型添加原始值**或对象作为成员数据: + + ```javascript + class Person { + name: 'Jake' + } + // Uncaught SyntaxError: Unexpected token + ``` + + - 类方法等同于对象属性,因此可以使用字符串、符号或计算的值作为键: + + ```javascript + const symbolKey = Symbol('symbolKey'); + class Person { + stringKey() { + console.log('invoked stringKey'); + } + [symbolKey]() { + console.log('invoked symbolKey'); + } + ['computed' + 'Key']() { + console.log('invoked computedKey'); + } + } + let p = new Person(); + + p.stringKey(); // invoked stringKey + p[symbolKey](); // invoked symbolKey + p.computedKey(); // invoked computedKey + ``` + + - 类定义也支持获取和设置**访问器**。语法与行为跟普通对象一样 + + ```javascript + class Person { + set name(newName) { + this.name_ = newName + ":Set"; + } + get name() { + return this.name_ + ":Get"; + } + } + let p = new Person(); + + p.name = 'Jake'; + console.log(p.name); // Jake + ``` + + + +3. **静态类方法** + + - 可以在类上定义静态方法。这些方法通常用于执行不特定于实例的操作,也不要求存在类的实例。与原型成员类似,~~静态成员每个类上只能有一个~~。 + - 可以有多个静态成员 + - 可以使用静态属性(新添加) + - 静态类成员在类定义中使用 **`static` 关键字**作为前缀。在静态成员中, `this` 引用类自身。其他所有约定跟原型成员一样: + + ```javascript + class Person { + constructor() { + // 添加到 this 的所有内容都会存在于不同的实例上 + this.locate = () => console.log('instance', this); + } + // 定义在类的原型对象上 + locate() { + console.log('prototype', this); + } + // 定义在类本身上 + static locate() { + console.log('class', this); + } + } + let p = new Person(); + + p.locate(); // instance, Person {} + Person.prototype.locate(); // prototype, {constructor: ... } + Person.locate(); // class, class Person {} + ``` + + - 静态类方法非常适合作为实例工厂: + + ```javascript + class Person { + constructor(age) { + this.age_ = age; + } + sayAge() { + console.log(this.age_); + } + static create() { + // 使用随机年龄创建并返回一个 Person 实例 + return new Person(Math.floor(Math.random() * 100)); // 或者 new this() + } + } + console.log(Person.create()); // Person { age_: ... } + ``` + + + +4. **非函数原型和类成员** + + - 虽然类定义并不显式支持在原型或类上添加成员数据,但在类定义外部,可以手动添加: + + ```javascript + class Person { + sayName() { + console.log(`${Person.greeting} ${this.name}`); + } + } + // 在类上定义数据成员 + Person.greeting = 'My name is'; + + // 在原型上定义数据成员 + Person.prototype.name = 'Jake'; + + let p = new Person(); + p.sayName(); // My name is Jake + ``` + + - **注意:** 类定义中之所以没有显式支持添加数据成员,是因为在共享目标(原型和类)上添加可变(可修改)数据成员是一种反模式。 + - 一般来说,对象实例应该独自拥有通过 this 引用的数据。 + +5. **迭代器与生成器方法** + + - 类定义语法支持在原型和类本身上定义生成器方法: + + ```javascript + class Person { + // 在原型上定义生成器方法 + * createNicknameIterator() { + yield 'Jack'; + yield 'Jake'; + yield 'J-Dog'; + } + // 在类上定义生成器方法 + static * createJobIterator() { + yield 'Butcher'; + yield 'Baker'; + yield 'Candlestick maker'; + } + } + + let jobIter = Person.createJobIterator(); + console.log(jobIter.next().value); // Butcher + console.log(jobIter.next().value); // Baker + console.log(jobIter.next().value); // Candlestick maker + + let p = new Person(); + let nicknameIter = p.createNicknameIterator(); + console.log(nicknameIter.next().value); // Jack + console.log(nicknameIter.next().value); // Jake + console.log(nicknameIter.next().value); // J-Dog + ``` + + - 因为支持生成器方法,所以可以通过添加一个默认的迭代器,把类实例变成可迭代对象: + + ```javascript + class Person { + constructor() { + this.nicknames = ['Jack', 'Jake', 'J-Dog']; + } + *[Symbol.iterator]() { + yield* this.nicknames.entries(); + } + } + let p = new Person(); + for (let [idx, nickname] of p) { + console.log(nickname); + } + // Jack + // Jake + // J-Dog + + + // 也可以只返回迭代器实例: + class Person2 { + constructor() { + this.nicknames = ['Jack', 'Jake', 'J-Dog']; + } + [Symbol.iterator]() { + return this.nicknames.entries(); + } + } + let p2 = new Person2(); + for (let [idx, nickname] of p) { + console.log(nickname); + } + // Jack + // Jake + // J-Dog + ``` + + + +### 8.4.4 继承 + +ECMAScript 6 新增特性中最出色的一个就是**原生支持了类继承机制**。虽然类继承使用的是新语法,但背后依旧使用的是原型链。 + +1. **继承基础** + + - ES6 类支持单继承。 + - 使用 **`extends`** 关键字,就可以继承任何拥有**`[[Construct]]`**和**原型**的对象。 + - 很大程度上,这意味着不仅可以继承一个类,也可以继承普通的构造函数(保持向后兼容): + + ```javascript + class Vehicle {} + // 继承类 + class Bus extends Vehicle {} + + let b = new Bus(); + console.log(b instanceof Bus); // true + console.log(b instanceof Vehicle); // true + + function Person() {} + + // 继承普通构造函数 + class Engineer extends Person {} + + let e = new Engineer(); + console.log(e instanceof Engineer); // true + console.log(e instanceof Person); // true + ``` + + - 派生类都会通过原型链访问到类和原型上定义的方法。 `this` 的值会反映调用相应方法的实例或者类: + + ```javascript + class Vehicle { + identifyPrototype(id) { + console.log(id, this); + } + static identifyClass(id) { + console.log(id, this); + } + } + class Bus extends Vehicle {} + + let v = new Vehicle(); + let b = new Bus(); + + b.identifyPrototype('bus'); // bus, Bus {} + v.identifyPrototype('vehicle'); // vehicle, Vehicle {} + + Bus.identifyClass('bus'); // bus, class Bus {} + Vehicle.identifyClass('vehicle'); // vehicle, class Vehicle {} + ``` + + - **注意:** `extends` 关键字也可以在类表达式中使用,因此 `let Bar = class extends Foo {}` 是有效的语法。 + + + +2. **构造函数、 HomeObject 和 super()** + + - 派生类的方法可以通过 `super` 关键字引用它们的原型。 + - 这个关键字只能在派生类中使用,而且仅限于类构造函数、实例方法和静态方法内部。 + - 在类构造函数中使用 `super` 可以调用父类构造函数。 + + ```javascript + class Vehicle { + constructor() { + this.hasEngine = true; + } + } + class Bus extends Vehicle { + constructor() { + // 不要在调用 super()之前引用 this,否则会抛出 ReferenceError + super(); // 相当于 super.constructor() + console.log(this instanceof Vehicle); // true + console.log(this); // Bus { hasEngine: true } + } + } + new Bus(); + ``` + + - 在静态方法中可以通过 `super` 调用继承的类上定义的静态方法: + + ```javascript + class Vehicle { + static identify() { + console.log('vehicle'); + } + } + class Bus extends Vehicle { + static identify() { + super.identify(); + } + } + Bus.identify(); // vehicle + ``` + + - **注意:** ES6 给类构造函数和静态方法添加了内部特性`[[HomeObject]]`,这个特性是一个指针,指向定义该方法的对象。 + - 这个指针是自动赋值的,而且只能在 JavaScript 引擎内部访问。 super 始终会定义为`[[HomeObject]]`的原型。 + - **在使用 `super` 时要注意几个问题。** + 1. `super` 只能在派生类构造函数和静态方法中使用。 + 2. 不能单独引用 `super` 关键字,要么用它调用构造函数,要么用它引用静态方法。 + 3. 调用 `super()`会调用父类构造函数,并将返回的实例赋值给 `this`。 + 4. `super()`的行为如同调用构造函数,如果需要给父类构造函数传参,则需要手动传入。 + 5. 如果没有定义类构造函数,在实例化派生类时会调用 `super()`,而且会传入所有传给派生类的参数。 + 6. **在类构造函数中,不能在调用 `super()`之前引用 `this`。** + 7. 如果在派生类中显式定义了构造函数,则要么必须在其中调用 `super()`,要么必须在其中返回一个对象。 + + ```javascript + // 1 + class Vehicle { + constructor() { + super(); + // SyntaxError: 'super' keyword unexpected + } + } + + // 2 + class Vehicle {} + class Bus extends Vehicle { + constructor() { + console.log(super); + // SyntaxError: 'super' keyword unexpected here + } + } + + // 3 + class Vehicle {} + class Bus extends Vehicle { + constructor() { + super(); + console.log(this instanceof Vehicle); + } + } + new Bus(); // true + + // 4 + class Vehicle { + constructor(licensePlate) { + this.licensePlate = licensePlate; + } + } + class Bus extends Vehicle { + constructor(licensePlate) { + super(licensePlate); + } + } + console.log(new Bus('1337H4X')); // Bus { licensePlate: '1337H4X' } + + // 5 + class Vehicle { + constructor(licensePlate) { + this.licensePlate = licensePlate; + } + } + class Bus extends Vehicle {} + console.log(new Bus('1337H4X')); // Bus { licensePlate: '1337H4X' } + + // 6 + class Vehicle {} + class Bus extends Vehicle { + constructor() { + console.log(this); + } + } + new Bus(); + // ReferenceError: Must call super constructor in derived class + // before accessing 'this' or returning from derived constructor + + // 7 + class Vehicle {} + class Car extends Vehicle {} + class Bus extends Vehicle { + constructor() { + super(); + } + } + class Van extends Vehicle { + constructor() { + return {}; + } + } + console.log(new Car()); // Car {} + console.log(new Bus()); // Bus {} + console.log(new Van()); // {} + ``` + + + +3. **抽象基类** + + - 有时候可能需要定义这样一个类,它可供其他类继承,但本身不会被实例化。 + + - 虽然 ECMAScript 没有专门支持这种类的语法 ,但通过 `new.target` 也很容易实现。 + + - **`new.target`**属性允许你检测函数或构造方法是否是通过[new](https://developer.mozilla.org/zh-CN/docs/orphaned/Web/JavaScript/Reference/Operators/new)运算符被调用的。 + + - 在**通过 new 运算符被初始化的函数**或构造方法中,`new.target`返回一个指向构造方法或函数的引用。 + + - 在**普通的函数**调用中,`new.target` 的值是[`undefined`](https://developer.mozilla.org/zh-CN/docs/orphaned/Web/JavaScript/Reference/Global_Objects/undefined)。 + + - `new.target` 保存通过 `new` 关键字调用的类或函数。通过在实例化时检测 `new.target` 是不是抽象基类,可以阻止对抽象基类的实例化: + + ```javascript + // 抽象基类 + class Vehicle { + constructor() { + console.log(new.target); + if (new.target === Vehicle) { + throw new Error('Vehicle cannot be directly instantiated'); + } + } + } + // 派生类 + class Bus extends Vehicle {} + new Bus(); // class Bus {} + new Vehicle(); // class Vehicle {} + // Error: Vehicle cannot be directly instantiated + ``` + + - 另外,通过在抽象基类构造函数中进行检查,可以要求派生类必须定义某个方法。因为原型方法在调用类构造函数之前就已经存在了,所以可以通过 `this` 关键字来检查相应的方法: + + ```javascript + // 抽象基类 + class Vehicle { + constructor() { + if (new.target === Vehicle) { + throw new Error('Vehicle cannot be directly instantiated'); + } + if (!this.foo) { + throw new Error('Inheriting class must define foo()'); + } + console.log('success!'); + } + } + // 派生类 + class Bus extends Vehicle { + foo() {} + } + // 派生类 + class Van extends Vehicle {} + new Bus(); // success! + new Van(); // Error: Inheriting class must define foo() + ``` + + + +4. **继承内置类型** + + - ES6 类为继承内置引用类型提供了顺畅的机制,开发者可以方便地扩展内置类型: + + ```javascript + class SuperArray extends Array { + shuffle() { + // 洗牌算法 + for (let i = this.length - 1; i > 0; i--) { + const j = Math.floor(Math.random() * (i + 1)); + [this[i], this[j]] = [this[j], this[i]]; + } + } + } + let a = new SuperArray(1, 2, 3, 4, 5); + console.log(a instanceof Array); // true + console.log(a instanceof SuperArray); // true + + console.log(a); // [1, 2, 3, 4, 5] + a.shuffle(); + console.log(a); // [3, 1, 4, 5, 2] + ``` + + - 有些内置类型的方法会返回新实例。默认情况下,返回实例的类型与原始实例的类型是一致的: + + ```javascript + class SuperArray extends Array {} + let a1 = new SuperArray(1, 2, 3, 4, 5); + let a2 = a1.filter(x => !!(x % 2)) + console.log(a1); // [1, 2, 3, 4, 5] + console.log(a2); // [1, 3, 5] + console.log(a1 instanceof SuperArray); // true + console.log(a2 instanceof SuperArray); // true + ``` + + - 如果想覆盖这个默认行为,则可以覆盖 `Symbol.species` 访问器,这个访问器决定在创建返回的实例时使用的类: + + ```javascript + class SuperArray extends Array { + static get[Symbol.species]() { + return Array; + } + } + let a1 = new SuperArray(1, 2, 3, 4, 5); + let a2 = a1.filter(x => !!(x % 2)) + console.log(a1); // [1, 2, 3, 4, 5] + console.log(a2); // [1, 3, 5] + console.log(a1 instanceof SuperArray); // true + console.log(a2 instanceof SuperArray); // false + ``` + + + +5. **类混入** + + - 把不同类的行为集中到一个类是一种常见的 JavaScript 模式。虽然 ES6 没有显式支持多类继承,但通过现有特性可以轻松地模拟这种行为。 + - **注意:** `Object.assign()`方法是为了混入对象行为而设计的。只有在需要混入类的行为时才有必要自己实现混入表达式。如果只是需要混入多个对象的属性,那么使用`Object.assign()`就可以了。 + - 在下面的代码片段中, `extends` 关键字后面是一个 JavaScript 表达式。任何可以解析为一个类或一个构造函数的表达式都是有效的。这个表达式会在求值类定义时被求值: + + ```javascript + class Vehicle {} + + function getParentClass() { + console.log('evaluated expression'); + return Vehicle; + } + class Bus extends getParentClass() {} + // 可求值的表达式 + ``` + + - 混入模式可以通过在一个表达式中连缀多个混入元素来实现,这个表达式最终会解析为一个可以被继承的类。如果 Person 类需要组合 A、 B、 C,则需要某种机制实现 B 继承 A, C 继承 B,而 Person 再继承 C,从而把 A、 B、 C 组合到这个超类中。实现这种模式有不同的策略。 + - 一个策略是定义一组“可嵌套”的函数,每个函数分别接收一个超类作为参数,而将混入类定义为这个参数的子类,并返回这个类。这些组合函数可以连缀调用,最终组合成超类表达式: + + ```javascript + class Vehicle {} + let FooMixin = (Superclass) => class extends Superclass { + foo() { + console.log('foo'); + } + }; + let BarMixin = (Superclass) => class extends Superclass { + bar() { + console.log('bar'); + } + }; + let BazMixin = (Superclass) => class extends Superclass { + baz() { + console.log('baz'); + } + }; + class Bus extends FooMixin(BarMixin(BazMixin(Vehicle))) {} + let b = new Bus(); + b.foo(); // foo + b.bar(); // bar + b.baz(); // baz + ``` + + - 通过写一个辅助函数, 可以把嵌套调用展开: + + ```javascript + class Vehicle {} + let FooMixin = (Superclass) => class extends Superclass { + foo() { + console.log('foo'); + } + }; + let BarMixin = (Superclass) => class extends Superclass { + bar() { + console.log('bar'); + } + }; + let BazMixin = (Superclass) => class extends Superclass { + baz() { + console.log('baz'); + } + }; + + function mix(BaseClass, ...Mixins) { + return Mixins.reduce((accumulator, current) => current(accumulator), BaseClass); + } + class Bus extends mix(Vehicle, FooMixin, BarMixin, BazMixin) {} + + let b = new Bus(); + b.foo(); // foo + b.bar(); // bar + b.baz(); // baz + ``` + + - **注意:** 很多 JavaScript 框架(特别是 React)已经抛弃混入模式,转向了组合模式(把方法提取到独立的类和辅助对象中,然后把它们组合起来,但不使用继承)。 + - 这反映了那个众所周知的软件设计原则:**“组合胜过继承( composition over inheritance)。”**这个设计原则被很多人遵循,在代码设计中能提供极大的灵活性。 + + + +# 第9章 代理与反射 + +ECMAScript 6 新增的代理和反射为开发者提供了**拦截并向基本操作嵌入额外行为的能力**。 + +具体地说,可以给目标对象定义一个关联的代理对象,而这个代理对象可以作为抽象的目标对象来使用。在对目标对象的各种操作影响目标对象之前,可以在代理对象中对这些操作加以控制。 + +- 由于**代理是一种新的基础性语言能力**,很多转译程序都不能把代理行为转换为之前的 ECMAScript 代码,因为代理的行为实际上是无可替代的。 + +## 9.1 代理基础 +### 9.1.1 创建空代理 + +1. 代理是使用 Proxy 构造函数创建的。 + + - 这个构造函数接收两个参数:**目标对象**和**处理程序对象**。 + + - 缺少其中任何一个参数都会抛出 TypeError。 + - 要创建空代理,可以传一个简单的对象字面量作为处理程序对象,从而让所有操作畅通无阻地抵达目标对象。 + + ```javascript + const target = { + id: 'target' + }; + const handler = {}; + const proxy = new Proxy(target, handler); + + // id 属性会访问同一个值 + console.log(target.id); // target + console.log(proxy.id); // target + + // 给目标属性赋值会反映在两个对象上 + // 因为两个对象访问的是同一个值 + target.id = 'foo'; + console.log(target.id); // foo + console.log(proxy.id); // foo + + // 给代理属性赋值会反映在两个对象上 + // 因为这个赋值会转移到目标对象 + proxy.id = 'bar'; + console.log(target.id); // bar + console.log(proxy.id); // bar + + // hasOwnProperty()方法在两个地方 + // 都会应用到目标对象 + console.log(target.hasOwnProperty('id')); // true + console.log(proxy.hasOwnProperty('id')); // true + + // Proxy.prototype 是 undefined + // 因此不能使用 instanceof 操作符 + // console.log(target instanceof Proxy); // TypeError: Function has non-object prototype 'undefined' in instanceof check + // console.log(proxy instanceof Proxy); // TypeError: Function has non-object prototype 'undefined' in instanceof check + + // 严格相等可以用来区分代理和目标 + console.log(target === proxy); // false + ``` + + + +### 9.1.2 定义捕获器 + +1. **捕获器( trap)**。 + + - 捕获器就是在处理程序对象中定义的“基本操作的拦截器”。 + - 每个处理程序对象可以包含零个或多个捕获器,每个捕获器都对应一种基本操作,可以直接或间接在代理对象上调用。 + - 每次在代理对象上调用这些基本操作时,代理可以在这些操作传播到目标对象之前先调用捕获器函数,从而拦截并修改相应的行为。 + - **注意:** 捕获器( trap)是从操作系统中借用的概念。 + - 在操作系统中,捕获器是程序流中的一个同步中断,可以暂停程序流,转而执行一段子例程,之后再返回原始程序流。 + - 定义一个 g`et()`捕获器,在 ECMAScript 操作以某种形式调用 `get()`时触发: + + ```javascript + const target = { + foo: 'bar' + }; + const handler = { + // 捕获器在处理程序对象中以方法名为键 + get() { + return 'handler override'; + } + }; + const proxy = new Proxy(target, handler); + + console.log(target.foo); // bar + console.log(proxy.foo); // handler override + + console.log(target['foo']); // bar + console.log(proxy['foo']); // handler override + + console.log(Object.create(target)['foo']); // bar + console.log(Object.create(proxy)['foo']); // handler override + ``` + + + +### 9.1.3 捕获器参数和反射 API + +1. 所有捕获器都可以访问相应的参数,基于这些参数可以重建被捕获方法的原始行为。 + + - 比如, `get()` 捕获器会接收到**目标对象**、**要查询的属性**和**代理对象**三个参数。 + + ```javascript + const target = { + foo: 'bar' + }; + const handler = { + get(trapTarget, property, receiver) { + console.log(trapTarget === target); + console.log(property); + console.log(receiver === proxy); + } + }; + const proxy = new Proxy(target, handler); + proxy.foo; + // true + // foo + // true + ``` + + - 有了这些参数, 就可以重建被捕获方法的原始行为: + + ```javascript + const target = { + foo: 'bar' + }; + const handler = { + get(trapTarget, property, receiver) { + return trapTarget[property]; + } + }; + const proxy = new Proxy(target, handler); + console.log(proxy.foo); // bar + console.log(target.foo); // bar + ``` + +2. 调用全局 **Reflect** 对象上(封装了原始行为)的同名方法来重建原始行为。 + + - 处理程序对象中所有可以捕获的方法都有对应的**反射( Reflect) API 方法**。这些方法与捕获器拦截的方法具有相同的名称和函数签名,而且也具有与被拦截方法相同的行为。 + + ```javascript + const target = { + foo: 'bar' + }; + const handler = { + get() { + return Reflect.get(...arguments); + } + }; + const proxy = new Proxy(target, handler); + console.log(proxy.foo); // bar + console.log(target.foo); // bar + + // 甚至还可以写得更简洁一些: + const target = { + foo: 'bar' + }; + const handler = { + get: Reflect.get + }; + const proxy = new Proxy(target, handler); + console.log(proxy.foo); // bar + console.log(target.foo); // bar + ``` + +3. 创建一个可以捕获所有方法,然后将每个方法转发给对应反射 API 的空代理,那么甚至不需要定义处理程序对象: + + ```javascript + const target = { + foo: 'bar' + }; + const proxy = new Proxy(target, Reflect); + console.log(proxy.foo); // bar + console.log(target.foo); // bar + ``` + +4. 反射 API 为开发者准备好了样板代码,在此基础上开发者可以用最少的代码修改捕获的方法。 + + ```javascript + const target = { + foo: 'bar', + baz: 'qux' + }; + const handler = { + get(trapTarget, property, receiver) { + let decoration = ''; + if (property === 'foo') { + decoration = '!!!'; + } + return Reflect.get(...arguments) + decoration; + } + }; + const proxy = new Proxy(target, handler); + + console.log(proxy.foo); // bar!!! + console.log(target.foo); // bar + + console.log(proxy.baz); // qux + console.log(target.baz); // qux + ``` + + + +### 9.1.4 捕获器不变式 + +1. 使用捕获器几乎可以改变所有基本方法的行为,但也不是没有限制。 + + - 每个捕获的方法都知道目标对象上下文、捕获函数签名,而捕获处理程序的行为必须遵循**“捕获器不变式”( trap invariant)**。 + - 捕获器不变式因方法不同而异,但通常都会防止捕获器定义出现过于反常的行为。 + - 比如,如果目标对象有一个不可配置且不可写的数据属性,那么在捕获器返回一个与该属性不同的值时,会抛出 TypeError: + + ```javascript + const target = {}; + Object.defineProperty(target, 'foo', { + configurable: false, + writable: false, + value: 'bar' + }); + const handler = { + get() { + return 'qux'; + } + }; + const proxy = new Proxy(target, handler); + console.log(proxy.foo); + // TypeError + ``` + + + +### 9.1.5 可撤销代理 + +1. 对于使用 `new Proxy()` 创建的普通代理来说,这种联系会在代理对象的生命周期内一直持续存在。 + +2. Proxy 也暴露了 **`revocable()`**方法,这个方法支持撤销代理对象与目标对象的关联。 + + - 撤销代理的操作是不可逆的。 + - 而且,撤销函数( `revoke()`)是幂等的,调用多少次的结果都一样。 + - 撤销代理之后再调用代理会抛出 `TypeError`。 + + ```javascript + const target = { + foo: 'bar' + }; + const handler = { + get() { + return 'intercepted'; + } + }; + const { + proxy, + revoke + } = Proxy.revocable(target, handler); + + console.log(proxy.foo); // intercepted + console.log(target.foo); // bar + + revoke(); // proxy.revocable(); + console.log(proxy.foo); // TypeError + ``` + + + +### 9.1.6 实用反射 API + +某些情况下应该优先使用反射 API,这是有一些理由的。 + +1. **反射 API 与对象 API ** + + 1. 反射 API 并不限于捕获处理程序; + 2. 大多数反射 API 方法在 Object 类型上有对应的方法。 + + 通常, Object 上的方法适用于通用程序,而反射方法适用于细粒度的对象控制与操作。 + +2. **状态标记 ** + + - 很多反射方法返回称作 “状态标记” 的布尔值,表示意图执行的操作是否成功。有时候,状态标记比那些返回修改后的对象或者抛出错误(取决于方法)的反射 API 方法更有用。 + + ```javascript + // 初始代码 + const o = {}; + + try { + Object.defineProperty(o, 'foo', 'bar'); + console.log('success'); + } catch (e) { + console.log('failure'); + } + ``` + + - 在定义新属性时如果发生问题, `Reflect.defineProperty()`会返回 `false`,而不是抛出错误。 + - 因此使用这个反射方法可以这样重构上面的代码: + + ```javascript + // 重构后的代码 + const o = {}; + + if (Reflect.defineProperty(o, 'foo', { + value: 'bar' + })) { + console.log('success'); + } else { + console.log('failure'); + } + ``` + + - 以下反射方法都会提供状态标记: + - `Reflect.defineProperty()` + - `Reflect.preventExtensions()` + - `Reflect.setPrototypeOf()` + - `Reflect.set()` + - `Reflect.deleteProperty()` + +3. **用一等函数替代操作符 ** + + - 以下反射方法提供**只有通过操作符**才能完成的操作。 + - `Reflect.get()`:可以替代对象属性访问操作符。 + - `Reflect.set()`:可以替代 `= `赋值操作符。 + - `Reflect.has()`:可以替代 `in` 操作符或 `with()`。 + - `Reflect.deleteProperty()`:可以替代 `delete` 操作符。 + - `Reflect.construct()`:可以替代 `new` 操作符。 + +4. **安全地应用函数 ** + + - 在通过 apply 方法调用函数时,被调用的函数可能也定义了自己的 apply 属性(虽然可能性极小)。 + - 为绕过这个问题,可以使用定义在 Function 原型上的 apply 方法,比如: + - `Function.prototype.apply.call(myFunc, thisVal, argumentList);` + - 这种可怕的代码完全可以使用 `Reflect.apply` 来避免: + - `Reflect.apply(myFunc, thisVal, argumentsList);` + + + +### 9.1.7 代理另一个代理 + +1. 代理可以拦截反射 API 的操作,而这意味着完全可以创建一个代理,通过它去代理另一个代理。这样就可以在一个目标对象之上构建多层拦截网: + +```javascript +const target = { + foo: 'bar' +}; + +const firstProxy = new Proxy(target, { + get() { + console.log('first proxy'); + return Reflect.get(...arguments); + } +}); + +const secondProxy = new Proxy(firstProxy, { + get() { + console.log('second proxy'); + return Reflect.get(...arguments); + } +}); + +console.log(secondProxy.foo); +// second proxy +// first proxy +// bar +``` + + + +### 9.1.8 代理的问题与不足 + +某些情况下,代理也不能与现在的 ECMAScript 机制很好地协同。 + +1. **代理中的 this ** + + ```javascript + const target = { + thisValEqualsProxy() { + return this === proxy; + } + } + const proxy = new Proxy(target, {}); + + console.log(target.thisValEqualsProxy()); // false + console.log(proxy.thisValEqualsProxy()); // true + ``` + + - 调用代理上的任何方法,比如 `proxy.outerMethod()`,而这个方法进而又会调用另一个方法,如 `this.innerMethod()`,实际上都会调用 `proxy.innerMethod()`。 + - 多数情况下,这是符合预期的行为。可是,如果目标对象依赖于对象标识,那就可能碰到意料之外的问题。 + + ```javascript + const wm = new WeakMap(); + class User { + constructor(userId) { + wm.set(this, userId); + } + set id(userId) { + wm.set(this, userId); + } + get id() { + return wm.get(this); + } + } + + // 由于这个实现依赖 User 实例的对象标识,在这个实例被代理的情况下就会出问题: + const user = new User(123); + console.log(user.id); // 123 + + const userInstanceProxy = new Proxy(user, {}); + console.log(userInstanceProxy.id); // undefined + ``` + + - 这是因为 User 实例一开始使用目标对象作为 WeakMap 的键,代理对象却尝试从自身取得这个实例。 + - 要解决这个问题,就需要重新配置代理,把代理 User 实例改为代理 User 类本身。之后再创建代理的实例就会以代理实例作为 WeakMap 的键了: + + ```javascript + const UserClassProxy = new Proxy(User, {}); + const proxyUser = new UserClassProxy(456); + console.log(proxyUser.id); + ``` + +2. **代理与内部槽位 ** + + - 代理与内置引用类型(比如 Array)的实例通常可以很好地协同,但有些 ECMAScript 内置类型可 + 能会依赖代理无法控制的机制,结果导致在代理上调用某些方法会出错。 + - 一个典型的例子就是 **Date 类型**。 + - 根据 ECMAScript 规范, Date 类型方法的执行依赖 `this` 值上的内部槽位`[[NumberDate]]`。 + - 代理对象上不存在这个内部槽位,而且这个内部槽位的值也不能通过普通的 `get()`和 `set()`操作访问到,于是代理拦截后本应转发给目标对象的方法会抛出 TypeError: + + ```javascript + const target = new Date(); + const proxy = new Proxy(target, {}); + console.log(proxy instanceof Date); // true + proxy.getDate(); // TypeError: 'this' is not a Date object + ``` + + + +## 9.2 代理捕获器与反射方法 + +代理可以捕获 13 种不同的基本操作。这些操作有各自不同的反射 API 方法、参数、 关联 ECMAScript 操作和不变式。 + +### 9.2.1 get() + +`get()` 捕获器会在获取属性值的操作中被调用。对应的反射 API 方法为 `Reflect.get()`。 + +```javascript +const myTarget = {}; +const proxy = new Proxy(myTarget, { + get(target, property, receiver) { + console.log('get()'); + return Reflect.get(...arguments) + } +}); +proxy.foo; +// get() +``` + +1. 返回值 + - 返回值无限制。 +2. 拦截的操作 + - `proxy.property` + - `proxy[property]` + - `Object.create(proxy)[property]` + - `Reflect.get(proxy, property, receiver)` +3. 捕获器处理程序参数 + - `target`:目标对象。 + - `property`:引用的目标对象上的字符串键属性。 ① + - `receiver`:代理对象或继承代理对象的对象。 +4. 捕获器不变式 + - 如果 `target.property` 不可写且不可配置,则处理程序返回的值必须与 `target.property` 匹配。 + - 如果 `target.property` 不可配置且`[[Get]]`特性为 `undefined`, 处理程序的返回值也必须是 `undefined`。 + +### 9.2.2 set() + +`set()` 捕获器会在设置属性值的操作中被调用。对应的反射 API 方法为 `Reflect.set()`。 + +```javascript +const myTarget = {}; +const proxy = new Proxy(myTarget, { + set(target, property, value, receiver) { + console.log('set()'); + return Reflect.set(...arguments) + } +}); +proxy.foo = 'bar'; +// set() +``` + +1. 返回值 + 返回 true 表示成功;返回 false 表示失败,严格模式下会抛出 TypeError。 +2. 拦截的操作 + ` proxy.property = value` + ` proxy[property] = value` + ` Object.create(proxy)[property] = value` + ` Reflect.set(proxy, property, value, receiver)` +3. 捕获器处理程序参数 +  target:目标对象。 +  property:引用的目标对象上的字符串键属性。 +  value:要赋给属性的值。 +  receiver:接收最初赋值的对象。 +4. 捕获器不变式 + 如果 target.property 不可写且不可配置,则不能修改目标属性的值。 + 如果 target.property 不可配置且`[[Set]]`特性为 undefined,则不能修改目标属性的值。 + 在严格模式下,处理程序中返回 false 会抛出 TypeError。 + +### 9.2.3 has() + +```javascript +// has() 捕获器会在 in 操作符中被调用。 对应的反射 API 方法为 Reflect.has()。 +const myTarget = {}; +const proxy = new Proxy(myTarget, { + has(target, property) { + console.log('has()'); + return Reflect.has(...arguments) + } +}); +'foo' in proxy; +// has() +``` + +1. 返回值 + has()必须返回布尔值,表示属性是否存在。返回非布尔值会被转型为布尔值。 +2. 拦截的操作 + ` property in proxy` + ` property in Object.create(proxy)` + ` with(proxy) {(property);}` + ` Reflect.has(proxy, property)` +3. 捕获器处理程序参数 +  target:目标对象。 +  property:引用的目标对象上的字符串键属性。 +4. 捕获器不变式 + 如果 target.property 存在且不可配置,则处理程序必须返回 true。 + 如果 target.property 存在且目标对象不可扩展,则处理程序必须返回 true。 + +### 9.2.4 defineProperty() + +```javascript +// defineProperty()捕获器会在 Object.defineProperty()中被调用。对应的反射 API 方法为 Reflect.defineProperty()。 +const myTarget = {}; +const proxy = new Proxy(myTarget, { + defineProperty(target, property, descriptor) { + console.log('defineProperty()'); + return Reflect.defineProperty(...arguments) + } +}); +Object.defineProperty(proxy, 'foo', { + value: 'bar' +}); +// defineProperty() +``` + +1. 返回值 + defineProperty()必须返回布尔值,表示属性是否成功定义。返回非布尔值会被转型为布尔值。 +2. 拦截的操作 + ` Object.defineProperty(proxy, property, descriptor)` + ` Reflect.defineProperty(proxy, property, descriptor)` +3. 捕获器处理程序参数 +  target:目标对象。 +  property:引用的目标对象上的字符串键属性。 +  descriptor:包含可选的 enumerable、 configurable、 writable、 value、 get 和 set + 定义的对象。 +4. 捕获器不变式 + 如果目标对象不可扩展,则无法定义属性。 + 如果目标对象有一个可配置的属性,则不能添加同名的不可配置属性。 + 如果目标对象有一个不可配置的属性,则不能添加同名的可配置属性。 + +### 9.2.5 getOwnPropertyDescriptor() + +```javascript +// getOwnPropertyDescriptor() 捕获器会在 Object.getOwnPropertyDescriptor()中被调 用。对应的反射 API 方法为 Reflect.getOwnPropertyDescriptor()。 +const myTarget = {}; +const proxy = new Proxy(myTarget, { + getOwnPropertyDescriptor(target, property) { + console.log('getOwnPropertyDescriptor()'); + return Reflect.getOwnPropertyDescriptor(...arguments) + } +}); +Object.getOwnPropertyDescriptor(proxy, 'foo'); +// getOwnPropertyDescriptor() +``` + +1. 返回值 + getOwnPropertyDescriptor()必须返回对象,或者在属性不存在时返回 undefined。 +2. 拦截的操作 + ` Object.getOwnPropertyDescriptor(proxy, property)` + ` Reflect.getOwnPropertyDescriptor(proxy, property)` +3. 捕获器处理程序参数 +  target:目标对象。 +  property:引用的目标对象上的字符串键属性。 +4. 捕获器不变式 + 如果自有的 target.property 存在且不可配置,则处理程序必须返回一个表示该属性存在的对象。 + 如果自有的 target.property 存在且可配置,则处理程序必须返回表示该属性可配置的对象。 + 如果自有的 target.property 存在且 target 不可扩展,则处理程序必须返回一个表示该属性存在的对象。 + 如果 target.property 不存在且 target 不可扩展,则处理程序必须返回 undefined 表示该属性不存在。 + 如果 target.property 不存在,则处理程序不能返回表示该属性可配置的对象。 + +### 9.2.6 deleteProperty() + +```javascript +// deleteProperty()捕获器会在 delete 操作符中被调用。对应的反射 API 方法为 Reflect.deleteProperty()。 +const myTarget = {}; +const proxy = new Proxy(myTarget, { + deleteProperty(target, property) { + console.log('deleteProperty()'); + return Reflect.deleteProperty(...arguments) + } +}); +delete proxy.foo +// deleteProperty() +``` + +1. 返回值 + deleteProperty() 必须返回布尔值,表示删除属性是否成功。返回非布尔值会被转型为布尔值。 +2. 拦截的操作 + ` delete proxy.property` + ` delete proxy[property]` + ` Reflect.deleteProperty(proxy, property)` +3. 捕获器处理程序参数 +  target:目标对象。 +  property:引用的目标对象上的字符串键属性。 +4. 捕获器不变式 + 如果自有的 target.property 存在且不可配置,则处理程序不能删除这个属性。 + +### 9.2.7 ownKeys() + +```javascript +// ownKeys() 捕获器会在 Object.keys() 及类似方法中被调用。 对应的反射 API 方法为 Reflect.ownKeys()。 +const myTarget = {}; +const proxy = new Proxy(myTarget, { + ownKeys(target) { + console.log('ownKeys()'); + return Reflect.ownKeys(...arguments) + } +}); +Object.keys(proxy); +// ownKeys() +``` + +1. 返回值 + ownKeys()必须返回包含字符串或符号的可枚举对象。 +2. 拦截的操作 + ` Object.getOwnPropertyNames(proxy)` + ` Object.getOwnPropertySymbols(proxy)` + ` Object.keys(proxy)` + ` Reflect.ownKeys(proxy)` +3. 捕获器处理程序参数 +  target:目标对象。 +4. 捕获器不变式 + 返回的可枚举对象必须包含 target 的所有不可配置的自有属性。 + 如果 target 不可扩展,则返回可枚举对象必须准确地包含自有属性键。 + +### 9.2.8 getPrototypeOf() + +```javascript +// getPrototypeOf()捕获器会在 Object.getPrototypeOf()中被调用。对应的反射 API 方法为 Reflect.getPrototypeOf()。 +const myTarget = {}; +const proxy = new Proxy(myTarget, { + getPrototypeOf(target) { + console.log('getPrototypeOf()'); + return Reflect.getPrototypeOf(...arguments) + } +}); +Object.getPrototypeOf(proxy); +// getPrototypeOf() +``` + +1. 返回值 + getPrototypeOf()必须返回对象或 null。 + +2. 拦截的操作 + ` Object.getPrototypeOf(proxy)` + + ` Reflect.getPrototypeOf(proxy)` + ` proxy.__proto__` + ` Object.prototype.isPrototypeOf(proxy)` + ` proxy instanceof Obj` + +3. 捕获器处理程序参数 +  target:目标对象。 + +4. 捕获器不变式 + 如果 target 不可扩展,则 Object.getPrototypeOf(proxy)唯一有效的返回值就是 Object. + getPrototypeOf(target)的返回值。 + +### 9.2.9 setPrototypeOf() + +```javascript +// setPrototypeOf()捕获器会在 Object.setPrototypeOf()中被调用。对应的反射 API 方法为 Reflect.setPrototypeOf()。 +const myTarget = {}; +const proxy = new Proxy(myTarget, { + setPrototypeOf(target, prototype) { + console.log('setPrototypeOf()'); + return Reflect.setPrototypeOf(...arguments) + } +}); +Object.setPrototypeOf(proxy, Object); +// setPrototypeOf() +``` + +1. 返回值 + setPrototypeOf()必须返回布尔值,表示原型赋值是否成功。返回非布尔值会被转型为布尔值。 +2. 拦截的操作 + ` Object.setPrototypeOf(proxy)` + ` Reflect.setPrototypeOf(proxy)` +3. 捕获器处理程序参数 +  target:目标对象。 +  prototype: target 的替代原型,如果是顶级原型则为 null。 +4. 捕获器不变式 + 如果 target 不可扩展,则唯一有效的 prototype 参数就是 Object.getPrototypeOf(target) + 的返回值。 + +### 9.2.10 isExtensible() + +```javascript +// isExtensible()捕获器会在 Object.isExtensible()中被调用。对应的反射 API 方法为 Reflect.isExtensible()。 +const myTarget = {}; +const proxy = new Proxy(myTarget, { + isExtensible(target) { + console.log('isExtensible()'); + return Reflect.isExtensible(...arguments) + } +}); +Object.isExtensible(proxy); +// isExtensible() +``` + +1. 返回值 + isExtensible()必须返回布尔值,表示 target 是否可扩展。返回非布尔值会被转型为布尔值。 +2. 拦截的操作 + ` Object.isExtensible(proxy)` + ` Reflect.isExtensible(proxy)` +3. 捕获器处理程序参数 +  target:目标对象。 +4. 捕获器不变式 + 如果 target 可扩展,则处理程序必须返回 true。 + 如果 target 不可扩展,则处理程序必须返回 false。 + +### 9.2.11 preventExtensions() + +```javascript +// preventExtensions()捕获器会在 Object.preventExtensions()中被调用。对应的反射 API 方法为 Reflect.preventExtensions()。 +const myTarget = {}; +const proxy = new Proxy(myTarget, { + preventExtensions(target) { + console.log('preventExtensions()'); + return Reflect.preventExtensions(...arguments) + } +}); +Object.preventExtensions(proxy); +// preventExtensions() +``` + +1. 返回值 + preventExtensions()必须返回布尔值,表示 target 是否已经不可扩展。返回非布尔值会被转 + 型为布尔值。 +2. 拦截的操作 + ` Object.preventExtensions(proxy)` + ` Reflect.preventExtensions(proxy)` +3. 捕获器处理程序参数 +  target:目标对象。 +4. 捕获器不变式 + 如果 `Object.isExtensible(proxy)` 是 false,则处理程序必须返回 true。 + +### 9.2.12 apply() + +`apply()` 捕获器会在调用函数时中被调用。对应的反射 API 方法为 `Reflect.apply()`。 + +```javascript +const myTarget = () => {}; +const proxy = new Proxy(myTarget, { + apply(target, thisArg, ...argumentsList) { + console.log('apply()'); + return Reflect.apply(...arguments) + } +}); +proxy(); +// apply() +``` + +1. 返回值 + 返回值无限制。 +2. 拦截的操作 + ` proxy(...argumentsList)` + ` Function.prototype.apply(thisArg, argumentsList)` + ` Function.prototype.call(thisArg, ...argumentsList)` + ` Reflect.apply(target, thisArgument, argumentsList)` +3. 捕获器处理程序参数 +  target:目标对象。 +  thisArg:调用函数时的 this 参数。 +  argumentsList:调用函数时的参数列表 +4. 捕获器不变式 + target 必须是一个函数对象。 + +### 9.2.13 construct() + +```javascript +// construct()捕获器会在 new 操作符中被调用。对应的反射 API 方法为 Reflect.construct()。 +const myTarget = function () {}; +const proxy = new Proxy(myTarget, { + construct(target, argumentsList, newTarget) { + console.log('construct()'); + return Reflect.construct(...arguments) + } +}); +new proxy; +// construct() +``` + +1. 返回值 + construct()必须返回一个对象。 + +2. 拦截的操作 + ` new proxy(...argumentsList)` + ` Reflect.construct(target, argumentsList, newTarget)` + +3. 捕获器处理程序参数 +  target:目标构造函数。 + +  argumentsList:传给目标构造函数的参数列表。 +  newTarget:最初被调用的构造函数。 + +4. 捕获器不变式 + target 必须可以用作构造函数。 + + + +## 9.3 代理模式 + +使用代理可以在代码中实现一些有用的编程模式。 + +### 9.3.1 跟踪属性访问 + +1. 通过捕获 `get`、 `set` 和 `has` 等操作,可以知道对象属性什么时候被访问、被查询。 + + - 把实现相应捕获器的某个对象代理放到应用中,可以监控这个对象何时在何处被访问过: + + ```javascript + const user = { + name: 'Jake' + }; + + const proxy = new Proxy(user, { + get(target, property, receiver) { + console.log(`Getting ${property}`); + return Reflect.get(...arguments); + }, + set(target, property, value, receiver) { + console.log(`Setting ${property}=${value}`); + return Reflect.set(...arguments); + } + }); + + proxy.name; // Getting name + proxy.age = 27; // Setting age=27 + ``` + + + +### 9.3.2 隐藏属性 + +代理的内部实现对外部代码是不可见的,因此要隐藏目标对象上的属性也轻而易举。 + +```javascript +const hiddenProperties = ['foo', 'bar']; +const targetObject = { + foo: 1, + bar: 2, + baz: 3 +}; +const proxy = new Proxy(targetObject, { + get(target, property) { + if (hiddenProperties.includes(property)) { + return undefined; + } else { + return Reflect.get(...arguments); + } + }, + has(target, property) { + if (hiddenProperties.includes(property)) { + return false; + } else { + return Reflect.has(...arguments); + } + } +}); +// get() +console.log(proxy.foo); // undefined +console.log(proxy.bar); // undefined +console.log(proxy.baz); // 3 +// has() +console.log('foo' in proxy); // false +console.log('bar' in proxy); // false +console.log('baz' in proxy); // true +``` + + + +### 9.3.3 属性验证 + +因为所有赋值操作都会触发 `set()` 捕获器,所以可以根据所赋的值决定是允许还是拒绝赋值: + +```javascript +const target = { + onlyNumbersGoHere: 0 +}; + +const proxy = new Proxy(target, { + set(target, property, value) { + if (typeof value !== 'number') { + return false; + } else { + return Reflect.set(...arguments); + } + } +}); +proxy.onlyNumbersGoHere = 1; +console.log(proxy.onlyNumbersGoHere); // 1 +proxy.onlyNumbersGoHere = '2'; +console.log(proxy.onlyNumbersGoHere); // 1 +``` + + + +### 9.3.4 函数与构造函数参数验证 + +跟保护和验证对象属性类似,也可对函数和构造函数参数进行审查。比如,可以让函数只接收某种类型的值: + +```javascript +function median(...nums) { + return nums.sort()[Math.floor(nums.length / 2)]; +} +const proxy = new Proxy(median, { + apply(target, thisArg, argumentsList) { + for (const arg of argumentsList) { + if (typeof arg !== 'number') { + throw 'Non-number argument provided'; + } + } + return Reflect.apply(...arguments); + } +}); +console.log(proxy(4, 7, 1)); // 4 +console.log(proxy(4, '7', 1)); +// Error: Non-number argument provided + + +// 类似地,可以要求实例化时必须给构造函数传参: +class User { + constructor(id) { + this.id_ = id; + } +} +const proxy = new Proxy(User, { + construct(target, argumentsList, newTarget) { + if (argumentsList[0] === undefined) { + throw 'User cannot be instantiated without id'; + } else { + return Reflect.construct(...arguments); + } + } +}); +new proxy(1); +new proxy(); +// Error: User cannot be instantiated without id +``` + + + +### 9.3.5 数据绑定与可观察对象 + +通过代理可以把运行时中原本不相关的部分联系到一起。这样就可以实现各种模式,从而让不同的代码互操作。 + +比如,可以将被代理的类绑定到一个全局实例集合,让所有创建的实例都被添加到这个集合中: + +```javascript +const userList = []; + +class User { + constructor(name) { + this.name_ = name; + } +} + +const proxy = new Proxy(User, { + construct() { + const newUser = Reflect.construct(...arguments); + userList.push(newUser); + return newUser; + } +}); + +new proxy('John'); +new proxy('Jacob'); +new proxy('Jingleheimerschmidt'); +console.log(userList); // [User {}, User {}, User{}] +``` + +另外,还可以把集合绑定到一个事件分派程序,每次插入新实例时都会发送消息: + +```javascript +const userList = []; + +function emit(newValue) { + console.log(newValue); +} +const proxy = new Proxy(userList, { + set(target, property, value, receiver) { + const result = Reflect.set(...arguments); + if (result) { + emit(Reflect.get(target, property, receiver)); + } + return result; + } +}); +proxy.push('John'); +// John +proxy.push('Jacob'); +// Jacob +``` + + + +# 第 10章 函数 + +每个函数都是 Function 类型的实例,而 Function 也有属性和方法,跟其他引用类型一样。 + +因为函数是对象,所以函数名就是指向函数对象的指针,而且不一定与函数本身紧密绑定。 + +函数的四种形式: + +1. 函数声明 +2. 函数表达式 +3. 箭头函数 +4. Function 构造函数(不推荐) + +这几种实例化函数对象的方式之间存在微妙但重要的差别,本章后面会讨论。 + +## 10.1 箭头函数 + +ECMAScript 6 新增了使用胖箭头( =>)语法定义函数表达式的能力。很大程度上,箭头函数实例化的函数对象与正式的函数表达式创建的函数对象行为是相同的。任何可以使用函数表达式的地方,都可以使用箭头函数。 + +1. 如果只有一个参数,那也可以不用括号。只有没有参数,或者多个参数的情况下,才需要使用括号。 +2. 箭头函数也可以不用大括号,但这样会改变函数的行为。 + 1. 使用大括号就说明包含“函数体”,可以在一个函数中包含多条语句,跟常规的函数一样。 + 2. 如果不使用大括号,那么箭头后面就只能有一行代码,比如一个赋值操作,或者一个表达式。 + 3. 而且,省略大括号会**隐式返回这行代码的值**。 +3. 箭头函数虽然语法简洁,但也有很多场合不适用。 + 1. 箭头函数不能使用 `arguments`、 `super` 和 `new.target`,也不能用作构造函数。 + 2. 此外,箭头函数也没有 `prototype` 属性。 + +## 10.2 函数名 + +函数名就是指向函数的指针,所以它们跟其他包含对象指针的变量具有相同的行为。这意味着一个函数可以有多个名称。 + +- 注意,使用**不带括号的函数名会访问函数指针**,而不会执行函数。 + +- 把 `sum` 设置为 `null` 之后,就切断了它与函数之间的关联。而 `anotherSum()` 还是可以照常调用,没有问题。 + +- ECMAScript 6 的所有函数对象都会暴露一个只读的 **`name`** 属性,其中包含关于函数的信息。 + + - 多数情况下,这个属性中保存的就是一个函数标识符,或者说是一个字符串化的变量名。 + - 即使函数没有名称,也会如实显示成空字符串。 + - 如果它是使用 `Function` 构造函数创建的,则会标识成"`anonymous`" 。 + +- 如果函数是一个**获取函数**、**设置函数**,或者使用 **`bind()`**实例化,那么标识符前面会加上一个前缀: + + ```javascript + function foo() {} + + console.log(foo.bind(null).name); // bound foo + + let dog = { + years: 1, + get age() { + return this.years; + }, + set age(newAge) { + this.years = newAge; + } + } + let propertyDescriptor = Object.getOwnPropertyDescriptor(dog, 'age'); + console.log(propertyDescriptor.get.name); // get age + console.log(propertyDescriptor.set.name); // set age + ``` + + + +## 10.3 理解参数 + +ECMAScript 函数既不关心传入的参数个数,也不关心这些参数的数据类型。 + +ECMAScript 函数的参数在内部表现为一个数组。 + +在使用 `function` 关键字定义(非箭头)函数时,可以在函数内部访问 `arguments` 对象,从中取得传进来的每个参数值。 + +- `arguments` 对象是一个类数组对象(但不是 Array 的实例),因此可以使用中括号语法访问其中的元素(第一个参数是 `arguments[0]`,第二个参数是 `arguments[1]`)。 +- 而要确定传进来多少个参数,可以访问 `arguments.length` 属性。 + +ECMAScript 函数的参数只是为了方便才写出来的,并不是必须写出来的。 + +- 在ECMAScript 中的命名参数不会创建让之后的调用必须匹配的函数签名。这是因为根本**不存在验证命名参数的机制。** + +**`arguments` 对象可以跟命名参数一起使用**: + +```javascript +function doAdd(num1, num2) { + if (arguments.length === 1) { + console.log(num1 + 10); + } else if (arguments.length === 2) { + console.log(arguments[0] + num2); + } +} +``` + +**arguments 对象的值始终会与对应的命名参数同步。** + +**严格模式下, arguments 会有一些变化。** + +- 首先,像前面那样给 `arguments[1]`赋值不会再影响 `num2`的值。就算把 `arguments[1]`设置为 10, `num2` 的值仍然还是传入的值。 +- 其次,在函数中尝试重写`arguments` 对象会导致语法错误。(代码也不会执行。) + + + +**箭头函数中的参数** + +- 如果函数是使用箭头语法定义的,那么传给函数的参数将不能使用 `arguments` 关键字访问,而只能通过定义的命名参数访问。 + + + +## 10.4 没有重载 + +在其他语言比如 Java 中,一个函数可以有两个定义,只要签名(接收参数的类型和数量)不同就行。如前所述, ECMAScript 函数没有签名,因为参数是由包含零个或多个值的数组表示的。没有函数签名,自然也就没有重载。 + +1. 如果在 ECMAScript 中定义了两个同名函数,则后定义的会覆盖先定义的。 + - 可以通过检查参数的类型和数量,然后分别执行不同的逻辑来模拟函数重载。 + + + +## 10.5 默认参数值 + +1. 实现默认参数的一种常用方式就是检测某个参数是否等于 undefined,如果是则意味着没有传这个参数,那就给它赋一个值。 + +2. ECMAScript 6 之后就不用这么麻烦了,因为它支持显式定义默认参数了。下面就是与前面代码等价的 ES6 写法,只要在函数定义中的参数后面用=就可以为参数赋一个默认值。 + + - `function makeKing(name = 'Henry'){}` + - 给参数传 `undefined` 相当于没有传值,不过这样可以利用多个独立的默认值: + + ```javascript + function makeKing(name = 'Henry', numerals = 'VIII') { + return `King ${name} ${numerals}`; + } + console.log(makeKing()); // 'King Henry VIII' + console.log(makeKing('Louis')); // 'King Louis VIII' + console.log(makeKing(undefined, 'VI')); // 'King Henry VI' + ``` + +3. 在使用默认参数时, arguments 对象的值不反映参数的默认值,只反映传给函数的参数。 + + - 当然,跟 ES5 严格模式一样,修改命名参数也不会影响 arguments 对象,它始终以调用函数时传入的值为准。 + +4. 默认参数值并不限于原始值或对象类型,也可以使用调用函数返回的值。 + +5. 函数的**默认参数只有在函数被调用时才会求值**,不会在函数定义时求值。而且,计算默认值的函数只有在调用函数但未传相应参数时才会被调用。 + +6. 箭头函数同样也可以这样使用默认参数,只不过在只有一个参数时,就必须使用括号而不能省略了。 + + + +**默认参数作用域与暂时性死区** + +1. 因为在求值默认参数时可以定义对象,也可以动态调用函数,所以函数参数肯定是在某个作用域中 + 求值的。 + + - 给多个参数定义默认值实际上跟使用 let 关键字顺序声明变量一样。 + - 默认参数会按照定义它们的顺序依次被初始化。 + - 参数初始化顺序遵循“暂时性死区”规则,**即前面定义的参数不能引用后面定义的**。 + + ```javascript + // 调用时不传第一个参数会报错 + function makeKing(name = numerals, numerals = 'VIII') { + return `King ${name} ${numerals}`; + } + + // 参数也存在于自己的作用域中, 它们不能引用函数体的作用域: + // 调用时不传第二个参数会报错 + function makeKing(name = 'Henry', numerals = defaultNumeral) { + let defaultNumeral = 'VIII'; + return `King ${name} ${numerals}`; + } + ``` + + + +## 10.6 参数扩展与收集 + +ECMAScript 6 新增了扩展操作符,使用它可以非常简洁地操作和组合集合数据。 + +扩展操作符最有用的场景就是函数定义中的参数列表,在这里它可以充分利用这门语言的弱类型及参数长度可变的特点。 + +扩展操作符既可以用于调用函数时传参,也可以用于定义函数参数。 + +### 10.6.1 扩展参数 + +1. 如果不使用扩展操作符传参,那么就得求助于 `apply()`方法: + - 语法:`func.apply(thisArg, [argsArray])` + - `console.log(getSum.apply(null, values)); // 10 ` +2. 使用扩展操作符传参: + - `console.log(getSum(...values)); // 10 ` +3. 也可以将扩展操作符用于命名参数,当然同时也可以使用默认参数。 + +### 10.6.2 收集参数 + +1. 在构思函数定义时,可以使用扩展操作符把不同长度的独立参数组合为一个数组。这有点类似 `arguments` 对象的构造机制,只不过收集参数的结果会得到一个 `Array` 实例。 + +2. 收集参数的前面如果还有命名参数,则只会收集其余的参数;如果没有则会得到空数组。因为收集参数的结果可变,所以只能把它作为最后一个参数: + + ```javascript + // 不可以 Module parse failed: Comma is not permitted after the rest element + function getProduct(...values, lastValue) {} + // 可以 + function ignoreFirst(firstValue, ...values) { + console.log(values); + } + ignoreFirst(); // [] + ignoreFirst(1); // [] + ignoreFirst(1, 2); // [2] + ignoreFirst(1, 2, 3); // [2, 3] + ``` + +3. 箭头函数虽然不支持 `arguments` 对象,但支持收集参数的定义方式。 + +4. 使用收集参数并不影响 `arguments` 对象,它仍然反映调用时传给函数的参数。 + + ```javascript + function getSum(...values) { + console.log(arguments.length); // 3 + console.log(arguments); // [1, 2, 3] + console.log(values); // [1, 2, 3] + } + console.log(getSum(1, 2, 3)); + ``` + + + +## 10.7 函数声明与函数表达式 + +一直没有把函数声明和函数表达式区分得很清楚。 + +事实上, JavaScript 引擎在加载数据时对它们是区别对待的。 + +- 函数声明: + - **函数声明提升( function declaration hoisting)**。 + - 把发现的函数声明提升到源代码树的顶部。 + - JavaScript 引擎在任何代码执行之前,会先读取函数声明,并在执行上下文中生成函数定义。 +- 函数表达式: + - **必须等到代码执行到它那一行**,才会在执行上下文中生成函数定义。 + + + +## 10.8 函数作为值 + +因为函数名在 ECMAScript 中就是变量,所以函数可以用在任何可以使用变量的地方。 + +- 这意味着不仅可以把**函数作为参数**传给另一个函数,而且还可以在一个**函数中返回另一个函数**。 + + + +## 10.9 函数内部 + +在 ECMAScript 5 中,函数内部存在两个特殊的对象: `arguments` 和 `this`。 ECMAScript 6 又新增了 `new.target` 属性。 + +### 10.9.1 arguments + +1. 虽然主要用于包含函数参数,但 arguments 对象其实还有一个 **`callee`** 属性,是一个指向 arguments 对象所在函数的指针。 + + - **严格模式下不能使用!** + - `Uncaught TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them` + + ```javascript + function factorial(num) { + if (num <= 1) { + return 1; + } else { + return num * factorial(num - 1); + } + } + + // 阶乘函数一般定义成递归调用的, 就像上面这个例子一样。 + // 只要给函数一个名称, 而且这个名称不会变, 这样定义就没有问题。 + // 但是, 这个函数要正确执行就必须保证函数名是 factorial, 从而导致了紧密耦合。 + // 使用 arguments.callee 就可以让函数逻辑与函数名解耦: + + function factorial(num) { + if (num <= 1) { + return 1; + } else { + return num * arguments.callee(num - 1); + } + } + + // 这个重写之后的 factorial()函数已经用 arguments.callee 代替了之前硬编码的 factorial。 + // 这意味着无论函数叫什么名称,都可以引用正确的函数。 + + let trueFactorial = factorial; + factorial = function() { + return 0; + }; + console.log(trueFactorial(5)); // 120 + console.log(factorial(5)); // 0 + + // 这里, trueFactorial 变量被赋值为 factorial,实际上把同一个函数的指针又保存到了另一个位置。 + // 然后, factorial 函数又被重写为一个返回 0 的函数。 + // 如果像 factorial()最初的版本那样不使用 arguments.callee,那么像上面这样调用 trueFactorial()就会返回 0。 + // 不过,通过将函数与名称解耦, trueFactorial()就可以正确计算阶乘,而 factorial()则只能返回 0。 + ``` + + + +### 10.9.2 this + +1. 另一个特殊的对象是 this,它在标准函数和箭头函数中有不同的行为。 + + - 在标准函数中, this 引用的是把函数当成方法调用的上下文对象,这时候通常称其为 this 值(在网页的全局上下文中调用函数时, this 指向 windows)。 + - 在箭头函数中, this 引用的是定义箭头函数的上下文。 + + ```javascript + window.color = 'red'; + let o = { + color: 'blue' + }; + let sayColor = () => console.log(this.color); + + sayColor(); // 'red' + o.sayColor = sayColor; + o.sayColor(); // 'red' + ``` + + - 在事件回调或定时回调中调用某个函数时, this 值指向的并非想要的对象。此时将回调函数写成箭头函数就可以解决问题。这是因为箭头函数中的 this 会保留定义该函数时的上下文: + + ```javascript + function King() { + this.royaltyName = 'Henry'; + // this 引用 King 的实例 + setTimeout(() => console.log(this.royaltyName), 1000); + } + + function Queen() { + this.royaltyName = 'Elizabeth'; + // this 引用 window 对象 + setTimeout(function () { + console.log(this.royaltyName); + }, 1000); + } + new King(); // Henry + new Queen(); // undefined + ``` + + + +### 10.9.3 caller + +ECMAScript 5 也会给函数对象上添加一个属性: **`caller`**。 + +1. 这个属性**引用的是调用当前函数的函数**,或者如果是在**全局作用域中调用的则为 null**。 + +```javascript +function outer() { + inner(); +} + +function inner() { + console.log(inner.caller); +} +outer(); + +// 以上代码会显示 outer() 函数的源代码。 这是因为 ourter() 调用了 inner(), inner.caller指向 outer()。 +// 如果要降低耦合度, 则可以通过 arguments.callee.caller 来引用同样的值: +function outer() { + inner(); +} + +function inner() { + console.log(arguments.callee.caller); +} +outer(); +``` + +- **在严格模式下访问 `arguments.callee` 会报错**。 + - ECMAScript 5 也定义了 `arguments.caller`, 但在严格模式下访问它会报错, 在非严格模式下则始终是 `undefined`。 + - 这是**为了分清 `arguments.caller` 和函数的 `caller`** 而故意为之的。 + - 而作为对这门语言的安全防护, 这些改动也让第三方代码无法检测同一上下文中运行的其他代码。 +- 严格模式下还有一个限制, 就是不能给函数的 `caller` 属性赋值, 否则会导致错误。 + + + +### 10.9.4 new.target + +1. ECMAScript 6 新增了检测函数是否使用 `new` 关键字调用的 `new.target` 属性。 + + - 如果函数是正常调用的,则 `new.target` 的值是 `undefined`; + - 如果是使用 `new` 关键字调用的,则 `new.target` 将引用被调用的构造函数。 + + ```javascript + function King() { + if (!new.target) { + throw 'King must be instantiated using "new"' + } + console.log('King instantiated using "new"'); + } + new King(); // King instantiated using "new" + King(); // Error: King must be instantiated using "new" + ``` + + + +## 10.10 函数属性与方法 + +1. 每个函数都有两个属性: **`length`** 和 **`prototype`**。 + + - 其中, length 属性保存函数定义的命名参数的个数。 + - prototype 属性也许是 ECMAScript 核心中最有趣的部分。 + - prototype 是保存引用类型所有实例方法的地方, toString()、 valueOf()等方法实际上都保存在 prototype 上,进而由所有实例共享。 + - prototype 属性是不可枚举的,因此使用 for-in 循环不会返回这个属性。 + +2. 函数还有两个方法: `apply()` 和 `call()`。 + + - 这两个方法都会以指定的 this 值来调用函数,即会设置调用函数时函数体内 this 对象的值。 + - `apply()` 方法接收两个参数:函数内 this 的值和一个参数数组。第二个参数可以是 Array 的实例,但也可以是 arguments 对象。 + - **注意:** 在严格模式下,调用函数时如果没有指定上下文对象,则 this 值不会指向 window。除非使用 `apply()`或 `call()`把函数指定给一个对象,否则 this 的值会变成 undefined。 + + - `call()` 方法与 `apply()` 的作用一样,只是传参的形式不同。 + - 第一个参数跟 `apply()`一样, 也是 this 值,而剩下的要传给被调用函数的参数则是逐个传递的。 + - `apply()和 call()`真正强大的地方并不是给函数传参,而是控制函数调用上下文即函数体内 this 值的能力。 + - 可以将任意对象设置为任意函数的作用域,这样对象可以不用关心方法。 + + ```javascript + window.color = 'red'; + let o = { + color: 'blue' + }; + + function sayColor() { + console.log(this.color); + } + sayColor(); // red + sayColor.call(this); // red + sayColor.call(window); // red + sayColor.call(o); // blue + ``` + +3. **`bind()`** 方法会创建一个新的函数实例,其 `this` 值会被绑定到传给 `bind()`的对象。 + + ```javascript + window.color = 'red'; + var o = { + color: 'blue' + }; + + function sayColor() { + console.log(this.color); + } + let objectSayColor = sayColor.bind(o); + objectSayColor(); // blue + ``` + +4. 对函数而言,继承的方法 `toLocaleString()`和 `toString()`始终返回函数的代码。返回代码的具体格式因浏览器而异。有的返回源代码,包含注释,而有的只返回代码的内部形式,会删除注释,甚至代码可能被解释器修改过。由于这些差异,因此不能在重要功能中依赖这些方法返回的值,而只应在调试中使用它们。继承的方法 `valueOf()`返回函数本身。 + + + +## 10.11 函数表达式 + +函数声明的关键特点是函数声明提升,即函数声明会在代码执行之前获得定义。 + +函数表达式看起来就像一个普通的变量定义和赋值,即创建一个函数再把它赋值给一个变量functionName。这样创建的函数叫作**匿名函数( anonymous funtion)**,因为 function 关键字后面没有标识符。(匿名函数有也时候也被称为**兰姆达函数**)。未赋值给其他变量的匿名函数的 name 属性是空字符串。 + + + +## 10.12 递归 + +递归函数通常的形式是一个函数通过名称调用自己。 + +1. 在严格模式下运行的代码是不能访问 `arguments.callee` 的,因为访问会出错。此时,可以使用**命名函数表达式( named function expression)**达到目的。 + + ```javascript + const factorial = (function f(num) { + if (num <= 1) { + return 1; + } else { + return num * f(num - 1); + } + }); + ``` + + + +## 10.13 尾调用优化 + +ECMAScript 6 规范新增了一项内存管理优化机制,让 JavaScript 引擎在满足条件时可以重用栈帧。 +具体来说,这项优化非常适合“尾调用”,即外部函数的返回值是一个内部函数的返回值。比如: + +``` +function outerFunction() { + return innerFunction(); // 尾调用 +} +``` + +- 在 ES6 优化之前,执行这个例子会在内存中发生如下操作。 + (1) 执行到 outerFunction 函数体,第一个栈帧被推到栈上。 + (2) 执行 outerFunction 函数体,到 return 语句。计算返回值必须先计算 innerFunction。 + (3) 执行到 innerFunction 函数体,第二个栈帧被推到栈上。 + (4) 执行 innerFunction 函数体,计算其返回值。 + (5) 将返回值传回 outerFunction,然后 outerFunction 再返回值。 + (6) 将栈帧弹出栈外。 +- 在 ES6 优化之后,执行这个例子会在内存中发生如下操作。 + (1) 执行到 outerFunction 函数体,第一个栈帧被推到栈上。 + (2) 执行 outerFunction 函数体,到达 return 语句。为求值返回语句,必须先求值 innerFunction。 + (3) 引擎发现把第一个栈帧弹出栈外也没问题,因为 innerFunction 的返回值也是 outerFunction的返回值。 + (4) 弹出 outerFunction 的栈帧。 + (5) 执行到 innerFunction 函数体,栈帧被推到栈上。 + (6) 执行 innerFunction 函数体,计算其返回值。 + (7) 将 innerFunction 的栈帧弹出栈外。 + +- 很明显,第一种情况下每多调用一次嵌套函数,就会多增加一个栈帧。而第二种情况下无论调用多少次嵌套函数,都只有一个栈帧。这就是 ES6 尾调用优化的关键:如果函数的逻辑允许基于尾调用将其销毁,则引擎就会那么做。 + +**注意:** 现在还没有办法测试尾调用优化是否起作用。不过,因为这是 ES6 规范所规定的,兼容的浏览器实现都能保证在代码满足条件的情况下应用这个优化。 + +### 10.13.1 尾调用优化的条件 + +1. 尾调用优化的条件就是确定外部栈帧真的没有必要存在了。涉及的条件如下: +  代码在严格模式下执行; +  外部函数的返回值是对尾调用函数的调用; + +  尾调用函数返回后不需要执行额外的逻辑; +  尾调用函数不是引用外部函数作用域中自由变量的闭包。 + +2. 差异化尾调用和递归尾调用是容易让人混淆的地方。无论是递归尾调用还是非递归尾调用,都可以应用优化。引擎并不区分尾调用中调用的是函数自身还是其他函数。不过,这个优化在递归场景下的效果是最明显的,因为递归代码最容易在栈内存中迅速产生大量栈帧。 + +3. 注意 之所以要求严格模式,主要因为在非严格模式下函数调用中允许使用 f.arguments 和 f.caller,而它们都会引用外部函数的栈帧。 + +### 10.13.2 尾调用优化的代码 + +- 可以通过把简单的递归函数转换为待优化的代码来加深对尾调用优化的理解。下面是一个通过递归计算斐波纳契数列的函数: + + ```javascript + function fib(n) { + if (n < 2) { + return n; + } + return fib(n - 1) + fib(n - 2); + } + console.log(fib(0)); // 0 + console.log(fib(1)); // 1 + console.log(fib(2)); // 1 + console.log(fib(3)); // 2 + console.log(fib(4)); // 3 + console.log(fib(5)); // 5 + console.log(fib(6)); // 8 + ``` + + - 结果, `fib(n)`的栈帧数的内存复杂度是$O(2^n)$​​。 + +- 解决这个问题也有不同的策略,比如把递归改写成迭代循环形式。不过,也可以保持递归实现,但将其重构为满足优化条件的形式。为此可以使用两个嵌套的函数,外部函数作为基础框架,内部函数执行递归: + + ```javascript + "use strict"; + // 基础框架 + function fib(n) { + return fibImpl(0, 1, n); + } + // 执行递归 + function fibImpl(a, b, n) { + if (n === 0) { + return a; + } + return fibImpl(b, a + b, n - 1); + } + ``` + + + +## 10.14 闭包 + +匿名函数经常被人误认为是**闭包( closure)**。 闭包指的是那些**引用了另一个函数作用域中变量的函数**,通常是在嵌套函数中实现的。 + +1. 理解**作用域链**创建和使用的细节对理解闭包非常重要。 + + - 在调用一个函数时,会为这个函数调用创建一个**执行上下文**,并创建一个**作用域链**。 + - 然后用 `arguments` 和其他命名参数来初始化这个函数的**活动对象**。 + - 外部函数的活动对象是内部函数作用域链上的第二个对象。 + - 这个作用域链一直向外串起了所有包含函数的活动对象,直到全局执行上下文才终止。 + + ```javascript + function compare(value1, value2) { + if (value1 < value2) { + return -1; + } else if (value1 > value2) { + return 1; + } else { + return 0; + } + } + let result = compare(5, 10); + ``` + + + +2. 函数执行时,每个执行上下文中都会有一个包含其中变量的对象。 + + - 全局上下文中的叫变量对象,它会在代码执行期间始终存在。 + + - 而函数局部上下文中的叫活动对象,只在函数执行期间存在。 + - 在定义`compare()`函数时,就会为它创建作用域链,预装载全局变量对象,并保存在内部的`[[Scope]]`中。 + - 在调用这个函数时,会创建相应的执行上下文,然后通过复制函数的`[[Scope]]`来创建其作用域链。 + - 接着会创建函数的活动对象(用作变量对象)并将其推入作用域链的前端。 + - 在这个例子中,这意味着 `compare()` 函数执行上下文的作用域链中有两个变量对象:局部变量对象和全局变量对象。 + - 作用域链其实是一个包含指针的列表,每个指针分别指向一个变量对象,但物理上并不会包含相应的对象。 + + ![](JavaScript高级程序设计第四版-笔记.assets/图片_55.Png) + + - 函数内部的代码在访问变量时,就会使用给定的名称从作用域链中查找变量。 + - 函数执行完毕后,局部活动对象会被销毁,内存中就只剩下全局作用域。 + - 不过,闭包就不一样了。 + - 在一个函数内部定义的函数会把其包含函数的活动对象添加到自己的作用域链中。 + - 因此,在`createComparisonFunction()`函数中,匿名函数的作用域链中实际上包含`createComparisonFunction()`的活动对象。 + + ![image-20210726162710016](JavaScript高级程序设计第四版-笔记.assets/image-20210726162710016.png) + + + +### [变量作用域,闭包](https://zh.javascript.info/closure) + +**闭包** + +右侧的矩形演示了执行过程中全局词法环境的变化:![image-20210726175624236](JavaScript高级程序设计第四版-笔记.assets/image-20210726175624236.png) + +1. 当脚本开始运行,词法环境预先填充了所有声明的变量。 + - 最初,它们处于“**未初始化(`Uninitialized`)**”状态。这是一种特殊的内部状态,这意味着引擎知道变量,但是在用 `let` 声明前,不能引用它。几乎就像变量不存在一样。 +2. 然后 `let phrase` 定义出现了。它尚未被赋值,因此它的值为 `undefined`。从这一刻起,我们就可以使用变量了。 +3. `phrase` 被赋予了一个值。 +4. `phrase` 的值被修改。 + +**总结:** + +- 开发者通常应该都知道“闭包”这个通用的编程术语。 +- [闭包](https://en.wikipedia.org/wiki/Closure_(computer_programming)) 是指内部函数总是可以访问其所在的外部函数中声明的变量和参数,即使在其外部函数被返回(寿命终结)了之后。在某些编程语言中,这是不可能的,或者应该以特殊的方式编写函数来实现。但是如上所述,在 JavaScript 中,所有函数都是天生闭包的(只有一个例外,将在 ["new Function" 语法](http://127.0.0.1:8081/new-function.htm) 中讲到)。 + - **所有函数都有名为 `[[Environment]]` 的隐藏属性,该属性保存了对创建该函数的词法环境的引用。** +- 也就是说:JavaScript 中的函数会自动通过隐藏的 `[[Environment]]` 属性记住创建它们的位置,所以它们都可以访问外部变量。 +- 在面试时,前端开发者通常会被问到“什么是闭包?”,正确的回答应该是闭包的定义,并解释清楚为什么 JavaScript 中的所有函数都是闭包的,以及可能的关于 `[[Environment]]` 属性和词法环境原理的技术细节。 + +```javascript +function foo() { + let a = 0; + return () => { + return a++; + }; +} +let b = foo(); +console.log(b()); // 0 +console.log(b()); // 1 +console.log(b()); // 2 +console.log(b()); // 3 +``` + +- 理论上当函数可达时,它外部的所有变量也都将存在。 + +- 但在实际中,JavaScript 引擎会试图优化它。它们会分析变量的使用情况,如果从代码中可以明显看出有未使用的外部变量,那么就会将其删除。 + + - **在 V8(Chrome,Edge,Opera)中的一个重要的副作用是,此类变量在调试中将不可用。** + +- 编写一个像 `sum(a)(b) = a+b` 这样工作的 `sum` 函数。 + + - `sum(1)(2) = 3` + + ```javascript + function sum(a) { + return (b) => { + return a + b; + } + } + console.log(sum(1)(2)); + ``` + + + +### 10.14.1 this 对象 + +1. 在闭包中使用 this 会让代码变复杂。 + + 1. 如果内部函数没有使用箭头函数定义,则 this 对象会在运行时绑定到执行函数的上下文。 + 2. 如果在全局函数中调用,则 this 在非严格模式下等于 window,在严格模式下等于 undefined。 + 3. 如果作为某个对象的方法调用,则 this 等于这个对象。 + 4. 匿名函数在这种情况下不会绑定到某个对象,这就意味着 this 会指向 window,除非在严格模式下 this 是 undefined。 + 5. 不过,由于闭包的写法所致,这个事实有时候没有那么容易看出来。 + + ```javascript + window.identity = 'The Window'; + let object = { + identity: 'My Object', + getIdentityFunc() { + return function () { + return this.identity; + }; + } + }; + console.log(object.getIdentityFunc()()); // 'The Window' + + + // 如果把 this 保存到闭包可以访问的另一个变量中,则是行得通的。 比如: + window.identity = 'The Window'; + let object = { + identity: 'My Object', + getIdentityFunc() { + let that = this; + return function () { + return that.identity; + }; + } + }; + console.log(object.getIdentityFunc()()); // 'My Object' + ``` + + - **注意:** this 和 arguments 都是不能直接在内部函数中访问的。如果想访问包含作用域中的 arguments 对象,则同样需要将其引用先保存到闭包能访问的另一个变量中。 + +2. 在一些特殊情况下, this 值可能并不是我们所期待的值。比如下面这个修改后的例子: + + ```javascript + window.identity = 'The Window'; + let object = { + identity: 'My Object', + getIdentity() { + return this.identity; + } + }; + + object.getIdentity(); // 'My Object' + (object.getIdentity)(); // 'My Object' + (object.getIdentity = object.getIdentity)(); // 'The Window' + // 第三行执行了一次赋值,然后再调用赋值后的结果。 + ``` + + + +### 10.14.2 内存泄漏 + +- 消除循环引用 + +## 10.15 立即调用的函数表达式 + +- 立即调用的匿名函数又被称作**立即调用的函数表达式( IIFE, Immediately Invoked Function Expression)**。 + + - 它类似于函数声明,但由于被包含在括号中,所以会被解释为函数表达式。 + - 紧跟在第一组括号后面的第二组括号会立即调用前面的函数表达式。 + + ```javascript + (function () { + // 块级作用域 + })(); + ``` + +- 使用 IIFE 可以模拟块级作用域,即在一个函数表达式内部声明变量,然后立即调用这个函数。 + + - 这样位于函数体作用域的变量就像是在块级作用域中一样。 ECMAScript 5 尚未支持块级作用域, 使用 IIFE 模拟块级作用域是相当普遍的。 + + ```javascript + // IIFE + (function () { + for (var i = 0; i < count; i++) { + console.log(i); + } + })(); + console.log(i); // 抛出错误 + ``` + +- 说明 IIFE 用途的一个实际的例子,就是可以用它锁定参数值。 + + - `var` 变量作用域外溢 + + ```javascript + let divs = document.querySelectorAll('div'); + // 达不到目的! + for (var i = 0; i < divs.length; ++i) { + divs[i].addEventListener('click', function () { + console.log(i); + }); + } + + // 需要借助 IIFE 来执行一个函数表达式,传入每次循环的当前索引,从而“锁定”点击时应该显示的索引值 + let divs = document.querySelectorAll('div'); + for (var i = 0; i < divs.length; ++i) { + divs[i].addEventListener('click', (function (frozenCounter) { + return function () { + console.log(frozenCounter); + }; + })(i)); + } + ``` + +- 而使用 ECMAScript 块级作用域变量,就不用这么大动干戈了: + + ```javascript + let divs = document.querySelectorAll('div'); + + for (let i = 0; i < divs.length; ++i) { + divs[i].addEventListener('click', function () { + console.log(i++); + }); + } + ``` + + + +## 10.16 私有变量 + +- JavaScript 没有私有成员的概念,所有对象属性都公有的。不过,倒是有私有变量的概念。 + + - 任何定义在函数或块中的变量,都可以认为是私有的,因为在这个函数或块的外部无法访问其中的变量。 + - 私有变量包括函数参数、局部变量,以及函数内部定义的其他函数。 + +- 如果函数中创建了一个闭包,则这个闭包能通过其作用域链访问其外部的变量。基于这一点,就可以创建出能够访问私有变量的公有方法。 + + ```javascript + function MyObject() { + // 私有变量和私有函数 + let privateVariable = 10; + + function privateFunction() { + return false; + } + // 特权方法 + this.publicMethod = function () { + privateVariable++; + return privateFunction(); + }; + } + ``` + + - 这个模式是把所有私有变量和私有函数都定义在构造函数中。然后,再创建一个能够访问这些私有成员的特权方法。 + - 这样做之所以可行,是因为定义在构造函数中的特权方法其实是一个闭包,它具有访问构造函数中定义的所有变量和函数的能力。 + + ```javascript + function Person(name) { + this.getName = function () { + return name; + }; + this.setName = function (value) { + name = value; + }; + } + let person = new Person('Nicholas'); + console.log(person.getName()); // 'Nicholas' + person.setName('Greg'); + console.log(person.getName()); // 'Greg' + ``` + +- 构造函数模式的缺点是每个实例都会重新创建一遍新方法。使用静态私有变量实现特权方法可以避免这个问题。 + +### 10.16.1 静态私有变量 + +```javascript +(function () { + // 私有变量和私有函数 + let privateVariable = 10; + + function privateFunction() { + return false; + } + // 构造函数 + MyObject = function () {}; + // 公有和特权方法 + MyObject.prototype.publicMethod = function () { + privateVariable++; + return privateFunction(); + }; +})(); +``` + +- 公有方法定义在构造函数的原型上,与典型的原型模式一样。 + - 注意,这个模式定义的构造函数没有使用函数声明,使用的是函数表达式。 + - 函数声明会创建内部函数,在这里并不是必需的。基于同样的原因(但操作相反),这里声明 MyObject 并没有使用任何关键字。因为不使用关键字声明的变量会创建在全局作用域中,所以 MyObject 变成了全局变量,可以在这个私有作用域外部被访问。注意在严格模式下给未声明的变量赋值会导致错误。 + - 私有变量和私有函数是由实例共享的。 + +```javascript +(function () { + let name = ''; + Person = function (value) { + name = value; + }; + Person.prototype.getName = function () { + return name; + }; + Person.prototype.setName = function (value) { + name = value; + }; +})(); +let person1 = new Person('Nicholas'); +console.log(person1.getName()); // 'Nicholas' +person1.setName('Matt'); +console.log(person1.getName()); // 'Matt' +let person2 = new Person('Michael'); +console.log(person1.getName()); // 'Michael' +console.log(person2.getName()); // 'Michael' +``` + +- 像这样创建静态私有变量可以利用原型更好地重用代码,只是每个实例没有了自己的私有变量。最终,到底是把私有变量放在实例中,还是作为静态私有变量,都需要根据自己的需求来确定。 +- **注意:** 使用闭包和私有变量会导致作用域链变长,作用域链越长,则查找变量所需的时间也越多。 + + + +### 10.16.2 模块模式 + +- 在一个单例对象上实现了相同的隔离和封装。单例对象( singleton)就是只有一个实例的对象。 + + - 模块模式是在单例对象基础上加以扩展,使其通过作用域链来关联私有变量和特权方法。 + + ```javascript + let singleton = { + name: value, + method() { + // 方法的代码 + } + }; + + // 实例 + let singleton = function () { + // 私有变量和私有函数 + let privateVariable = 10; + + function privateFunction() { + return false; + } + // 特权/公有方法和属性 + return { + publicProperty: true, + publicMethod() { + privateVariable++; + return privateFunction(); + } + }; + }(); + ``` + +- 模块模式使用了匿名函数返回一个对象。 + + - 在匿名函数内部,首先定义私有变量和私有函数。 + - 之后,创建一个要通过匿名函数返回的对象字面量。这个对象字面量中只包含可以公开访问的属性和方法。因为这个对象定义在匿名函数内部,所以它的所有公有方法都可以访问同一个作用域的私有变量和私有函数。 + - 本质上,对象字面量定义了单例对象的公共接口。 + + ```javascript + let application = function () { + // 私有变量和私有函数 + let components = new Array(); + // 初始化 + components.push(new BaseComponent()); + // 公共接口 + return { + getComponentCount() { + return components.length; + }, + registerComponent(component) { + if (typeof component == 'object') { + components.push(component); + } + } + }; + }(); + ``` + + + +### 10.16.3 模块增强模式 + +- 另一个利用模块模式的做法是在返回对象之前先对其进行增强。 + + - 这适合单例对象需要是某个特定类型的实例,但又必须给它添加额外属性或方法的场景。 + + ```javascript + let singleton = function () { + // 私有变量和私有函数 + let privateVariable = 10; + + function privateFunction() { + return false; + } + // 创建对象 + let object = new CustomType(); + // 添加特权/公有属性和方法 + object.publicProperty = true; + object.publicMethod = function () { + privateVariable++; + return privateFunction(); + }; + // 返回对象 + return object; + }(); + + // 如果前一节的 application 对象必须是 BaseComponent 的实例,那么就可以使用下面的代码来创建它: + let application = function () { + // 私有变量和私有函数 + let components = new Array(); + // 初始化 + components.push(new BaseComponent()); + // 创建局部变量保存实例 + let app = new BaseComponent(); + // 公共接口 + app.getComponentCount = function () { + return components.length; + }; + app.registerComponent = function (component) { + if (typeof component == "object") { + components.push(component); + } + }; + // 返回实例 + return app; + }(); + ``` + + - 在这个重写的 application 单例对象的例子中,首先定义了私有变量和私有函数,跟之前例子中一样。主要区别在于这里创建了一个名为 app 的变量,其中保存了 BaseComponent 组件的实例。这是最终要变成 application 的那个对象的局部版本。在给这个局部变量 app 添加了能够访问私有变量的公共方法之后,匿名函数返回了这个对象。然后,这个对象被赋值给 application。 + + + +# 第 11章 期约与异步函数 + +> 建议先阅读《现代JavaScript教程》的本章内容 + +ECMAScript 6 新增了正式的 Promise(期约)引用类型,支持优雅地定义和组织异步逻辑。接下来几个版本增加了使用 async 和 await 关键字定义异步函数的机制。 + +## 11.1 异步编程 +### 11.1.1 同步与异步 + +1. **同步行为**对应内存中顺序执行的处理器指令。 + - 每条指令都会严格按照它们出现的顺序来执行,而每条指令执行后也能立即获得存储在系统本地(如寄存器或系统内存)的信息。这样的执行流程容易分析程序在执行到代码任意位置时的状态(比如变量的值)。 +2. **异步行为**类似于系统中断,即当前进程外部的实体可以触发代码执行。 + - 异步操作经常是必要的,因为强制进程等待一个长时间的操作通常是不可行的(同步操作则必须要等)。 + +### 11.1.2 以往的异步编程模式 + +- 在早期的 JavaScript 中,只支持定义回调函数来表明异步操作完成。 + - 串联多个异步操作是一个常见的问题,通常需要深度嵌套的回调函数(俗称“**回调地狱**”)来解决。 + +1. **异步返回值 ** + + - 有什么好办法把这个值传给需要它的地方?广泛接受的一个策略是给异步操作提供一个回调,这个回调中包含要使用异步返回值的代码(作为回调的参数)。 + + - 位于函数闭包中的回调及其参数在异步执行时仍然是可用的。 + + ```javascript + function double(value, callback) { + setTimeout(() => callback(value * 2), 1000); + } + double(3, (x) => console.log(`I was given: ${x}`)); + // I was given: 6(大约 1000 毫秒之后) + ``` + + + +2. **失败处理 ** + + - 异步操作的失败处理在回调模型中也要考虑,因此自然就出现了成功回调和失败回调: + + ```javascript + function double(value, success, failure) { + setTimeout(() => { + try { + if (typeof value !== 'number') { + throw 'Must provide number as first argument'; + } + success(2 * value); + } catch (e) { + failure(e); + } + }, 1000); + } + const successCallback = (x) => console.log(`Success: ${x}`); + const failureCallback = (e) => console.log(`Failure: ${e}`); + double(3, successCallback, failureCallback); + double('b', successCallback, failureCallback); + // Success: 6(大约 1000 毫秒之后) + // Failure: Must provide number as first argument(大约 1000 毫秒之后) + ``` + + - 这种模式已经不可取了,因为必须在**初始化异步操作时定义回调**。 + + - 异步函数的返回值只在短时间内存在,只有预备好将这个短时间内存在的值作为参数的回调才能接收到它。 + +3. **嵌套异步回调 ** + + ```javascript + function double(value, success, failure) { + setTimeout(() => { + try { + if (typeof value !== 'number') { + throw 'Must provide number as first argument'; + } + success(2 * value); + } catch (e) { + failure(e); + } + }, 1000); + } + const successCallback = (x) => { + double(x, (y) => console.log(`Success: ${y}`)); + }; + const failureCallback = (e) => console.log(`Failure: ${e}`); + double(3, successCallback, failureCallback); + // Success: 12(大约 1000 毫秒之后) + ``` + + - 随着代码越来越复杂,回调策略是不具有扩展性的。“回调地狱”这个称呼可谓名至实归。 + - 嵌套回调的代码维护起来就是噩梦。 + + + +## 11.2 期约 +11.2.1 Promises/A+规范 + +### 11.2.2 期约基础 + +ECMAScript 6 新增的引用类型 `Promise`,可以通过 new 操作符来实例化。 + +创建新期约时需要传入执行器( `executor`)函数作为参数(后面马上会介绍),下面的例子使用了一个空函数对象来应付一下解释器: + +```javascript +let p = new Promise(() => {}); +setTimeout(console.log, 0, p); // Promise +``` + +1. **期约状态机 ** + - 在把一个期约实例传给 `console.log()`时,控制台输出(可能因浏览器不同而略有差异)表明该实例处于**待定( pending)**状态。 + - 如前所述,期约是一个有状态的对象,可能处于如下 3 种状态之一: + 1. **待定( pending)** + 2. **兑现**( fulfilled,有时候也称为“解决”, **resolved**) + 3. **拒绝( rejected)** + - **待定( pending)**是期约的最初始状态。在待定状态下,期约可以**落定( settled)**为代表成功的**兑现( fulfilled)**状态,或者代表失败的**拒绝( rejected)**状态。 + - **期约的状态是私有的**,不能直接通过 JavaScript 检测到。 + - `[[PromiseState]]: "pending"` + - 期约故意将异步行为封装起来,从而隔离外部的同步代码。 +2. **解决值、拒绝理由及期约用例 ** + 1. 期约的状态代表期约是否完成。 + - “待定”表示尚未开始或者正在执行中, + - “兑现”表示已经成功完成, + - 而“拒绝”则表示没有成功完成。 + 2. 每个期约只要状态切换为兑现,就会有一个私有的内部**值( value)**。类似地,每个期约只要状态切换为拒绝,就会有一个私有的内部**理由( reason)**。 + - 二者都是可选的,而且默认值为 undefined。 +3. **通过执行函数控制期约状态 ** + 1. 由于期约的状态是私有的,所以只能在内部进行操作。内部操作在期约的执行器函数中完成。 + - 执行器函数主要有两项职责:初始化期约的异步行为和控制状态的最终转换。 + - 其中,控制期约状态的转换是通过调用它的两个函数参数实现的。 + - 这两个函数参数通常都命名为 `resolve()`和 `reject()`。 + - 调用 `resolve()`会把状态切换为兑现,调用 `reject()`会把状态切换为拒绝。 + - 另外,调用 `reject()`也会抛出错误(后面会讨论这个错误)。 + - 无论 `resolve()`和 `reject()`中的哪个被调用,状态转换都不可撤销了。 +4. **`Promise.resolve() `** + - 通过调用 `Promise.resolve()`静态方法,可以实例化一个解决的期约。 + - 对这个静态方法而言,如果传入的参数本身是一个期约,那它的行为就类似于一个空包装。 +5. **`Promise.reject() `** + - `Promise.reject()`会实例化一个拒绝的期约并抛出一个异步错误(**这个错误不能通过 try/catch 捕获,而只能通过拒绝处理程序捕获**)。 +6. **同步/异步执行的二元性 ** + - 拒绝期约的错误并没有抛到执行同步代码的线程里,而是通过浏览器异步消息队列来处理的。因此, `try/catch` 块并不能捕获该错误。 + - 不能捕获异步错误。 + + + +### 11.2.3 期约的实例方法 + +1. **实现 Thenable 接口 ** + + - 在 ECMAScript 暴露的异步结构中,任何对象都有一个 `then()`方法。这个方法被认为实现了 **Thenable** 接口。 + + ```javascript + class MyThenable { + then() {} + } + ``` + + - Promise 类型实现了 `Thenable` 接口。这个简化的接口跟 TypeScript 或其他包中的接口或类型定义不同,它们都设定了 `Thenable` 接口更具体的形式。 + - 异步函数时还会再谈到 Thenable 接口的用途和目的。 + +2. **`Promise.prototype.then() `** + + - 这个 `then()`方法接收最多两个参数: `onResolved` 处理程序和 `onRejected` 处理程序。这两个参数都是可选的,如果提供的话,则会在期约分别进入“兑现”和“拒绝”状态时执行。 + - 传给 then()的任何非函数类型的参数都会被静默忽略。 + + ```javascript + function onResolved(id) { + setTimeout(console.log, 0, id, 'resolved'); + } + + function onRejected(id) { + setTimeout(console.log, 0, id, 'rejected'); + } + let p1 = new Promise((resolve, reject) => setTimeout(resolve, 3000)); + let p2 = new Promise((resolve, reject) => setTimeout(reject, 3000)); + // 非函数处理程序会被静默忽略,不推荐 + p1.then('gobbeltygook'); + // 不传 onResolved 处理程序的规范写法 + p2.then(null, () => onRejected('p2')); + // p2 rejected( 3 秒后) + ``` + + - 如果没有显式的返回语句,则 `Promise.resolve()`会包装默认的返回值 `undefined`。 + - 如果有显式的返回值,则 `Promise.resolve()`会包装这个值 + - 抛出异常会返回拒绝的期约 + - 调用 `then()`时不传处理程序则原样向后传 + - 注意,返回错误值不会触发上面的拒绝行为,而会把错误对象包装在一个解决的期约中 + +3. **`Promise.prototype.catch() `** + + - 用于给期约添加拒绝处理程序。这个方法只接收一个参数:onRejected 处理程序。 + - 事实上,这个方法就是一个语法糖,调用它就相当于调用 `Promise.prototype.then(null, onRejected)`。 + +4. **`Promise.prototype.finally() `** + + - 用于给期约添加 `onFinally` 处理程序,这个处理程序在期约转换为解决或拒绝状态时都会执行。这个方法可以避免 `onResolved` 和 `onRejected` 处理程序中出现冗余代码。 + - 但 `onFinally` 处理程序没有办法知道期约的状态是解决还是拒绝,所以这个方法主要用于添加清理代码。 + +5. **非重入期约方法 ** + + - 当期约进入落定状态时,与该状态相关的处理程序仅仅会被排期,而非立即执行。 + - 跟在添加这个处理程序的代码之后的同步代码一定会在处理程序之前先执行。 + - 即使期约一开始就是与附加处理程序关联的状态,执行顺序也是这样的。 + - 这个特性由 JavaScript 运行时保证,被称为**“非重入”( non-reentrancy)特性**。 + + ```javascript + let synchronousResolve; + // 创建一个期约并将解决函数保存在一个局部变量中 + let p = new Promise((resolve) => { + synchronousResolve = function () { + console.log('1: invoking resolve()'); + resolve(); + console.log('2: resolve() returns'); + }; + }); + p.then(() => console.log('4: then() handler executes')); + synchronousResolve(); + console.log('3: synchronousResolve() returns'); + + // 实际的输出: + // 1: invoking resolve() + // 2: resolve() returns + // 3: synchronousResolve() returns + // 4: then() handler executes + ``` + + - 即使期约状态变化发生在添加处理程序之后,处理程序也会等到运行的消息队列让它出列时才会执行。 + - 非重入适用于 `onResolved/onRejected` 处理程序、 `catch()`处理程序和 `finally()`处理程序。 + + ```javascript + let p1 = Promise.resolve(); + p1.then(() => console.log('p1.then() onResolved')); + console.log('p1.then() returns'); + + let p2 = Promise.reject(); + p2.then(null, () => console.log('p2.then() onRejected')); + console.log('p2.then() returns'); + + let p3 = Promise.reject(); + p3.catch(() => console.log('p3.catch() onRejected')); + console.log('p3.catch() returns'); + + let p4 = Promise.resolve(); + p4.finally(() => console.log('p4.finally() onFinally')); + console.log('p4.finally() returns'); + + // p1.then() returns + // p2.then() returns + // p3.catch() returns + // p4.finally() returns + // p1.then() onResolved + // p2.then() onRejected + // p3.catch() onRejected + // p4.finally() onFinally + ``` + + + +6. **邻近处理程序的执行顺序 ** + + - 期约添加了多个处理程序,当期约状态变化时,相关处理程序会按照添加它们的顺序依次执行。无论是 `then()`、 `catch()`还是 `finally()`添加的处理程序都是如此。 + + ```javascript + let p1 = Promise.resolve(); + let p2 = Promise.reject(); + p1.then(() => setTimeout(console.log, 0, 1)); + p1.then(() => setTimeout(console.log, 0, 2)); + // 1 + // 2 + p2.then(null, () => setTimeout(console.log, 0, 3)); + p2.then(null, () => setTimeout(console.log, 0, 4)); + // 3 + // 4 + p2.catch(() => setTimeout(console.log, 0, 5)); + p2.catch(() => setTimeout(console.log, 0, 6)); + // 5 + // 6 + p1.finally(() => setTimeout(console.log, 0, 7)); + p1.finally(() => setTimeout(console.log, 0, 8)); + // 7 + // 8 + ``` + + + +7. **传递解决值和拒绝理由 ** + + - Promise.resolve()和 Promise.reject()在被调用时就会接收解决值和拒绝理由。同样地,它们返回的期约也会像执行器一样把这些值传给 onResolved 或 onRejected 处理程序。 + +8. **拒绝期约与拒绝错误处理 ** + + - 拒绝期约类似于 `throw()`表达式,因为它们都代表一种程序状态,即需要中断或者特殊处理。在期约的执行函数或处理程序中抛出错误会导致拒绝,对应的错误对象会成为拒绝的理由。 + - 期约中抛出错误时,因为错误实际上是从消息队列中异步抛出的,所以并不会阻止运行时继续执行同步指令。 + + + +### 11.2.4 期约连锁与期约合成 + +期约连锁:一个期约接一个期约地拼接。 + +期约合成:将多个期约组合为一个期约。 + +1. **期约连锁 ** + + - 因为每个期约实例的方法( `then()、 catch()和 finally()`)都会返回一个新的期约对象,而这个新期约又有自己的实例方法。这样连缀方法调用就可以构成所谓的“期约连锁”。 + + ```javascript + let p = new Promise((resolve, reject) => { + console.log('initial promise rejects'); + reject(); + }); + p.catch(() => console.log('reject handler')) + .then(() => console.log('resolve handler')) + .finally(() => console.log('finally handler')); + + // initial promise rejects + // reject handler + // resolve handler + // finally handler + ``` + + + +2. **期约图 ** + + - 因为一个期约可以有任意多个处理程序,所以期约连锁可以构建**有向非循环图**的结构。 + - 这样,每个期约都是图中的一个节点,而使用实例方法添加的处理程序则是有向顶点。 + - 因为图中的每个节点都会等待前一个节点落定,所以图的方向就是期约的解决或拒绝顺序。 + + ```javascript + // A + // / \ + // B C + // /\ /\ + // D E F G + + let A = new Promise((resolve, reject) => { + console.log('A'); + resolve(); + }); + + let B = A.then(() => console.log('B')); + let C = A.then(() => console.log('C')); + + B.then(() => console.log('D')); + B.then(() => console.log('E')); + C.then(() => console.log('F')); + C.then(() => console.log('G')); + + // A + // B + // C + // D + // E + // F + // G + ``` + + - 注意,日志的输出语句是对二叉树的层序遍历。树只是期约图的一种形式。 + - 如前所述,期约的处理程序是按照它们添加的顺序执行的。 + - 由于期约的处理程序是先添加到消息队列, 然后才逐个执行,因此构成了层序遍历。 + +3. **`Promise.all()和 Promise.race() `** + + - 将多个期约实例组合成一个期约的静态方法 + + - **`Promise.all()`**静态方法创建的期约会在一组期约全部解决之后再解决。 + + - 这个静态方法接收一个可迭代对象,返回一个新期约。 + - 如果至少有一个包含的期约待定,则合成的期约也会待定。如果有一个包含的期约拒绝,则合成的期约也会拒绝。 + - 如果所有期约都成功解决,则合成期约的解决值就是所有包含期约解决值的数组,按照迭代器顺序排序。 + + - **`Promise.race()`**静态方法返回一个包装期约,是一组集合中最先解决或拒绝的期约的镜像。 + + - 这个方法接收一个可迭代对象,返回一个新期约 + - 不会对解决或拒绝的期约区别对待。无论是解决还是拒绝,只要是第一个落定的期约, `Promise.race()`就会包装其解决值或拒绝理由并返回新期约 + - 如果有一个期约拒绝,只要它是第一个落定的,就会成为拒绝合成期约的理由。 + - 之后再拒绝的期约不会影响最终期约的拒绝理由。不过,这并不影响所有包含期约正常的拒绝操作。 + - ~~与 `Promise.all()`类似~~,合成的期约会静默处理所有包含期约的拒绝操作,如下所示: + - `Promise.all()` 有一个包含的期约拒绝,则合成的期约也会拒绝。不会静默处理! + + ```javascript + // 虽然只有第一个期约的拒绝理由会进入 + // 拒绝处理程序,第二个期约的拒绝也 + // 会被静默处理,不会有错误跑掉 + + let p = Promise.race([ + Promise.reject(3), + new Promise((resolve, reject) => setTimeout(reject, 1000)) + ]); + + p.catch((reason) => setTimeout(console.log, 0, reason)); // 3 + // 没有未处理的错误 + ``` + + + +4. **串行期约合成 ** + + - 异步产生值并将其传给处理程序。 + - 基于后续期约使用之前期约的返回值来串联期约是期约的基本功能。 + - 这很像函数合成,即将多个函数合成为一个函数,比如: + + ```javascript + function addTwo(x) { + return x + 2; + } + + function addThree(x) { + return x + 3; + } + + function addFive(x) { + return x + 5; + } + + function addTen(x) { + return addFive(addTwo(addThree(x))); + } + console.log(addTen(7)); // 17 + ``` + + - 类似地,期约也可以像这样合成起来,渐进地消费一个值,并返回一个结果: + + ```javascript + function addTwo(x) { + return x + 2; + } + + function addThree(x) { + return x + 3; + } + + function addFive(x) { + return x + 5; + } + + function addTen(x) { + return Promise.resolve(x) + .then(addTwo) + .then(addThree) + .then(addFive); + } + addTen(8).then(console.log); // 18 + ``` + + - 使用 `Array.prototype.reduce()`可以写成更简洁的形式: + + ```javascript + function addTwo(x) { + return x + 2; + } + + function addThree(x) { + return x + 3; + } + + function addFive(x) { + return x + 5; + } + + function addTen(x) { + return [addTwo, addThree, addFive] + .reduce((promise, fn) => promise.then(fn), Promise.resolve(x)); + } + addTen(8).then(console.log); // 18 + ``` + + - 这种模式可以提炼出一个通用函数,可以把任意多个函数作为处理程序合成一个连续传值的期约连锁。这个通用的合成函数可以这样实现: + + ```javascript + function addTwo(x) { + return x + 2; + } + + function addThree(x) { + return x + 3; + } + + function addFive(x) { + return x + 5; + } + + function compose(...fns) { + return (x) => fns.reduce((promise, fn) => promise.then(fn), Promise.resolve(x)) + } + let addTen = compose(addTwo, addThree, addFive); + addTen(8).then(console.log); // 18 + ``` + + + + + +### 11.2.5 期约扩展 + +很多第三方期约库实现中具备而 ECMAScript 规范却未涉及的两个特性:期约取消和进度追踪。 + +1. **期约取消 ** + + - 某些第三方库,比如 Bluebird,就提供了这个特性。 + + - **“取消令牌”( cancel token)** + + - 生成的令牌实例提供了一个接口,利用这个接口可以取消期约;同时也提供了一个期约的实例,可以用来触发取消后的操作并求值取消状态。 + + ```javascript + class CancelToken { + constructor(cancelFn) { + this.promise = new Promise((resolve, reject) => { + cancelFn(resolve); + }); + } + } + ``` + + - 这个类包装了一个期约,把解决方法暴露给了 `cancelFn` 参数。 + + - 这样,外部代码就可以向构造函数中传入一个函数,从而控制什么情况下可以取消期约。 + - 这里期约是令牌类的公共成员,因此可以给它添加处理程序以取消期约。 + + ```javascript + document.querySelector("body").innerHTML = ` + `; + + class CancelToken { + constructor(cancelFn) { + this.promise = new Promise((resolve, reject) => { + cancelFn(resolve); + }); + } + } + + const startButton = document.querySelector('#start'); + const cancelButton = document.querySelector('#cancel'); + + function cancellableDelayedResolve(delay) { + console.log("开始 delay") + return new Promise((resolve, reject) => { + const id = setTimeout(resolve, delay, "delay Ok"); + // 异步并发,用来取消上一个异步操作 + const cancelToken = new CancelToken((cancelFn) => { + cancelButton.addEventListener("click", cancelFn); + }) + cancelToken.promise.then(() => { + clearTimeout(id); + reject("cancel") + }) + }); + } + + startButton.addEventListener("click", () => cancellableDelayedResolve(1000).then(e => { + console.log("resolve 结果:", e); + }).catch(e => { + console.log("reject 结果:", e); + })); + ``` + + - **简化版** + + ```javascript + document.querySelector("body").innerHTML = ` + `; + + // 简化 取消令牌 + function cancelCB() { + return new Promise((resolve, reject) => { + cancelButton.addEventListener("click", () => { + console.log("取消 cancelled") + resolve(); + }) + }) + } + + const startButton = document.querySelector('#start'); + const cancelButton = document.querySelector('#cancel'); + + function cancellableDelayedResolve(delay) { + console.log("开始 delay") + return new Promise((resolve, reject) => { + const id = setTimeout((() => { + console.log("正常 resolve"); + resolve("ok"); + }), delay); + + // 用来取消上一个异步操作 + cancelCB().then(() => { + clearTimeout(id); + reject("cancel"); + }); + }); + } + startButton.addEventListener("click", () => cancellableDelayedResolve(3000).then(e => { + console.log("resolve 结果:", e); + }).catch(e => { + console.log("reject 结果:", e); + })); + ``` + + + +2. **期约进度通知 ** + + - ECMAScript 6 期约并不支持进度追踪,但是可以通过扩展来实现。 + - 一种实现方式是扩展 Promise 类,为它添加 `notify()`方法,如下所示: + + ```javascript + class TrackablePromise extends Promise { + constructor(executor) { + const notifyHandlers = []; + + super((resolve, reject) => { + return executor(resolve, reject, (status) => { + notifyHandlers.map((handler) => handler(status)); + }); + }); + + this.notifyHandlers = notifyHandlers; + } + + notify(notifyHandler) { + this.notifyHandlers.push(notifyHandler); + return this; + } + } + ``` + + - 这样, `TrackablePromise` 就可以在执行函数中使用 `notify()`函数了。 + + - `notify()`函数会返回期约,所以可以连缀调用,连续添加处理程序。多个处理程序会针对收到的每条消息分别执行一遍,如下所示: + + ```javascript + class TrackablePromise extends Promise { + constructor(executor) { + const notifyHandlers = []; + + super((resolve, reject) => { + return executor(resolve, reject, (status) => { + notifyHandlers.map((handler) => handler(status)); + }); + }); + + this.notifyHandlers = notifyHandlers; + } + + notify(notifyHandler) { + this.notifyHandlers.push(notifyHandler); + return this; + } + } + + let p = new TrackablePromise((resolve, reject, notify) => { + function countdown(x) { + if (x > 0) { + notify(`${20 * x}% remaining`); + setTimeout(() => countdown(x - 1), 1000); + } else { + resolve(); + } + } + countdown(5); + }); + + p.notify((x) => setTimeout(console.log, 0, 'progress:', x)); + p.then(() => setTimeout(console.log, 0, 'completed')); + + // (约 1 秒后) 80% remaining + // (约 2 秒后) 60% remaining + // (约 3 秒后) 40% remaining + // (约 4 秒后) 20% remaining + // (约 5 秒后) completed + + p.notify((x) => setTimeout(console.log, 0, 'a:', x)) + .notify((x) => setTimeout(console.log, 0, 'b:', x)); + p.then(() => setTimeout(console.log, 0, 'completed')); + + // (约 1 秒后) a: 80% remaining + // (约 1 秒后) b: 80% remaining + // (约 2 秒后) a: 60% remaining + // (约 2 秒后) b: 60% remaining + // (约 3 秒后) a: 40% remaining + // (约 3 秒后) b: 40% remaining + // (约 4 秒后) a: 20% remaining + // (约 4 秒后) b: 20% remaining + // (约 5 秒后) completed + ``` + + + + + +## 11.3 异步函数 + +异步函数,也称为“`async/await`”(语法关键字),是 ES6 期约模式在 ECMAScript 函数中的应用。`async/await` 是 ES8 规范新增的,同步方式写的代码 + +### 11.3.1 异步函数 + +1. **async ** + + - async 关键字用于声明异步函数。这个关键字可以用在函数声明、函数表达式、箭头函数和方法上: + + ```javascript + async function foo() {} + + let bar = async function () {}; + + let baz = async () => {}; + + class Qux { + async qux() {} + } + ``` + + - 使用 async 关键字可以让函数具有异步特征,但总体上其代码仍然是同步求值的。而在参数或闭包方面,异步函数仍然具有普通 JavaScript 函数的正常行为。 + - 不过,异步函数如果使用 `return` 关键字返回了值(如果没有 `return` 则会返回 `undefined`),这个值会被 `Promise.resolve()`包装成一个期约对象。**异步函数始终返回期约对象。** + + ```javascript + async function foo() { + console.log(1); + return 3; + } + + foo().then(console.log); + console.log(2); + // 1 + // 2 + // 3 + ``` + + - 异步函数的返回值期待(但实际上并不要求)一个实现 `thenable` 接口的对象,但常规的值也可以。 + - 如果返回的是实现 `thenable` 接口的对象,则这个对象可以由提供给 `then()`的处理程序“解包”。 + - 如果不是,则返回值就被**当作已经解决的期约**。 + + ```javascript + // 返回一个原始值 + async function foo() { + return 'foo'; + } + foo().then(console.log); + // foo + + // 返回一个没有实现 thenable 接口的对象 + async function bar() { + return ['bar']; + } + bar().then(console.log); + // ['bar'] + + // 返回一个实现了 thenable 接口的非期约对象 + async function baz() { + const thenable = { + then(callback) { + callback('baz'); + } + }; + return thenable; + } + baz().then(console.log); + // baz + + // 返回一个期约 + async function qux() { + return Promise.resolve('qux'); + } + qux().then(console.log); + // qux + ``` + + - 与在期约处理程序中一样,在异步函数中抛出错误会返回拒绝的期约 + - 拒绝期约的错误不会被异步函数捕获 + +2. **await ** + + - 使用 `await` 关键字可以暂停异步函数代码的执行,等待期约解决。 + + ```javascript + async function foo() { + let p = new Promise((resolve, reject) => setTimeout(resolve, 1000, 3)); + console.log(await p); + } + + foo(); + // 3 + ``` + + - **注意**, `await` 关键字会暂停执行异步函数后面的代码,让出 JavaScript 运行时的执行线程。 + - 这个行为与生成器函数中的 `yield` 关键字是一样的。 + - `await` 关键字同样是尝试“解包”对象的值,然后将这个值传给表达式,再异步恢复异步函数的执行。 + - `await` 关键字期待(但实际上并不要求)一个实现 `thenable` 接口的对象,但常规的值也可以。 + - 如果是实现 `thenable` 接口的对象,则这个对象可以由 `await` 来“解包”。 + - 如果不是,则这个值就被当作已经解决的期约。 + + ```javascript + // 等待一个原始值 + async function foo() { + console.log(await 'foo'); + } + foo(); + // foo + + // 等待一个没有实现 thenable 接口的对象 + async function bar() { + console.log(await ['bar']); + } + bar(); + // ['bar'] + + // 等待一个实现了 thenable 接口的非期约对象 + async function baz() { + const thenable = { + then(callback) { + callback('baz'); + } + }; + console.log(await thenable); + } + baz(); + // baz + + // 等待一个期约 + async function qux() { + console.log(await Promise.resolve('qux')); + } + qux(); + // qux + ``` + + - 等待会抛出错误的同步操作,会返回拒绝的期约 + - 单独的 `Promise.reject()`不会被异步函数捕获,而会抛出未捕获错误。 + - 不过,对拒绝的期约使用 `await` 则会释放( `unwrap`)错误值(将拒绝期约返回): + + ```javascript + async function foo() { + console.log(1); + await Promise.reject(3); + console.log(4); // 这行代码不会执行 + } + + // 给返回的期约添加一个拒绝处理程序 + foo().catch(console.log); + console.log(2); + + // 1 + // 2 + // 3 + ``` + + + +3. **await 的限制 ** + + - `await` 关键字必须在异步函数中使用,不能在顶级上下文如` + + + + +``` + +模块加载是“阻塞的”,这意味着前置操作必须完成才能执行后续操作。 + +为一个应用程序而按顺序加载五个 JavaScript 文件并不理想,并且手动管理正确的加载顺序也颇为棘手。 + +### 26.1.5 异步依赖 + +使用动态模块加载,那么使用一个` + + +``` + +- 与传统脚本不同,所有模块都会像` + + + + + + + + + + + + + + + + + + + +``` + +- 嵌入的模块定义代码不能使用 `import` 加载到其他模块。 + - 只有通过**外部文件加载的模块**才可以使用 `import` 加载。 + - 因此,嵌入模块只适合作为入口模块。 + +### 26.4.2 模块加载 + +- ECMAScript 6 模块的独特之处在于,既可以通过浏览器原生加载,也可以与第三方加载器和构建工具一起加载。有些浏览器还没有原生支持 ES6 模块,因此可能还需要第三方工具。事实上,很多时候使用第三方工具可能会更方便。 +- 完全支持 ECMAScript 6 模块的浏览器可以**从顶级模块加载整个依赖图,且是异步完成的**。 + - 浏览器会解析入口模块,确定依赖,并发送对依赖模块的请求。 + - 这些文件通过网络返回后,浏览器就会解析它们的内容,确定它们的依赖,如果这些二级依赖还没有加载,则会发送更多请求。 + - 这个异步递归加载过程会持续到整个应用程序的依赖图都解析完成。 + - 解析完依赖图,应用程序就可以正式加载模块了。 +- 这个过程与 AMD 风格的模块加载非常相似。模块文件按需加载,且后续模块的请求会因为每个依赖模块的网络延迟而同步延迟。即,如果 moduleA 依赖 moduleB, moduleB 依赖 moduleC。浏览器在对 moduleB 的请求完成之前并不知道要请求 moduleC。这种加载方式效率很高,也不需要外部工具,但加载大型应用程序的深度依赖图可能要花费很长时间。 + +### 26.4.3 模块行为 + +- ECMAScript 6 模块借用了 CommonJS 和 AMD 的很多优秀特性。下面简单列举一些。 +  模块代码只在加载后执行。 +  模块只能加载一次。 +  模块是单例。 +  模块可以定义公共接口,其他模块可以基于这个公共接口观察和交互。 +  模块可以请求加载其他模块。 +  支持循环依赖。 +- **ES6 模块系统也增加了一些新行为。** +  ES6 模块默认在严格模式下执行。 +  ES6 模块不共享全局命名空间。 +  模块顶级 this 的值是 undefined(常规脚本中是 window)。 +  模块中的 var 声明不会添加到 window 对象。 +  ES6 模块是异步加载和执行的。 +- 浏览器运行时在知道应该把某个文件当成模块时,会有条件地按照上述 ECMAScript 6 模块行为来施加限制。 + - 与` + // 不支持模块的浏览器会执行这里的代码 + + ``` + +- 当然,这样一来支持模块的浏览器就有麻烦了。此时,前面的代码会执行两次,显然这不是我们想要的结果。为了避免这种情况,原生支持 ECMAScript 6 模块的浏览器也会识别 nomodule 属性。此属性通知支持 ES6 模块的浏览器不执行脚本。不支持模块的浏览器无法识别该属性,从而忽略这个属性的存在。 + + ```html + // 支持模块的浏览器会执行这段脚本 + // 不支持模块的浏览器不会执行这段脚本 + + + // 支持模块的浏览器不会执行这段脚本 + // 不支持模块的浏览器会执行这段脚本 + + ``` + + + +# 第 27章 工作者线程 +## 27.1 工作者线程简介 +### 27.1.1 工作者线程与线程 +### 27.1.2 工作者线程的类型 +### 27.1.3 WorkerGlobalScope +## 27.2 专用工作者线程 +### 27.2.1 专用工作者线程的基本概念 +### 27.2.2 专用工作者线程与隐式 MessagePorts +### 27.2.3 专用工作者线程的生命周期 +### 27.2.4 配置 Worker 选项 +### 27.2.5 在 JavaScript 行内创建工作者线程 +### 27.2.6 在工作者线程中动态执行脚本 +### 27.2.7 委托任务到子工作者线程 +### 27.2.8 处理工作者线程错误 +### 27.2.9 与专用工作者线程通信 +### 27.2.10 工作者线程数据传输 +### 27.2.11 线程池 +## 27.3 共享工作者线程 +### 27.3.1 共享工作者线程简介 +### 27.3.2 理解共享工作者线程的生命周期 +### 27.3.3 连接到共享工作者线程 +## 27.4 服务工作者线程 +### 27.4.1 服务工作者线程基础 +### 27.4.2 服务工作者线程缓存 +### 27.4.3 服务工作者线程客户端 +### 27.4.4 服务工作者线程与一致性 +### 27.4.5 理解服务工作者线程的生命周期 +### 27.4.6 控制反转与服务工作者线程持久化 +### 27.4.7 通过 updateViaCache 管理服务文件缓存 +### 27.4.8 强制性服务工作者线程操作 +### 27.4.9 服务工作者线程消息 +### 27.4.10 拦截 fetch 事件 +### 27.4.11 推送通知 +# 第 28章 最佳实践 +## 28.1 可维护性 +### 28.1.1 什么是可维护的代码 +### 28.1.2 编码规范 +### 28.1.3 松散耦合 +### 28.1.4 编码惯例 +## 28.2 性能 +### 28.2.1 作用域意识 +### 28.2.2 选择正确的方法 + +1. **避免不必要的属性查找 ** + + - 算法复杂度 + - `O(1)` ,常量,无论多少值,执行时间都不变。表示简单值和保存在变量中的值 + - `O(logn)`,对数,执行时间随着值的增加而增加,但算法完成不需要读取每个值。例子:二分查找 + - `O(n)`,线性,执行时间与值的数量直接相关。例子:迭代数组的所有元素 + - `O(n2)`,二次方,执行时间随着值的增加而增加,而且每个值至少要读取 n 次。例子:插入排序 + - 常量值或 O(1),指字面量和保存在变量中的值,表示读取常量值所需的时间不会因值的多少而变化。读取常量值是效率极高的操作,因此非常快。 + - 访问数组元素也是 O(1)操作,与简单的变量查找一样。 + - 使用变量和数组相比访问对象属性效率更高,访问对象属性的算法复杂度是 O(n)。 + - 访问对象的每个属性都比访问变量或数组花费的时间长,因为查找属性名要搜索原型链。简单来说,查找的属性越多,执行时间就越长。 + - 特别要注意避免通过多次查找获取一个值。 + - 只要使用某个 object 属性超过一次,就应该将其保存在局部变量中。第一次仍然要用 O(n)的复杂度去访问这个属性,但后续每次访问就都是 O(1),这样就是质的提升了。 + - 通常,只要能够降低算法复杂度,就应该尽量通过在局部变量中保存值来替代属性查找。 + - 另外,如果实现某个需求既可以使用数组的数值索引,又可以使用命名属性(比如 NodeList 对象),那就都应该使用数值索引。 + +2. **优化循环 ** + + 1. **简化终止条件。**因为每次循环都会计算终止条件,所以它应该尽可能地快。这意味着要避免属性找或其他 O(n)操作。 + 2. **简化循环体**。循环体是最花时间的部分,因此要尽可能优化。要确保其中不包含可以轻松转移到循环外部的密集计算。 + 3. **使用后测试循环。**最常见的循环就是 for 和 while 循环,这两种循环都属于先测试循环。 do-while 就是后测试循环,避免了对终止条件初始评估 ,因此应该会更快。 + +3. **展开循环 ** + + - 如果循环的次数是有限的,那么通常抛弃循环而直接多次调用函数会更快。 + +4. **避免重复解释 ** + + - 重复解释的问题存在于 JavaScript 代码尝试解释 JavaScript 代码的情形。 + - 在使用 `eval()` 函数或 Function 构造函数,或者给 `setTimeout()` 传入字符串参数时会出现这种情况。 + +5. **其他性能优化注意事项 ** + + 1. **原生方法很快。** + + - 应该尽可能使用原生方法,而不是使用 JavaScript 写的方法。原生方法是使用 C 或 C++等编译型语言写的,因此比 JavaScript 写的方法要快得多。 + + - JavaScript 中经常被忽视的是Math 对象上那些执行复杂数学运算的方法。这些方法总是比执行相同任务的 JavaScript 函数快 + 得多,比如求正弦、余弦等。 + + 2. **switch 语句很快。** + + - 如果代码中有复杂的 `if-else` 语句,将其转换成 `switch` 语句可以变得更快。 + - 然后,通过重新组织分支,把最可能的放前面,不太可能的放后面,可以进一步提升性能。 + + 3. **位操作很快。** + + - 在执行数学运算操作时,位操作一定比任何布尔值或数值计算更快。选择性地将某些数学操作替换成位操作,可以极大提升复杂计算的效率。像求模、逻辑 AND 与和逻辑 OR 或都很适合替代成位操作。 + + + +### 28.2.3 语句最少化 + +1. **多个变量声明 ** +2. **插入迭代性值 ** +3. **使用数组和对象字面量 ** + + + +### 28.2.4 优化 DOM 交互 + +1. **实时更新最小化 ** +2. **使用 innerHTML ** +3. **使用事件委托 ** +4. **注意 HTMLCollection ** + + + + + +## 28.3 部署 +### 28.3.1 构建流程 + +1. **文件结构 ** +2. **任务运行器 ** +3. **摇树优化 ** +4. **模块打包器 ** + + + +### 28.3.2 验证 +### 28.3.3 压缩 + +1. **代码压缩 ** +2. **JavaScript 编译 ** +3. **JavaScript 转译 ** +4. **HTTP 压缩 ** +5. + +# 附录A ES2018和ES2019(图灵社区下载) + +## A.1 异步迭代 + +### A.1.1 创建并使用异步迭代器 + + + + + +## A.2 对象字面量的剩余操作符和扩展操作符 + + + + + +## A.3 Promise.prototype.finally() + + + + + +## A.4 正则表达式相关特性 + + + + + + + +## A.5 数组打平方法 + + + + + +## A.6 Object.fromEntries() + + + + + +## A.7 字符串修理方法 + + + + + + + +## A.8 Symbol.prototype.description + + + + + +## A.9 可选的 catch 绑定 + + + + + +## A.10 其他新增内容 + + + + + + + +# 附录B 严格模式(图灵社区下载) + +## B.1 选择使用 + + + + + +## B.2 变量 + + + + + +## B.3 对象 + + + + + +## B.4 函数 + + + + + +## B.5 this 强制转型 + + + + + + + +## B.6 类与模块 + + + + + +## B.7 其他变化 + + + + + + + +# 附录C JavaScript库和框架(图灵社区下载) + +## C.1 框架 + + + + + +## C.2 通用库 + + + + + +## C.3 动画与特效 + + + + + + + +# 附录D JavaScript工具(图灵社区下载) + +## D.1 包管理 + + + +## D.2 模块加载器 + + + + + +## D.3 模块打包器 + + + + + +## D.4 编译/转译工具及静态类型系统 + + + + + +## D.5 高性能脚本工具 + + + + + +## D.6 编辑器 + + + + + +## D.7 构建工具、自动化系统和任务运行器 + + + + + +## D.8 代码检查和格式化 + + + + + +## D.9 压缩工具 + + + + + + + +## D.10 单元测试 + + + + + +## D.11 文档生成器 \ No newline at end of file diff --git "a/Typescript\345\255\246\344\271\240\347\254\224\350\256\260.md" "b/Typescript\345\255\246\344\271\240\347\254\224\350\256\260.md" new file mode 100644 index 0000000..d8dcac5 --- /dev/null +++ "b/Typescript\345\255\246\344\271\240\347\254\224\350\256\260.md" @@ -0,0 +1,684 @@ +# TypeScript 笔记 + +## 环境搭建 + +[How to Set Up a Node.js Project with TypeScript](https://blog.appsignal.com/2022/01/19/how-to-set-up-a-nodejs-project-with-typescript.html) + +### 步骤一:安装依赖 + +```bash +mkdir typescript-project + +cd typescript-project + +npm i typescript --save-dev + +npx tsc --init + +nano tsconfig.json + +npm install nodemon -D # 监视文件重启用 +``` + +或者使用: + +```bash +npm install -D ts-node # 合并`node` + `tsc`两个命令 + +# Execute a script as `node` + `tsc`. +ts-node script.ts +``` + +[nodemon](https://www.digitalocean.com/community/tutorials/workflow-nodemon) + +Using these options, let’s create the command to satisfy the following scenario: + +- watching the `server` directory +- specifying files with a `.ts` extension +- ignoring files with a `.test.ts` suffix +- executing the file (`server/server.ts`) with `ts-node` +- waiting for three seconds to restart after a file changes + +`tsconfig.json` + +```json +{ + // "extends": "@tsconfig/node16/tsconfig.json", + "compilerOptions": { + /* 基本选项 */ + "target": "ES6", // 指定 ECMAScript 目标版本: 'ES3' (default), 'ES5', 'ES6'/'ES2015', 'ES2016', 'ES2017', or 'ESNEXT' + "module": "CommonJS", // 指定使用模块: 'commonjs', 'amd', 'system', 'umd' or 'es2015' + "lib": [], // 指定要包含在编译中的库文件 + "allowJs": true, // 允许编译 javascript 文件 + "checkJs": true, // 报告 javascript 文件中的错误 + "jsx": "preserve", // 指定 jsx 代码的生成: 'preserve', 'react-native', or 'react' + "declaration": true, // 生成相应的 '.d.ts' 文件 + // "sourceMap": true, // 生成相应的 '.map' 文件 + // "outFile": "./", // 将输出文件合并为一个文件 + "outDir": "./build", // 指定输出目录 + "rootDir": "./", // 用来控制输出目录结构 --outDir. + "removeComments": true, // 删除编译后的所有的注释 + "noEmit": false, // 不生成输出文件 + "importHelpers": false, // 从 tslib 导入辅助工具函数 + "isolatedModules": false, // 将每个文件作为单独的模块 (与 'ts.transpileModule' 类似). + + /* 严格的类型检查选项 */ + "strict": true, // 启用所有严格类型检查选项 + "noImplicitAny": true, // 在表达式和声明上有隐含的 any类型时报错 + "strictNullChecks": true, // 启用严格的 null 检查 + "noImplicitThis": true, // 当 this 表达式值为 any 类型的时候,生成一个错误 + "alwaysStrict": true, // 以严格模式检查每个模块,并在每个文件里加入 'use strict' + + /* 额外的检查 */ + "noUnusedLocals": true, // 有未使用的变量时,抛出错误 + "noUnusedParameters": true, // 有未使用的参数时,抛出错误 + "noImplicitReturns": true, // 并不是所有函数里的代码都有返回值时,抛出错误 + "noFallthroughCasesInSwitch": true, // 报告 switch 语句的 fallthrough 错误。(即,不允许 switch 的 case 语句贯穿) + + /* 模块解析选项 */ + "moduleResolution": "node", // 选择模块解析策略: 'node' (Node.js) or 'classic' (TypeScript pre-1.6) + "baseUrl": "./", // 用于解析非相对模块名称的基目录 + "paths": {}, // 模块名到基于 baseUrl 的路径映射的列表 + "rootDirs": [], // 根文件夹列表,其组合内容表示项目运行时的结构内容 + // "typeRoots": [], // 包含类型声明的文件列表 + // "types": [], // 需要包含的类型声明文件名列表 + "allowSyntheticDefaultImports": true, // 允许从没有设置默认导出的模块中默认导入。 + + /* Source Map Options */ + // "sourceRoot": "./", // 指定调试器应该找到 TypeScript 文件而不是源文件的位置 + // "mapRoot": "./", // 指定调试器应该找到映射文件而不是生成文件的位置 + // "inlineSourceMap": true, // 生成单个 soucemaps 文件,而不是将 sourcemaps 生成不同的文件 + // "inlineSources": true, // 将代码与 sourcemaps 生成到一个文件中,要求同时设置了 --inlineSourceMap 或 --sourceMap 属性 + + /* 其他选项 */ + "experimentalDecorators": true, // 启用装饰器 + "emitDecoratorMetadata": true // 为装饰器提供元数据的支持 + }, + "include": ["./src"], + "exclude": ["./node_modules"] +} +``` + +`package.json` + +```json +{ + "name": "typescript", + "version": "1.0.0", + "description": "", + "main": "build/src/index.js", + "scripts": { + "start": "nodemon src/index.ts" + }, + "author": "", + "license": "ISC", + "devDependencies": { + "nodemon": "^2.0.19", + "ts-node": "^10.9.1", + "typescript": "^4.7.4" + } +} +``` + +`index.ts` + +```typescript +const world = 'world' + +export function hello(who: string = world): string { + return `Hello ${who}! ` +} + +console.log(hello(world)) +``` + +`nodemon.json` + +```json +{ + "watch": ["src"], + "ext": "ts", + "ignore": ["*.test.ts"], + "delay": "0", + "execMap": { + "ts": "ts-node" + } +} +``` + +### 步骤二:启动项目 + +```typescript +const world = 'world' + +export function hello(who: string = world): string { + return `Hello ${who}! ` +} +``` + +```bash +npx tsc # 编译 + +npx tsc -w # watch mode + +npm start # 自动编译和重启 +``` + +### 步骤三:安装类型提示和代码格式化工具 + +This error occurs because the `lib` compiler option set in the [base configuration](https://www.npmjs.com/package/@tsconfig/node16) for Node.js v16 does not include the `dom` option, which contains type definitions for the `console` object and other browser-specific APIs. The error message above suggests adding the `dom` option to the `lib` property to fix the problem, but this is not the correct solution for a Node.js project. + +The correct fix involves installing the [type definitions for Node.js APIs](https://www.npmjs.com/package/@types/node) so that the TypeScript compiler can understand and validate all the built-in Node.js APIs. Here's how: + +```bash +npm install @types/node --save-dev +npm install @tsconfig/node16 --save-dev # 非必要 +``` + +```bash +npm install eslint --save-dev +npm i prettier eslint-plugin-prettier eslint-config-prettier -D +npm install @typescript-eslint/parser @typescript-eslint/eslint-plugin --save-dev +``` + +`.eslintrc.js` + +```javascript +module.exports = { + parser: '@typescript-eslint/parser', // 定义ESLint的解析器 + extends: ['eslint:recommended', 'plugin:@typescript-eslint/recommended', 'prettier'], // 定义文件继承的子规范 + plugins: ['prettier'], // 定义了该eslint文件所依赖的插件 + env: { + // 指定代码的运行环境 + browser: true, + node: true, + es2021: true, + }, + parserOptions: { + // 指定ESLint可以解析JSX语法 + ecmaFeatures: { + jsx: true, + }, + ecmaVersion: 'latest', + sourceType: 'module', + }, + rules: { + 'no-console': 'off', + 'import/prefer-default-export': 'off', + '@typescript-eslint/no-unused-vars': 'warn', + }, +} +``` + +`.prettierrc.js` + +```javascript +module.exports = { + printWidth: 120, //一行的字符数,如果超过会进行换行,默认为80 + tabWidth: 2, //一个tab代表几个空格数,默认为80 + useTabs: false, //是否使用tab进行缩进,默认为false,表示用空格进行缩减 + singleQuote: true, //字符串是否使用单引号,默认为false,使用双引号 + semi: false, //行位是否使用分号,默认为true + trailingComma: 'es5', //是否使用尾逗号,有三个可选值"" + bracketSpacing: true, //对象大括号直接是否有空格,默认为true,效果:{ foo: bar } + arrowParens: 'always', // 箭头函数单个参数加分号 + bracketSameLine: true, +} +``` + +## @types + +毫无疑问,[DefinitelyTyped](https://github.com/borisyankov/DefinitelyTyped) 是 TypeScript 最大的优势之一,社区已经记录了 90% 的顶级 JavaScript 库。 + +``` +npm install @types/jquery --save-dev +``` + +可以看出,对于某些团队而言,拥有允许全局使用的定义是一个问题。因此,你可以通过配置 `tsconfig.json` 的 `compilerOptions.types` 选项,引入有意义的类型: + +```json +{ + "compilerOptions": { + "types": ["jquery"] + } +} +``` + +如上例所示,通过配置 `compilerOptions.types: [ "jquery" ]` 后,只允许使用 `jquery` 的 `@types` 包,即使这个人安装了另一个声明文件,比如 `npm install @types/node`,它的全局变量(例如 `process`)也不会泄漏到你的代码中,直到你将它们添加到 tsconfig.json 类型选项。 + +## 数据类型 + +### 数字类型枚举与数字类型 + +数字类型枚举,允许我们将数字类型或者其他任何与数字类型兼容的类型赋值给枚举类型的实例。 + +```ts +enum Color { + Red, + Green, + Blue, +} + +let col = Color.Red +col = 0 // 有效的,这也是 Color.Red +``` + +## `--lib` 选项 + +有时,你想要解耦编译目标(即生成的 JavaScript 版本)和环境库支持之间的关系。例如对于 Promise,你的编译目标是 `--target es5`,但是你仍然想使用它,这时,你可以使用 `lib` 对它进行控制。 + +### config.json + +```json +"compilerOptions": { + "lib": ["dom", "es6"] +} +``` + +## 捕获键的名称 + +`keyof` 操作符能让你捕获一个类型的键。例如,你可以使用它来捕获变量的键名称,在通过使用 `typeof` 来获取类型之后: + +```ts +const colors = { + red: 'red', + blue: 'blue', +} + +type Colors = keyof typeof colors + +let color: Colors // color 的类型是 'red' | 'blue' +color = 'red' // ok +color = 'blue' // ok +color = 'anythingElse' // Error +``` + +这允许你很容易地拥有像字符串枚举+常量这样的类型,如上例所示。 + +## Utility Types + +[实用工具类型](http://www.patrickzhong.com/TypeScript/zh/reference/utility-types.html#实用工具类型) + +TypeScript 提供一些工具类型来帮助常见的类型转换。这些类型是全局可见的。 + +### [`Partial`](http://www.patrickzhong.com/TypeScript/zh/reference/utility-types.html#partialtype) + +构造类型`Type`,并将它所有的属性设置为可选的。它的返回类型表示输入类型的所有子类型。 + +#### [例子](http://www.patrickzhong.com/TypeScript/zh/reference/utility-types.html#例子) + +```typescript +interface Todo { + title: string + description: string +} + +function updateTodo(todo: Todo, fieldsToUpdate: Partial) { + return { ...todo, ...fieldsToUpdate } +} + +const todo1 = { + title: 'organize desk', + description: 'clear clutter', +} + +const todo2 = updateTodo(todo1, { + description: 'throw out trash', +}) +``` + +### [`Readonly`](http://www.patrickzhong.com/TypeScript/zh/reference/utility-types.html#readonlytype) + +构造类型`Type`,并将它所有的属性设置为`readonly`,也就是说构造出的类型的属性不能被再次赋值。 + +#### [例子](http://www.patrickzhong.com/TypeScript/zh/reference/utility-types.html#例子-1) + +```typescript +interface Todo { + title: string +} + +const todo: Readonly = { + title: 'Delete inactive users', +} + +todo.title = 'Hello' // Error: cannot reassign a readonly property +``` + +这个工具可用来表示在运行时会失败的赋值表达式(比如,当尝试给[冻结对象](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze)的属性再次赋值时)。 + +#### [`Object.freeze`](http://www.patrickzhong.com/TypeScript/zh/reference/utility-types.html#objectfreeze) + +```typescript +function freeze(obj: T): Readonly +``` + +### [`Record`](http://www.patrickzhong.com/TypeScript/zh/reference/utility-types.html#recordkeys-type) + +构造一个类型,其属性名的类型为`K`,属性值的类型为`T`。这个工具可用来将某个类型的属性映射到另一个类型上。 + +#### [例子](http://www.patrickzhong.com/TypeScript/zh/reference/utility-types.html#例子-2) + +```typescript +interface PageInfo { + title: string +} + +type Page = 'home' | 'about' | 'contact' + +const x: Record = { + about: { title: 'about' }, + contact: { title: 'contact' }, + home: { title: 'home' }, +} +``` + +### [`Pick`](http://www.patrickzhong.com/TypeScript/zh/reference/utility-types.html#picktype-keys) + +从类型`Type`中挑选部分属性`Keys`来构造类型。 + +#### [例子](http://www.patrickzhong.com/TypeScript/zh/reference/utility-types.html#例子-3) + +```typescript +interface Todo { + title: string + description: string + completed: boolean +} + +type TodoPreview = Pick + +const todo: TodoPreview = { + title: 'Clean room', + completed: false, +} +``` + +Pick enum + +```typescript +enum KeysToBePickedFrom { + KEY_ONE = 'Key One', + KEY_TWO = 'Key Number Two', + KEY_THREE = 'Another key n. 3', + LAST_KEY = 'Here is the last Key', +} + +type PickKey = Extract + +type Picked_KeysOfEnum = PickKey + +interface KeysPickedForType { + keyone: Picked_KeysOfEnum +} + +const picks: KeysPickedForType = { + keyone: 'KEY_ONE', // KEY_ONE | LAST_KEY +} +``` + +### [`Omit`](http://www.patrickzhong.com/TypeScript/zh/reference/utility-types.html#omittype-keys) + +从类型`Type`中获取所有属性,然后从中剔除`Keys`属性后构造一个类型。 + +#### [例子](http://www.patrickzhong.com/TypeScript/zh/reference/utility-types.html#例子-4) + +```typescript +interface Todo { + title: string + description: string + completed: boolean +} + +type TodoPreview = Omit + +const todo: TodoPreview = { + title: 'Clean room', + completed: false, +} +``` + +### [`Exclude`](http://www.patrickzhong.com/TypeScript/zh/reference/utility-types.html#excludetype-excludedunion) + +从类型`Type`中剔除所有可以赋值给`ExcludedUnion`的属性,然后构造一个类型。 + +#### [例子](http://www.patrickzhong.com/TypeScript/zh/reference/utility-types.html#例子-5) + +```typescript +type T0 = Exclude<'a' | 'b' | 'c', 'a'> // "b" | "c" +type T1 = Exclude<'a' | 'b' | 'c', 'a' | 'b'> // "c" +type T2 = Exclude void), Function> // string | number +``` + +### [`Extract`](http://www.patrickzhong.com/TypeScript/zh/reference/utility-types.html#extracttype-union) + +从类型`Type`中提取所有可以赋值给`Union`的类型,然后构造一个类型。 + +#### [例子](http://www.patrickzhong.com/TypeScript/zh/reference/utility-types.html#例子-6) + +```typescript +type T0 = Extract<'a' | 'b' | 'c', 'a' | 'f'> // "a" +type T1 = Extract void), Function> // () => void +``` + +### [`NonNullable`](http://www.patrickzhong.com/TypeScript/zh/reference/utility-types.html#nonnullabletype) + +从类型`Type`中剔除`null`和`undefined`,然后构造一个类型。 + +#### [例子](http://www.patrickzhong.com/TypeScript/zh/reference/utility-types.html#例子-7) + +```typescript +type T0 = NonNullable // string | number +type T1 = NonNullable // string[] +``` + +### [`Parameters`](http://www.patrickzhong.com/TypeScript/zh/reference/utility-types.html#parameterstype) + +由函数类型`Type`的参数类型来构建出一个元组类型。 + +#### [例子](http://www.patrickzhong.com/TypeScript/zh/reference/utility-types.html#例子-8) + +```ts +declare function f1(arg: { a: number; b: string }): void + +type T0 = Parameters<() => string> +// [] +type T1 = Parameters<(s: string) => void> +// [s: string] +type T2 = Parameters<(arg: T) => T> +// [arg: unknown] +type T3 = Parameters +// [arg: { a: number; b: string; }] +type T4 = Parameters +// unknown[] +type T5 = Parameters +// never +type T6 = Parameters +// never +// Type 'string' does not satisfy the constraint '(...args: any) => any'. +type T7 = Parameters +// never +// Type 'Function' does not satisfy the constraint '(...args: any) => any'. +``` + +### [`ConstructorParameters`](http://www.patrickzhong.com/TypeScript/zh/reference/utility-types.html#constructorparameterstype) + +由构造函数类型来构建出一个元组类型或数组类型。 由构造函数类型`Type`的参数类型来构建出一个元组类型。(若`Type`不是构造函数类型,则返回`never`)。 + +#### [例子](http://www.patrickzhong.com/TypeScript/zh/reference/utility-types.html#例子-9) + +```ts +type T0 = ConstructorParameters +// [message?: string | undefined] +type T1 = ConstructorParameters +// string[] +type T2 = ConstructorParameters +// [pattern: string | RegExp, flags?: string | undefined] +type T3 = ConstructorParameters +// unknown[] + +type T4 = ConstructorParameters +// never +// Type 'Function' does not satisfy the constraint 'new (...args: any) => any'. +``` + +### [`ReturnType`](http://www.patrickzhong.com/TypeScript/zh/reference/utility-types.html#returntypetype) + +由函数类型`Type`的返回值类型构建一个新类型。 + +#### [例子](http://www.patrickzhong.com/TypeScript/zh/reference/utility-types.html#例子-10) + +``` +type T0 = ReturnType<() => string>; // string +type T1 = ReturnType<(s: string) => void>; // void +type T2 = ReturnType<(() => T)>; // {} +type T3 = ReturnType<(() => T)>; // number[] +type T4 = ReturnType; // { a: number, b: string } +type T5 = ReturnType; // any +type T6 = ReturnType; // any +type T7 = ReturnType; // Error +type T8 = ReturnType; // Error +``` + +### [`InstanceType`](http://www.patrickzhong.com/TypeScript/zh/reference/utility-types.html#instancetypetype) + +由构造函数类型`Type`的实例类型来构建一个新类型。 + +#### [例子](http://www.patrickzhong.com/TypeScript/zh/reference/utility-types.html#例子-11) + +```typescript +class C { + x = 0 + y = 0 +} + +type T0 = InstanceType // C +type T1 = InstanceType // any +type T2 = InstanceType // any +type T3 = InstanceType // Error +type T4 = InstanceType // Error +``` + +### [`Required`](http://www.patrickzhong.com/TypeScript/zh/reference/utility-types.html#requiredtype) + +构建一个类型,使类型`Type`的所有属性为`required`。 与此相反的是[`Partial`](http://www.patrickzhong.com/TypeScript/zh/reference/utility-types.html#partialtype)。 + +#### [例子](http://www.patrickzhong.com/TypeScript/zh/reference/utility-types.html#例子-12) + +```typescript +interface Props { + a?: number + b?: string +} + +const obj: Props = { a: 5 } // OK + +const obj2: Required = { a: 5 } // Error: property 'b' missing +``` + +### [`ThisParameterType`](http://www.patrickzhong.com/TypeScript/zh/reference/utility-types.html#thisparametertypetype) + +从函数类型中提取 [this](http://www.patrickzhong.com/TypeScript/zh/handbook/functions.html#this参数) 参数的类型。 若函数类型不包含 `this` 参数,则返回 [unknown](http://www.patrickzhong.com/TypeScript/zh/handbook/basic-types.html#unknown) 类型。 + +#### [例子](http://www.patrickzhong.com/TypeScript/zh/reference/utility-types.html#例子-13) + +```ts +function toHex(this: Number) { + return this.toString(16) +} + +function numberToString(n: ThisParameterType) { + return toHex.apply(n) +} +``` + +### [`OmitThisParameter`](http://www.patrickzhong.com/TypeScript/zh/reference/utility-types.html#omitthisparametertype) + +从`Type`类型中剔除 [`this`](http://www.patrickzhong.com/TypeScript/zh/handbook/functions.html#this参数) 参数。 若未声明 `this` 参数,则结果类型为 `Type` 。 否则,由`Type`类型来构建一个不带`this`参数的类型。 泛型会被忽略,并且只有最后的重载签名会被采用。 + +#### [例子](http://www.patrickzhong.com/TypeScript/zh/reference/utility-types.html#例子-14) + +```ts +function toHex(this: Number) { + return this.toString(16) +} + +const fiveToHex: OmitThisParameter = toHex.bind(5) + +console.log(fiveToHex()) +``` + +### [`ThisType`](http://www.patrickzhong.com/TypeScript/zh/reference/utility-types.html#thistypetype) + +这个工具不会返回一个转换后的类型。 它做为上下文的[`this`](http://www.patrickzhong.com/TypeScript/zh/handbook/functions.html#this)类型的一个标记。 注意,若想使用此类型,必须启用`--noImplicitThis`。 + +#### [例子](http://www.patrickzhong.com/TypeScript/zh/reference/utility-types.html#例子-15) + +```typescript +// Compile with --noImplicitThis + +type ObjectDescriptor = { + data?: D + methods?: M & ThisType // Type of 'this' in methods is D & M +} + +function makeObject(desc: ObjectDescriptor): D & M { + let data: object = desc.data || {} + let methods: object = desc.methods || {} + return { ...data, ...methods } as D & M +} + +let obj = makeObject({ + data: { x: 0, y: 0 }, + methods: { + moveBy(dx: number, dy: number) { + this.x += dx // Strongly typed this + this.y += dy // Strongly typed this + }, + }, +}) + +obj.x = 10 +obj.y = 20 +obj.moveBy(5, 5) +``` + +上面例子中,`makeObject`参数里的`methods`对象具有一个上下文类型`ThisType`,因此`methods`对象的方法里`this`的类型为`{ x: number, y: number } & { moveBy(dx: number, dy: number): number }`。 + +在`lib.d.ts`里,`ThisType`标识接口是个简单的空接口声明。除了在被识别为对象字面量的上下文类型之外,这个接口与一般的空接口没有什么不同。 + +### [操作字符串的类型](http://www.patrickzhong.com/TypeScript/zh/reference/utility-types.html#操作字符串的类型) + +为了便于操作模版字符串字面量,TypeScript 引入了一些能够操作字符串的类型。 更多详情,请阅读[模版字面量类型](http://www.patrickzhong.com/TypeScript/zh/handbook-v2/type-manipulation/template-literal-types.html#固有字符串操作类型)。 + +## [三斜线指令](http://www.patrickzhong.com/TypeScript/zh/reference/triple-slash-directives.html#三斜线指令) + +三斜线指令是包含单个 XML 标签的单行注释。 注释的内容会做为编译器指令使用。 + +三斜线指令*仅*可放在包含它的文件的最顶端。 一个三斜线指令的前面只能出现单行或多行注释,这包括其它的三斜线指令。 如果它们出现在一个语句或声明之后,那么它们会被当做普通的单行注释,并且不具有特殊的涵义。 + +`/// `指令是三斜线指令中最常见的一种。 它用于声明文件间的*依赖*。 + +三斜线引用告诉编译器在编译过程中要引入的额外的文件。 + +当使用`--out`或`--outFile`时,它也可以做为调整输出内容顺序的一种方法。 文件在输出文件内容中的位置与经过预处理后的输入顺序一致。 + +## 参考资料 + +Typescript 手册 + +https://www.typescriptlang.org/docs/handbook/ + +中文版:http://www.patrickzhong.com/TypeScript + +一个基于 Go 与 Typescript 开发的看板开源软件:taskcafe (https://github.com/JordanKnott/taskcafe)。 + +支持对任务进行筛选过滤、打标签、添加截止日期、分配成员、制定流程等操作 + +#前端 #电子书 :《深入理解 TypeScript (https://github.com/jkchao/typescript-book-chinese)》(TypeScript Deep Dive (https://github.com/basarat/typescript-book))。 + +该书将从基础到深入,全面阐述 TypeScript 的各种魔法,并结合实际场景用例,让你更深入的理解 TypeScript + +全栈 React.js、GraphQL、Postgres、TypeScript 入门模板 (https://github.com/braydenwerner/Wern-Fullstack-Template) + +https://github.com/braydenwerner/Wern-Fullstack-Template diff --git "a/fast-interview-code/css/01-\347\233\222\346\250\241\345\236\213.html" "b/fast-interview-code/css/01-\347\233\222\346\250\241\345\236\213.html" new file mode 100644 index 0000000..0f1637d --- /dev/null +++ "b/fast-interview-code/css/01-\347\233\222\346\250\241\345\236\213.html" @@ -0,0 +1,25 @@ + + + + + + + 盒模型 + + + +
    this is div1
    + + + + diff --git "a/fast-interview-code/css/02-margin-\347\272\265\345\220\221\351\207\215\345\217\240.html" "b/fast-interview-code/css/02-margin-\347\272\265\345\220\221\351\207\215\345\217\240.html" new file mode 100644 index 0000000..877ba29 --- /dev/null +++ "b/fast-interview-code/css/02-margin-\347\272\265\345\220\221\351\207\215\345\217\240.html" @@ -0,0 +1,26 @@ + + + + + + + margin 纵向重叠 + + + + +

    AAA

    +

    +

    +

    +

    BBB

    + + + \ No newline at end of file diff --git "a/fast-interview-code/css/03-margin-\350\264\237\345\200\274.html" "b/fast-interview-code/css/03-margin-\350\264\237\345\200\274.html" new file mode 100644 index 0000000..42898c1 --- /dev/null +++ "b/fast-interview-code/css/03-margin-\350\264\237\345\200\274.html" @@ -0,0 +1,61 @@ + + + + + + + margin 负值 + + + + +

    用于测试 margin top bottom 的负数情况

    +
    +
    + this is item 1 +
    +
    + this is item 2 +
    +
    + +

    用于测试 margin left right 的负数情况

    +
    +
    + this is item 3 +
    +
    + this is item 4 +
    +
    + + + \ No newline at end of file diff --git a/fast-interview-code/css/04-bfc.html b/fast-interview-code/css/04-bfc.html new file mode 100644 index 0000000..bbca24b --- /dev/null +++ b/fast-interview-code/css/04-bfc.html @@ -0,0 +1,26 @@ + + + + + + + Document + + + +
    + +

    某一段文字……

    +
    + + \ No newline at end of file diff --git "a/fast-interview-code/css/05-\345\234\243\346\235\257\345\270\203\345\261\200.html" "b/fast-interview-code/css/05-\345\234\243\346\235\257\345\270\203\345\261\200.html" new file mode 100644 index 0000000..fd74dba --- /dev/null +++ "b/fast-interview-code/css/05-\345\234\243\346\235\257\345\270\203\345\261\200.html" @@ -0,0 +1,64 @@ + + + + + + + 圣杯布局 + + + + +
    +
    this is center
    +
    this is left
    + +
    + + + \ No newline at end of file diff --git "a/fast-interview-code/css/06-\345\217\214\351\243\236\347\277\274\345\270\203\345\261\200.html" "b/fast-interview-code/css/06-\345\217\214\351\243\236\347\277\274\345\270\203\345\261\200.html" new file mode 100644 index 0000000..d1aa3a6 --- /dev/null +++ "b/fast-interview-code/css/06-\345\217\214\351\243\236\347\277\274\345\270\203\345\261\200.html" @@ -0,0 +1,52 @@ + + + + + + + 双飞翼布局 + + + +
    +
    + this is main +
    +
    +
    + this is left +
    + + + \ No newline at end of file diff --git "a/fast-interview-code/css/07-\350\211\262\345\255\220.html" "b/fast-interview-code/css/07-\350\211\262\345\255\220.html" new file mode 100644 index 0000000..0b8664a --- /dev/null +++ "b/fast-interview-code/css/07-\350\211\262\345\255\220.html" @@ -0,0 +1,42 @@ + + + + + + + flex 画骰子 + + + +
    + + + +
    + + \ No newline at end of file diff --git "a/fast-interview-code/css/08-\345\256\232\344\275\215.html" "b/fast-interview-code/css/08-\345\256\232\344\275\215.html" new file mode 100644 index 0000000..d16da37 --- /dev/null +++ "b/fast-interview-code/css/08-\345\256\232\344\275\215.html" @@ -0,0 +1,42 @@ + + + + + + + absote relative 定位问题 + + + + +

    absolute 和 relative 定位问题

    +
    +
    + this is absolute +
    +
    + + + \ No newline at end of file diff --git "a/fast-interview-code/css/09-\346\260\264\345\271\263\345\257\271\351\275\220.html" "b/fast-interview-code/css/09-\346\260\264\345\271\263\345\257\271\351\275\220.html" new file mode 100644 index 0000000..e9dfb1c --- /dev/null +++ "b/fast-interview-code/css/09-\346\260\264\345\271\263\345\257\271\351\275\220.html" @@ -0,0 +1,57 @@ + + + + + + + 水平对齐 + + + +
    + 一段文字 +
    + +
    +
    + this is block item +
    +
    + +
    +
    + this is absolute item +
    +
    + + \ No newline at end of file diff --git "a/fast-interview-code/css/10-\345\236\202\347\233\264\345\257\271\351\275\220.html" "b/fast-interview-code/css/10-\345\236\202\347\233\264\345\257\271\351\275\220.html" new file mode 100644 index 0000000..220d159 --- /dev/null +++ "b/fast-interview-code/css/10-\345\236\202\347\233\264\345\257\271\351\275\220.html" @@ -0,0 +1,88 @@ + + + + + + + 垂直对齐 + + + +
    + 一段文字 +
    + +
    +
    + this is item +
    +
    + +
    +
    + this is item +
    +
    + +
    +
    + this is item +
    +
    + + \ No newline at end of file diff --git "a/fast-interview-code/css/11-line-height-\347\273\247\346\211\277.html" "b/fast-interview-code/css/11-line-height-\347\273\247\346\211\277.html" new file mode 100644 index 0000000..ae322d6 --- /dev/null +++ "b/fast-interview-code/css/11-line-height-\347\273\247\346\211\277.html" @@ -0,0 +1,22 @@ + + + + + + + line-height 继承问题 + + + +

    这是一行文字

    + + \ No newline at end of file diff --git a/fast-interview-code/css/12-rem.html b/fast-interview-code/css/12-rem.html new file mode 100644 index 0000000..4c39ad8 --- /dev/null +++ b/fast-interview-code/css/12-rem.html @@ -0,0 +1,36 @@ + + + + + + + rem 演示 + + + + +

    rem 1

    +

    rem 1

    +

    rem 1

    + +
    + this is div1 +
    +
    + this is div2 +
    +
    + this is div3 +
    + + + \ No newline at end of file diff --git "a/fast-interview-code/css/13-\345\223\215\345\272\224\345\274\217.html" "b/fast-interview-code/css/13-\345\223\215\345\272\224\345\274\217.html" new file mode 100644 index 0000000..4641b9f --- /dev/null +++ "b/fast-interview-code/css/13-\345\223\215\345\272\224\345\274\217.html" @@ -0,0 +1,43 @@ + + + + + + + 响应式布局 + + + +
    + this is div +
    + + \ No newline at end of file diff --git a/fast-interview-code/css/14-vw-wh.html b/fast-interview-code/css/14-vw-wh.html new file mode 100644 index 0000000..7677592 --- /dev/null +++ b/fast-interview-code/css/14-vw-wh.html @@ -0,0 +1,30 @@ + + + + + + vw vh test + + + +

    vw vh 测试

    +
    +
    + + + + \ No newline at end of file diff --git a/fast-interview-code/js-base/async-demo.js b/fast-interview-code/js-base/async-demo.js new file mode 100644 index 0000000..ca3b706 --- /dev/null +++ b/fast-interview-code/js-base/async-demo.js @@ -0,0 +1,12 @@ +// // 异步 (callback 回调函数) +// console.log(100) +// setTimeout(() => { +// console.log(200) +// }, 1000) +// console.log(300) +// console.log(400) + +// 同步 +console.log(100) +alert(200) +console.log(300) diff --git a/fast-interview-code/js-base/bind-demo.js b/fast-interview-code/js-base/bind-demo.js new file mode 100644 index 0000000..3fe84db --- /dev/null +++ b/fast-interview-code/js-base/bind-demo.js @@ -0,0 +1,26 @@ +// 模拟 bind +Function.prototype.bind1 = function () { + // 将参数拆解为数组 + const args = Array.prototype.slice.call(arguments) + + // 获取 this(数组第一项) + const t = args.shift() + + // fn1.bind(...) 中的 fn1 + const self = this + + // 返回一个函数 + return function () { + return self.apply(t, args) + } +} + +function fn1(a, b, c) { + console.log('this', this) + console.log(a, b, c) + return 'this is fn1' +} + +const fn2 = fn1.bind1({x: 100}, 10, 20, 30) +const res = fn2() +console.log(res) diff --git a/fast-interview-code/js-base/cache-demo.js b/fast-interview-code/js-base/cache-demo.js new file mode 100644 index 0000000..a47ad8a --- /dev/null +++ b/fast-interview-code/js-base/cache-demo.js @@ -0,0 +1,17 @@ +// 闭包隐藏数据,只提供 API +function createCache() { + const data = {} // 闭包中的数据,被隐藏,不被外界访问 + return { + set: function (key, val) { + data[key] = val + }, + get: function (key) { + return data[key] + } + } +} + +const c = createCache() +c.set('a', 100) +console.log( c.get('a') ) + diff --git a/fast-interview-code/js-base/class-demo-1.js b/fast-interview-code/js-base/class-demo-1.js new file mode 100644 index 0000000..1f0d103 --- /dev/null +++ b/fast-interview-code/js-base/class-demo-1.js @@ -0,0 +1,30 @@ +// 类 +class Student { + constructor(name, number) { + this.name = name + this.number = number + // this.gender = 'male' + } + sayHi() { + console.log( + `姓名 ${this.name} ,学号 ${this.number}` + ) + // console.log( + // '姓名 ' + this.name + ' ,学号 ' + this.number + // ) + } + // study() { + + // } +} + +// 通过类 new 对象/实例 +const xialuo = new Student('夏洛', 100) +console.log(xialuo.name) +console.log(xialuo.number) +xialuo.sayHi() + +const madongmei = new Student('马冬梅', 101) +console.log(madongmei.name) +console.log(madongmei.number) +madongmei.sayHi() diff --git a/fast-interview-code/js-base/class-demo-2.js b/fast-interview-code/js-base/class-demo-2.js new file mode 100644 index 0000000..5bb6219 --- /dev/null +++ b/fast-interview-code/js-base/class-demo-2.js @@ -0,0 +1,45 @@ +// 父类 +class People { + constructor(name) { + this.name = name + } + eat() { + console.log(`${this.name} eat something`) + } +} + +// 子类 +class Student extends People { + constructor(name, number) { + super(name) + this.number = number + } + sayHi() { + console.log(`姓名 ${this.name} 学号 ${this.number}`) + } +} + +// 子类 +class Teacher extends People { + constructor(name, major) { + super(name) + this.major = major + } + teach() { + console.log(`${this.name} 教授 ${this.major}`) + } +} + +// 实例 +const xialuo = new Student('夏洛', 100) +console.log(xialuo.name) +console.log(xialuo.number) +xialuo.sayHi() +xialuo.eat() + +// 实例 +const wanglaoshi = new Teacher('王老师', '语文') +console.log(wanglaoshi.name) +console.log(wanglaoshi.major) +wanglaoshi.teach() +wanglaoshi.eat() diff --git a/fast-interview-code/js-base/closure.js b/fast-interview-code/js-base/closure.js new file mode 100644 index 0000000..55556ff --- /dev/null +++ b/fast-interview-code/js-base/closure.js @@ -0,0 +1,25 @@ +// 函数作为返回值 +// function create() { +// const a = 100 +// return function () { +// console.log(a) +// } +// } + +// const fn = create() +// const a = 200 +// fn() // 100 + +// 函数作为参数被传递 +function print(fn) { + const a = 200 + fn() +} +const a = 100 +function fn() { + console.log(a) +} +print(fn) // 100 + +// 所有的自由变量的查找,是在函数定义的地方,向上级作用域查找 +// 不是在执行的地方!!! diff --git a/fast-interview-code/js-base/deepClone.js b/fast-interview-code/js-base/deepClone.js new file mode 100644 index 0000000..780dc77 --- /dev/null +++ b/fast-interview-code/js-base/deepClone.js @@ -0,0 +1,48 @@ +/** + * 深拷贝 + */ + +const obj1 = { + age: 20, + name: 'xxx', + address: { + city: 'beijing' + }, + arr: ['a', 'b', 'c'] +} + +const obj2 = deepClone(obj1) +obj2.address.city = 'shanghai' +obj2.arr[0] = 'a1' +console.log(obj1.address.city) +console.log(obj1.arr[0]) + +/** + * 深拷贝 + * @param {Object} obj 要拷贝的对象 + */ +function deepClone(obj = {}) { + if (typeof obj !== 'object' || obj == null) { + // obj 是 null ,或者不是对象和数组,直接返回 + return obj + } + + // 初始化返回结果 + let result + if (obj instanceof Array) { + result = [] + } else { + result = {} + } + + for (let key in obj) { + // 保证 key 不是原型的属性 + if (obj.hasOwnProperty(key)) { + // 递归调用!!! + result[key] = deepClone(obj[key]) + } + } + + // 返回结果 + return result +} diff --git a/fast-interview-code/js-base/index.html b/fast-interview-code/js-base/index.html new file mode 100644 index 0000000..5a1ac0e --- /dev/null +++ b/fast-interview-code/js-base/index.html @@ -0,0 +1,16 @@ + + + + + + + js 基础知识 演示 + + +

    一段文字 1

    +

    一段文字 2

    +

    一段文字 3

    + + + + \ No newline at end of file diff --git a/fast-interview-code/js-base/jquery-demo.js b/fast-interview-code/js-base/jquery-demo.js new file mode 100644 index 0000000..434b2ed --- /dev/null +++ b/fast-interview-code/js-base/jquery-demo.js @@ -0,0 +1,50 @@ +class jQuery { + constructor(selector) { + const result = document.querySelectorAll(selector) + const length = result.length + for (let i = 0; i < length; i++) { + this[i] = result[i] + } + this.length = length + this.selector = selector + } + get(index) { + return this[index] + } + each(fn) { + for (let i = 0; i < this.length; i++) { + const elem = this[i] + fn(elem) + } + } + on(type, fn) { + return this.each(elem => { + elem.addEventListener(type, fn, false) + }) + } + // 扩展很多 DOM API +} + +// 插件 +jQuery.prototype.dialog = function (info) { + alert(info) +} + +// “造轮子” +class myJQuery extends jQuery { + constructor(selector) { + super(selector) + } + // 扩展自己的方法 + addClass(className) { + + } + style(data) { + + } +} + +// const $p = new jQuery('p') +// $p.get(1) +// $p.each((elem) => console.log(elem.nodeName)) +// $p.on('click', () => alert('clicked')) diff --git a/fast-interview-code/js-base/promise-demo.js b/fast-interview-code/js-base/promise-demo.js new file mode 100644 index 0000000..bc14c76 --- /dev/null +++ b/fast-interview-code/js-base/promise-demo.js @@ -0,0 +1,40 @@ +function loadImg(src) { + const p = new Promise( + (resolve, reject) => { + const img = document.createElement('img') + img.onload = () => { + resolve(img) + } + img.onerror = () => { + const err = new Error(`图片加载失败 ${src}`) + reject(err) + } + img.src = src + } + ) + return p +} + +// const url = 'https://img.mukewang.com/5a9fc8070001a82402060220-140-140.jpg' +// loadImg(url).then(img => { +// console.log(img.width) +// return img +// }).then(img => { +// console.log(img.height) +// }).catch(ex => console.error(ex)) + +const url1 = 'https://img.mukewang.com/5a9fc8070001a82402060220-140-140.jpg' +const url2 = 'https://img3.mukewang.com/5a9fc8070001a82402060220-100-100.jpg' + +loadImg(url1).then(img1 => { + console.log(img1.width) + return img1 // 普通对象 +}).then(img1 => { + console.log(img1.height) + return loadImg(url2) // promise 实例 +}).then(img2 => { + console.log(img2.width) + return img2 +}).then(img2 => { + console.log(img2.height) +}).catch(ex => console.error(ex)) diff --git a/fast-interview-code/js-base/scope-demo.js b/fast-interview-code/js-base/scope-demo.js new file mode 100644 index 0000000..3c27138 --- /dev/null +++ b/fast-interview-code/js-base/scope-demo.js @@ -0,0 +1,10 @@ +let a +for (let i = 0; i < 10; i++) { + a = document.createElement('a') + a.innerHTML = i + '
    ' + a.addEventListener('click', function (e) { + e.preventDefault() + alert(i) + }) + document.body.appendChild(a) +} diff --git a/fast-interview-code/js-web-api/ajax.html b/fast-interview-code/js-web-api/ajax.html new file mode 100644 index 0000000..fd29f07 --- /dev/null +++ b/fast-interview-code/js-web-api/ajax.html @@ -0,0 +1,14 @@ + + + + + + + ajax 演示 + + +

    一段文字 1

    + + + + \ No newline at end of file diff --git a/fast-interview-code/js-web-api/ajax.js b/fast-interview-code/js-web-api/ajax.js new file mode 100644 index 0000000..9a8db6b --- /dev/null +++ b/fast-interview-code/js-web-api/ajax.js @@ -0,0 +1,40 @@ +// const xhr = new XMLHttpRequest() +// xhr.open('GET', '/data/test.json', true) +// xhr.onreadystatechange = function () { +// if (xhr.readyState === 4) { +// if (xhr.status === 200) { +// // console.log( +// // JSON.parse(xhr.responseText) +// // ) +// alert(xhr.responseText) +// } else if (xhr.status === 404) { +// console.log('404 not found') +// } +// } +// } +// xhr.send(null) + +function ajax(url) { + const p = new Promise((resolve, reject) => { + const xhr = new XMLHttpRequest() + xhr.open('GET', url, true) + xhr.onreadystatechange = function () { + if (xhr.readyState === 4) { + if (xhr.status === 200) { + resolve( + JSON.parse(xhr.responseText) + ) + } else if (xhr.status === 404 || xhr.status === 500) { + reject(new Error('404 not found')) + } + } + } + xhr.send(null) + }) + return p +} + +const url = '/data/test.json' +ajax(url) +.then(res => console.log(res)) +.catch(err => console.error(err)) diff --git a/fast-interview-code/js-web-api/data/jsonp.js b/fast-interview-code/js-web-api/data/jsonp.js new file mode 100644 index 0000000..b31a2e2 --- /dev/null +++ b/fast-interview-code/js-web-api/data/jsonp.js @@ -0,0 +1,3 @@ +abc( + { name: 'xxx' } +) \ No newline at end of file diff --git a/fast-interview-code/js-web-api/data/test.json b/fast-interview-code/js-web-api/data/test.json new file mode 100644 index 0000000..738f5b6 --- /dev/null +++ b/fast-interview-code/js-web-api/data/test.json @@ -0,0 +1,3 @@ +{ + "name": "zhangsan" +} \ No newline at end of file diff --git a/fast-interview-code/js-web-api/dom-1.js b/fast-interview-code/js-web-api/dom-1.js new file mode 100644 index 0000000..054d6c5 --- /dev/null +++ b/fast-interview-code/js-web-api/dom-1.js @@ -0,0 +1,30 @@ +// const div1 = document.getElementById('div1') +// console.log('div1', div1) + +// const divList = document.getElementsByTagName('div') // 集合 +// console.log('divList.length', divList.length) +// console.log('divList[1]', divList[1]) + +// const containerList = document.getElementsByClassName('container') // 集合 +// console.log('containerList.length', containerList.length) +// console.log('containerList[1]', containerList[1]) + +// const pList = document.querySelectorAll('p') +// console.log('pList', pList) + +// const pList = document.querySelectorAll('p') +// const p1 = pList[0] + +// // property 形式 +// p1.style.width = '100px' +// console.log( p1.style.width ) +// p1.className = 'red' +// console.log( p1.className ) +// console.log(p1.nodeName) +// console.log(p1.nodeType) // 1 + +// // attribute +// p1.setAttribute('data-name', 'imooc') +// console.log( p1.getAttribute('data-name') ) +// p1.setAttribute('style', 'font-size: 50px;') +// console.log( p1.getAttribute('style') ) diff --git a/fast-interview-code/js-web-api/dom-2.js b/fast-interview-code/js-web-api/dom-2.js new file mode 100644 index 0000000..76eed80 --- /dev/null +++ b/fast-interview-code/js-web-api/dom-2.js @@ -0,0 +1,28 @@ +const div1 = document.getElementById('div1') +const div2 = document.getElementById('div2') + +// 新建节点 +const newP = document.createElement('p') +newP.innerHTML = 'this is newP' +// 插入节点 +div1.appendChild(newP) + +// 移动节点 +const p1 = document.getElementById('p1') +div2.appendChild(p1) + +// 获取父元素 +console.log( p1.parentNode ) + +// 获取子元素列表 +const div1ChildNodes = div1.childNodes +console.log( div1.childNodes ) +const div1ChildNodesP = Array.prototype.slice.call(div1.childNodes).filter(child => { + if (child.nodeType === 1) { + return true + } + return false +}) +console.log('div1ChildNodesP', div1ChildNodesP) + +div1.removeChild( div1ChildNodesP[0] ) diff --git a/fast-interview-code/js-web-api/dom-3.js b/fast-interview-code/js-web-api/dom-3.js new file mode 100644 index 0000000..ed88bd2 --- /dev/null +++ b/fast-interview-code/js-web-api/dom-3.js @@ -0,0 +1,17 @@ +const list = document.getElementById('list') + +// 创建一个文档片段,此时还没有插入到 DOM 结构中 +const frag = document.createDocumentFragment() + +for (let i = 0; i < 20; i++) { + const li = document.createElement('li') + li.innerHTML = `List item ${i}` + + // 先插入文档片段中 + frag.appendChild(li) +} + +// 都完成之后,再统一插入到 DOM 结构中 +list.appendChild(frag) + +console.log(list) diff --git a/fast-interview-code/js-web-api/dom.html b/fast-interview-code/js-web-api/dom.html new file mode 100644 index 0000000..8f4ae07 --- /dev/null +++ b/fast-interview-code/js-web-api/dom.html @@ -0,0 +1,32 @@ + + + + + + + dom 演示 + + + + +
    +

    一段文字 1

    +

    一段文字 2

    +

    一段文字 3

    +
    +
    + +
    +
      +
    + + + + \ No newline at end of file diff --git a/fast-interview-code/js-web-api/event.html b/fast-interview-code/js-web-api/event.html new file mode 100644 index 0000000..bf6cac4 --- /dev/null +++ b/fast-interview-code/js-web-api/event.html @@ -0,0 +1,40 @@ + + + + + + + 事件 演示 + + + + + + + +
    + a1
    + a2
    + a3
    + a4
    + +
    + + + + \ No newline at end of file diff --git a/fast-interview-code/js-web-api/event.js b/fast-interview-code/js-web-api/event.js new file mode 100644 index 0000000..94f55e6 --- /dev/null +++ b/fast-interview-code/js-web-api/event.js @@ -0,0 +1,53 @@ +// 通用的事件绑定函数 +// function bindEvent(elem, type, fn) { +// elem.addEventListener(type, fn) +// } +function bindEvent(elem, type, selector, fn) { + if (fn == null) { + fn = selector + selector = null + } + elem.addEventListener(type, event => { + const target = event.target + if (selector) { + // 代理绑定 + if (target.matches(selector)) { + fn.call(target, event) + } + } else { + // 普通绑定 + fn.call(target, event) + } + }) +} + +// 普通绑定 +const btn1 = document.getElementById('btn1') +bindEvent(btn1, 'click', function (event) { + // console.log(event.target) // 获取触发的元素 + event.preventDefault() // 阻止默认行为 + alert(this.innerHTML) +}) + +// 代理绑定 +const div3 = document.getElementById('div3') +bindEvent(div3, 'click', 'a', function (event) { + event.preventDefault() + alert(this.innerHTML) +}) + +// const p1 = document.getElementById('p1') +// bindEvent(p1, 'click', event => { +// event.stopPropagation() // 阻止冒泡 +// console.log('激活') +// }) +// const body = document.body +// bindEvent(body, 'click', event => { +// console.log('取消') +// // console.log(event.target) +// }) +// const div2 = document.getElementById('div2') +// bindEvent(div2, 'click', event => { +// console.log('div2 clicked') +// console.log(event.target) +// }) diff --git a/fast-interview-code/js-web-api/jsonp.html b/fast-interview-code/js-web-api/jsonp.html new file mode 100644 index 0000000..5fb92f0 --- /dev/null +++ b/fast-interview-code/js-web-api/jsonp.html @@ -0,0 +1,19 @@ + + + + + + + jsonp 演示 + + +

    一段文字 1

    + + + + + \ No newline at end of file diff --git "a/fast-interview-code/js-\345\274\202\346\255\245\350\277\233\351\230\266/01-\351\242\230\347\233\256.md" "b/fast-interview-code/js-\345\274\202\346\255\245\350\277\233\351\230\266/01-\351\242\230\347\233\256.md" new file mode 100644 index 0000000..7af32d5 --- /dev/null +++ "b/fast-interview-code/js-\345\274\202\346\255\245\350\277\233\351\230\266/01-\351\242\230\347\233\256.md" @@ -0,0 +1,121 @@ +# 异步 题目 + +- 描述 event loop 运行机制(可画图) +- Promise 哪几种状态,如何变化? +- 宏任务和微任务的区别 +- 场景题:Promise catch 连接 then +- 场景题:Promise 和 setTimeout 顺序 +- 场景题:各类异步执行顺序问题 + +## Promise catch 连接 then + +```js +// 第一题 +Promise.resolve().then(() => { + console.log(1) +}).catch(() => { + console.log(2) +}).then(() => { + console.log(3) +}) +// 1 3 + +// 第二题 +Promise.resolve().then(() => { + console.log(1) + throw new Error('erro1') +}).catch(() => { + console.log(2) +}).then(() => { + console.log(3) +}) +// 1 2 3 + +// 第三题 +Promise.resolve().then(() => { + console.log(1) + throw new Error('erro1') +}).catch(() => { + console.log(2) +}).catch(() => { // 注意这里是 catch + console.log(3) +}) +// 1 2 +``` + +## async/await 语法问题 + +```js +async function fn() { + return 100 +} +(async function () { + const a = fn() // ?? // promise + const b = await fn() // ?? // 100 +})() +``` + +```js +(async function () { + console.log('start') + const a = await 100 + console.log('a', a) + const b = await Promise.resolve(200) + console.log('b', b) + const c = await Promise.reject(300) + console.log('c', c) + console.log('end') +})() // 执行完毕,打印出那些内容? +``` + +## Promise 和 setTimeout 顺序 + +```js +console.log(100) +setTimeout(() => { + console.log(200) +}) +Promise.resolve().then(() => { + console.log(300) +}) +console.log(400) +// 100 400 300 200 +``` + +## 执行顺序问题 + +网上很经典的面试题 + +```js +async function async1 () { + console.log('async1 start') + await async2() // 这一句会同步执行,返回 Promise ,其中的 `console.log('async2')` 也会同步执行 + console.log('async1 end') // 上面有 await ,下面就变成了“异步”,类似 cakkback 的功能(微任务) +} + +async function async2 () { + console.log('async2') +} + +console.log('script start') + +setTimeout(function () { // 异步,宏任务 + console.log('setTimeout') +}, 0) + +async1() + +new Promise (function (resolve) { // 返回 Promise 之后,即同步执行完成,then 是异步代码 + console.log('promise1') // Promise 的函数体会立刻执行 + resolve() +}).then (function () { // 异步,微任务 + console.log('promise2') +}) + +console.log('script end') + +// 同步代码执行完之后,屡一下现有的异步未执行的,按照顺序 +// 1. async1 函数中 await 后面的内容 —— 微任务 +// 2. setTimeout —— 宏任务 +// 3. then —— 微任务 +``` diff --git "a/fast-interview-code/js-\345\274\202\346\255\245\350\277\233\351\230\266/02-event-loop.md" "b/fast-interview-code/js-\345\274\202\346\255\245\350\277\233\351\230\266/02-event-loop.md" new file mode 100644 index 0000000..ea39c51 --- /dev/null +++ "b/fast-interview-code/js-\345\274\202\346\255\245\350\277\233\351\230\266/02-event-loop.md" @@ -0,0 +1,31 @@ +# event loop + +图片可参考 ppt + +```js +console.log('Hi') + +setTimeout(function cb1() { + console.log('cb1') // cb 即 callback +}, 5000) + +console.log('Bye') +``` + +------ + +DOM 事件,也用 event loop + +```html + + + +``` diff --git "a/fast-interview-code/js-\345\274\202\346\255\245\350\277\233\351\230\266/03-promise.md" "b/fast-interview-code/js-\345\274\202\346\255\245\350\277\233\351\230\266/03-promise.md" new file mode 100644 index 0000000..c50b532 --- /dev/null +++ "b/fast-interview-code/js-\345\274\202\346\255\245\350\277\233\351\230\266/03-promise.md" @@ -0,0 +1,137 @@ +# Promise + +- 三种状态 +- 状态和 then catch +- 常用 API + +先回顾一下 Promise 的基本使用 + +```js +// 加载图片 +function loadImg(src) { + const p = new Promise( + (resolve, reject) => { + const img = document.createElement('img') + img.onload = () => { + resolve(img) + } + img.onerror = () => { + const err = new Error(`图片加载失败 ${src}`) + reject(err) + } + img.src = src + } + ) + return p +} +const url = 'https://img.mukewang.com/5a9fc8070001a82402060220-140-140.jpg' +loadImg(url).then(img => { + console.log(img.width) + return img +}).then(img => { + console.log(img.height) +}).catch(ex => console.error(ex)) +``` + +## 三种状态 + +三种状态 pending resolved rejected + +(画图表示转换关系,以及转换不可逆) + +```js +// 刚定义时,状态默认为 pending +const p1 = new Promise((resolve, reject) => { + +}) + +// 执行 resolve() 后,状态变成 resolved +const p2 = new Promise((resolve, reject) => { + setTimeout(() => { + resolve() + }) +}) + +// 执行 reject() 后,状态变成 rejected +const p3 = new Promise((resolve, reject) => { + setTimeout(() => { + reject() + }) +}) + +``` + +```js +// 直接返回一个 resolved 状态 +Promise.resolve(100) +// 直接返回一个 rejected 状态 +Promise.reject('some error') +``` + +## 状态和 then catch + +状态变化会触发 then catch —— 这些比较好理解,就不再代码演示了 + +- pending 不会触发任何 then catch 回调 +- 状态变为 resolved 会触发后续的 then 回调 +- 状态变为 rejected 会触发后续的 catch 回调 + +----- + +then catch 会继续返回 Promise ,**此时可能会发生状态变化!!!** + +```js +// then() 一般正常返回 resolved 状态的 promise +Promise.resolve().then(() => { + return 100 +}) + +// then() 里抛出错误,会返回 rejected 状态的 promise +Promise.resolve().then(() => { + throw new Error('err') +}) + +// catch() 不抛出错误,会返回 resolved 状态的 promise +Promise.reject().catch(() => { + console.error('catch some error') +}) + +// catch() 抛出错误,会返回 rejected 状态的 promise +Promise.reject().catch(() => { + console.error('catch some error') + throw new Error('err') +}) +``` + +看一个综合的例子,即那几个面试题 + +```js +// 第一题 +Promise.resolve().then(() => { + console.log(1) +}).catch(() => { + console.log(2) +}).then(() => { + console.log(3) +}) + +// 第二题 +Promise.resolve().then(() => { // 返回 rejected 状态的 promise + console.log(1) + throw new Error('erro1') +}).catch(() => { // 返回 resolved 状态的 promise + console.log(2) +}).then(() => { + console.log(3) +}) + +// 第三题 +Promise.resolve().then(() => { // 返回 rejected 状态的 promise + console.log(1) + throw new Error('erro1') +}).catch(() => { // 返回 resolved 状态的 promise + console.log(2) +}).catch(() => { + console.log(3) +}) +``` diff --git "a/fast-interview-code/js-\345\274\202\346\255\245\350\277\233\351\230\266/04-async.md" "b/fast-interview-code/js-\345\274\202\346\255\245\350\277\233\351\230\266/04-async.md" new file mode 100644 index 0000000..d9d5f47 --- /dev/null +++ "b/fast-interview-code/js-\345\274\202\346\255\245\350\277\233\351\230\266/04-async.md" @@ -0,0 +1,178 @@ +# async/await + +- 语法介绍 +- 和 Promise 的关系 +- 异步本质 +- for...of + +**有很多 async 的面试题,例如** +- async 直接返回,是什么 +- async 直接返回 promise +- await 后面不加 promise +- 等等,需要找出一个规律 + +## 语法介绍 + +用同步的方式,编写异步。 + +```js +function loadImg(src) { + const promise = new Promise((resolve, reject) => { + const img = document.createElement('img') + img.onload = () => { + resolve(img) + } + img.onerror = () => { + reject(new Error(`图片加载失败 ${src}`)) + } + img.src = src + }) + return promise +} + +async function loadImg1() { + const src1 = 'http://www.imooc.com/static/img/index/logo_new.png' + const img1 = await loadImg(src1) + return img1 +} + +async function loadImg2() { + const src2 = 'https://avatars3.githubusercontent.com/u/9583120' + const img2 = await loadImg(src2) + return img2 +} + +(async function () { + // 注意:await 必须放在 async 函数中,否则会报错 + try { + // 加载第一张图片 + const img1 = await loadImg1() + console.log(img1) + // 加载第二张图片 + const img2 = await loadImg2() + console.log(img2) + } catch (ex) { + console.error(ex) + } +})() +``` + +## 和 Promise 的关系 + +- async 函数返回结果都是 Promise 对象(如果函数内没返回 Promise ,则自动封装一下) + +```js +async function fn2() { + return new Promise(() => {}) +} +console.log( fn2() ) + +async function fn1() { + return 100 +} +console.log( fn1() ) // 相当于 Promise.resolve(100) +``` + +- await 后面跟 Promise 对象:会阻断后续代码,等待状态变为 resolved ,才获取结果并继续执行 +- await 后续跟非 Promise 对象:会直接返回 + +```js +(async function () { + const p1 = new Promise(() => {}) + await p1 + console.log('p1') // 不会执行 +})() + +(async function () { + const p2 = Promise.resolve(100) + const res = await p2 + console.log(res) // 100 +})() + +(async function () { + const res = await 100 + console.log(res) // 100 +})() + +(async function () { + const p3 = Promise.reject('some err') + const res = await p3 + console.log(res) // 不会执行 +})() +``` + +- try...catch 捕获 rejected 状态 + +```js +(async function () { + const p4 = Promise.reject('some err') + try { + const res = await p4 + console.log(res) + } catch (ex) { + console.error(ex) + } +})() +``` + +总结来看: + +- async 封装 Promise +- await 处理 Promise 成功 +- try...catch 处理 Promise 失败 + +## 异步本质 + +await 是同步写法,但本质还是异步调用。 + +```js +async function async1 () { + console.log('async1 start') + await async2() + console.log('async1 end') // 关键在这一步,它相当于放在 callback 中,最后执行 +} + +async function async2 () { + console.log('async2') +} + +console.log('script start') +async1() +console.log('script end') +``` + +即,只要遇到了 `await` ,后面的代码都相当于放在 callback 里。 + +## for...of + +```js +// 定时算乘法 +function multi(num) { + return new Promise((resolve) => { + setTimeout(() => { + resolve(num * num) + }, 1000) + }) +} + +// // 使用 forEach ,是 1s 之后打印出所有结果,即 3 个值是一起被计算出来的 +// function test1 () { +// const nums = [1, 2, 3]; +// nums.forEach(async x => { +// const res = await multi(x); +// console.log(res); +// }) +// } +// test1(); + +// 使用 for...of ,可以让计算挨个串行执行 +async function test2 () { + const nums = [1, 2, 3]; + for (let x of nums) { + // 在 for...of 循环体的内部,遇到 await 会挨个串行计算 + const res = await multi(x) + console.log(res) + } +} +test2() +``` diff --git "a/fast-interview-code/js-\345\274\202\346\255\245\350\277\233\351\230\266/05-\345\276\256\344\273\273\345\212\241\345\222\214\345\256\217\344\273\273\345\212\241.md" "b/fast-interview-code/js-\345\274\202\346\255\245\350\277\233\351\230\266/05-\345\276\256\344\273\273\345\212\241\345\222\214\345\256\217\344\273\273\345\212\241.md" new file mode 100644 index 0000000..5df8fc7 --- /dev/null +++ "b/fast-interview-code/js-\345\274\202\346\255\245\350\277\233\351\230\266/05-\345\276\256\344\273\273\345\212\241\345\222\214\345\256\217\344\273\273\345\212\241.md" @@ -0,0 +1,79 @@ +# 宏任务和微任务 + +## 介绍 + +- 宏任务:setTimeout setInterval DOM 事件 +- 微任务:Promise(对于前端来说) +- 微任务比宏任务执行的更早 + +```js +console.log(100) +setTimeout(() => { + console.log(200) +}) +Promise.resolve().then(() => { + console.log(300) +}) +console.log(400) +// 100 400 300 200 +``` + +## event loop 和 DOM 渲染 + +再次回顾 event loop 的过程 + +- 每一次 call stack 结束,都会触发 DOM 渲染(不一定非得渲染,就是给一次 DOM 渲染的机会!!!) +- 然后再进行 event loop + +```js +const $p1 = $('

    一段文字

    ') +const $p2 = $('

    一段文字

    ') +const $p3 = $('

    一段文字

    ') +$('#container') + .append($p1) + .append($p2) + .append($p3) + +console.log('length', $('#container').children().length ) +alert('本次 call stack 结束,DOM 结构已更新,但尚未触发渲染') +// (alert 会阻断 js 执行,也会阻断 DOM 渲染,便于查看效果) +// 到此,即本次 call stack 结束后(同步任务都执行完了),浏览器会自动触发渲染,不用代码干预 + +// 另外,按照 event loop 触发 DOM 渲染时机,setTimeout 时 alert ,就能看到 DOM 渲染后的结果了 +setTimeout(function () { + alert('setTimeout 是在下一次 Call Stack ,就能看到 DOM 渲染出来的结果了') +}) +``` + +## 宏任务和微任务的区别 + +- 宏任务:DOM 渲染后再触发 +- 微任务:DOM 渲染前会触发 + +```js +// 修改 DOM +const $p1 = $('

    一段文字

    ') +const $p2 = $('

    一段文字

    ') +const $p3 = $('

    一段文字

    ') +$('#container') + .append($p1) + .append($p2) + .append($p3) + +// // 微任务:渲染之前执行(DOM 结构已更新) +// Promise.resolve().then(() => { +// const length = $('#container').children().length +// alert(`micro task ${length}`) +// }) + +// 宏任务:渲染之后执行(DOM 结构已更新) +setTimeout(() => { + const length = $('#container').children().length + alert(`macro task ${length}`) +}) +``` + +再深入思考一下:为何两者会有以上区别,一个在渲染前,一个在渲染后? + +- 微任务:ES 语法标准之内,JS 引擎来统一处理。即,不用浏览器有任何关于,即可一次性处理完,更快更及时。 +- 宏任务:ES 语法没有,JS 引擎不处理,浏览器(或 nodejs)干预处理。 diff --git a/fast-interview-code/myTest/test.html b/fast-interview-code/myTest/test.html new file mode 100644 index 0000000..4de76fe --- /dev/null +++ b/fast-interview-code/myTest/test.html @@ -0,0 +1,30 @@ + + + + + + + Document + + +
    + + + diff --git a/fast-interview-code/prod-env/debounce.html b/fast-interview-code/prod-env/debounce.html new file mode 100644 index 0000000..7c2daea --- /dev/null +++ b/fast-interview-code/prod-env/debounce.html @@ -0,0 +1,14 @@ + + + + + + + debounce 演示 + + + + + + + \ No newline at end of file diff --git a/fast-interview-code/prod-env/debounce.js b/fast-interview-code/prod-env/debounce.js new file mode 100644 index 0000000..da5347b --- /dev/null +++ b/fast-interview-code/prod-env/debounce.js @@ -0,0 +1,36 @@ +const input1 = document.getElementById('input1') + +// let timer = null +// input1.addEventListener('keyup', function () { +// if (timer) { +// clearTimeout(timer) +// } +// timer = setTimeout(() => { +// // 模拟触发 change 事件 +// console.log(input1.value) + +// // 清空定时器 +// timer = null +// }, 500) +// }) + +// 防抖 +function debounce(fn, delay = 500) { + // timer 是闭包中的 + let timer = null + + return function () { + if (timer) { + clearTimeout(timer) + } + timer = setTimeout(() => { + fn.apply(this, arguments) + timer = null + }, delay) + } +} + +input1.addEventListener('keyup', debounce(function (e) { + console.log(e.target) + console.log(input1.value) +}, 600)) diff --git a/fast-interview-code/prod-env/index.html b/fast-interview-code/prod-env/index.html new file mode 100644 index 0000000..a11f2e9 --- /dev/null +++ b/fast-interview-code/prod-env/index.html @@ -0,0 +1,20 @@ + + + + + + + 运行环境 演示 + + +

    一段文字 1

    +

    一段文字 2

    +

    一段文字 3

    + + + + + \ No newline at end of file diff --git a/fast-interview-code/prod-env/index.js b/fast-interview-code/prod-env/index.js new file mode 100644 index 0000000..a62d55e --- /dev/null +++ b/fast-interview-code/prod-env/index.js @@ -0,0 +1,12 @@ +const img1 = document.getElementById('img1') +img1.onload = function () { + console.log('img loaded') +} + +window.addEventListener('load', function () { + console.log('window loaded') +}) + +document.addEventListener('DOMContentLoaded', function () { + console.log('dom content loaded') +}) \ No newline at end of file diff --git a/fast-interview-code/prod-env/throttle.html b/fast-interview-code/prod-env/throttle.html new file mode 100644 index 0000000..fc4bb73 --- /dev/null +++ b/fast-interview-code/prod-env/throttle.html @@ -0,0 +1,21 @@ + + + + + + + throttle 演示 + + + +
    可拖拽
    + + + + \ No newline at end of file diff --git a/fast-interview-code/prod-env/throttle.js b/fast-interview-code/prod-env/throttle.js new file mode 100644 index 0000000..3b5669c --- /dev/null +++ b/fast-interview-code/prod-env/throttle.js @@ -0,0 +1,36 @@ +const div1 = document.getElementById('div1') + +// let timer = null +// div1.addEventListener('drag', function (e) { +// if (timer) { +// return +// } +// timer = setTimeout(() => { +// console.log(e.offsetX, e.offsetY) + +// timer = null +// }, 100) +// }) + +// 节流 +function throttle(fn, delay = 100) { + let timer = null + + return function () { + if (timer) { + return + } + timer = setTimeout(() => { + fn.apply(this, arguments) + timer = null + }, delay) + } +} + +div1.addEventListener('drag', throttle(function (e) { + console.log(e.offsetX, e.offsetY) +})) + +div1.addEventListener('drag', function(event) { + +}) diff --git a/fast-interview-code/prod-env/xss.html b/fast-interview-code/prod-env/xss.html new file mode 100644 index 0000000..f692329 --- /dev/null +++ b/fast-interview-code/prod-env/xss.html @@ -0,0 +1,15 @@ + + + + + + + xss 演示 + + +

    一段文字1

    +

    一段文字2

    +

    一段文字3

    + <script>alert(document.cookie);</script> + + \ No newline at end of file diff --git a/fast-interview-code/questions-demo/RAF.js b/fast-interview-code/questions-demo/RAF.js new file mode 100644 index 0000000..a1c7cf4 --- /dev/null +++ b/fast-interview-code/questions-demo/RAF.js @@ -0,0 +1,26 @@ +// 3s 把宽度从 100px 变为 640px ,即增加 540px +// 60帧/s ,3s 180 帧 ,每次变化 3px + +const $div1 = $('#div1') +let curWidth = 100 +const maxWidth = 640 + +// // setTimeout +// function animate() { +// curWidth = curWidth + 3 +// $div1.css('width', curWidth) +// if (curWidth < maxWidth) { +// setTimeout(animate, 16.7) // 自己控制时间 +// } +// } +// animate() + +// RAF +function animate() { + curWidth = curWidth + 3 + $div1.css('width', curWidth) + if (curWidth < maxWidth) { + window.requestAnimationFrame(animate) // 时间不用自己控制 + } +} +animate() diff --git a/fast-interview-code/questions-demo/array-api.js b/fast-interview-code/questions-demo/array-api.js new file mode 100644 index 0000000..e308c04 --- /dev/null +++ b/fast-interview-code/questions-demo/array-api.js @@ -0,0 +1,59 @@ +// const arr = [10, 20, 30, 40] + +// // pop +// const popRes = arr.pop() +// console.log(popRes, arr) + +// // shift +// const shiftRes = arr.shift() +// console.log(shiftRes, arr) + +// // push +// const pushRes = arr.push(50) // 返回 length +// console.log(pushRes, arr) + +// // unshift +// const unshiftRes = arr.unshift(5) // 返回 length +// console.log(unshiftRes, arr) + + + +// // 纯函数:1. 不改变源数组(没有副作用);2. 返回一个数组 +// const arr = [10, 20, 30, 40] + +// // concat +// const arr1 = arr.concat([50, 60, 70]) +// // map +// const arr2 = arr.map(num => num * 10) +// // filter +// const arr3 = arr.filter(num => num > 25) +// // slice +// const arr4 = arr.slice() + +// // 非纯函数 +// // push pop shift unshift +// // forEach +// // some every +// // reduce + +// const arr = [10, 20, 30, 40, 50] + +// // slice 纯函数 +// const arr1 = arr.slice() +// const arr2 = arr.slice(1, 4) +// const arr3 = arr.slice(2) +// const arr4 = arr.slice(-3) + +// // splice 非纯函数 +// const spliceRes = arr.splice(1, 2, 'a', 'b', 'c') +// // const spliceRes1 = arr.splice(1, 2) +// // const spliceRes2 = arr.splice(1, 0, 'a', 'b', 'c') +// console.log(spliceRes, arr) + +const res = [10, 20, 30].map(parseInt) +console.log(res) + +// 拆解 +[10, 20, 30].map((num, index) => { + return parseInt(num, index) +}) diff --git a/fast-interview-code/questions-demo/flat.js b/fast-interview-code/questions-demo/flat.js new file mode 100644 index 0000000..a8bea2a --- /dev/null +++ b/fast-interview-code/questions-demo/flat.js @@ -0,0 +1,13 @@ +function flat(arr) { + // 验证 arr 中,还有没有深层数组 [1, 2, [3, 4]] + const isDeep = arr.some(item => item instanceof Array) + if (!isDeep) { + return arr // 已经是 flatern [1, 2, 3, 4] + } + + const res = Array.prototype.concat.apply([], arr) + return flat(res) // 递归 +} + +const res = flat( [1, 2, [3, 4, [10, 20, [100, 200]]], 5] ) +console.log(res) diff --git a/fast-interview-code/questions-demo/fn.js b/fast-interview-code/questions-demo/fn.js new file mode 100644 index 0000000..5a56231 --- /dev/null +++ b/fast-interview-code/questions-demo/fn.js @@ -0,0 +1,13 @@ +// // 函数声明 +// const res = sum(10, 20) +// console.log(res) +// function sum(x, y) { +// return x + y +// } + +// // 函数表达式 +// var res = sum(10, 20) +// console.log(res) +// var sum = function (x, y) { +// return x + y +// } diff --git a/fast-interview-code/questions-demo/index.html b/fast-interview-code/questions-demo/index.html new file mode 100644 index 0000000..5b6189d --- /dev/null +++ b/fast-interview-code/questions-demo/index.html @@ -0,0 +1,25 @@ + + + + + + + JS 真题演示 + + + + +

    JS 真题演示

    + +
    + + + + + \ No newline at end of file diff --git a/fast-interview-code/questions-demo/isEqual.js b/fast-interview-code/questions-demo/isEqual.js new file mode 100644 index 0000000..945ee78 --- /dev/null +++ b/fast-interview-code/questions-demo/isEqual.js @@ -0,0 +1,52 @@ +// 判断是否是对象或数组 +function isObject(obj) { + return typeof obj === 'object' && obj !== null +} +// 全相等(深度) +function isEqual(obj1, obj2) { + if (!isObject(obj1) || !isObject(obj2)) { + // 值类型(注意,参与 equal 的一般不会是函数) + return obj1 === obj2 + } + if (obj1 === obj2) { + return true + } + // 两个都是对象或数组,而且不相等 + // 1. 先取出 obj1 和 obj2 的 keys ,比较个数 + const obj1Keys = Object.keys(obj1) + const obj2Keys = Object.keys(obj2) + if (obj1Keys.length !== obj2Keys.length) { + return false + } + // 2. 以 obj1 为基准,和 obj2 一次递归比较 + for (let key in obj1) { + // 比较当前 key 的 val —— 递归!!! + const res = isEqual(obj1[key], obj2[key]) + if (!res) { + return false + } + } + // 3. 全相等 + return true +} + +// 测试 +const obj1 = { + a: 100, + b: { + x: 100, + y: 200 + } +} +const obj2 = { + a: 100, + b: { + x: 100, + y: 200 + } +} +// console.log( obj1 === obj2 ) +console.log( isEqual(obj1, obj2) ) + +const arr1 = [1, 2, 3] +const arr2 = [1, 2, 3, 4] diff --git a/fast-interview-code/questions-demo/object.js b/fast-interview-code/questions-demo/object.js new file mode 100644 index 0000000..ecda882 --- /dev/null +++ b/fast-interview-code/questions-demo/object.js @@ -0,0 +1,30 @@ +const obj1 = { + a: 10, + b: 20, + sum() { + return this.a + this.b + } +} + +const obj2 = new Object({ + a: 10, + b: 20, + sum() { + return this.a + this.b + } +}) + +const obj21 = new Object(obj1) // obj1 === obj2 + +const obj3 = Object.create(null) +const obj4 = new Object() // {} + +const obj5 = Object.create({ + a: 10, + b: 20, + sum() { + return this.a + this.b + } +}) + +const obj6 = Object.create(obj1) diff --git a/fast-interview-code/questions-demo/query.js b/fast-interview-code/questions-demo/query.js new file mode 100644 index 0000000..3685dea --- /dev/null +++ b/fast-interview-code/questions-demo/query.js @@ -0,0 +1,20 @@ +// // 传统方式 +// function query(name) { +// const search = location.search.substr(1) // 类似 array.slice(1) +// // search: 'a=10&b=20&c=30' +// const reg = new RegExp(`(^|&)${name}=([^&]*)(&|$)`, 'i') +// const res = search.match(reg) +// if (res === null) { +// return null +// } +// return res[2] +// } +// query('d') + +// URLSearchParams +function query(name) { + const search = location.search + const p = new URLSearchParams(search) + return p.get(name) +} +console.log( query('b') ) diff --git a/fast-interview-code/questions-demo/reg.js b/fast-interview-code/questions-demo/reg.js new file mode 100644 index 0000000..d17448c --- /dev/null +++ b/fast-interview-code/questions-demo/reg.js @@ -0,0 +1,18 @@ + +// 邮政编码 +/\d{6}/ + +// 小写英文字母 +/^[a-z]+$/ + +// 英文字母 +/^[a-zA-Z]+$/ + +// 日期格式 2019.12.1 +/^\d{4}-\d{1,2}-\d{1,2}$/ + +// 用户名 +/^[a-zA-Z]\w{5, 17}$/ + +// 简单的 IP 地址匹配 +/\d+\.\d+\.\d+\.\d+/ diff --git a/fast-interview-code/questions-demo/scope.js b/fast-interview-code/questions-demo/scope.js new file mode 100644 index 0000000..544d270 --- /dev/null +++ b/fast-interview-code/questions-demo/scope.js @@ -0,0 +1,38 @@ +// // 自由变量示例 —— 内存会被释放 +// let a = 0 +// function fn1() { +// let a1 = 100 + +// function fn2() { +// let a2 = 200 + +// function fn3() { +// let a3 = 300 +// return a + a1 + a2 + a3 +// } +// fn3() +// } +// fn2() +// } +// fn1() + +// // 闭包 函数作为返回值 —— 内存不会被释放 +// function create() { +// let a = 100 +// return function () { +// console.log(a) +// } +// } +// let fn = create() +// let a = 200 +// fn() // 100 + +function print(fn) { + let a = 200 + fn() +} +let a = 100 +function fn() { + console.log(a) +} +print(fn) // 100 \ No newline at end of file diff --git a/fast-interview-code/questions-demo/unique.js b/fast-interview-code/questions-demo/unique.js new file mode 100644 index 0000000..398160b --- /dev/null +++ b/fast-interview-code/questions-demo/unique.js @@ -0,0 +1,21 @@ +// // 传统方式 +// function unique(arr) { +// const res = [] +// arr.forEach(item => { +// if (res.indexOf(item) < 0) { +// res.push(item) +// } +// }) +// return res +// } + +// 使用 Set (无序,不能重复) +function unique(arr) { + const set = new Set(arr) + return [...set] +} + +const res = unique([30, 10, 20, 30, 40, 10]) +console.log(res) + + diff --git a/fast-interview-code/questions-demo/var-let-const.js b/fast-interview-code/questions-demo/var-let-const.js new file mode 100644 index 0000000..970b115 --- /dev/null +++ b/fast-interview-code/questions-demo/var-let-const.js @@ -0,0 +1,13 @@ +// // 变量提升 ES5 +// console.log(a) // undefined +// var a = 200 + +// var a +// console.log(a) // undefined +// a = 200 + +// 块级作用域 +for (let i = 0; i < 10; i++) { + let j = i + 1 +} +console.log(j) diff --git a/fast-interview-code/webpack-demo/.babelrc b/fast-interview-code/webpack-demo/.babelrc new file mode 100644 index 0000000..a91d04a --- /dev/null +++ b/fast-interview-code/webpack-demo/.babelrc @@ -0,0 +1,4 @@ +{ + "presets": ["@babel/preset-env"], + "plugins": [] +} \ No newline at end of file diff --git a/fast-interview-code/webpack-demo/dist/bundle.58cf28598ed2e217d4b3.js b/fast-interview-code/webpack-demo/dist/bundle.58cf28598ed2e217d4b3.js new file mode 100644 index 0000000..4af6de2 --- /dev/null +++ b/fast-interview-code/webpack-demo/dist/bundle.58cf28598ed2e217d4b3.js @@ -0,0 +1 @@ +!function(e){var n={};function t(o){if(n[o])return n[o].exports;var r=n[o]={i:o,l:!1,exports:{}};return e[o].call(r.exports,r,r.exports,t),r.l=!0,r.exports}t.m=e,t.c=n,t.d=function(e,n,o){t.o(e,n)||Object.defineProperty(e,n,{enumerable:!0,get:o})},t.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.t=function(e,n){if(1&n&&(e=t(e)),8&n)return e;if(4&n&&"object"==typeof e&&e&&e.__esModule)return e;var o=Object.create(null);if(t.r(o),Object.defineProperty(o,"default",{enumerable:!0,value:e}),2&n&&"string"!=typeof e)for(var r in e)t.d(o,r,function(n){return e[n]}.bind(null,r));return o},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},t.p="",t(t.s=0)}([function(e,n,t){"use strict";t.r(n);function o(e,n){for(var t=0;t + + + + + + Document + + +

    一段文字

    + + \ No newline at end of file diff --git a/fast-interview-code/webpack-demo/package-lock.json b/fast-interview-code/webpack-demo/package-lock.json new file mode 100644 index 0000000..043ac1e --- /dev/null +++ b/fast-interview-code/webpack-demo/package-lock.json @@ -0,0 +1,7103 @@ +{ + "name": "webpack-demo", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npm.taobao.org/@babel/code-frame/download/@babel/code-frame-7.5.5.tgz", + "integrity": "sha1-vAeC9tafe31JUxIZaZuYj2aaj50=", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/core": { + "version": "7.6.2", + "resolved": "https://registry.npm.taobao.org/@babel/core/download/@babel/core-7.6.2.tgz", + "integrity": "sha1-Bpp3bo1enu//diNryIRVZr0x3ZE=", + "dev": true, + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.6.2", + "@babel/helpers": "^7.6.2", + "@babel/parser": "^7.6.2", + "@babel/template": "^7.6.0", + "@babel/traverse": "^7.6.2", + "@babel/types": "^7.6.0", + "convert-source-map": "^1.1.0", + "debug": "^4.1.0", + "json5": "^2.1.0", + "lodash": "^4.17.13", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "http://registry.npm.taobao.org/debug/download/debug-4.1.1.tgz", + "integrity": "sha1-O3ImAlUQnGtYnO4FDx1RYTlmR5E=", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "json5": { + "version": "2.1.0", + "resolved": "http://registry.npm.taobao.org/json5/download/json5-2.1.0.tgz", + "integrity": "sha1-56DGLEgoXGKNIKELhcibuAfDKFA=", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fms%2Fdownload%2Fms-2.1.2.tgz", + "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.6.2", + "resolved": "https://registry.npm.taobao.org/@babel/generator/download/@babel/generator-7.6.2.tgz?cache=0&sync_timestamp=1569274895599&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fgenerator%2Fdownload%2F%40babel%2Fgenerator-7.6.2.tgz", + "integrity": "sha1-2sijwt8RgzTCop/zRG2hY2qPjAM=", + "dev": true, + "requires": { + "@babel/types": "^7.6.0", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.0.0", + "resolved": "https://registry.npm.taobao.org/@babel/helper-annotate-as-pure/download/@babel/helper-annotate-as-pure-7.0.0.tgz", + "integrity": "sha1-Mj053QtQ4Qx8Bsp9djjmhk2MXDI=", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.1.0", + "resolved": "https://registry.npm.taobao.org/@babel/helper-builder-binary-assignment-operator-visitor/download/@babel/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz", + "integrity": "sha1-a2lijf5Ah3mODE7Zjj1Kay+9L18=", + "dev": true, + "requires": { + "@babel/helper-explode-assignable-expression": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-call-delegate": { + "version": "7.4.4", + "resolved": "https://registry.npm.taobao.org/@babel/helper-call-delegate/download/@babel/helper-call-delegate-7.4.4.tgz", + "integrity": "sha1-h8H4yhmtVSpzanonscH8+LH/H0M=", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.4.4", + "@babel/traverse": "^7.4.4", + "@babel/types": "^7.4.4" + } + }, + "@babel/helper-define-map": { + "version": "7.5.5", + "resolved": "https://registry.npm.taobao.org/@babel/helper-define-map/download/@babel/helper-define-map-7.5.5.tgz", + "integrity": "sha1-PewywgRvN+CbKMk+sLED/Sol02k=", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/types": "^7.5.5", + "lodash": "^4.17.13" + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.1.0", + "resolved": "https://registry.npm.taobao.org/@babel/helper-explode-assignable-expression/download/@babel/helper-explode-assignable-expression-7.1.0.tgz", + "integrity": "sha1-U3+hP28WdN90WwwA7I/k6ZaByPY=", + "dev": true, + "requires": { + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npm.taobao.org/@babel/helper-function-name/download/@babel/helper-function-name-7.1.0.tgz", + "integrity": "sha1-oM6wFoX3M1XUNgwSR/WCv6/I/1M=", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npm.taobao.org/@babel/helper-get-function-arity/download/@babel/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha1-g1ctQyDipGVyY3NBE8QoaLZOScM=", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.4.4", + "resolved": "https://registry.npm.taobao.org/@babel/helper-hoist-variables/download/@babel/helper-hoist-variables-7.4.4.tgz", + "integrity": "sha1-Api18lyMCcUxAtUqxKmPdz6yhQo=", + "dev": true, + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.5.5", + "resolved": "https://registry.npm.taobao.org/@babel/helper-member-expression-to-functions/download/@babel/helper-member-expression-to-functions-7.5.5.tgz", + "integrity": "sha1-H7W47ERTqTxDnun+Ou6kqEt2tZA=", + "dev": true, + "requires": { + "@babel/types": "^7.5.5" + } + }, + "@babel/helper-module-imports": { + "version": "7.0.0", + "resolved": "https://registry.npm.taobao.org/@babel/helper-module-imports/download/@babel/helper-module-imports-7.0.0.tgz", + "integrity": "sha1-lggbcRHkhtpNLNlxrRpP4hbMLj0=", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-module-transforms": { + "version": "7.5.5", + "resolved": "https://registry.npm.taobao.org/@babel/helper-module-transforms/download/@babel/helper-module-transforms-7.5.5.tgz", + "integrity": "sha1-+E/4oJA43Lyh/UNVZhpQCTcWW0o=", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-simple-access": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/template": "^7.4.4", + "@babel/types": "^7.5.5", + "lodash": "^4.17.13" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.0.0", + "resolved": "https://registry.npm.taobao.org/@babel/helper-optimise-call-expression/download/@babel/helper-optimise-call-expression-7.0.0.tgz", + "integrity": "sha1-opIMVwKwc8Fd5REGIAqoytIEl9U=", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.0.0", + "resolved": "https://registry.npm.taobao.org/@babel/helper-plugin-utils/download/@babel/helper-plugin-utils-7.0.0.tgz", + "integrity": "sha1-u7P77phmHFaQNCN8wDlnupm08lA=", + "dev": true + }, + "@babel/helper-regex": { + "version": "7.5.5", + "resolved": "https://registry.npm.taobao.org/@babel/helper-regex/download/@babel/helper-regex-7.5.5.tgz", + "integrity": "sha1-CqaCT3EAouDonBUnwjk2wVLKs1E=", + "dev": true, + "requires": { + "lodash": "^4.17.13" + } + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.1.0", + "resolved": "https://registry.npm.taobao.org/@babel/helper-remap-async-to-generator/download/@babel/helper-remap-async-to-generator-7.1.0.tgz", + "integrity": "sha1-Nh2AghtvONp1vT8HheziCojF/n8=", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-wrap-function": "^7.1.0", + "@babel/template": "^7.1.0", + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-replace-supers": { + "version": "7.5.5", + "resolved": "https://registry.npm.taobao.org/@babel/helper-replace-supers/download/@babel/helper-replace-supers-7.5.5.tgz", + "integrity": "sha1-+EzkPfAxIi0rrQaNJibLV5nDS8I=", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.5.5", + "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/traverse": "^7.5.5", + "@babel/types": "^7.5.5" + } + }, + "@babel/helper-simple-access": { + "version": "7.1.0", + "resolved": "https://registry.npm.taobao.org/@babel/helper-simple-access/download/@babel/helper-simple-access-7.1.0.tgz", + "integrity": "sha1-Ze65VMjCRb6qToWdphiPOdceWFw=", + "dev": true, + "requires": { + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.4", + "resolved": "https://registry.npm.taobao.org/@babel/helper-split-export-declaration/download/@babel/helper-split-export-declaration-7.4.4.tgz", + "integrity": "sha1-/5SJSjQL549T8GrwOLIFxJ2ZNnc=", + "dev": true, + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@babel/helper-wrap-function": { + "version": "7.2.0", + "resolved": "https://registry.npm.taobao.org/@babel/helper-wrap-function/download/@babel/helper-wrap-function-7.2.0.tgz", + "integrity": "sha1-xOABJEV2nigVtVKW6tQ6lYVJ9vo=", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/template": "^7.1.0", + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.2.0" + } + }, + "@babel/helpers": { + "version": "7.6.2", + "resolved": "https://registry.npm.taobao.org/@babel/helpers/download/@babel/helpers-7.6.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelpers%2Fdownload%2F%40babel%2Fhelpers-7.6.2.tgz", + "integrity": "sha1-aB/+SJ6k3MVfI85GnljlnBwEUVM=", + "dev": true, + "requires": { + "@babel/template": "^7.6.0", + "@babel/traverse": "^7.6.2", + "@babel/types": "^7.6.0" + } + }, + "@babel/highlight": { + "version": "7.5.0", + "resolved": "https://registry.npm.taobao.org/@babel/highlight/download/@babel/highlight-7.5.0.tgz", + "integrity": "sha1-VtETEr2SSPphlZHQJHK+boyzJUA=", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.6.2", + "resolved": "https://registry.npm.taobao.org/@babel/parser/download/@babel/parser-7.6.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fparser%2Fdownload%2F%40babel%2Fparser-7.6.2.tgz", + "integrity": "sha1-IF6cleFro7i5YJBnemfJ1gdbcKE=", + "dev": true + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.2.0", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-async-generator-functions/download/@babel/plugin-proposal-async-generator-functions-7.2.0.tgz", + "integrity": "sha1-somzBmadzkrSCwJSiJoVdoydQX4=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-remap-async-to-generator": "^7.1.0", + "@babel/plugin-syntax-async-generators": "^7.2.0" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.5.0", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-dynamic-import/download/@babel/plugin-proposal-dynamic-import-7.5.0.tgz", + "integrity": "sha1-5TIgLbSDhyNpGxCme4zlCeOXxQY=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-dynamic-import": "^7.2.0" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.2.0", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-json-strings/download/@babel/plugin-proposal-json-strings-7.2.0.tgz", + "integrity": "sha1-Vo7MRGxhSK5rJn8CVREwiR4p8xc=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-json-strings": "^7.2.0" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.6.2", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-object-rest-spread/download/@babel/plugin-proposal-object-rest-spread-7.6.2.tgz", + "integrity": "sha1-j/zMjzplRen3iYi2v0/ogbiOgJY=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-object-rest-spread": "^7.2.0" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.2.0", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-optional-catch-binding/download/@babel/plugin-proposal-optional-catch-binding-7.2.0.tgz", + "integrity": "sha1-E12B7baKCB5V5W7EhUHs6AZcOPU=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.2.0" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.6.2", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-unicode-property-regex/download/@babel/plugin-proposal-unicode-property-regex-7.6.2.tgz", + "integrity": "sha1-BUE3YolPQb/kK5pegJGb1XXcyAI=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.4.4", + "regexpu-core": "^4.6.0" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.2.0", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-async-generators/download/@babel/plugin-syntax-async-generators-7.2.0.tgz", + "integrity": "sha1-aeHw2zTG9aDPfiszI78VmnbIy38=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.2.0", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-dynamic-import/download/@babel/plugin-syntax-dynamic-import-7.2.0.tgz", + "integrity": "sha1-acFZ/69JmBIhYa2OvF5tH1XfhhI=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.2.0", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-json-strings/download/@babel/plugin-syntax-json-strings-7.2.0.tgz", + "integrity": "sha1-cr0T9v/h0lk4Ep0qGGsR/WKVFHA=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.2.0", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-object-rest-spread/download/@babel/plugin-syntax-object-rest-spread-7.2.0.tgz", + "integrity": "sha1-O3o+czUQxX6CC5FCpleayLDfrS4=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.2.0", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-optional-catch-binding/download/@babel/plugin-syntax-optional-catch-binding-7.2.0.tgz", + "integrity": "sha1-qUAT1u2okI3+akd+f57ahWVuz1w=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.2.0", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-arrow-functions/download/@babel/plugin-transform-arrow-functions-7.2.0.tgz", + "integrity": "sha1-mur75Nb/xlY7+Pg3IJFijwB3lVA=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.5.0", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-async-to-generator/download/@babel/plugin-transform-async-to-generator-7.5.0.tgz?cache=0&sync_timestamp=1562245140908&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-async-to-generator%2Fdownload%2F%40babel%2Fplugin-transform-async-to-generator-7.5.0.tgz", + "integrity": "sha1-iaOEigFmYjtbxIEWS1k2q5R+iH4=", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-remap-async-to-generator": "^7.1.0" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.2.0", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-block-scoped-functions/download/@babel/plugin-transform-block-scoped-functions-7.2.0.tgz", + "integrity": "sha1-XTzBHo1d3XUqpkyRSNDbbLef0ZA=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.6.2", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-block-scoping/download/@babel/plugin-transform-block-scoping-7.6.2.tgz", + "integrity": "sha1-lsM6uXqa5QDMb1sZ4Ep+ZVM2Cnk=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "lodash": "^4.17.13" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.5.5", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-classes/download/@babel/plugin-transform-classes-7.5.5.tgz", + "integrity": "sha1-0JQpnZvWgKFKKg7a44MFrWD7Tek=", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-define-map": "^7.5.5", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.5.5", + "@babel/helper-split-export-declaration": "^7.4.4", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.2.0", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-computed-properties/download/@babel/plugin-transform-computed-properties-7.2.0.tgz", + "integrity": "sha1-g6ffamWIZbHI9kHVEMbzryICFto=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.6.0", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-destructuring/download/@babel/plugin-transform-destructuring-7.6.0.tgz", + "integrity": "sha1-RLvgi1f0SACU1X2f+82W0wkHW6Y=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.6.2", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-dotall-regex/download/@babel/plugin-transform-dotall-regex-7.6.2.tgz", + "integrity": "sha1-RKu5SLiPAZmmJwJOFQisr43Jsvk=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.4.4", + "regexpu-core": "^4.6.0" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.5.0", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-duplicate-keys/download/@babel/plugin-transform-duplicate-keys-7.5.0.tgz?cache=0&sync_timestamp=1562245140778&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-duplicate-keys%2Fdownload%2F%40babel%2Fplugin-transform-duplicate-keys-7.5.0.tgz", + "integrity": "sha1-xdv1EGv4TN9pEiLAl0wSsd+TGFM=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.2.0", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-exponentiation-operator/download/@babel/plugin-transform-exponentiation-operator-7.2.0.tgz", + "integrity": "sha1-pjhoKJ5bQAf3BU1GSRr1FDV2YAg=", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.4.4", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-for-of/download/@babel/plugin-transform-for-of-7.4.4.tgz", + "integrity": "sha1-Amf8c14kyAi6FzhmxsTRRA/DxVY=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.4.4", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-function-name/download/@babel/plugin-transform-function-name-7.4.4.tgz", + "integrity": "sha1-4UNhFquwYQwiWQlISHVKxSMJIq0=", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.2.0", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-literals/download/@babel/plugin-transform-literals-7.2.0.tgz", + "integrity": "sha1-aQNT6B+SZ9rU/Yz9d+r6hqulPqE=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.2.0", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-member-expression-literals/download/@babel/plugin-transform-member-expression-literals-7.2.0.tgz", + "integrity": "sha1-+hCqXFiiy2r88sn/qMtNiz1Imi0=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.5.0", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-modules-amd/download/@babel/plugin-transform-modules-amd-7.5.0.tgz?cache=0&sync_timestamp=1562245140815&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-modules-amd%2Fdownload%2F%40babel%2Fplugin-transform-modules-amd-7.5.0.tgz", + "integrity": "sha1-7wBDXUbaCllhqnKKHS7P8GPk+5E=", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0", + "babel-plugin-dynamic-import-node": "^2.3.0" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.6.0", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-modules-commonjs/download/@babel/plugin-transform-modules-commonjs-7.6.0.tgz?cache=0&sync_timestamp=1567797385897&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-modules-commonjs%2Fdownload%2F%40babel%2Fplugin-transform-modules-commonjs-7.6.0.tgz", + "integrity": "sha1-Od/pV95EIERfH8+ItoouSqRRVIY=", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.4.4", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-simple-access": "^7.1.0", + "babel-plugin-dynamic-import-node": "^2.3.0" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.5.0", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-modules-systemjs/download/@babel/plugin-transform-modules-systemjs-7.5.0.tgz?cache=0&sync_timestamp=1562245135498&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-modules-systemjs%2Fdownload%2F%40babel%2Fplugin-transform-modules-systemjs-7.5.0.tgz", + "integrity": "sha1-51JmoT75QgLbKgYgl3dW9R1S0kk=", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.4.4", + "@babel/helper-plugin-utils": "^7.0.0", + "babel-plugin-dynamic-import-node": "^2.3.0" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.2.0", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-modules-umd/download/@babel/plugin-transform-modules-umd-7.2.0.tgz", + "integrity": "sha1-dnjOdRafCHe46yI1U4wHQmjdAa4=", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.6.2", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-named-capturing-groups-regex/download/@babel/plugin-transform-named-capturing-groups-regex-7.6.2.tgz", + "integrity": "sha1-wcoLuEuU84XKMCw5MuhwsPsOUis=", + "dev": true, + "requires": { + "regexpu-core": "^4.6.0" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.4.4", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-new-target/download/@babel/plugin-transform-new-target-7.4.4.tgz", + "integrity": "sha1-GNEgQ4sMye6VpH8scryXaPvtYKU=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.5.5", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-object-super/download/@babel/plugin-transform-object-super-7.5.5.tgz", + "integrity": "sha1-xwAh34NAc8ZethO4Z5zEo4HRqfk=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.5.5" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.4.4", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-parameters/download/@babel/plugin-transform-parameters-7.4.4.tgz", + "integrity": "sha1-dVbPA/MYvScZ/kySLS2Ai+VXHhY=", + "dev": true, + "requires": { + "@babel/helper-call-delegate": "^7.4.4", + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.2.0", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-property-literals/download/@babel/plugin-transform-property-literals-7.2.0.tgz", + "integrity": "sha1-A+M/ZT9bJcTrVyyYuUhQVbOJ6QU=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.4.5", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-regenerator/download/@babel/plugin-transform-regenerator-7.4.5.tgz", + "integrity": "sha1-Yp3IJRLFXO4BNB+ye9/LIQNUaA8=", + "dev": true, + "requires": { + "regenerator-transform": "^0.14.0" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.2.0", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-reserved-words/download/@babel/plugin-transform-reserved-words-7.2.0.tgz", + "integrity": "sha1-R5Kvh8mYpJNnWX0H/t8CY20uFjQ=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.2.0", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-shorthand-properties/download/@babel/plugin-transform-shorthand-properties-7.2.0.tgz", + "integrity": "sha1-YzOu4vjW7n4oYVRXKYk0o7RhmPA=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.6.2", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-spread/download/@babel/plugin-transform-spread-7.6.2.tgz", + "integrity": "sha1-/HfPeYsksQxG4bUbG4jCv2YbuN0=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.2.0", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-sticky-regex/download/@babel/plugin-transform-sticky-regex-7.2.0.tgz", + "integrity": "sha1-oeRUtZlVYKnB4NU338FQYf0mh+E=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.0.0" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.4.4", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-template-literals/download/@babel/plugin-transform-template-literals-7.4.4.tgz", + "integrity": "sha1-nSj+p7vOY3+3YSoHUJidgyHUvLA=", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.2.0", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-typeof-symbol/download/@babel/plugin-transform-typeof-symbol-7.2.0.tgz", + "integrity": "sha1-EX0rzsL79ktLWdH5gZiUaC0p8rI=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.6.2", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-unicode-regex/download/@babel/plugin-transform-unicode-regex-7.6.2.tgz", + "integrity": "sha1-tpKq2Iin6NixshS+a53APVAx9pg=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.4.4", + "regexpu-core": "^4.6.0" + } + }, + "@babel/preset-env": { + "version": "7.6.2", + "resolved": "https://registry.npm.taobao.org/@babel/preset-env/download/@babel/preset-env-7.6.2.tgz", + "integrity": "sha1-q7s+14XH/kIg1MgqU2IdcfwMddM=", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-async-generator-functions": "^7.2.0", + "@babel/plugin-proposal-dynamic-import": "^7.5.0", + "@babel/plugin-proposal-json-strings": "^7.2.0", + "@babel/plugin-proposal-object-rest-spread": "^7.6.2", + "@babel/plugin-proposal-optional-catch-binding": "^7.2.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.6.2", + "@babel/plugin-syntax-async-generators": "^7.2.0", + "@babel/plugin-syntax-dynamic-import": "^7.2.0", + "@babel/plugin-syntax-json-strings": "^7.2.0", + "@babel/plugin-syntax-object-rest-spread": "^7.2.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.2.0", + "@babel/plugin-transform-arrow-functions": "^7.2.0", + "@babel/plugin-transform-async-to-generator": "^7.5.0", + "@babel/plugin-transform-block-scoped-functions": "^7.2.0", + "@babel/plugin-transform-block-scoping": "^7.6.2", + "@babel/plugin-transform-classes": "^7.5.5", + "@babel/plugin-transform-computed-properties": "^7.2.0", + "@babel/plugin-transform-destructuring": "^7.6.0", + "@babel/plugin-transform-dotall-regex": "^7.6.2", + "@babel/plugin-transform-duplicate-keys": "^7.5.0", + "@babel/plugin-transform-exponentiation-operator": "^7.2.0", + "@babel/plugin-transform-for-of": "^7.4.4", + "@babel/plugin-transform-function-name": "^7.4.4", + "@babel/plugin-transform-literals": "^7.2.0", + "@babel/plugin-transform-member-expression-literals": "^7.2.0", + "@babel/plugin-transform-modules-amd": "^7.5.0", + "@babel/plugin-transform-modules-commonjs": "^7.6.0", + "@babel/plugin-transform-modules-systemjs": "^7.5.0", + "@babel/plugin-transform-modules-umd": "^7.2.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.6.2", + "@babel/plugin-transform-new-target": "^7.4.4", + "@babel/plugin-transform-object-super": "^7.5.5", + "@babel/plugin-transform-parameters": "^7.4.4", + "@babel/plugin-transform-property-literals": "^7.2.0", + "@babel/plugin-transform-regenerator": "^7.4.5", + "@babel/plugin-transform-reserved-words": "^7.2.0", + "@babel/plugin-transform-shorthand-properties": "^7.2.0", + "@babel/plugin-transform-spread": "^7.6.2", + "@babel/plugin-transform-sticky-regex": "^7.2.0", + "@babel/plugin-transform-template-literals": "^7.4.4", + "@babel/plugin-transform-typeof-symbol": "^7.2.0", + "@babel/plugin-transform-unicode-regex": "^7.6.2", + "@babel/types": "^7.6.0", + "browserslist": "^4.6.0", + "core-js-compat": "^3.1.1", + "invariant": "^2.2.2", + "js-levenshtein": "^1.1.3", + "semver": "^5.5.0" + } + }, + "@babel/template": { + "version": "7.6.0", + "resolved": "https://registry.npm.taobao.org/@babel/template/download/@babel/template-7.6.0.tgz", + "integrity": "sha1-fwFZx/UBIjDa1kzKQuyb21yVNuY=", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.6.0", + "@babel/types": "^7.6.0" + } + }, + "@babel/traverse": { + "version": "7.6.2", + "resolved": "https://registry.npm.taobao.org/@babel/traverse/download/@babel/traverse-7.6.2.tgz?cache=0&sync_timestamp=1569274897186&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Ftraverse%2Fdownload%2F%40babel%2Ftraverse-7.6.2.tgz", + "integrity": "sha1-sOK/1AHTOc4ObAVpAgbR4RUCziw=", + "dev": true, + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.6.2", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/parser": "^7.6.2", + "@babel/types": "^7.6.0", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "http://registry.npm.taobao.org/debug/download/debug-4.1.1.tgz", + "integrity": "sha1-O3ImAlUQnGtYnO4FDx1RYTlmR5E=", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fms%2Fdownload%2Fms-2.1.2.tgz", + "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=", + "dev": true + } + } + }, + "@babel/types": { + "version": "7.6.1", + "resolved": "https://registry.npm.taobao.org/@babel/types/download/@babel/types-7.6.1.tgz", + "integrity": "sha1-U6vzMIrdOsKiiE1TkVHFfEs6xkg=", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "@types/events": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/@types/events/download/@types/events-3.0.0.tgz", + "integrity": "sha1-KGLz9Yqaf3w+eNefEw3U1xwlwqc=", + "dev": true + }, + "@types/glob": { + "version": "7.1.1", + "resolved": "https://registry.npm.taobao.org/@types/glob/download/@types/glob-7.1.1.tgz", + "integrity": "sha1-qlmhxuP7xCHgfM0xqUTDDrpSFXU=", + "dev": true, + "requires": { + "@types/events": "*", + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npm.taobao.org/@types/minimatch/download/@types/minimatch-3.0.3.tgz", + "integrity": "sha1-PcoOPzOyAPx9ETnAzZbBJoyt/Z0=", + "dev": true + }, + "@types/node": { + "version": "12.7.8", + "resolved": "https://registry.npm.taobao.org/@types/node/download/@types/node-12.7.8.tgz?cache=0&sync_timestamp=1569453138457&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fnode%2Fdownload%2F%40types%2Fnode-12.7.8.tgz", + "integrity": "sha1-yxv2gAI4iYvC/2/6VwLDyt01Bwg=", + "dev": true + }, + "@webassemblyjs/ast": { + "version": "1.8.5", + "resolved": "http://registry.npm.taobao.org/@webassemblyjs/ast/download/@webassemblyjs/ast-1.8.5.tgz", + "integrity": "sha1-UbHF/mV2o0lTv0slPfnw1JDZ41k=", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.8.5", + "resolved": "http://registry.npm.taobao.org/@webassemblyjs/floating-point-hex-parser/download/@webassemblyjs/floating-point-hex-parser-1.8.5.tgz", + "integrity": "sha1-G6kmopI2E+3OSW/VsC6M6KX0lyE=", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.8.5", + "resolved": "http://registry.npm.taobao.org/@webassemblyjs/helper-api-error/download/@webassemblyjs/helper-api-error-1.8.5.tgz", + "integrity": "sha1-xJ2tIvZFInxe22EL25aX8aq3Ifc=", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.8.5", + "resolved": "http://registry.npm.taobao.org/@webassemblyjs/helper-buffer/download/@webassemblyjs/helper-buffer-1.8.5.tgz", + "integrity": "sha1-/qk+Qphj3V5DOFVfQikjhaZT8gQ=", + "dev": true + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.8.5", + "resolved": "http://registry.npm.taobao.org/@webassemblyjs/helper-code-frame/download/@webassemblyjs/helper-code-frame-1.8.5.tgz", + "integrity": "sha1-mnQP9I4/qjAisd/1RCPfmqKTwl4=", + "dev": true, + "requires": { + "@webassemblyjs/wast-printer": "1.8.5" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.8.5", + "resolved": "http://registry.npm.taobao.org/@webassemblyjs/helper-fsm/download/@webassemblyjs/helper-fsm-1.8.5.tgz", + "integrity": "sha1-ugt9Oz9+RzPaYFnJMyJ12GBwJFI=", + "dev": true + }, + "@webassemblyjs/helper-module-context": { + "version": "1.8.5", + "resolved": "http://registry.npm.taobao.org/@webassemblyjs/helper-module-context/download/@webassemblyjs/helper-module-context-1.8.5.tgz", + "integrity": "sha1-3vS5knsBAdyMu9jR7bW3ucguskU=", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "mamacro": "^0.0.3" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.8.5", + "resolved": "http://registry.npm.taobao.org/@webassemblyjs/helper-wasm-bytecode/download/@webassemblyjs/helper-wasm-bytecode-1.8.5.tgz", + "integrity": "sha1-U3p1Dt31weky83RCBlUckcG5PmE=", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.8.5", + "resolved": "http://registry.npm.taobao.org/@webassemblyjs/helper-wasm-section/download/@webassemblyjs/helper-wasm-section-1.8.5.tgz", + "integrity": "sha1-dMpqa8vhnlCjtrRihH5pUD5r/L8=", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.8.5", + "resolved": "http://registry.npm.taobao.org/@webassemblyjs/ieee754/download/@webassemblyjs/ieee754-1.8.5.tgz", + "integrity": "sha1-cSMp2+8kDza/V70ve4+5v0FUQh4=", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.8.5", + "resolved": "http://registry.npm.taobao.org/@webassemblyjs/leb128/download/@webassemblyjs/leb128-1.8.5.tgz", + "integrity": "sha1-BE7es06mefPgTNT9mCTV41dnrhA=", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.8.5", + "resolved": "http://registry.npm.taobao.org/@webassemblyjs/utf8/download/@webassemblyjs/utf8-1.8.5.tgz", + "integrity": "sha1-qL87XY/+mGx8Hjc8y9wqCRXwztw=", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.8.5", + "resolved": "http://registry.npm.taobao.org/@webassemblyjs/wasm-edit/download/@webassemblyjs/wasm-edit-1.8.5.tgz", + "integrity": "sha1-li2hKqWswcExyBxCMpkcgs5W4Bo=", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/helper-wasm-section": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-opt": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "@webassemblyjs/wast-printer": "1.8.5" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.8.5", + "resolved": "http://registry.npm.taobao.org/@webassemblyjs/wasm-gen/download/@webassemblyjs/wasm-gen-1.8.5.tgz", + "integrity": "sha1-VIQHZsLBAC62TtGr5yCt7XFPmLw=", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.8.5", + "resolved": "http://registry.npm.taobao.org/@webassemblyjs/wasm-opt/download/@webassemblyjs/wasm-opt-1.8.5.tgz", + "integrity": "sha1-sk2fa6UDlK8TSfUQr6j/y4pj0mQ=", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.8.5", + "resolved": "http://registry.npm.taobao.org/@webassemblyjs/wasm-parser/download/@webassemblyjs/wasm-parser-1.8.5.tgz", + "integrity": "sha1-IVdvDsiLkUJzV7hTY4NmjvfGa40=", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.8.5", + "resolved": "http://registry.npm.taobao.org/@webassemblyjs/wast-parser/download/@webassemblyjs/wast-parser-1.8.5.tgz", + "integrity": "sha1-4Q7s1ULQ5705T2gnxJ899tTu+4w=", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/floating-point-hex-parser": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-code-frame": "1.8.5", + "@webassemblyjs/helper-fsm": "1.8.5", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.8.5", + "resolved": "http://registry.npm.taobao.org/@webassemblyjs/wast-printer/download/@webassemblyjs/wast-printer-1.8.5.tgz", + "integrity": "sha1-EUu8SB/RDKDiOzVg+oEnSLC65bw=", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5", + "@xtuc/long": "4.2.2" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "http://registry.npm.taobao.org/@xtuc/ieee754/download/@xtuc/ieee754-1.2.0.tgz", + "integrity": "sha1-7vAUoxRa5Hehy8AM0eVSM23Ot5A=", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "http://registry.npm.taobao.org/@xtuc/long/download/@xtuc/long-4.2.2.tgz", + "integrity": "sha1-0pHGpOl5ibXGHZrPOWrk/hM6cY0=", + "dev": true + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npm.taobao.org/accepts/download/accepts-1.3.7.tgz", + "integrity": "sha1-UxvHJlF6OytB+FACHGzBXqq1B80=", + "dev": true, + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "acorn": { + "version": "6.3.0", + "resolved": "https://registry.npm.taobao.org/acorn/download/acorn-6.3.0.tgz", + "integrity": "sha1-AIdQkRn/pPwKAEHR6TpBfmjLhW4=", + "dev": true + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "dependencies": { + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + } + } + }, + "ajv-errors": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/ajv-errors/download/ajv-errors-1.0.1.tgz", + "integrity": "sha1-81mGrOuRr63sQQL72FAUlQzvpk0=", + "dev": true + }, + "ajv-keywords": { + "version": "3.4.1", + "resolved": "https://registry.npm.taobao.org/ajv-keywords/download/ajv-keywords-3.4.1.tgz", + "integrity": "sha1-75FuJxxkrBIXH9g4TqrmsjRYVNo=", + "dev": true + }, + "ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npm.taobao.org/ansi-colors/download/ansi-colors-3.2.4.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fansi-colors%2Fdownload%2Fansi-colors-3.2.4.tgz", + "integrity": "sha1-46PaS/uubIapwoViXeEkojQCb78=", + "dev": true + }, + "ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npm.taobao.org/ansi-html/download/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "dev": true + }, + "ansi-regex": { + "version": "4.1.0", + "resolved": "http://registry.npm.taobao.org/ansi-regex/download/ansi-regex-4.1.0.tgz", + "integrity": "sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc=", + "dev": true + }, + "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=1566430668860&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fansi-styles%2Fdownload%2Fansi-styles-3.2.1.tgz", + "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/anymatch/download/anymatch-2.0.0.tgz", + "integrity": "sha1-vLJLTzeTTZqnrBe0ra+J58du8us=", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "http://registry.npm.taobao.org/normalize-path/download/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/aproba/download/aproba-1.2.0.tgz", + "integrity": "sha1-aALmJk79GMeQobDVF/DyYnvyyUo=", + "dev": true + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "http://registry.npm.taobao.org/arr-diff/download/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "http://registry.npm.taobao.org/arr-flatten/download/arr-flatten-1.1.0.tgz", + "integrity": "sha1-NgSLv/TntH4TZkQxbJlmnqWukfE=", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "http://registry.npm.taobao.org/arr-union/download/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-flatten": { + "version": "2.1.2", + "resolved": "http://registry.npm.taobao.org/array-flatten/download/array-flatten-2.1.2.tgz", + "integrity": "sha1-JO+AoowaiTYX4hSbDG0NeIKTsJk=", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/array-union/download/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npm.taobao.org/array-uniq/download/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "http://registry.npm.taobao.org/array-unique/download/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npm.taobao.org/asn1.js/download/asn1.js-4.10.1.tgz", + "integrity": "sha1-ucK/WAXx5kqt7tbfOiv6+1pz9aA=", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npm.taobao.org/assert/download/assert-1.5.0.tgz", + "integrity": "sha1-VcEJqvbgrv2z3EtxJAxwv1dLGOs=", + "dev": true, + "requires": { + "object-assign": "^4.1.1", + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/inherits/download/inherits-2.0.1.tgz?cache=0&sync_timestamp=1560975547815&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Finherits%2Fdownload%2Finherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npm.taobao.org/util/download/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/assign-symbols/download/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "async": { + "version": "1.5.2", + "resolved": "https://registry.npm.taobao.org/async/download/async-1.5.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fasync%2Fdownload%2Fasync-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "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=", + "dev": true + }, + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/async-limiter/download/async-limiter-1.0.1.tgz", + "integrity": "sha1-3TeelPDbgxCwgpH51kwyCXZmF/0=", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "http://registry.npm.taobao.org/atob/download/atob-2.1.2.tgz", + "integrity": "sha1-bZUX654DDSQ2ZmZR6GvZ9vE1M8k=", + "dev": true + }, + "babel-loader": { + "version": "8.0.6", + "resolved": "https://registry.npm.taobao.org/babel-loader/download/babel-loader-8.0.6.tgz", + "integrity": "sha1-4zvbbzYrA/S7FBoMIauHxQG3Dfs=", + "dev": true, + "requires": { + "find-cache-dir": "^2.0.0", + "loader-utils": "^1.0.2", + "mkdirp": "^0.5.1", + "pify": "^4.0.1" + } + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.0", + "resolved": "https://registry.npm.taobao.org/babel-plugin-dynamic-import-node/download/babel-plugin-dynamic-import-node-2.3.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbabel-plugin-dynamic-import-node%2Fdownload%2Fbabel-plugin-dynamic-import-node-2.3.0.tgz", + "integrity": "sha1-8A9Qe9qjw+P/bn5emNkKesq5b38=", + "dev": true, + "requires": { + "object.assign": "^4.1.0" + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/balanced-match/download/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "http://registry.npm.taobao.org/base/download/base-0.11.2.tgz", + "integrity": "sha1-e95c7RRbbVUakNuH+DxVi060io8=", + "dev": true, + "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": "http://registry.npm.taobao.org/define-property/download/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz", + "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "http://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz", + "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npm.taobao.org/base64-js/download/base64-js-1.3.1.tgz", + "integrity": "sha1-WOzoy3XdB+ce0IxzarxfrE2/jfE=", + "dev": true + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/batch/download/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "dev": true + }, + "big.js": { + "version": "5.2.2", + "resolved": "http://registry.npm.taobao.org/big.js/download/big.js-5.2.2.tgz", + "integrity": "sha1-ZfCvOC9Xi83HQr2cKB6cstd2gyg=", + "dev": true + }, + "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=", + "dev": true + }, + "bluebird": { + "version": "3.5.5", + "resolved": "https://registry.npm.taobao.org/bluebird/download/bluebird-3.5.5.tgz", + "integrity": "sha1-qNCv1zJR7/u9X+OEp31zADwXpx8=", + "dev": true + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npm.taobao.org/bn.js/download/bn.js-4.11.8.tgz", + "integrity": "sha1-LN4J617jQfSEdGuwMJsyU7GxRC8=", + "dev": true + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npm.taobao.org/body-parser/download/body-parser-1.19.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbody-parser%2Fdownload%2Fbody-parser-1.19.0.tgz", + "integrity": "sha1-lrJwnlfJxOCab9Zqj9l5hE9p8Io=", + "dev": true, + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "dependencies": { + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/bytes/download/bytes-3.1.0.tgz", + "integrity": "sha1-9s95M6Ng4FiPqf3oVlHNx/gF0fY=", + "dev": true + } + } + }, + "bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npm.taobao.org/bonjour/download/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "dev": true, + "requires": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/boolbase/download/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "http://registry.npm.taobao.org/brace-expansion/download/brace-expansion-1.1.11.tgz", + "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=", + "dev": true, + "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=", + "dev": true, + "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" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "http://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "http://registry.npm.taobao.org/brorand/download/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "http://registry.npm.taobao.org/browserify-aes/download/browserify-aes-1.2.0.tgz", + "integrity": "sha1-Mmc0ZC9APavDADIJhTu3CtQo70g=", + "dev": true, + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/browserify-cipher/download/browserify-cipher-1.0.1.tgz", + "integrity": "sha1-jWR0wbhwv9q807z8wZNKEOlPFfA=", + "dev": true, + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "http://registry.npm.taobao.org/browserify-des/download/browserify-des-1.0.2.tgz", + "integrity": "sha1-OvTx9Zg5QDVy8cZiBDdfen9wPpw=", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "http://registry.npm.taobao.org/browserify-rsa/download/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "http://registry.npm.taobao.org/browserify-sign/download/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "dev": true, + "requires": { + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "http://registry.npm.taobao.org/browserify-zlib/download/browserify-zlib-0.2.0.tgz", + "integrity": "sha1-KGlFnZqjviRf6P4sofRuLn9U1z8=", + "dev": true, + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.0.tgz", + "integrity": "sha512-UQxE0DIhRB5z/zDz9iA03BOfxaN2+GQdBYH/2WrSIWEUrnpzTPJbhqt+umq6r3acaPRTW1FNTkrcp0PXgtFkvA==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001358", + "electron-to-chromium": "^1.4.164", + "node-releases": "^2.0.5", + "update-browserslist-db": "^1.0.0" + }, + "dependencies": { + "caniuse-lite": { + "version": "1.0.30001359", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001359.tgz", + "integrity": "sha512-Xln/BAsPzEuiVLgJ2/45IaqD9jShtk3Y33anKb4+yLwQzws3+v6odKfpgES/cDEaZMLzSChpIGdbOYtH9MyuHw==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.4.169", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.169.tgz", + "integrity": "sha512-Yb7UFva1sLlAaRyCkgoFF3qWvwZacFDtsGKi44rZsk8vnhL0DMhsUdhI4Dz9CCJQfftncDMGSI3AYiDtg8mD/w==", + "dev": true + }, + "node-releases": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.5.tgz", + "integrity": "sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==", + "dev": true + } + } + }, + "buffer": { + "version": "4.9.1", + "resolved": "https://registry.npm.taobao.org/buffer/download/buffer-4.9.1.tgz", + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "http://registry.npm.taobao.org/buffer-from/download/buffer-from-1.1.1.tgz", + "integrity": "sha1-MnE7wCj3XAL9txDXx7zsHyxgcO8=", + "dev": true + }, + "buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/buffer-indexof/download/buffer-indexof-1.1.1.tgz", + "integrity": "sha1-Uvq8xqYG0aADAoAmSO9o9jnaJow=", + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "http://registry.npm.taobao.org/buffer-xor/download/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "http://registry.npm.taobao.org/builtin-status-codes/download/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/bytes/download/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true + }, + "cacache": { + "version": "12.0.3", + "resolved": "https://registry.npm.taobao.org/cacache/download/cacache-12.0.3.tgz?cache=0&sync_timestamp=1569877474907&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcacache%2Fdownload%2Fcacache-12.0.3.tgz", + "integrity": "sha1-vpmruk4b9d9GHNWiwQcfxDJXM5A=", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/cache-base/download/cache-base-1.0.1.tgz", + "integrity": "sha1-Cn9GQWgxyLZi7jb+TnxZ129marI=", + "dev": true, + "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" + } + }, + "camel-case": { + "version": "3.0.0", + "resolved": "http://registry.npm.taobao.org/camel-case/download/camel-case-3.0.0.tgz", + "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "dev": true, + "requires": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npm.taobao.org/camelcase/download/camelcase-5.3.1.tgz", + "integrity": "sha1-48mzFWnhBoEd8kL3FXJaH0xJQyA=", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-2.4.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchalk%2Fdownload%2Fchalk-2.4.2.tgz", + "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-5.5.0.tgz", + "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npm.taobao.org/chokidar/download/chokidar-2.1.8.tgz?cache=0&sync_timestamp=1569897822781&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchokidar%2Fdownload%2Fchokidar-2.1.8.tgz", + "integrity": "sha1-gEs6e2qZNYw8XGHnHYco8EHP+Rc=", + "dev": true, + "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" + } + }, + "chownr": { + "version": "1.1.3", + "resolved": "https://registry.npm.taobao.org/chownr/download/chownr-1.1.3.tgz?cache=0&sync_timestamp=1569391492311&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchownr%2Fdownload%2Fchownr-1.1.3.tgz", + "integrity": "sha1-Qtg31SOWiNVfMDADpQgjD6ZycUI=", + "dev": true + }, + "chrome-trace-event": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/chrome-trace-event/download/chrome-trace-event-1.0.2.tgz", + "integrity": "sha1-I0CQ7pfH1K0aLEvq4nUF3v/GCKQ=", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "http://registry.npm.taobao.org/cipher-base/download/cipher-base-1.0.4.tgz", + "integrity": "sha1-h2Dk7MJy9MNjUy+SbYdKriwTl94=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "http://registry.npm.taobao.org/class-utils/download/class-utils-0.3.6.tgz", + "integrity": "sha1-+TNprouafOAv1B+q0MqDAzGQxGM=", + "dev": true, + "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": "http://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "clean-css": { + "version": "4.2.1", + "resolved": "http://registry.npm.taobao.org/clean-css/download/clean-css-4.2.1.tgz", + "integrity": "sha1-LUEe92uFabbQyEBo2r6FsKpeXBc=", + "dev": true, + "requires": { + "source-map": "~0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "http://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npm.taobao.org/cliui/download/cliui-5.0.0.tgz", + "integrity": "sha1-3u/P2y6AB4SqNPRvoI4GhRx7u8U=", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "http://registry.npm.taobao.org/code-point-at/download/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/collection-visit/download/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "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?cache=0&sync_timestamp=1566248756583&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcolor-convert%2Fdownload%2Fcolor-convert-1.9.3.tgz", + "integrity": "sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg=", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "http://registry.npm.taobao.org/color-name/download/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "commander": { + "version": "2.20.1", + "resolved": "https://registry.npm.taobao.org/commander/download/commander-2.20.1.tgz", + "integrity": "sha1-OGPOPKktCDHc8qEC9ftLWSav0Pk=", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/commondir/download/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npm.taobao.org/component-emitter/download/component-emitter-1.3.0.tgz", + "integrity": "sha1-FuQHD7qK4ptnnyIVhT7hgasuq8A=", + "dev": true + }, + "compressible": { + "version": "2.0.17", + "resolved": "https://registry.npm.taobao.org/compressible/download/compressible-2.0.17.tgz", + "integrity": "sha1-bowQihatWDhKl386SCyiC/8vOME=", + "dev": true, + "requires": { + "mime-db": ">= 1.40.0 < 2" + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npm.taobao.org/compression/download/compression-1.7.4.tgz", + "integrity": "sha1-lVI+/xcMpXwpoMpB5v4TH0Hlu48=", + "dev": true, + "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" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "http://registry.npm.taobao.org/concat-map/download/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "http://registry.npm.taobao.org/concat-stream/download/concat-stream-1.6.2.tgz", + "integrity": "sha1-kEvfGUzTEi/Gdcd/xKw9T/D9GjQ=", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npm.taobao.org/connect-history-api-fallback/download/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha1-izIIk1kwjRERFdgcrT/Oq4iPl7w=", + "dev": true + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "http://registry.npm.taobao.org/console-browserify/download/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "dev": true, + "requires": { + "date-now": "^0.1.4" + } + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/constants-browserify/download/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npm.taobao.org/content-disposition/download/content-disposition-0.5.3.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcontent-disposition%2Fdownload%2Fcontent-disposition-0.5.3.tgz", + "integrity": "sha1-4TDK9+cnkIfFYWwgB9BIVpiYT70=", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "http://registry.npm.taobao.org/content-type/download/content-type-1.0.4.tgz", + "integrity": "sha1-4TjMdeBAxyexlm/l5fjJruJW/js=", + "dev": true + }, + "convert-source-map": { + "version": "1.6.0", + "resolved": "https://registry.npm.taobao.org/convert-source-map/download/convert-source-map-1.6.0.tgz", + "integrity": "sha1-UbU3qMQ+DwTewZk7/83VBOdYrCA=", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npm.taobao.org/cookie/download/cookie-0.4.0.tgz", + "integrity": "sha1-vrQ35wIrO21JAZ0IhmUwPr6cFLo=", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "http://registry.npm.taobao.org/cookie-signature/download/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "http://registry.npm.taobao.org/copy-concurrently/download/copy-concurrently-1.0.5.tgz", + "integrity": "sha1-kilzmMrjSTf8r9bsgTnBgFHwteA=", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "http://registry.npm.taobao.org/copy-descriptor/download/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "core-js-compat": { + "version": "3.2.1", + "resolved": "https://registry.npm.taobao.org/core-js-compat/download/core-js-compat-3.2.1.tgz", + "integrity": "sha1-DL28LjhujgDTuF3IHISO/+xbgVA=", + "dev": true, + "requires": { + "browserslist": "^4.6.6", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz?cache=0&sync_timestamp=1565627380363&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-6.3.0.tgz", + "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=", + "dev": true + } + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "http://registry.npm.taobao.org/core-util-is/download/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "create-ecdh": { + "version": "4.0.3", + "resolved": "http://registry.npm.taobao.org/create-ecdh/download/create-ecdh-4.0.3.tgz", + "integrity": "sha1-yREbbzMEXEaX8UR4f5JUzcd8Rf8=", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "http://registry.npm.taobao.org/create-hash/download/create-hash-1.2.0.tgz", + "integrity": "sha1-iJB4rxGmN1a8+1m9IhmWvjqe8ZY=", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "http://registry.npm.taobao.org/create-hmac/download/create-hmac-1.1.7.tgz", + "integrity": "sha1-aRcMeLOrlXFHsriwRXLkfq0iQ/8=", + "dev": true, + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npm.taobao.org/cross-spawn/download/cross-spawn-6.0.5.tgz?cache=0&sync_timestamp=1567511208574&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcross-spawn%2Fdownload%2Fcross-spawn-6.0.5.tgz", + "integrity": "sha1-Sl7Hxk364iw6FBJNus3uhG2Ay8Q=", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "http://registry.npm.taobao.org/crypto-browserify/download/crypto-browserify-3.12.0.tgz", + "integrity": "sha1-OWz58xN/A+S45TLFj2mCVOAPgOw=", + "dev": true, + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "css-select": { + "version": "1.2.0", + "resolved": "http://registry.npm.taobao.org/css-select/download/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "dev": true, + "requires": { + "boolbase": "~1.0.0", + "css-what": "2.1", + "domutils": "1.5.1", + "nth-check": "~1.0.1" + } + }, + "css-what": { + "version": "2.1.3", + "resolved": "https://registry.npm.taobao.org/css-what/download/css-what-2.1.3.tgz", + "integrity": "sha1-ptdgRXM2X+dGhsPzEcVlE9iChfI=", + "dev": true + }, + "cyclist": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/cyclist/download/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", + "dev": true + }, + "date-now": { + "version": "0.1.4", + "resolved": "http://registry.npm.taobao.org/date-now/download/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "http://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/decamelize/download/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "http://registry.npm.taobao.org/decode-uri-component/download/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/deep-equal/download/deep-equal-1.1.0.tgz", + "integrity": "sha1-MQPN+KttMs9KjfeGVFjyuNM/N0U=", + "dev": true, + "requires": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + } + }, + "default-gateway": { + "version": "4.2.0", + "resolved": "https://registry.npm.taobao.org/default-gateway/download/default-gateway-4.2.0.tgz", + "integrity": "sha1-FnEEx1AMIRX23WmwpTa7jtcgVSs=", + "dev": true, + "requires": { + "execa": "^1.0.0", + "ip-regex": "^2.1.0" + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "http://registry.npm.taobao.org/define-properties/download/define-properties-1.1.3.tgz", + "integrity": "sha1-z4jabL7ib+bbcJT2HYcMvYTO6fE=", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "http://registry.npm.taobao.org/define-property/download/define-property-2.0.2.tgz", + "integrity": "sha1-1Flono1lS6d+AqgX+HENcCyxbp0=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz", + "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "http://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz", + "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "del": { + "version": "4.1.1", + "resolved": "https://registry.npm.taobao.org/del/download/del-4.1.1.tgz", + "integrity": "sha1-no8RciLqRKMf86FWwEm5kFKp8LQ=", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + } + }, + "depd": { + "version": "1.1.2", + "resolved": "http://registry.npm.taobao.org/depd/download/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "des.js": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/des.js/download/des.js-1.0.0.tgz", + "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "destroy": { + "version": "1.0.4", + "resolved": "http://registry.npm.taobao.org/destroy/download/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "detect-file": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/detect-file/download/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "dev": true + }, + "detect-node": { + "version": "2.0.4", + "resolved": "https://registry.npm.taobao.org/detect-node/download/detect-node-2.0.4.tgz", + "integrity": "sha1-AU7o+PZpxcWAI9pkuBecCDooxGw=", + "dev": true + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "http://registry.npm.taobao.org/diffie-hellman/download/diffie-hellman-5.0.3.tgz", + "integrity": "sha1-QOjumPVaIUlgcUaSHGPhrl89KHU=", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/dns-equal/download/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "dev": true + }, + "dns-packet": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", + "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", + "dev": true, + "requires": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npm.taobao.org/dns-txt/download/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "dev": true, + "requires": { + "buffer-indexof": "^1.0.0" + } + }, + "dom-converter": { + "version": "0.2.0", + "resolved": "http://registry.npm.taobao.org/dom-converter/download/dom-converter-0.2.0.tgz", + "integrity": "sha1-ZyGp2u4uKTaClVtq/kFncWJ7t2g=", + "dev": true, + "requires": { + "utila": "~0.4" + } + }, + "dom-serializer": { + "version": "0.2.1", + "resolved": "https://registry.npm.taobao.org/dom-serializer/download/dom-serializer-0.2.1.tgz", + "integrity": "sha1-E2UMhQ2v/qNdi2JqTPxNOhdkP9s=", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/domelementtype/download/domelementtype-2.0.1.tgz", + "integrity": "sha1-H4vf6R9aeAYydOgDtL3O326U+U0=", + "dev": true + } + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "http://registry.npm.taobao.org/domain-browser/download/domain-browser-1.2.0.tgz", + "integrity": "sha1-PTH1AZGmdJ3RN1p/Ui6CPULlTto=", + "dev": true + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npm.taobao.org/domelementtype/download/domelementtype-1.3.1.tgz", + "integrity": "sha1-0EjESzew0Qp/Kj1f7j9DM9eQSB8=", + "dev": true + }, + "domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npm.taobao.org/domhandler/download/domhandler-2.4.2.tgz", + "integrity": "sha1-iAUJfpM9ZehVRvcm1g9euItE+AM=", + "dev": true, + "requires": { + "domelementtype": "1" + } + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npm.taobao.org/domutils/download/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npm.taobao.org/duplexify/download/duplexify-3.7.1.tgz", + "integrity": "sha1-Kk31MX9sz9kfhtb9JdjYoQO4gwk=", + "dev": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "http://registry.npm.taobao.org/ee-first/download/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "elliptic": { + "version": "6.5.1", + "resolved": "https://registry.npm.taobao.org/elliptic/download/elliptic-6.5.1.tgz?cache=0&sync_timestamp=1567592249994&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Felliptic%2Fdownload%2Felliptic-6.5.1.tgz", + "integrity": "sha1-w4D1+Qm/G5tEKNAozRjTsO/WtSs=", + "dev": true, + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npm.taobao.org/emoji-regex/download/emoji-regex-7.0.3.tgz", + "integrity": "sha1-kzoEBShgyF6DwSJHnEdIqOTHIVY=", + "dev": true + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/emojis-list/download/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "http://registry.npm.taobao.org/encodeurl/download/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npm.taobao.org/end-of-stream/download/end-of-stream-1.4.4.tgz?cache=0&sync_timestamp=1569416272686&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fend-of-stream%2Fdownload%2Fend-of-stream-1.4.4.tgz", + "integrity": "sha1-WuZKX0UFe682JuwU2gyl5LJDHrA=", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "enhanced-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npm.taobao.org/enhanced-resolve/download/enhanced-resolve-4.1.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fenhanced-resolve%2Fdownload%2Fenhanced-resolve-4.1.0.tgz", + "integrity": "sha1-Qcfgv9/nSsH/4eV61qXGyfN0Kn8=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "tapable": "^1.0.0" + } + }, + "entities": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/entities/download/entities-2.0.0.tgz?cache=0&sync_timestamp=1563403318326&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fentities%2Fdownload%2Fentities-2.0.0.tgz", + "integrity": "sha1-aNYITKsbB5dnVA2A5Wo5tCPkq/Q=", + "dev": true + }, + "errno": { + "version": "0.1.7", + "resolved": "http://registry.npm.taobao.org/errno/download/errno-0.1.7.tgz", + "integrity": "sha1-RoTXF3mtOa8Xfj8AeZb3xnyFJhg=", + "dev": true, + "requires": { + "prr": "~1.0.1" + } + }, + "es-abstract": { + "version": "1.14.2", + "resolved": "https://registry.npm.taobao.org/es-abstract/download/es-abstract-1.14.2.tgz", + "integrity": "sha1-fOEI+tgwaMh4PDzfYuUE4ITYxJc=", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.0", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.0", + "is-callable": "^1.1.4", + "is-regex": "^1.0.4", + "object-inspect": "^1.6.0", + "object-keys": "^1.1.1", + "string.prototype.trimleft": "^2.0.0", + "string.prototype.trimright": "^2.0.0" + } + }, + "es-to-primitive": { + "version": "1.2.0", + "resolved": "http://registry.npm.taobao.org/es-to-primitive/download/es-to-primitive-1.2.0.tgz", + "integrity": "sha1-7fckeAM0VujdqO8J4ArZZQcH83c=", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-html": { + "version": "1.0.3", + "resolved": "http://registry.npm.taobao.org/escape-html/download/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "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=", + "dev": true + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npm.taobao.org/eslint-scope/download/eslint-scope-4.0.3.tgz?cache=0&sync_timestamp=1563679289211&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Feslint-scope%2Fdownload%2Feslint-scope-4.0.3.tgz", + "integrity": "sha1-ygODMxD2iJoyZHgaqC5j65z+eEg=", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "http://registry.npm.taobao.org/esrecurse/download/esrecurse-4.2.1.tgz", + "integrity": "sha1-AHo7n9vCs7uH5IeeoZyS/b05Qs8=", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npm.taobao.org/estraverse/download/estraverse-4.3.0.tgz", + "integrity": "sha1-OYrT88WiSUi+dyXoPRGn3ijNvR0=", + "dev": true + }, + "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": "http://registry.npm.taobao.org/etag/download/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, + "eventemitter3": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/eventemitter3/download/eventemitter3-4.0.0.tgz", + "integrity": "sha1-1lF2FjiH7lnzhtZMgmELaWpKdOs=", + "dev": true + }, + "events": { + "version": "3.0.0", + "resolved": "http://registry.npm.taobao.org/events/download/events-3.0.0.tgz", + "integrity": "sha1-mgoN+vYok9krh1uPJpjKQRSXPog=", + "dev": true + }, + "eventsource": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.1.1.tgz", + "integrity": "sha512-qV5ZC0h7jYIAOhArFJgSfdyz6rALJyb270714o7ZtNnw2WSJ+eexhKtE0O8LYPRsHZHf2osHKZBxGPvm3kPkCA==", + "dev": true, + "requires": { + "original": "^1.0.0" + } + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "http://registry.npm.taobao.org/evp_bytestokey/download/evp_bytestokey-1.0.3.tgz", + "integrity": "sha1-f8vbGY3HGVlDLv4ThCaE4FJaywI=", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/execa/download/execa-1.0.0.tgz", + "integrity": "sha1-xiNqW7TfbW8V6I5/AXeYIWdJ3dg=", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "http://registry.npm.taobao.org/expand-brackets/download/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "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": { + "define-property": { + "version": "0.2.5", + "resolved": "http://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "http://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "http://registry.npm.taobao.org/expand-tilde/download/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npm.taobao.org/express/download/express-4.17.1.tgz", + "integrity": "sha1-RJH8OGBc9R+GKdOcK10Cb5ikwTQ=", + "dev": true, + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "array-flatten": { + "version": "1.1.1", + "resolved": "http://registry.npm.taobao.org/array-flatten/download/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + } + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "http://registry.npm.taobao.org/extend-shallow/download/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/is-extendable/download/is-extendable-1.0.1.tgz", + "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "http://registry.npm.taobao.org/extglob/download/extglob-2.0.4.tgz", + "integrity": "sha1-rQD+TcYSqSMuhxhxHcXLWrAoVUM=", + "dev": true, + "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": "http://registry.npm.taobao.org/define-property/download/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "http://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz", + "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "http://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz", + "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "http://registry.npm.taobao.org/fast-json-stable-stringify/download/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "faye-websocket": { + "version": "0.10.0", + "resolved": "https://registry.npm.taobao.org/faye-websocket/download/faye-websocket-0.10.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffaye-websocket%2Fdownload%2Ffaye-websocket-0.10.0.tgz", + "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "figgy-pudding": { + "version": "3.5.1", + "resolved": "http://registry.npm.taobao.org/figgy-pudding/download/figgy-pudding-3.5.1.tgz", + "integrity": "sha1-hiRwESkBxyeg5JWoB0S9W6odZ5A=", + "dev": 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=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "http://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.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=", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + } + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/find-cache-dir/download/find-cache-dir-2.1.0.tgz", + "integrity": "sha1-jQ+UzRP+Q8bHwmGg2GEVypGMBfc=", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/find-up/download/find-up-3.0.0.tgz", + "integrity": "sha1-SRafHXmTQwZG2mHsxa41XCHJe3M=", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "findup-sync": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/findup-sync/download/findup-sync-3.0.0.tgz?cache=0&sync_timestamp=1563064157116&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffindup-sync%2Fdownload%2Ffindup-sync-3.0.0.tgz", + "integrity": "sha1-F7EI+e5RLft6XH88iyfqnhqcCNE=", + "dev": true, + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + } + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "http://registry.npm.taobao.org/flush-write-stream/download/flush-write-stream-1.1.1.tgz", + "integrity": "sha1-jdfYc6G6vCB9lOrQwuDkQnbr8ug=", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "follow-redirects": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", + "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==", + "dev": true + }, + "for-in": { + "version": "1.0.2", + "resolved": "http://registry.npm.taobao.org/for-in/download/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "forwarded": { + "version": "0.1.2", + "resolved": "http://registry.npm.taobao.org/forwarded/download/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "http://registry.npm.taobao.org/fragment-cache/download/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "http://registry.npm.taobao.org/fresh/download/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, + "from2": { + "version": "2.3.0", + "resolved": "http://registry.npm.taobao.org/from2/download/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "fs-minipass": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.6.0" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "http://registry.npm.taobao.org/fs-write-stream-atomic/download/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/fs.realpath/download/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "1.2.9", + "resolved": "https://registry.npm.taobao.org/fsevents/download/fsevents-1.2.9.tgz", + "integrity": "sha1-P17WZYPM1vQAtaANtvfoYTY+OI8=", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.12.1", + "node-pre-gyp": "^0.12.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.1", + "bundled": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.3", + "bundled": true, + "dev": true, + "optional": true, + "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" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true, + "optional": true + }, + "minipass": { + "version": "2.3.5", + "bundled": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.2.1", + "bundled": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.3.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^4.1.0", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.12.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "optional": true, + "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" + } + }, + "rimraf": { + "version": "2.6.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.7.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "yallist": { + "version": "3.0.3", + "bundled": true, + "optional": true + } + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "http://registry.npm.taobao.org/function-bind/download/function-bind-1.1.1.tgz", + "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "http://registry.npm.taobao.org/get-caller-file/download/get-caller-file-2.0.5.tgz", + "integrity": "sha1-T5RBKoLbMvNuOwuXQfipf+sDH34=", + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npm.taobao.org/get-stream/download/get-stream-4.1.0.tgz", + "integrity": "sha1-wbJVV189wh1Zv8ec09K0axw6VLU=", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "http://registry.npm.taobao.org/get-value/download/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npm.taobao.org/glob/download/glob-7.1.4.tgz", + "integrity": "sha1-qmCKL2xXetNX4a5aXCbZqNGWklU=", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "global-modules": { + "version": "2.0.0", + "resolved": "http://registry.npm.taobao.org/global-modules/download/global-modules-2.0.0.tgz", + "integrity": "sha1-mXYFrSNF8n9RU5vqJldEISFcd4A=", + "dev": true, + "requires": { + "global-prefix": "^3.0.0" + }, + "dependencies": { + "global-prefix": { + "version": "3.0.0", + "resolved": "http://registry.npm.taobao.org/global-prefix/download/global-prefix-3.0.0.tgz", + "integrity": "sha1-/IX3MGTfafUEIfR/iD/luRO6m5c=", + "dev": true, + "requires": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + } + } + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "http://registry.npm.taobao.org/global-prefix/download/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npm.taobao.org/globals/download/globals-11.12.0.tgz?cache=0&sync_timestamp=1568452081683&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fglobals%2Fdownload%2Fglobals-11.12.0.tgz", + "integrity": "sha1-q4eVM4hooLq9hSV1gBjCp+uVxC4=", + "dev": true + }, + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npm.taobao.org/globby/download/globby-6.1.0.tgz?cache=0&sync_timestamp=1562307970751&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fglobby%2Fdownload%2Fglobby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "http://registry.npm.taobao.org/pify/download/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "graceful-fs": { + "version": "4.2.2", + "resolved": "https://registry.npm.taobao.org/graceful-fs/download/graceful-fs-4.2.2.tgz", + "integrity": "sha1-bwlSYF0BQMHP2xOO0AV3W5LWewI=", + "dev": true + }, + "handle-thing": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/handle-thing/download/handle-thing-2.0.0.tgz", + "integrity": "sha1-DgOWlf9QyT/CiFV9aW88HcZ3Z1Q=", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "http://registry.npm.taobao.org/has/download/has-1.0.3.tgz", + "integrity": "sha1-ci18v8H2qoJB8W3YFOAR4fQeh5Y=", + "dev": true, + "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=", + "dev": true + }, + "has-symbols": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/has-symbols/download/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/has-value/download/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/has-values/download/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hash-base": { + "version": "3.0.4", + "resolved": "http://registry.npm.taobao.org/hash-base/download/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "http://registry.npm.taobao.org/hash.js/download/hash.js-1.1.7.tgz", + "integrity": "sha1-C6vKU46NTuSg+JiNaIZlN6ADz0I=", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "he": { + "version": "1.2.0", + "resolved": "http://registry.npm.taobao.org/he/download/he-1.2.0.tgz", + "integrity": "sha1-hK5l+n6vsWX922FWauFLrwVmTw8=", + "dev": true + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/hmac-drbg/download/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "http://registry.npm.taobao.org/homedir-polyfill/download/homedir-polyfill-1.0.3.tgz", + "integrity": "sha1-dDKYzvTlrz4ZQWH7rcwhUdOgWOg=", + "dev": true, + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npm.taobao.org/hpack.js/download/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "html-entities": { + "version": "1.2.1", + "resolved": "https://registry.npm.taobao.org/html-entities/download/html-entities-1.2.1.tgz", + "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", + "dev": true + }, + "html-minifier": { + "version": "3.5.21", + "resolved": "https://registry.npm.taobao.org/html-minifier/download/html-minifier-3.5.21.tgz", + "integrity": "sha1-0AQOBUcw41TbAIRjWTGUAVIS0gw=", + "dev": true, + "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": { + "commander": { + "version": "2.17.1", + "resolved": "https://registry.npm.taobao.org/commander/download/commander-2.17.1.tgz", + "integrity": "sha1-vXerfebelCBc6sxy8XFtKfIKd78=", + "dev": true + } + } + }, + "html-webpack-plugin": { + "version": "3.2.0", + "resolved": "https://registry.npm.taobao.org/html-webpack-plugin/download/html-webpack-plugin-3.2.0.tgz?cache=0&sync_timestamp=1563437816811&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhtml-webpack-plugin%2Fdownload%2Fhtml-webpack-plugin-3.2.0.tgz", + "integrity": "sha1-sBq71yOsqqeze2r0SS69oD2d03s=", + "dev": true, + "requires": { + "html-minifier": "^3.2.3", + "loader-utils": "^0.2.16", + "lodash": "^4.17.3", + "pretty-error": "^2.0.2", + "tapable": "^1.0.0", + "toposort": "^1.0.0", + "util.promisify": "1.0.0" + }, + "dependencies": { + "big.js": { + "version": "3.2.0", + "resolved": "http://registry.npm.taobao.org/big.js/download/big.js-3.2.0.tgz", + "integrity": "sha1-pfwpi4G54Nyi5FiCR4S2XFK6WI4=", + "dev": true + }, + "json5": { + "version": "0.5.1", + "resolved": "http://registry.npm.taobao.org/json5/download/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "loader-utils": { + "version": "0.2.17", + "resolved": "http://registry.npm.taobao.org/loader-utils/download/loader-utils-0.2.17.tgz", + "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "dev": true, + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" + } + } + } + }, + "htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npm.taobao.org/htmlparser2/download/htmlparser2-3.10.1.tgz", + "integrity": "sha1-vWedw/WYl7ajS7EHSchVu1OpOS8=", + "dev": true, + "requires": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + }, + "dependencies": { + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/entities/download/entities-1.1.2.tgz?cache=0&sync_timestamp=1563403318326&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fentities%2Fdownload%2Fentities-1.1.2.tgz", + "integrity": "sha1-vfpzUplmTfr9NFKe1PhSKidf6lY=", + "dev": true + }, + "readable-stream": { + "version": "3.4.0", + "resolved": "https://registry.npm.taobao.org/readable-stream/download/readable-stream-3.4.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Freadable-stream%2Fdownload%2Freadable-stream-3.4.0.tgz", + "integrity": "sha1-pRwmdUZY4KPCHb9ZFjvUW6b0R/w=", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npm.taobao.org/http-deceiver/download/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "dev": true + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npm.taobao.org/http-errors/download/http-errors-1.7.2.tgz?cache=0&sync_timestamp=1561418493658&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhttp-errors%2Fdownload%2Fhttp-errors-1.7.2.tgz", + "integrity": "sha1-T1ApzxMjnzEDblsuVSkrz7zIXI8=", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npm.taobao.org/inherits/download/inherits-2.0.3.tgz?cache=0&sync_timestamp=1560975547815&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Finherits%2Fdownload%2Finherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "http-parser-js": { + "version": "0.4.10", + "resolved": "https://registry.npm.taobao.org/http-parser-js/download/http-parser-js-0.4.10.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhttp-parser-js%2Fdownload%2Fhttp-parser-js-0.4.10.tgz", + "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=", + "dev": true + }, + "http-proxy": { + "version": "1.18.0", + "resolved": "https://registry.npm.taobao.org/http-proxy/download/http-proxy-1.18.0.tgz?cache=0&sync_timestamp=1568770934756&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhttp-proxy%2Fdownload%2Fhttp-proxy-1.18.0.tgz", + "integrity": "sha1-2+VfY+daNH2389mZdPJpKjFKajo=", + "dev": true, + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-middleware": { + "version": "0.19.1", + "resolved": "https://registry.npm.taobao.org/http-proxy-middleware/download/http-proxy-middleware-0.19.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhttp-proxy-middleware%2Fdownload%2Fhttp-proxy-middleware-0.19.1.tgz", + "integrity": "sha1-GDx9xKoUeRUDBkmMIQza+WCApDo=", + "dev": true, + "requires": { + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/https-browserify/download/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "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=", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npm.taobao.org/ieee754/download/ieee754-1.1.13.tgz", + "integrity": "sha1-7BaFWOlaoYH9h9N/VcMrvLZwi4Q=", + "dev": true + }, + "iferr": { + "version": "0.1.5", + "resolved": "http://registry.npm.taobao.org/iferr/download/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/import-local/download/import-local-2.0.0.tgz", + "integrity": "sha1-VQcL44pZk88Y72236WH1vuXFoJ0=", + "dev": true, + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "http://registry.npm.taobao.org/imurmurhash/download/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npm.taobao.org/infer-owner/download/infer-owner-1.0.4.tgz", + "integrity": "sha1-xM78qo5RBRwqQLos6KPScpWvlGc=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "http://registry.npm.taobao.org/inflight/download/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npm.taobao.org/inherits/download/inherits-2.0.4.tgz?cache=0&sync_timestamp=1560975547815&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Finherits%2Fdownload%2Finherits-2.0.4.tgz", + "integrity": "sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w=", + "dev": true + }, + "ini": { + "version": "1.3.5", + "resolved": "http://registry.npm.taobao.org/ini/download/ini-1.3.5.tgz", + "integrity": "sha1-7uJfVtscnsYIXgwid4CD9Zar+Sc=", + "dev": true + }, + "internal-ip": { + "version": "4.3.0", + "resolved": "https://registry.npm.taobao.org/internal-ip/download/internal-ip-4.3.0.tgz", + "integrity": "sha1-hFRSuq2dLKO2nGNaE3rLmg2tCQc=", + "dev": true, + "requires": { + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" + } + }, + "interpret": { + "version": "1.2.0", + "resolved": "http://registry.npm.taobao.org/interpret/download/interpret-1.2.0.tgz", + "integrity": "sha1-1QYaYiS+WOgIOYX1AU2EQ1lXYpY=", + "dev": true + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npm.taobao.org/invariant/download/invariant-2.2.4.tgz", + "integrity": "sha1-YQ88ksk1nOHbYW5TgAjSP/NRWOY=", + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/invert-kv/download/invert-kv-2.0.0.tgz", + "integrity": "sha1-c5P1r6Weyf9fZ6J2INEcIm4+7AI=", + "dev": true + }, + "ip": { + "version": "1.1.5", + "resolved": "http://registry.npm.taobao.org/ip/download/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true + }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/ip-regex/download/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "dev": true + }, + "ipaddr.js": { + "version": "1.9.0", + "resolved": "https://registry.npm.taobao.org/ipaddr.js/download/ipaddr.js-1.9.0.tgz", + "integrity": "sha1-N9905DCg5HVQ/lSi3v4w2KzZX2U=", + "dev": true + }, + "is-absolute-url": { + "version": "3.0.3", + "resolved": "https://registry.npm.taobao.org/is-absolute-url/download/is-absolute-url-3.0.3.tgz?cache=0&sync_timestamp=1569735737284&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-absolute-url%2Fdownload%2Fis-absolute-url-3.0.3.tgz", + "integrity": "sha1-lsaiK2ojkpsR6gr7GDbDatSl1pg=", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "http://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-arguments": { + "version": "1.0.4", + "resolved": "https://registry.npm.taobao.org/is-arguments/download/is-arguments-1.0.4.tgz", + "integrity": "sha1-P6+WbHy6D/Q3+zH2JQCC/PBEjPM=", + "dev": true + }, + "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=", + "dev": true, + "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=1569905349018&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-buffer%2Fdownload%2Fis-buffer-1.1.6.tgz", + "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=", + "dev": true + }, + "is-callable": { + "version": "1.1.4", + "resolved": "http://registry.npm.taobao.org/is-callable/download/is-callable-1.1.4.tgz", + "integrity": "sha1-HhrfIZ4e62hNaR+dagX/DTCiTXU=", + "dev": true + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "http://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-date-object": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/is-date-object/download/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "http://registry.npm.taobao.org/is-descriptor/download/is-descriptor-0.1.6.tgz", + "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", + "dev": true, + "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": "http://registry.npm.taobao.org/kind-of/download/kind-of-5.1.0.tgz", + "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=", + "dev": true + } + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "http://registry.npm.taobao.org/is-extendable/download/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "http://registry.npm.taobao.org/is-extglob/download/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "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=", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npm.taobao.org/is-glob/download/is-glob-4.0.1.tgz", + "integrity": "sha1-dWfb6fL14kZ7x3q4PEopSCQHpdw=", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "http://registry.npm.taobao.org/is-number/download/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npm.taobao.org/is-path-cwd/download/is-path-cwd-2.2.0.tgz", + "integrity": "sha1-Z9Q7gmZKe1GR/ZEZEn6zAASKn9s=", + "dev": true + }, + "is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/is-path-in-cwd/download/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha1-v+Lcomxp85cmWkAJljYCk1oFOss=", + "dev": true, + "requires": { + "is-path-inside": "^2.1.0" + } + }, + "is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/is-path-inside/download/is-path-inside-2.1.0.tgz", + "integrity": "sha1-fJgQWH1lmkDSe8201WFuqwWUlLI=", + "dev": true, + "requires": { + "path-is-inside": "^1.0.2" + } + }, + "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=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-regex": { + "version": "1.0.4", + "resolved": "http://registry.npm.taobao.org/is-regex/download/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "requires": { + "has": "^1.0.1" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/is-stream/download/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-symbol": { + "version": "1.0.2", + "resolved": "http://registry.npm.taobao.org/is-symbol/download/is-symbol-1.0.2.tgz", + "integrity": "sha1-oFX2rlcZLK7jKeeoYBGLSXqVDzg=", + "dev": true, + "requires": { + "has-symbols": "^1.0.0" + } + }, + "is-windows": { + "version": "1.0.2", + "resolved": "http://registry.npm.taobao.org/is-windows/download/is-windows-1.0.2.tgz", + "integrity": "sha1-0YUOuXkezRjmGCzhKjDzlmNLsZ0=", + "dev": true + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/is-wsl/download/is-wsl-1.1.0.tgz?cache=0&sync_timestamp=1569219622778&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-wsl%2Fdownload%2Fis-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz?cache=0&sync_timestamp=1562592125418&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fisarray%2Fdownload%2Fisarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "http://registry.npm.taobao.org/isexe/download/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npm.taobao.org/isobject/download/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "js-levenshtein": { + "version": "1.1.6", + "resolved": "https://registry.npm.taobao.org/js-levenshtein/download/js-levenshtein-1.1.6.tgz", + "integrity": "sha1-xs7ljrNVA3LfjeuF+tXOZs4B1Z0=", + "dev": true + }, + "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=", + "dev": true + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npm.taobao.org/jsesc/download/jsesc-2.5.2.tgz", + "integrity": "sha1-gFZNLkg9rPbo7yCWUKZ98/DCg6Q=", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "http://registry.npm.taobao.org/json-parse-better-errors/download/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha1-u4Z8+zRQ5pEHwTHRxRS6s9yLyqk=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "http://registry.npm.taobao.org/json-schema-traverse/download/json-schema-traverse-0.4.1.tgz", + "integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA=", + "dev": true + }, + "json3": { + "version": "3.3.3", + "resolved": "https://registry.npm.taobao.org/json3/download/json3-3.3.3.tgz", + "integrity": "sha1-f8EON1/FrkLEcFpcwKpvYr4wW4E=", + "dev": true + }, + "json5": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/json5/download/json5-1.0.1.tgz", + "integrity": "sha1-d5+wAYYE+oVOrL9iUhgNg1Q+Pb4=", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "killable": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/killable/download/killable-1.0.1.tgz", + "integrity": "sha1-TIzkQRh6Bhx0dPuHygjipjgZSJI=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-6.0.2.tgz", + "integrity": "sha1-ARRrNqYhjmTljzqNZt5df8b20FE=", + "dev": true + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/lcid/download/lcid-2.0.0.tgz", + "integrity": "sha1-bvXS32DlL4LrIopMNz6NHzlyU88=", + "dev": true, + "requires": { + "invert-kv": "^2.0.0" + } + }, + "loader-runner": { + "version": "2.4.0", + "resolved": "http://registry.npm.taobao.org/loader-runner/download/loader-runner-2.4.0.tgz", + "integrity": "sha1-7UcGa/5TTX6ExMe5mYwqdWB9k1c=", + "dev": true + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "http://registry.npm.taobao.org/loader-utils/download/loader-utils-1.2.3.tgz", + "integrity": "sha1-H/XcaRHJ8KBiUxpMBLYJQGEIwsc=", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/locate-path/download/locate-path-3.0.0.tgz", + "integrity": "sha1-2+w7OrdZdYBxtY/ln8QYca8hQA4=", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "loglevel": { + "version": "1.6.4", + "resolved": "https://registry.npm.taobao.org/loglevel/download/loglevel-1.6.4.tgz", + "integrity": "sha1-9Aj08Abbg1TQV33PbTNIWzy5DVY=", + "dev": true + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npm.taobao.org/loose-envify/download/loose-envify-1.4.0.tgz", + "integrity": "sha1-ce5R+nvkyuwaY4OffmgtgTLTDK8=", + "dev": true, + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "lower-case": { + "version": "1.1.4", + "resolved": "http://registry.npm.taobao.org/lower-case/download/lower-case-1.1.4.tgz", + "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", + "dev": true + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "http://registry.npm.taobao.org/lru-cache/download/lru-cache-5.1.1.tgz", + "integrity": "sha1-HaJ+ZxAnGUdpXa9oSOhH8B2EuSA=", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/make-dir/download/make-dir-2.1.0.tgz", + "integrity": "sha1-XwMQ4YuL6JjMBwCSlaMK5B6R5vU=", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "mamacro": { + "version": "0.0.3", + "resolved": "http://registry.npm.taobao.org/mamacro/download/mamacro-0.0.3.tgz", + "integrity": "sha1-rSyVdhl8nxq/MI0Hh4Zb2XWj8+Q=", + "dev": true + }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "http://registry.npm.taobao.org/map-age-cleaner/download/map-age-cleaner-0.1.3.tgz", + "integrity": "sha1-fVg6cwZDTAVf5HSw9FB45uG0uSo=", + "dev": true, + "requires": { + "p-defer": "^1.0.0" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "http://registry.npm.taobao.org/map-cache/download/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/map-visit/download/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "md5.js": { + "version": "1.3.5", + "resolved": "http://registry.npm.taobao.org/md5.js/download/md5.js-1.3.5.tgz", + "integrity": "sha1-tdB7jjIW4+J81yjXL3DR5qNCAF8=", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npm.taobao.org/media-typer/download/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "mem": { + "version": "4.3.0", + "resolved": "https://registry.npm.taobao.org/mem/download/mem-4.3.0.tgz", + "integrity": "sha1-Rhr0l7xK4JYIzbLmDu+2m/90QXg=", + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + } + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "http://registry.npm.taobao.org/memory-fs/download/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/merge-descriptors/download/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "http://registry.npm.taobao.org/methods/download/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npm.taobao.org/micromatch/download/micromatch-3.1.10.tgz", + "integrity": "sha1-cIWbyVyYQJUvNZoGij/En57PrCM=", + "dev": true, + "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" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "http://registry.npm.taobao.org/miller-rabin/download/miller-rabin-4.0.1.tgz", + "integrity": "sha1-8IA1HIZbDcViqEYpZtqlNUPHik0=", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npm.taobao.org/mime/download/mime-1.6.0.tgz?cache=0&sync_timestamp=1560034758817&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmime%2Fdownload%2Fmime-1.6.0.tgz", + "integrity": "sha1-Ms2eXGRVO9WNGaVor0Uqz/BJgbE=", + "dev": true + }, + "mime-db": { + "version": "1.40.0", + "resolved": "https://registry.npm.taobao.org/mime-db/download/mime-db-1.40.0.tgz", + "integrity": "sha1-plBX6ZjbCQ9zKmj2wnbTh9QSbDI=", + "dev": true + }, + "mime-types": { + "version": "2.1.24", + "resolved": "https://registry.npm.taobao.org/mime-types/download/mime-types-2.1.24.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmime-types%2Fdownload%2Fmime-types-2.1.24.tgz", + "integrity": "sha1-tvjQs+lR77d97eyhlM/20W9nb4E=", + "dev": true, + "requires": { + "mime-db": "1.40.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/mimic-fn/download/mimic-fn-2.1.0.tgz", + "integrity": "sha1-ftLCzMyvhNP/y3pptXcR/CCDQBs=", + "dev": true + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/minimalistic-assert/download/minimalistic-assert-1.0.1.tgz", + "integrity": "sha1-LhlN4ERibUoQ5/f7wAznPoPk1cc=", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/minimalistic-crypto-utils/download/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "http://registry.npm.taobao.org/minimatch/download/minimatch-3.0.4.tgz", + "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "http://registry.npm.taobao.org/minimist/download/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.9.0" + } + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/mississippi/download/mississippi-3.0.0.tgz", + "integrity": "sha1-6goykfl+C16HdrNj1fChLZTGcCI=", + "dev": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npm.taobao.org/mixin-deep/download/mixin-deep-1.3.2.tgz?cache=0&sync_timestamp=1561436244196&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmixin-deep%2Fdownload%2Fmixin-deep-1.3.2.tgz", + "integrity": "sha1-ESC0PcNZp4Xc5ltVuC4lfM9HlWY=", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/is-extendable/download/is-extendable-1.0.1.tgz", + "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "http://registry.npm.taobao.org/mkdirp/download/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "http://registry.npm.taobao.org/minimist/download/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + } + } + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/move-concurrently/download/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fms%2Fdownload%2Fms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npm.taobao.org/multicast-dns/download/multicast-dns-6.2.3.tgz", + "integrity": "sha1-oOx72QVcQoL3kMPIL04o2zsxsik=", + "dev": true, + "requires": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + } + }, + "multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/multicast-dns-service-types/download/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "dev": true + }, + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npm.taobao.org/nan/download/nan-2.14.0.tgz", + "integrity": "sha1-eBj3IgJ7JFmobwKV1DTR/CM2xSw=", + "dev": true, + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "http://registry.npm.taobao.org/nanomatch/download/nanomatch-1.2.13.tgz", + "integrity": "sha1-uHqKpPwN6P5r6IiVs4mD/yZb0Rk=", + "dev": true, + "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" + } + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npm.taobao.org/negotiator/download/negotiator-0.6.2.tgz", + "integrity": "sha1-/qz3zPUlp3rpY0Q2pkiD/+yjRvs=", + "dev": true + }, + "neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npm.taobao.org/neo-async/download/neo-async-2.6.1.tgz", + "integrity": "sha1-rCetpmFn+ohJpq3dg39rGJrSCBw=", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "resolved": "http://registry.npm.taobao.org/nice-try/download/nice-try-1.0.5.tgz", + "integrity": "sha1-ozeKdpbOfSI+iPybdkvX7xCJ42Y=", + "dev": true + }, + "no-case": { + "version": "2.3.2", + "resolved": "http://registry.npm.taobao.org/no-case/download/no-case-2.3.2.tgz", + "integrity": "sha1-YLgTOWvjmz8SiKTB7V0efSi0ZKw=", + "dev": true, + "requires": { + "lower-case": "^1.1.1" + } + }, + "node-forge": { + "version": "0.8.2", + "resolved": "https://registry.npm.taobao.org/node-forge/download/node-forge-0.8.2.tgz?cache=0&sync_timestamp=1569552454213&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnode-forge%2Fdownload%2Fnode-forge-0.8.2.tgz", + "integrity": "sha1-tLzFn7Es53qIJfxqeD3+MYJJnFo=", + "dev": true + }, + "node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npm.taobao.org/node-libs-browser/download/node-libs-browser-2.2.1.tgz", + "integrity": "sha1-tk9RPRgzhiX5A0bSew0jXmMfZCU=", + "dev": true, + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "http://registry.npm.taobao.org/punycode/download/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "http://registry.npm.taobao.org/normalize-path/download/normalize-path-3.0.0.tgz", + "integrity": "sha1-Dc1p/yOhybEf0JeDFmRKA4ghamU=", + "dev": true + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npm.taobao.org/npm-run-path/download/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "nth-check": { + "version": "1.0.2", + "resolved": "http://registry.npm.taobao.org/nth-check/download/nth-check-1.0.2.tgz", + "integrity": "sha1-sr0pXDfj3VijvwcAN2Zjuk2c8Fw=", + "dev": true, + "requires": { + "boolbase": "~1.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/number-is-nan/download/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "http://registry.npm.taobao.org/object-assign/download/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "http://registry.npm.taobao.org/object-copy/download/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "http://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-inspect": { + "version": "1.6.0", + "resolved": "https://registry.npm.taobao.org/object-inspect/download/object-inspect-1.6.0.tgz", + "integrity": "sha1-xwtsv3LydKq0w0wMgvUWe/gs8Vs=", + "dev": true + }, + "object-is": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/object-is/download/object-is-1.0.1.tgz", + "integrity": "sha1-CqYOyZiaCz7Xlc9NBvYs8a1lObY=", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/object-keys/download/object-keys-1.1.1.tgz", + "integrity": "sha1-HEfyct8nfzsdrwYWd9nILiMixg4=", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/object-visit/download/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npm.taobao.org/object.assign/download/object.assign-4.1.0.tgz", + "integrity": "sha1-lovxEA15Vrs8oIbwBvhGs7xACNo=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.getownpropertydescriptors": { + "version": "2.0.3", + "resolved": "http://registry.npm.taobao.org/object.getownpropertydescriptors/download/object.getownpropertydescriptors-2.0.3.tgz", + "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.5.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "http://registry.npm.taobao.org/object.pick/download/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/obuf/download/obuf-1.1.2.tgz", + "integrity": "sha1-Cb6jND1BhZ69RGKS0RydTbYZCE4=", + "dev": true + }, + "on-finished": { + "version": "2.3.0", + "resolved": "http://registry.npm.taobao.org/on-finished/download/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "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=", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "http://registry.npm.taobao.org/once/download/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "opn": { + "version": "5.5.0", + "resolved": "https://registry.npm.taobao.org/opn/download/opn-5.5.0.tgz", + "integrity": "sha1-/HFk+rVtI1kExRw7J9pnWMo7m/w=", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + } + }, + "original": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/original/download/original-1.0.2.tgz", + "integrity": "sha1-5EKmHP/hxf0gpl8yYcJmY7MD8l8=", + "dev": true, + "requires": { + "url-parse": "^1.4.3" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "http://registry.npm.taobao.org/os-browserify/download/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "os-locale": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/os-locale/download/os-locale-3.1.0.tgz?cache=0&sync_timestamp=1560274285880&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fos-locale%2Fdownload%2Fos-locale-3.1.0.tgz", + "integrity": "sha1-qAKm7hfyTBBIOrmTVxnO9O0Wvxo=", + "dev": true, + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/p-defer/download/p-defer-1.0.0.tgz?cache=0&sync_timestamp=1559922734651&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fp-defer%2Fdownload%2Fp-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/p-finally/download/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/p-is-promise/download/p-is-promise-2.1.0.tgz", + "integrity": "sha1-kYzrrqJIpiz3/6uOO8qMX4gvxC4=", + "dev": true + }, + "p-limit": { + "version": "2.2.1", + "resolved": "https://registry.npm.taobao.org/p-limit/download/p-limit-2.2.1.tgz", + "integrity": "sha1-qgeniMwxUck5tRMfY1cPDdIAlTc=", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/p-locate/download/p-locate-3.0.0.tgz", + "integrity": "sha1-Mi1poFwCZLJZl9n0DNiokasAZKQ=", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/p-map/download/p-map-2.1.0.tgz", + "integrity": "sha1-MQko/u+cnsxltosXaTAYpmXOoXU=", + "dev": true + }, + "p-retry": { + "version": "3.0.1", + "resolved": "https://registry.npm.taobao.org/p-retry/download/p-retry-3.0.1.tgz", + "integrity": "sha1-MWtMiJPiyNwc+okfQGxLQivr8yg=", + "dev": true, + "requires": { + "retry": "^0.12.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npm.taobao.org/p-try/download/p-try-2.2.0.tgz", + "integrity": "sha1-yyhoVA4xPWHeWPr741zpAE1VQOY=", + "dev": true + }, + "pako": { + "version": "1.0.10", + "resolved": "http://registry.npm.taobao.org/pako/download/pako-1.0.10.tgz", + "integrity": "sha1-Qyi621CGpCaqkPVBl31JVdpclzI=", + "dev": true + }, + "parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/parallel-transform/download/parallel-transform-1.2.0.tgz", + "integrity": "sha1-kEnKN9bLIYLDsdLHIL6U0UpYFPw=", + "dev": true, + "requires": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "param-case": { + "version": "2.1.1", + "resolved": "http://registry.npm.taobao.org/param-case/download/param-case-2.1.1.tgz", + "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", + "dev": true, + "requires": { + "no-case": "^2.2.0" + } + }, + "parse-asn1": { + "version": "5.1.5", + "resolved": "https://registry.npm.taobao.org/parse-asn1/download/parse-asn1-5.1.5.tgz", + "integrity": "sha1-ADJxND2ljclMrOSU+u89IUfs6g4=", + "dev": true, + "requires": { + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/parse-passwd/download/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npm.taobao.org/parseurl/download/parseurl-1.3.3.tgz", + "integrity": "sha1-naGee+6NEt/wUT7Vt2lXeTvC6NQ=", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npm.taobao.org/pascalcase/download/pascalcase-0.1.1.tgz?cache=0&sync_timestamp=1565253337239&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpascalcase%2Fdownload%2Fpascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-browserify": { + "version": "0.0.1", + "resolved": "http://registry.npm.taobao.org/path-browserify/download/path-browserify-0.0.1.tgz", + "integrity": "sha1-5sTd1+06onxoogzE5Q4aTug7vEo=", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "http://registry.npm.taobao.org/path-dirname/download/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/path-exists/download/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/path-is-absolute/download/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "http://registry.npm.taobao.org/path-is-inside/download/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/path-key/download/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npm.taobao.org/path-to-regexp/download/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "pbkdf2": { + "version": "3.0.17", + "resolved": "http://registry.npm.taobao.org/pbkdf2/download/pbkdf2-3.0.17.tgz", + "integrity": "sha1-l2wgZTBhexTrsyEUI597CTNuk6Y=", + "dev": true, + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "pify": { + "version": "4.0.1", + "resolved": "http://registry.npm.taobao.org/pify/download/pify-4.0.1.tgz", + "integrity": "sha1-SyzSXFDVmHNcUCkiJP2MbfQeMjE=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npm.taobao.org/pinkie/download/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "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=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/pkg-dir/download/pkg-dir-3.0.0.tgz", + "integrity": "sha1-J0kCDyOe2ZCIGx9xIQ1R62UjvqM=", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "portfinder": { + "version": "1.0.24", + "resolved": "https://registry.npm.taobao.org/portfinder/download/portfinder-1.0.24.tgz", + "integrity": "sha1-Ee+8aGXxLzdiS2Ux6tHYCe2WXPo=", + "dev": true, + "requires": { + "async": "^1.5.2", + "debug": "^2.2.0", + "mkdirp": "0.5.x" + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "http://registry.npm.taobao.org/posix-character-classes/download/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "pretty-error": { + "version": "2.1.1", + "resolved": "http://registry.npm.taobao.org/pretty-error/download/pretty-error-2.1.1.tgz", + "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", + "dev": true, + "requires": { + "renderkid": "^2.0.1", + "utila": "~0.4" + } + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npm.taobao.org/private/download/private-0.1.8.tgz", + "integrity": "sha1-I4Hts2ifelPWUxkAYPz4ItLzaP8=", + "dev": true + }, + "process": { + "version": "0.11.10", + "resolved": "http://registry.npm.taobao.org/process/download/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "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=", + "dev": true + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/promise-inflight/download/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "proxy-addr": { + "version": "2.0.5", + "resolved": "https://registry.npm.taobao.org/proxy-addr/download/proxy-addr-2.0.5.tgz", + "integrity": "sha1-NMvWSi2B9LH9IedvnwbIpFKZ7jQ=", + "dev": true, + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.0" + } + }, + "prr": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/prr/download/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "http://registry.npm.taobao.org/public-encrypt/download/public-encrypt-4.0.3.tgz", + "integrity": "sha1-T8ydd6B+SLp1J+fL4N4z0HATMeA=", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "pump": { + "version": "3.0.0", + "resolved": "http://registry.npm.taobao.org/pump/download/pump-3.0.0.tgz", + "integrity": "sha1-tKIRaBW94vTh6mAjVOjHVWUQemQ=", + "dev": true, + "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?cache=0&sync_timestamp=1569938140182&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpumpify%2Fdownload%2Fpumpify-1.5.1.tgz", + "integrity": "sha1-NlE74karJ1cLGjdKXOJ4v9dDcM4=", + "dev": true, + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "resolved": "http://registry.npm.taobao.org/pump/download/pump-2.0.1.tgz", + "integrity": "sha1-Ejma3W5M91Jtlzy8i1zi4pCLOQk=", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "http://registry.npm.taobao.org/punycode/download/punycode-2.1.1.tgz", + "integrity": "sha1-tYsBCsQMIsVldhbI0sLALHv0eew=", + "dev": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npm.taobao.org/qs/download/qs-6.7.0.tgz?cache=0&sync_timestamp=1569207136481&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fqs%2Fdownload%2Fqs-6.7.0.tgz", + "integrity": "sha1-QdwaAV49WB8WIXdr4xr7KHapsbw=", + "dev": true + }, + "querystring": { + "version": "0.2.0", + "resolved": "http://registry.npm.taobao.org/querystring/download/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "http://registry.npm.taobao.org/querystring-es3/download/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "querystringify": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/querystringify/download/querystringify-2.1.1.tgz", + "integrity": "sha1-YOWl/WSn+L+k0qsu1v30yFutFU4=", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "http://registry.npm.taobao.org/randombytes/download/randombytes-2.1.0.tgz", + "integrity": "sha1-32+ENy8CcNxlzfYpE0mrekc9Tyo=", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "http://registry.npm.taobao.org/randomfill/download/randomfill-1.0.4.tgz", + "integrity": "sha1-ySGW/IarQr6YPxvzF3giSTHWFFg=", + "dev": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npm.taobao.org/range-parser/download/range-parser-1.2.1.tgz", + "integrity": "sha1-PPNwI9GZ4cJNGlW4SADC8+ZGgDE=", + "dev": true + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npm.taobao.org/raw-body/download/raw-body-2.4.0.tgz", + "integrity": "sha1-oc5vucm8NWylLoklarWQWeE9AzI=", + "dev": true, + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "dependencies": { + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/bytes/download/bytes-3.1.0.tgz", + "integrity": "sha1-9s95M6Ng4FiPqf3oVlHNx/gF0fY=", + "dev": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npm.taobao.org/readable-stream/download/readable-stream-2.3.6.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Freadable-stream%2Fdownload%2Freadable-stream-2.3.6.tgz", + "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", + "dev": true, + "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=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "regenerate": { + "version": "1.4.0", + "resolved": "https://registry.npm.taobao.org/regenerate/download/regenerate-1.4.0.tgz", + "integrity": "sha1-SoVuxLVuQHfFV1icroXnpMiGmhE=", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "8.1.0", + "resolved": "https://registry.npm.taobao.org/regenerate-unicode-properties/download/regenerate-unicode-properties-8.1.0.tgz", + "integrity": "sha1-71Hg8OpK1CS3e/fLQfPgFccKPw4=", + "dev": true, + "requires": { + "regenerate": "^1.4.0" + } + }, + "regenerator-transform": { + "version": "0.14.1", + "resolved": "https://registry.npm.taobao.org/regenerator-transform/download/regenerator-transform-0.14.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fregenerator-transform%2Fdownload%2Fregenerator-transform-0.14.1.tgz", + "integrity": "sha1-Oy/OThq3cywI9mXf2zFHScfd0vs=", + "dev": true, + "requires": { + "private": "^0.1.6" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "http://registry.npm.taobao.org/regex-not/download/regex-not-1.0.2.tgz", + "integrity": "sha1-H07OJ+ALC2XgJHpoEOaoXYOldSw=", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regexp.prototype.flags": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/regexp.prototype.flags/download/regexp.prototype.flags-1.2.0.tgz", + "integrity": "sha1-azByTjBqJ4M+6xcbZqyIkLo35Bw=", + "dev": true, + "requires": { + "define-properties": "^1.1.2" + } + }, + "regexpu-core": { + "version": "4.6.0", + "resolved": "https://registry.npm.taobao.org/regexpu-core/download/regexpu-core-4.6.0.tgz", + "integrity": "sha1-IDfBizJ8/Oim/qKk7EQfJDKvuLY=", + "dev": true, + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.1.0", + "regjsgen": "^0.5.0", + "regjsparser": "^0.6.0", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.1.0" + } + }, + "regjsgen": { + "version": "0.5.0", + "resolved": "https://registry.npm.taobao.org/regjsgen/download/regjsgen-0.5.0.tgz", + "integrity": "sha1-p2NNwI+JIJwgSa3aNSVxH7lyZd0=", + "dev": true + }, + "regjsparser": { + "version": "0.6.0", + "resolved": "https://registry.npm.taobao.org/regjsparser/download/regjsparser-0.6.0.tgz", + "integrity": "sha1-8eaui32iuulsmTmbhozWyTOiupw=", + "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", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "relateurl": { + "version": "0.2.7", + "resolved": "http://registry.npm.taobao.org/relateurl/download/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", + "dev": true + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "http://registry.npm.taobao.org/remove-trailing-separator/download/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "renderkid": { + "version": "2.0.3", + "resolved": "http://registry.npm.taobao.org/renderkid/download/renderkid-2.0.3.tgz", + "integrity": "sha1-OAF5wv9a4TZcUivy/Pz/AcW3QUk=", + "dev": true, + "requires": { + "css-select": "^1.1.0", + "dom-converter": "^0.2", + "htmlparser2": "^3.3.0", + "strip-ansi": "^3.0.0", + "utila": "^0.4.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "http://registry.npm.taobao.org/ansi-regex/download/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "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=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "http://registry.npm.taobao.org/repeat-element/download/repeat-element-1.1.3.tgz", + "integrity": "sha1-eC4NglwMWjuzlzH4Tv7mt0Lmsc4=", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "http://registry.npm.taobao.org/repeat-string/download/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "require-directory": { + "version": "2.1.1", + "resolved": "http://registry.npm.taobao.org/require-directory/download/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "http://registry.npm.taobao.org/require-main-filename/download/require-main-filename-2.0.0.tgz", + "integrity": "sha1-0LMp7MfMD2Fkn2IhW+aa9UqomJs=", + "dev": true + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/requires-port/download/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "resolve": { + "version": "1.12.0", + "resolved": "https://registry.npm.taobao.org/resolve/download/resolve-1.12.0.tgz?cache=0&sync_timestamp=1564641434608&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fresolve%2Fdownload%2Fresolve-1.12.0.tgz", + "integrity": "sha1-P8ZEo1yEpIVUYJ/ybsUrZvpXffY=", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/resolve-cwd/download/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + } + }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/resolve-dir/download/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "dependencies": { + "global-modules": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/global-modules/download/global-modules-1.0.0.tgz", + "integrity": "sha1-bXcPDrUjrHgWTXK15xqIdyZcw+o=", + "dev": true, + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + } + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/resolve-from/download/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "http://registry.npm.taobao.org/resolve-url/download/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npm.taobao.org/ret/download/ret-0.1.15.tgz", + "integrity": "sha1-uKSCXVvbH8P29Twrwz+BOIaBx7w=", + "dev": true + }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npm.taobao.org/retry/download/retry-0.12.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fretry%2Fdownload%2Fretry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "dev": true + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npm.taobao.org/rimraf/download/rimraf-2.7.1.tgz", + "integrity": "sha1-NXl/E6f9rcVmFCwp1PB8ytSD4+w=", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "http://registry.npm.taobao.org/ripemd160/download/ripemd160-2.0.2.tgz", + "integrity": "sha1-ocGm9iR1FXe6XQeRTLyShQWFiQw=", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "run-queue": { + "version": "1.0.3", + "resolved": "http://registry.npm.taobao.org/run-queue/download/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dev": true, + "requires": { + "aproba": "^1.1.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.1.2.tgz", + "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "http://registry.npm.taobao.org/safe-regex/download/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "http://registry.npm.taobao.org/safer-buffer/download/safer-buffer-2.1.2.tgz", + "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo=", + "dev": true + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/schema-utils/download/schema-utils-1.0.0.tgz?cache=0&sync_timestamp=1569611252618&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fschema-utils%2Fdownload%2Fschema-utils-1.0.0.tgz", + "integrity": "sha1-C3mpMgTXtgDUsoUNH2bCo0lRx3A=", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/select-hose/download/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "dev": true + }, + "selfsigned": { + "version": "1.10.6", + "resolved": "https://registry.npm.taobao.org/selfsigned/download/selfsigned-1.10.6.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fselfsigned%2Fdownload%2Fselfsigned-1.10.6.tgz", + "integrity": "sha1-ezzTftnCA0JhoXOvGhquJ9gWm2c=", + "dev": true, + "requires": { + "node-forge": "0.8.2" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npm.taobao.org/semver/download/semver-5.7.1.tgz?cache=0&sync_timestamp=1565627380363&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-5.7.1.tgz", + "integrity": "sha1-qVT5Ma66UI0we78Gnv8MAclhFvc=", + "dev": true + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npm.taobao.org/send/download/send-0.17.1.tgz", + "integrity": "sha1-wdiwWfeQD3Rm3Uk4vcROEd2zdsg=", + "dev": true, + "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": { + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fms%2Fdownload%2Fms-2.1.1.tgz", + "integrity": "sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo=", + "dev": true + } + } + }, + "serialize-javascript": { + "version": "1.9.1", + "resolved": "https://registry.npm.taobao.org/serialize-javascript/download/serialize-javascript-1.9.1.tgz", + "integrity": "sha1-z8IArvd7YAxH2pu4FJyUPnmML9s=", + "dev": true + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npm.taobao.org/serve-index/download/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "dependencies": { + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npm.taobao.org/http-errors/download/http-errors-1.6.3.tgz?cache=0&sync_timestamp=1561418493658&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhttp-errors%2Fdownload%2Fhttp-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npm.taobao.org/inherits/download/inherits-2.0.3.tgz?cache=0&sync_timestamp=1560975547815&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Finherits%2Fdownload%2Finherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/setprototypeof/download/setprototypeof-1.1.0.tgz?cache=0&sync_timestamp=1563425414995&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsetprototypeof%2Fdownload%2Fsetprototypeof-1.1.0.tgz", + "integrity": "sha1-0L2FU2iHtv58DYGMuWLZ2RxU5lY=", + "dev": true + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npm.taobao.org/serve-static/download/serve-static-1.14.1.tgz", + "integrity": "sha1-Zm5jbcTwEPfvKZcKiKZ0MgiYsvk=", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "http://registry.npm.taobao.org/set-blocking/download/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "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=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "http://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "http://registry.npm.taobao.org/setimmediate/download/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/setprototypeof/download/setprototypeof-1.1.1.tgz?cache=0&sync_timestamp=1563425414995&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsetprototypeof%2Fdownload%2Fsetprototypeof-1.1.1.tgz", + "integrity": "sha1-fpWsskqpL1iF4KvvW6ExMw1K5oM=", + "dev": true + }, + "sha.js": { + "version": "2.4.11", + "resolved": "http://registry.npm.taobao.org/sha.js/download/sha.js-2.4.11.tgz", + "integrity": "sha1-N6XPC4HsvGlD3hCbopYNGyZYSuc=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/shebang-command/download/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/shebang-regex/download/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "http://registry.npm.taobao.org/signal-exit/download/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "http://registry.npm.taobao.org/snapdragon/download/snapdragon-0.8.2.tgz", + "integrity": "sha1-ZJIufFZbDhQgS6GqfWlkJ40lGC0=", + "dev": true, + "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": { + "define-property": { + "version": "0.2.5", + "resolved": "http://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "http://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "http://registry.npm.taobao.org/snapdragon-node/download/snapdragon-node-2.1.1.tgz", + "integrity": "sha1-bBdfhv8UvbByRWPo88GwIaKGhTs=", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/define-property/download/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz", + "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "http://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz", + "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "http://registry.npm.taobao.org/snapdragon-util/download/snapdragon-util-3.0.1.tgz", + "integrity": "sha1-+VZHlIbyrNeXAGk/b3uAXkWrVuI=", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "sockjs": { + "version": "0.3.19", + "resolved": "https://registry.npm.taobao.org/sockjs/download/sockjs-0.3.19.tgz", + "integrity": "sha1-2Xa76ACve9IK4IWY1YI5NQiZPA0=", + "dev": true, + "requires": { + "faye-websocket": "^0.10.0", + "uuid": "^3.0.1" + } + }, + "sockjs-client": { + "version": "1.4.0", + "resolved": "https://registry.npm.taobao.org/sockjs-client/download/sockjs-client-1.4.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsockjs-client%2Fdownload%2Fsockjs-client-1.4.0.tgz", + "integrity": "sha1-yfJWjhnI/YFztJl+o0IOC7MGx9U=", + "dev": true, + "requires": { + "debug": "^3.2.5", + "eventsource": "^1.0.7", + "faye-websocket": "~0.11.1", + "inherits": "^2.0.3", + "json3": "^3.3.2", + "url-parse": "^1.4.3" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "http://registry.npm.taobao.org/debug/download/debug-3.2.6.tgz", + "integrity": "sha1-6D0X3hbYp++3cX7b5fsQE17uYps=", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "faye-websocket": { + "version": "0.11.3", + "resolved": "https://registry.npm.taobao.org/faye-websocket/download/faye-websocket-0.11.3.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffaye-websocket%2Fdownload%2Ffaye-websocket-0.11.3.tgz", + "integrity": "sha1-XA6aiWjokSwoZjn96XeosgnyUI4=", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fms%2Fdownload%2Fms-2.1.2.tgz", + "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=", + "dev": true + } + } + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "http://registry.npm.taobao.org/source-list-map/download/source-list-map-2.0.1.tgz", + "integrity": "sha1-OZO9hzv8SEecyp6jpUeDXHwVSzQ=", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "http://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.2", + "resolved": "http://registry.npm.taobao.org/source-map-resolve/download/source-map-resolve-0.5.2.tgz", + "integrity": "sha1-cuLMNAlVQ+Q7LGKyxMENSpBU8lk=", + "dev": true, + "requires": { + "atob": "^2.1.1", + "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.13", + "resolved": "https://registry.npm.taobao.org/source-map-support/download/source-map-support-0.5.13.tgz?cache=0&sync_timestamp=1564565500102&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsource-map-support%2Fdownload%2Fsource-map-support-0.5.13.tgz", + "integrity": "sha1-MbJKnC5zwt6FBmwP631Edn7VKTI=", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "http://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "http://registry.npm.taobao.org/source-map-url/download/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "spdy": { + "version": "4.0.1", + "resolved": "https://registry.npm.taobao.org/spdy/download/spdy-4.0.1.tgz", + "integrity": "sha1-bxLtHF236k8k67i4m6WMh8CCV/I=", + "dev": true, + "requires": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "http://registry.npm.taobao.org/debug/download/debug-4.1.1.tgz", + "integrity": "sha1-O3ImAlUQnGtYnO4FDx1RYTlmR5E=", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fms%2Fdownload%2Fms-2.1.2.tgz", + "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=", + "dev": true + } + } + }, + "spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/spdy-transport/download/spdy-transport-3.0.0.tgz", + "integrity": "sha1-ANSGOmQArXXfkzYaFghgXl3NzzE=", + "dev": true, + "requires": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "http://registry.npm.taobao.org/debug/download/debug-4.1.1.tgz", + "integrity": "sha1-O3ImAlUQnGtYnO4FDx1RYTlmR5E=", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fms%2Fdownload%2Fms-2.1.2.tgz", + "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=", + "dev": true + }, + "readable-stream": { + "version": "3.4.0", + "resolved": "https://registry.npm.taobao.org/readable-stream/download/readable-stream-3.4.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Freadable-stream%2Fdownload%2Freadable-stream-3.4.0.tgz", + "integrity": "sha1-pRwmdUZY4KPCHb9ZFjvUW6b0R/w=", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "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=", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "ssri": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", + "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "http://registry.npm.taobao.org/static-extend/download/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "http://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "http://registry.npm.taobao.org/statuses/download/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "http://registry.npm.taobao.org/stream-browserify/download/stream-browserify-2.0.2.tgz", + "integrity": "sha1-h1IdOKRKp+6RzhzSpH3wy0ndZgs=", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-each": { + "version": "1.2.3", + "resolved": "http://registry.npm.taobao.org/stream-each/download/stream-each-1.2.3.tgz", + "integrity": "sha1-6+J6DDibBPvMIzZClS4Qcxr6m64=", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npm.taobao.org/stream-http/download/stream-http-2.8.3.tgz", + "integrity": "sha1-stJCRpKIpaJ+xP6JM6z2I95lFPw=", + "dev": true, + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "stream-shift": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/stream-shift/download/stream-shift-1.0.0.tgz", + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/string-width/download/string-width-3.1.0.tgz", + "integrity": "sha1-InZ74htirxCBV0MG9prFG2IgOWE=", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "string.prototype.trimleft": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/string.prototype.trimleft/download/string.prototype.trimleft-2.1.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstring.prototype.trimleft%2Fdownload%2Fstring.prototype.trimleft-2.1.0.tgz", + "integrity": "sha1-bMR/DX641isPNwFhFxWjlUWR1jQ=", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string.prototype.trimright": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/string.prototype.trimright/download/string.prototype.trimright-2.1.0.tgz?cache=0&sync_timestamp=1568091065735&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstring.prototype.trimright%2Fdownload%2Fstring.prototype.trimright-2.1.0.tgz", + "integrity": "sha1-Zp0WS+nfm291WfqOiZRbFopabFg=", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/string_decoder/download/string_decoder-1.1.1.tgz", + "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", + "dev": true, + "requires": { + "safe-buffer": "~5.1.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=", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/strip-eof/download/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-6.1.0.tgz", + "integrity": "sha1-B2Srxpxj1ayELdSGfo0CXogN+PM=", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npm.taobao.org/tapable/download/tapable-1.1.3.tgz", + "integrity": "sha1-ofzMBrWNth/XpF2i2kT186Pme6I=", + "dev": true + }, + "tar": { + "version": "4.4.19", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.19.tgz", + "integrity": "sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==", + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.1.4", + "fs-minipass": "^1.2.7", + "minipass": "^2.9.0", + "minizlib": "^1.3.3", + "mkdirp": "^0.5.5", + "safe-buffer": "^5.2.1", + "yallist": "^3.1.1" + }, + "dependencies": { + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true, + "optional": true + }, + "minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true, + "optional": true + }, + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "optional": true, + "requires": { + "minimist": "^1.2.6" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "optional": true + } + } + }, + "terser": { + "version": "4.3.4", + "resolved": "https://registry.npm.taobao.org/terser/download/terser-4.3.4.tgz", + "integrity": "sha1-rZG63pVhnjQ0aF1p76Yhpa9fh30=", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "http://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "terser-webpack-plugin": { + "version": "1.4.1", + "resolved": "https://registry.npm.taobao.org/terser-webpack-plugin/download/terser-webpack-plugin-1.4.1.tgz", + "integrity": "sha1-YbGOQOruW+l+dxzbsQ7RKAiIwrQ=", + "dev": true, + "requires": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^1.7.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "http://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "through2": { + "version": "2.0.5", + "resolved": "http://registry.npm.taobao.org/through2/download/through2-2.0.5.tgz", + "integrity": "sha1-AcHjnrMdB8t9A6lqcIIyYLIxMs0=", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "thunky": { + "version": "1.0.3", + "resolved": "https://registry.npm.taobao.org/thunky/download/thunky-1.0.3.tgz", + "integrity": "sha1-9d9zJFNAewkZHa5z4qjMc/OBqCY=", + "dev": true + }, + "timers-browserify": { + "version": "2.0.11", + "resolved": "https://registry.npm.taobao.org/timers-browserify/download/timers-browserify-2.0.11.tgz?cache=0&sync_timestamp=1565448362964&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftimers-browserify%2Fdownload%2Ftimers-browserify-2.0.11.tgz", + "integrity": "sha1-gAsfPu4nLlvFPuRloE0OgEwxIR8=", + "dev": true, + "requires": { + "setimmediate": "^1.0.4" + } + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/to-arraybuffer/download/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "http://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": "http://registry.npm.taobao.org/to-object-path/download/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "http://registry.npm.taobao.org/to-regex/download/to-regex-3.0.2.tgz", + "integrity": "sha1-E8/dmzNlUvMLUfM6iuG0Knp1mc4=", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "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=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/toidentifier/download/toidentifier-1.0.0.tgz", + "integrity": "sha1-fhvjRw8ed5SLxD2Uo8j013UrpVM=", + "dev": true + }, + "toposort": { + "version": "1.0.7", + "resolved": "http://registry.npm.taobao.org/toposort/download/toposort-1.0.7.tgz", + "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=", + "dev": true + }, + "tslib": { + "version": "1.10.0", + "resolved": "https://registry.npm.taobao.org/tslib/download/tslib-1.10.0.tgz", + "integrity": "sha1-w8GflZc/sKYpc/sJ2Q2WHuQ+XIo=", + "dev": true + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "http://registry.npm.taobao.org/tty-browserify/download/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npm.taobao.org/type-is/download/type-is-1.6.18.tgz", + "integrity": "sha1-TlUs0F3wlGfcvE73Od6J8s83wTE=", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "http://registry.npm.taobao.org/typedarray/download/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "uglify-js": { + "version": "3.4.10", + "resolved": "https://registry.npm.taobao.org/uglify-js/download/uglify-js-3.4.10.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fuglify-js%2Fdownload%2Fuglify-js-3.4.10.tgz", + "integrity": "sha1-mtlWPY6zrN+404WX0q8dgV9qdV8=", + "dev": true, + "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", + "integrity": "sha1-9hmKqE5bg8RgVLlN3tv+1e6f8So=", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "http://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "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.1.0", + "resolved": "https://registry.npm.taobao.org/unicode-match-property-value-ecmascript/download/unicode-match-property-value-ecmascript-1.1.0.tgz", + "integrity": "sha1-W0tCbgjROoA2Xg1lesemwexGonc=", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "1.0.5", + "resolved": "https://registry.npm.taobao.org/unicode-property-aliases-ecmascript/download/unicode-property-aliases-ecmascript-1.0.5.tgz", + "integrity": "sha1-qcxsx85joKMCP8meNBuUQx1AWlc=", + "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=", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "http://registry.npm.taobao.org/unique-filename/download/unique-filename-1.1.1.tgz", + "integrity": "sha1-HWl2k2mtoFgxA6HmrodoG1ZXMjA=", + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npm.taobao.org/unique-slug/download/unique-slug-2.0.2.tgz", + "integrity": "sha1-uqvOkQg/xk6UWw861hPiZPfNTmw=", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "unpipe": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/unpipe/download/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/unset-value/download/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "http://registry.npm.taobao.org/has-value/download/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "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=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "http://registry.npm.taobao.org/has-values/download/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + } + } + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/upath/download/upath-1.2.0.tgz", + "integrity": "sha1-j2bbzVWog6za5ECK+LA1pQRMGJQ=", + "dev": true + }, + "update-browserslist-db": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.4.tgz", + "integrity": "sha512-jnmO2BEGUjsMOe/Fg9u0oczOe/ppIDZPebzccl1yDWGLFP16Pa1/RM5wEoKYPG2zstNcDuAStejyxsOuKINdGA==", + "dev": true, + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } + }, + "upper-case": { + "version": "1.1.3", + "resolved": "http://registry.npm.taobao.org/upper-case/download/upper-case-1.1.3.tgz", + "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", + "dev": true + }, + "uri-js": { + "version": "4.2.2", + "resolved": "http://registry.npm.taobao.org/uri-js/download/uri-js-4.2.2.tgz", + "integrity": "sha1-lMVA4f93KVbiKZUHwBCupsiDjrA=", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "http://registry.npm.taobao.org/urix/download/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "http://registry.npm.taobao.org/url/download/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "http://registry.npm.taobao.org/punycode/download/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "use": { + "version": "3.1.1", + "resolved": "http://registry.npm.taobao.org/use/download/use-3.1.1.tgz", + "integrity": "sha1-1QyMrHmhn7wg8pEfVuuXP04QBw8=", + "dev": true + }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npm.taobao.org/util/download/util-0.11.1.tgz", + "integrity": "sha1-MjZzNyDsZLsn9uJvQhqqLhtYjWE=", + "dev": true, + "requires": { + "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npm.taobao.org/inherits/download/inherits-2.0.3.tgz?cache=0&sync_timestamp=1560975547815&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Finherits%2Fdownload%2Finherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "http://registry.npm.taobao.org/util-deprecate/download/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "util.promisify": { + "version": "1.0.0", + "resolved": "http://registry.npm.taobao.org/util.promisify/download/util.promisify-1.0.0.tgz", + "integrity": "sha1-RA9xZaRZyaFtwUXrjnLzVocJcDA=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "utila": { + "version": "0.4.0", + "resolved": "http://registry.npm.taobao.org/utila/download/utila-0.4.0.tgz", + "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", + "dev": true + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/utils-merge/download/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, + "uuid": { + "version": "3.3.3", + "resolved": "https://registry.npm.taobao.org/uuid/download/uuid-3.3.3.tgz", + "integrity": "sha1-RWjwIW54dg7h2/Ok0s9T4iQRKGY=", + "dev": true + }, + "v8-compile-cache": { + "version": "2.0.3", + "resolved": "https://registry.npm.taobao.org/v8-compile-cache/download/v8-compile-cache-2.0.3.tgz", + "integrity": "sha1-APdJTSritojP4omd9u0sVL75Hb4=", + "dev": true + }, + "vary": { + "version": "1.1.2", + "resolved": "http://registry.npm.taobao.org/vary/download/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + }, + "vm-browserify": { + "version": "1.1.0", + "resolved": "http://registry.npm.taobao.org/vm-browserify/download/vm-browserify-1.1.0.tgz", + "integrity": "sha1-vXbWojMj4sqP+hICjcBFWcdfkBk=", + "dev": true + }, + "watchpack": { + "version": "1.6.0", + "resolved": "https://registry.npm.taobao.org/watchpack/download/watchpack-1.6.0.tgz?cache=0&sync_timestamp=1562782917067&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fwatchpack%2Fdownload%2Fwatchpack-1.6.0.tgz", + "integrity": "sha1-S8EsLr6KonenHx0/FNaFx7RGzQA=", + "dev": true, + "requires": { + "chokidar": "^2.0.2", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + } + }, + "wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npm.taobao.org/wbuf/download/wbuf-1.7.3.tgz", + "integrity": "sha1-wdjRSTFtPqhShIiVy2oL/oh7h98=", + "dev": true, + "requires": { + "minimalistic-assert": "^1.0.0" + } + }, + "webpack": { + "version": "4.41.0", + "resolved": "https://registry.npm.taobao.org/webpack/download/webpack-4.41.0.tgz?cache=0&sync_timestamp=1569532173364&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fwebpack%2Fdownload%2Fwebpack-4.41.0.tgz", + "integrity": "sha1-22olS95nF2n3wU6QoaVec2Avxws=", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/wasm-edit": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "acorn": "^6.2.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.1.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.1", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.1", + "watchpack": "^1.6.0", + "webpack-sources": "^1.4.1" + } + }, + "webpack-cli": { + "version": "3.3.9", + "resolved": "https://registry.npm.taobao.org/webpack-cli/download/webpack-cli-3.3.9.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fwebpack-cli%2Fdownload%2Fwebpack-cli-3.3.9.tgz", + "integrity": "sha1-ecJ+cflLf+Mk1ZSrZKjjlrnaqRo=", + "dev": true, + "requires": { + "chalk": "2.4.2", + "cross-spawn": "6.0.5", + "enhanced-resolve": "4.1.0", + "findup-sync": "3.0.0", + "global-modules": "2.0.0", + "import-local": "2.0.0", + "interpret": "1.2.0", + "loader-utils": "1.2.3", + "supports-color": "6.1.0", + "v8-compile-cache": "2.0.3", + "yargs": "13.2.4" + } + }, + "webpack-dev-middleware": { + "version": "3.7.2", + "resolved": "https://registry.npm.taobao.org/webpack-dev-middleware/download/webpack-dev-middleware-3.7.2.tgz?cache=0&sync_timestamp=1569685176128&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fwebpack-dev-middleware%2Fdownload%2Fwebpack-dev-middleware-3.7.2.tgz", + "integrity": "sha1-ABnD23FuP6XOy/ZPKriKdLqzMfM=", + "dev": true, + "requires": { + "memory-fs": "^0.4.1", + "mime": "^2.4.4", + "mkdirp": "^0.5.1", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + }, + "dependencies": { + "mime": { + "version": "2.4.4", + "resolved": "https://registry.npm.taobao.org/mime/download/mime-2.4.4.tgz?cache=0&sync_timestamp=1560034758817&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmime%2Fdownload%2Fmime-2.4.4.tgz", + "integrity": "sha1-vXuRE1/GsBzePpuuM9ZZtj2IV+U=", + "dev": true + } + } + }, + "webpack-dev-server": { + "version": "3.8.1", + "resolved": "https://registry.npm.taobao.org/webpack-dev-server/download/webpack-dev-server-3.8.1.tgz", + "integrity": "sha1-SFtkxKrcI/YB5yEUtAwbH+ox2fE=", + "dev": true, + "requires": { + "ansi-html": "0.0.7", + "bonjour": "^3.5.0", + "chokidar": "^2.1.8", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "debug": "^4.1.1", + "del": "^4.1.1", + "express": "^4.17.1", + "html-entities": "^1.2.1", + "http-proxy-middleware": "^0.19.1", + "import-local": "^2.0.0", + "internal-ip": "^4.3.0", + "ip": "^1.1.5", + "is-absolute-url": "^3.0.2", + "killable": "^1.0.1", + "loglevel": "^1.6.4", + "opn": "^5.5.0", + "p-retry": "^3.0.1", + "portfinder": "^1.0.24", + "schema-utils": "^1.0.0", + "selfsigned": "^1.10.6", + "semver": "^6.3.0", + "serve-index": "^1.9.1", + "sockjs": "0.3.19", + "sockjs-client": "1.4.0", + "spdy": "^4.0.1", + "strip-ansi": "^3.0.1", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.7.1", + "webpack-log": "^2.0.0", + "ws": "^6.2.1", + "yargs": "12.0.5" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "http://registry.npm.taobao.org/ansi-regex/download/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npm.taobao.org/cliui/download/cliui-4.1.0.tgz", + "integrity": "sha1-NIQi2+gtgAswIu709qwQvy5NG0k=", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "http://registry.npm.taobao.org/ansi-regex/download/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "debug": { + "version": "4.1.1", + "resolved": "http://registry.npm.taobao.org/debug/download/debug-4.1.1.tgz", + "integrity": "sha1-O3ImAlUQnGtYnO4FDx1RYTlmR5E=", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "http://registry.npm.taobao.org/get-caller-file/download/get-caller-file-1.0.3.tgz", + "integrity": "sha1-+Xj6TJDR3+f/LWvtoqUV5xO9z0o=", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fms%2Fdownload%2Fms-2.1.2.tgz", + "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "http://registry.npm.taobao.org/require-main-filename/download/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz?cache=0&sync_timestamp=1565627380363&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-6.3.0.tgz", + "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/string-width/download/string-width-2.1.1.tgz", + "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "http://registry.npm.taobao.org/ansi-regex/download/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "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=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "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=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "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=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.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=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, + "yargs": { + "version": "12.0.5", + "resolved": "https://registry.npm.taobao.org/yargs/download/yargs-12.0.5.tgz", + "integrity": "sha1-BfWZe2CWR7ZPZrgeO0sQo2jnrRM=", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.1" + } + }, + "yargs-parser": { + "version": "11.1.1", + "resolved": "https://registry.npm.taobao.org/yargs-parser/download/yargs-parser-11.1.1.tgz?cache=0&sync_timestamp=1567799275344&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fyargs-parser%2Fdownload%2Fyargs-parser-11.1.1.tgz", + "integrity": "sha1-h5oIZZc7yp9rq1y987HGfsfTvPQ=", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/webpack-log/download/webpack-log-2.0.0.tgz", + "integrity": "sha1-W3ko4GN1k/EZ0y9iJ8HgrDHhtH8=", + "dev": true, + "requires": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + } + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npm.taobao.org/webpack-sources/download/webpack-sources-1.4.3.tgz", + "integrity": "sha1-7t2OwLko+/HL/plOItLYkPMwqTM=", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "http://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "websocket-driver": { + "version": "0.7.3", + "resolved": "https://registry.npm.taobao.org/websocket-driver/download/websocket-driver-0.7.3.tgz", + "integrity": "sha1-otTg1PTxFvHmKX66WLBdQwEA6fk=", + "dev": true, + "requires": { + "http-parser-js": ">=0.4.0 <0.4.11", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.3", + "resolved": "https://registry.npm.taobao.org/websocket-extensions/download/websocket-extensions-0.1.3.tgz", + "integrity": "sha1-XS/yKXcAPsaHpLhwc9+7rBRszyk=", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "http://registry.npm.taobao.org/which/download/which-1.3.1.tgz", + "integrity": "sha1-pFBD1U9YBTFtqNYvn1CRjT2nCwo=", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "http://registry.npm.taobao.org/which-module/download/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npm.taobao.org/worker-farm/download/worker-farm-1.7.0.tgz", + "integrity": "sha1-JqlMU5G7ypJhUgAvabhKS/dy5ag=", + "dev": true, + "requires": { + "errno": "~0.1.7" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npm.taobao.org/wrap-ansi/download/wrap-ansi-5.1.0.tgz", + "integrity": "sha1-H9H2cjXVttD+54EFYAG/tpTAOwk=", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "http://registry.npm.taobao.org/wrappy/download/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "ws": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", + "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npm.taobao.org/xtend/download/xtend-4.0.2.tgz", + "integrity": "sha1-u3J3n1+kZRhrH0OPZ0+jR/2121Q=", + "dev": true + }, + "y18n": { + "version": "4.0.0", + "resolved": "http://registry.npm.taobao.org/y18n/download/y18n-4.0.0.tgz", + "integrity": "sha1-le+U+F7MgdAHwmThkKEg8KPIVms=", + "dev": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npm.taobao.org/yallist/download/yallist-3.1.1.tgz?cache=0&sync_timestamp=1569874170379&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fyallist%2Fdownload%2Fyallist-3.1.1.tgz", + "integrity": "sha1-27fa+b/YusmrRev2ArjLrQ1dCP0=", + "dev": true + }, + "yargs": { + "version": "13.2.4", + "resolved": "https://registry.npm.taobao.org/yargs/download/yargs-13.2.4.tgz", + "integrity": "sha1-C1YreUAW65ZRuYvTes82SqXW3IM=", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "os-locale": "^3.1.0", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.0" + } + }, + "yargs-parser": { + "version": "13.1.1", + "resolved": "https://registry.npm.taobao.org/yargs-parser/download/yargs-parser-13.1.1.tgz?cache=0&sync_timestamp=1567799275344&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fyargs-parser%2Fdownload%2Fyargs-parser-13.1.1.tgz", + "integrity": "sha1-0mBYUyqgbTZf4JH2ofwGsvfl7KA=", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } +} diff --git a/fast-interview-code/webpack-demo/package.json b/fast-interview-code/webpack-demo/package.json new file mode 100644 index 0000000..2db8dae --- /dev/null +++ b/fast-interview-code/webpack-demo/package.json @@ -0,0 +1,23 @@ +{ + "name": "webpack-demo", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "build": "webpack --config webpack.prod.js", + "dev": "webpack-dev-server" + }, + "keywords": [], + "author": "", + "license": "ISC", + "devDependencies": { + "@babel/core": "^7.6.2", + "@babel/preset-env": "^7.6.2", + "babel-loader": "^8.0.6", + "html-webpack-plugin": "^3.2.0", + "webpack": "^4.41.0", + "webpack-cli": "^3.3.9", + "webpack-dev-server": "^3.8.1" + } +} diff --git a/fast-interview-code/webpack-demo/src/fn.js b/fast-interview-code/webpack-demo/src/fn.js new file mode 100644 index 0000000..ea83b52 --- /dev/null +++ b/fast-interview-code/webpack-demo/src/fn.js @@ -0,0 +1,14 @@ +// export function fn() { +// console.log('fn') +// } +// export const name = 'b' + +function fn() { + console.log('fn') +} +const name = 'b' + +export { // 注意这里不能有 default !!! + fn, + name +} \ No newline at end of file diff --git a/fast-interview-code/webpack-demo/src/index.html b/fast-interview-code/webpack-demo/src/index.html new file mode 100644 index 0000000..49c7a2f --- /dev/null +++ b/fast-interview-code/webpack-demo/src/index.html @@ -0,0 +1,12 @@ + + + + + + + Document + + +

    一段文字

    + + \ No newline at end of file diff --git a/fast-interview-code/webpack-demo/src/index.js b/fast-interview-code/webpack-demo/src/index.js new file mode 100644 index 0000000..23fae64 --- /dev/null +++ b/fast-interview-code/webpack-demo/src/index.js @@ -0,0 +1,23 @@ +console.log('index js') + +// 导入 +import { fn, name } from './fn' +fn() +console.log('name is ', name) + +// 箭头函数 +const sum = (a, b) => a + b +const result = sum(10, 20) +console.log(result) + +// class +class People { + constructor(name) { + this.name = name + } + sayHi() { + console.log(`${this.name} say hi`) + } +} +const zhangsan = new People('张三') +console.log(zhangsan.sayHi()) diff --git a/fast-interview-code/webpack-demo/webpack.config.js b/fast-interview-code/webpack-demo/webpack.config.js new file mode 100644 index 0000000..8089552 --- /dev/null +++ b/fast-interview-code/webpack-demo/webpack.config.js @@ -0,0 +1,34 @@ +const path = require('path') +const HtmlWebpackPlugin = require('html-webpack-plugin') + +module.exports = { + // mode 可选 development 或 production ,默认为后者 + // production 会默认压缩代码并进行其他优化(如 tree shaking) + mode: 'development', + entry: path.join(__dirname, 'src', 'index'), + output: { + filename: 'bundle.js', + path: path.join(__dirname, 'dist') + }, + module: { + rules: [ + { + test: /\.js$/, + loader: ['babel-loader'], + include: path.join(__dirname, 'src'), + exclude: /node_modules/ + }, + ] + }, + plugins: [ + new HtmlWebpackPlugin({ + template: path.join(__dirname, 'src', 'index.html'), + filename: 'index.html' + }) + ], + devServer: { + port: 3000, + contentBase: path.join(__dirname, 'dist'), // 根目录 + open: true, // 自动打开浏览器 + } +} diff --git a/fast-interview-code/webpack-demo/webpack.prod.js b/fast-interview-code/webpack-demo/webpack.prod.js new file mode 100644 index 0000000..d5cc5e5 --- /dev/null +++ b/fast-interview-code/webpack-demo/webpack.prod.js @@ -0,0 +1,27 @@ +const path = require('path') +const HtmlWebpackPlugin = require('html-webpack-plugin') + +module.exports = { + mode: 'production', + entry: path.join(__dirname, 'src', 'index'), + output: { + filename: 'bundle.[contenthash].js', + path: path.join(__dirname, 'dist') + }, + module: { + rules: [ + { + test: /\.js$/, + loader: ['babel-loader'], + include: path.join(__dirname, 'src'), + exclude: /node_modules/ + }, + ] + }, + plugins: [ + new HtmlWebpackPlugin({ + template: path.join(__dirname, 'src', 'index.html'), + filename: 'index.html' + }) + ] +} diff --git "a/fast-interview-code/\345\211\215\347\253\257\351\235\242\350\257\225\350\257\276-\346\200\235\347\273\264\345\257\274\345\233\276.png" "b/fast-interview-code/\345\211\215\347\253\257\351\235\242\350\257\225\350\257\276-\346\200\235\347\273\264\345\257\274\345\233\276.png" new file mode 100644 index 0000000..085a477 Binary files /dev/null and "b/fast-interview-code/\345\211\215\347\253\257\351\235\242\350\257\225\350\257\276-\346\200\235\347\273\264\345\257\274\345\233\276.png" differ diff --git a/readme.md b/readme.md index 318e0c4..a914936 100644 --- a/readme.md +++ b/readme.md @@ -1,7000 +1,23 @@ -# [JavaScript从入门到精通](https://www.bilibili.com/video/av29885002) - -## 初探 JavaScript 魅力 - -### JavsScript 是什么 - -- 网页特效原理 - - JavaScript 就是修改样式(文档) -- 编写 JS 的流程 - - 布局:HTML + CSS - - 属性:确定要修改的属性 - - 事件: 确定用户 做哪些操作(产品设计) - - 编写 JS :在事件中,用 JS 来修改页面元素的样式 - -### 第一个 JS 特效:鼠标提示框 - -- 分析效果实现原理 - - - 样式:`div` 的 `display / none` - - 事件:`onmouseover / onmouseout` - - 动手编写效果 - -- 特效基础 - - - 事件驱动:`onmouseover` - - 元素属性操作:`obj.style.[...]` - - 特效实现原理概括:响应式用户操作,对页面元素样式修改 - -- 兼容性问题 - - ```js - // div2.style.display='block'; // 部分浏览器不兼容 - document.getElementById('div2').style.display='block'; // 所有浏览器兼容 - ``` - -- 函数 - - - 制作更复杂的效果 - - 直接在事件内写代码会很乱 - - 引入 `function()` 函数的基本形式 - - 把 JS 标签里放入到函数里,类似于 css 里的 `class` - - 变量的使用:别名 - - 定义和调用 - - 函数定义:告诉系统有这个函数,不会执行 - - 函数调用:执行函数里面的代码 - - 关系和区别 - -- 代码 - - ```html - - - - - 第一个JS效果 - - - - - - - - - -
    -
    - - -
    -

    文字
    文字2

    -
    - - - ``` - -### 网页换肤和 if 判断 - -- 网页换肤 - - - 土豆网 “开灯” “关灯效果” - - 任何标签都可以加 ID ,包括 link - - 任何标签的属性,都可以修改 - - HTML 里面怎么写,JS 里面就怎么写 - -- if 判断 - - - 特效实现原理 - - if 基本形式 - - JS 里面 ` = 赋值, == 判断` - - 为 a 链接添加 JS - - ` ` - - className 的使用 - - ` class ` 是关键字,所以用 ` className ` 代替 - - 其它 HTML 里面怎么写,JS 里面就怎么写 - -- 代码 - - ```html - - - - - - - - - - - -
    1
    -
    2
    -
    3
    - -
    - - - -
    - - javascript:; - - -
    4
    - - - - ``` - -### 函数传参 - -- 改变背景颜色 - - - 函数传参:参数就是占位符 - - 函数里面变量用传参 - -- 改变 div 的任意样式 - - - 操纵属性的第二种方式 - - 要修改的属性不确定时:` 元素.style[ 变量/字符串 ] = 变量/字符串 ` - - JS 中用 `.` 的地方都可以用 `[]` 代替; - - 字符串变量区别和关系 :带引号是字符串,不带是变量 - - 将属性名作为参数传递 - -- style 与 className - - - ` 元素.style.属性 = 变量/字符串 ` - - style 是修改行内样式 - - 行内样式优先级最高,之后再修改 className 不会有效果 - - 建议:只操作一种样式,要么只操作 style ,要么只操作 className - -- 代码: - - ```HTML - - - - - 函数传参 - - - - - - - - - - - - - - - -
    - - - - ``` - - - -### 提取行间事件 - -- 提取事件 - - 为元素添加事件 - - 事件和其它属性一样,可以用 JS 添加:`元素.事件 = 函数名/函数;` - - 不能加括号,加括号直接执行函数 - - `window.onload` 的意义:等待页面加载完成再执行 JS - - 行为( js )、样式( css )、结构( html ) 三者分离 -- 获取一组元素 - - ` 元素.getElementsByTagName('标签名') ` - - 数组的使用 - - 数组的属性 - - 全选的实现 -- 代码: 同下 - -### 循环 while 和 for - -- 用 while 引入 循环的概念 - - - while 循环语法 - - 自增的意义 - - 循环的构成:初始化、条件、语句、自增 - -- for 循环 - - - 用 for 代替 while 循环 - - 用 for 循环为一组元素甜腻骄傲事件 - - 什么时候用循环----一组元素 - - 例子 - - 全选---- checked 属性 - - 反选---- for 循环配合 if 判断 - -- 代码: - - ```HTML - - - - - 提取行间事件和循环 - - - - - - - - - - - - - - - - - -
    -
    -
    -
    -
    - -
    - - - - - - - -
    - - - - ``` - - - -### 导航栏选项卡 - -- 按钮的实现 - - - 添加事件 - - this 的使用: 指当前发生事件的元素 - - 先清空所有按钮,再选中当前按钮 - -- 内容的实现(ul) - - - 先隐藏所有 ul,再显示当前 ul - - 索引值的使用:什么时候用索引值 - - HTML 添加 index 会被 FireFox 过滤 - - JS 添加 index - -- 代码: - - ```HTML - - - - - 导航选项卡 - - - - -
    - 1 - 2 - 3 - 4 -
    -
    -
      -
    • 1
    • -
    • 1
    • -
    • 1
    • -
    -
      -
    • 2
    • -
    • 2
    • -
    • 2
    • -
    -
      -
    • 3
    • -
    • 3
    • -
    • 3
    • -
    -
      -
    • 4
    • -
    • 4
    • -
    • 4
    • -
    -
    - - - ``` - - - -### JS 简易日历 - -- 程序实现思路 - - - 类似于选项卡,只是下面只有一个div - - innerHTML 的使用 - -- 数组的使用 - - - 定义:` arr = [1, 2, 3] ` - - 使用:` arr[0] ` - -- 字符串拼接 - - - 作用:拼接两个字符串 - - 问题:拼接中的优先级 - - 就近相加, 字符串后面数字相加要加括号 - -- 代码: - - ```HTML - - - - - 简易日历 - - - - -
    -
    ` | 定义表格标题。 | +| `
    ` | 定义表格的表头。 | +| `
    ` | 定义表格单元。 | +| `
    - - - - - - - - - - - - - - - - - - - - -
    1
    JAN
    2
    FER
    3
    MAR
    4
    APR
    5
    MAY
    6
    JUN
    7
    JUL
    8
    AUG
    9
    SEP
    10
    OCT
    11
    NOV
    12
    DEC
    -
    -

    - -

    -
    - - - - ``` - - - -## JavaScript 基础 - -### JavaScript 组成 - -- ECMAScript:解释器、编译器(几乎所有兼容) -- DOM:Document Object Model,HTML,`document`(大部分兼容) -- BOM:Browser Object Model,浏览器,`window`(完全不兼容) - - 各组成部分的兼容性、兼容性问题的由来 - -### 变量类型 - -- 类型:`typeof` 运算符 - - 用法:`typeof 元素`返回变量的类型 - - 常见类型: - - `number` 、`string` 、`boolean` 、`undefined`(未定义或定义未使用)、`object`、`function` -- 一个变量应该只放一种类型的数据 - -### 变量类型转换 - -- 数据类型转换 - - - 例子:计算两个文本框的和 - - - 显式类型转换(强制类型转换) - - - `parseInt()` 去除小数、`parseFloat() ` 保留小数:从左至右提取数字,遇到不是数字跳出 - - - `NaN ` 的意义和检测:`Not a Number` - - - NaN: NaN 和任何值都不相等,包括它自己 - - - 使用 ` isNaN()` 检测是否是全是数字 - - - ``` - Number() 转换数值,String() 转换字符串,Boolean() 转换布尔值 - ``` - - - 隐式类型的转换 - - - `== `:先转换类型 再比较 - - 对比 `=== `:全等于,不转换类型直接比较 - - - ` - `:数字相减 - - 对比 ` +`:字符串连接、数字相加 - - - ```js - 5 + null // 返回 5 因为 null 被转换为 0 - "5" + null // 返回 "5null" 因为 null 被转换为 "null" - "5" + 2 // 返回 52 因为 2 被转换为 "2" - "5" - 2 // 返回 3 因为 "5" 被转换为 5 - "5" * "2" // 返回 10 因为 "5" 和 "2" 被转换为 5 和 2 - ``` - -- 更多可用于将数值转换为字符串的方法: - - | 方法 | 描述 | - | :-------------- | :----------------------------------------------------- | - | toExponential() | 返回字符串,对数字进行舍入,并使用指数计数法来写。 | - | toFixed() | 返回字符串,对数字进行舍入,并使用指定位数的小数来写。 | - | toPrecision() | 返回字符串,把数字写为指定的长度。 | - -- 代码: - - ```HTML - - - - - 变量类型转换 - - - - - - - -
    - -
    -
    - -
    - - - ``` - - -### 变量的作用域和闭包 - -- 变量作用域(作用范围) - - 局部变量、全局变量 -- 什么是闭包? - - **子函数可以使用父函数中的局部变量** - - 之前一直在使用闭包 - - 网上对于闭包的定义 - -### 命名规范 - -- 命名规范及必要性 - - 可读性--能看懂 - - 规范性--符合规则 -- 匈牙利命名法 - - **类型前缀 + 首字母大写**:` getElementByTagName ` - -| 类型 | 前缀 | 类型(英文) | 实例 | -| ---------- | ---- | ------------ | ------------ | -| 数组 | a | Array | aItems | -| 布尔值 | b | Boolean | bIsComplete | -| 浮点数 | f | Float | fPrice | -| 函数 | fn | Function | fnHandler | -| 整数 | i | Integer | iItemCount | -| 对象 | o | Object | oDiv1 | -| 正则表达式 | re | RegExp | reEmailCheck | -| 字符串 | s | String | sUserName | -| 变体变量 | v | Variant | vAnything | - -### 运算符 - -- 算数:` +加、-减、*乘、/ 除、%取模 ` - - - 实例:隔行变色、秒转时间 - -- 赋值:` =、+=、-=、*=、/=、%= ` - - - ` +=` : `i += 1 等于 i++ ` - -- 关系:` <、>、<=、>=、== 、===、!=、!==` - - - `!==` :不同类型不比较,且无结果,同类型才比较,对应 `===` - - `!=`:若类型不同,会偿试转换类型,对应 `== ` - -- 逻辑:&&与、||或、!否 - - - 实例:全选与反选 - -- 运算符优先级:括号 - -- 代码: - - ```HTML - - - - - 运算符 - - - - -
    -
      -
    • -
    • -
    • -
    • -
    • -
    • -
    • -
    • -
    • -
    -
    -
    - - - ``` - -### 程序流程控制 - -- 判断:`if、switch、?:` -- 循环:`while、for` -- 跳出:`break、continue` -- 什么是真、什么是假 - - 真:true、非零数字、非空字符串、非空对象 - - 假:false、数字0、空字符串、空对象、undefiend -- 代码:同下 - -### JSON - -- 什么是 JSON - -- JSON 和数组 - -- `JSON` 和 `for in` - -- 代码: - - ```HTML - - - - - 程序流程控制 - - - - - - ``` - -## 深入 JavaScript - -### 函数返回值 - -- 什么是函数返回值 - - 函数的执行结果 - - 可以没有 return -- 一个函数应该只有一种返回值类型 - -### 函数传参与行间样式 - -- 可变函数(不定参数):`arguments` - - - **参数数组** - -- 例子:求和 - - - 求所有参数的和 - -- 例子2:CSS 函数 - - - 判断 `arguments.length` - - 给参数取名,增强可读性 - -- **取非行间样式(不能用来设置):** - - - `obj.currentStyle[attr]` 只兼容 IE ,返回小数 - - - `getComputedStyle(obj, false)[attr]`,返回小数 - - - ```js - // 解决兼容问题 - // 封装获取计算后元素样式函数 - function getStyle(obj, name) { - if (obj.currentStyle) { - return obj.currentStyle[name]; - } else { - return getComputedStyle(obj, '') [name]; - } - } - ``` - - - 复合样式:`background` / `border ` 要用具体样式名 `backgroundColor ` 等 - - - 单一样式:` width` / `height` / `position` - -### 数组基础操作 - -- 数组的使用 - - - 定义 - - `var arr = [23, 234, 23, 45];` - - `var arr = new Array(12, 5, 7, 34);` - - 没有任何差别,`[]` 的性能略高,因为代码短 - -- 数组的属性 - - - `length` - - 既可以获取,又可以设置 - - 例子:快速清空数组 `length = 0` - -- 数组的使用原则:数组中应该只存一种类型的变量 - -- 数组的方法 - - - 添加 - - `push(元素)`,从尾部添加 - - `unshift(元素)`,从头部添加 - - 删除 - - `pop()`,从尾部删除 - - `shift()`,从头部删除 - -- 排序 - - - `数组.sort([比较函数])`,排序一个数组,只有数组能使用 - - - 排序一个字符串数组,不加比较函数,**默认按照 ASCII 码排序** - - - 排序一个数字数组,加数字比较大小函数 - - - ```js - // 正序比较函数 数字比大小 字符比ASCII值大小 - function positiveSort(n1, n2) { - if (isNaN) { - if (n1 > n2) { - return 1; - } - if (n1 < n2) { - return -1; - } - if (n1 === n2) { - return 0; - } - } else { - return n1 - n2; - } - } - ``` - -- 转换类 - - - `数组.concat(数组2)` - - 连接两个数组,可用于深度复制 - - `数组.join(分隔符)` - - 用分隔符,组合数组元素,生成字符串 - - 字符串 `split` - - `数组.reverse()` - - 颠倒数组中元素的顺序 - -- `数组.slice(start,end)` - - - 从已有数组中返回选定元素,可用于深度复制 - - start 为负数时,和数组长度相加再查找 - -- `splice`:先删除,后插入 - - - `数组.splice(起点,长度,元素)` - - - 删除 - - - `数组.splice(起点,长度)` - - - 插入 - - - `数组.splice(起点,0,元素...)` - - - 替换 - - - `数组.splice(起点,长度,元素)` - -- ECMAScript 两个关于位置的方法 - - - `arrayObject.indexOf(searchvalue,startIndex)` - - 从startIndex 开始向后查找,默认值为 0 - - 返回 number 查找项在数组中的位置,没找到返回-1 - - ``arrayObject.lastIndexOf(searchvalue,startIndex)` - - 从startIndex 开始向前查找,默认值为 0 - - 返回 number 查找项在数组中的位置,没找到返回-1 - -- 代码: - - ```HTML - - - - - 数组操作 - - - - -
    - - - - - -
    -
    - - -
    -
    - - - -
    -
    - - - ``` - -- 数组名作为变量(遍历数组中的数组): - - ```js - var arr1=new Array(); - var arr2=new Array(); - var arrlist= new Array(); //存放以上数组 - arrlist.push(arr1); - arrlist.push(arr2); - //循环遍历arrlist,就可以达到你要的效果 - ``` - - - -## 定时器的使用 - -### 定时器的作用 - -- 开启定时器 - - - `setInterval(函数, 间隔时间)` 间隔型,函数后面不能带括号和传参 - - `setTimeout(函数, 延时时间)` 延时型 - - 两种定时器的区别,定时器要 `window.onload` 完一秒后才执行 - -- 停止定时器 - - - `clearInterval(定时器名字)` - - `clearTimeout(定时器名字)` - -- 代码: - - ```js - window.onload = function () { - var oBtn1 = document.getElementById('btn1'); - var oBtn2 = document.getElementById('btn2'); - var timer = null; - - oBtn1.onclick = function () { - timer = setInterval(function () { - alert('a'); - }, 2000); - }; - - oBtn2.onclick = function () { - clearInterval(timer); - }; - }; - ``` - -### 数码时钟 - -- 效果思路 - -- 获取系统时间 - - - `new Date` 对象 - - `getHours / getMinutes / getSeconds` - -- 显示系统时间 - - - 字符串连接 - - 空位补零 - -- 设置图片路径 - - - `str[i]`:取出字符串中的第 i 个值,不兼容 ie7 - -- `charAt(i)` 方法 :取出字符串中的第 i 个值,兼容各种浏览器 - -- 设置路径:`"url('img/0.png')"` - -- JavaScript 中的 String 方法 - - - `obj.charAt(index)` - - 返回index位置的字符 - - `obj.charCodeAt()` - - 返回index位置的字符编码 - - `obj.indexOf("str")` - - 顺序搜索str,返回其位置,未找到返回-1 - - `obj.lastIndexOf("str")` - - 倒序搜索str,返回其位置,未找到返回-1 - - `slice(start,end)`:同数组 - - `substring(start,end)`:同上,区别在于参数为负数时自动转换为0,并且较小的数为起始位 - - `substr(start,len)`:同上,len 表示截取的长度 - -- 代码: - - ```HTML - - - - 数码时钟 - - - -
      -
    • -
    • - : -
    • -
    • - : -
    • -
    • -
    - - - ``` - - - -### Date 对象其它方法 - -| 方法 | 描述 | -| :---------------- | :-------------------------------------- | -| getDate() | 获得以数值计(1-31)的日 | -| getDay() | 或者以数值计(0-6)的周 | -| getFullYear() | 获得四位的年(yyyy) | -| getHours() | 获得时(0-23) | -| getMilliseconds() | 获得毫秒(0-999) | -| getMinutes() | 获得分钟(0-59) | -| getMonth() | 获得月(0-11) | -| getSeconds() | 获得秒(0-59) | -| getTime() | 获得时间(1970 年 1 月 1 日以来的毫秒) | - -### 延时提示框 - -- 效果演示 - -- 原来的方法 - - - 移入显示,移出隐藏 - -- 移出延时隐藏 - - - 移入下面 `div` 后,还是隐藏 - -- 简化代码 - - - 合并两个相同的 `mouseover` 和 `mouseout` - - 连续 `a=b=c=function()` 两个事件共使用一个函数 - -- 代码:同下 - - -### 无缝滚动 - -- 效果演示 - -- 物体运动基础 - - - 让 `div` 移动起来 - - `offsetLeft/offsetTop` 的作用:获取当前对象的左边距/上边距 - - `offsetWidth/offsetHeight` - - 用定时器让物体连续移动: - - `innerHTML` 拼接两节图片, 宽度后面加 `px` 才会生效 - - `overflow:hidden;` 隐藏元素外的内容 - -- 改变滚动的方向 - - - 修改 `speed` - - 修改判定条件 - - 多次点击越来越快:`if (!timer) `或`clearInterval(timer);` 避免重复调用 - -- 鼠标移入暂停 - - - 移入关闭定时器 - - 移出重新开启定时器 - -- 代码: - - ```HTML - - - - - 移出延时隐藏 - - - -
    -
    -
    -
      -
    • -
    • -
    • -
    • -
    -
    - - - - - ``` - - - -## DOM 基础 - -### DOM 基础 - -- 什么是 DOM -- 浏览器支持情况 - -### DOM 节点 - -- DOM 节点 - - 获取子节点 - - `childNodes`:不兼容高版本,用`nodeType` 兼容 - - 获取文本节点`( nodeType == 3)` 和元素节点`( nodeType == 1)` - - `children`:**只获取元素节点,兼容** - - `parentNode`:查找父节点 - - 例子:点击链接,隐藏整个 `li` - - `offsetParent`:查找定位父级 - - 例子:获取元素在页面上的实际位置 - - 首尾子节点 - - `firstChild` 有兼容性问题,IE6-8用 - - `firstElementChild` 高版本使用 - - `lastChild `/ `lastElementChild` - - 兄弟节点 - - 有兼容性问题,IE6-8用前面的 - - `nextSbling` / ` nextElementSibling` - - `previousSibling ` / `previousElementSibling` - -### 操作元素属性 - -- 操作元素属性 - - 元素属性操作 - - 第一种:`oDiv.style.display = 'block';` - - 第二种:`oDiv.style['display'] = 'block';` - - 第三种:Dom 方式 - - Dom 方式操作元素属性 - - 获取:`getAttribute(名称)` - - 设置:`setAttribute(名称, 值)` - - 删除:`removeAttribute(名称)` - -### DOM 元素灵活查找 - -- 用 className 选择元素 - - - 如何用 className 选择元素 - - - 选出所有元素 - - 通过 className 条件筛选 - - - 封装成函数: - - ```js - // 通过 className 查找元素 - function getByClass(oParent, sClass) { - var aResult = []; - var aEle = oParent.getElementsByTagName('*'); - - for(var i = 0; i < aEle.length; i++) { - if (aEle[i].className == sClass) { - aResult.push(aEle[i]); - } - } - return aResult; - } - ``` -``` - - - -## DOM 操作应用 - -### 创建、插入和删除元素 - -- 创建 DOM 元素 - - - `document.createElement(标签名)` 创建一个节点,不渲染 - - `父级.appendChild(节点)` **删除原有子节点**,再添加子节点,并渲染 - - 例子:为 `ul` 插入 `li` - -- 插入元素 - - - `父级.insertBefore(节点, 原有节点)` 在已有元素前插入 - - 例子:倒叙插入 `li` - -- 删除 DOM 元素 - - - `父级.removeChild(节点)` 删除一个节点 - - 例子:删除 `li` - -- 代码: - - ```HTML - - - - - DOM创建插入删除元素 - - - - - - - - -
    -
      -
    -
    - - -``` - - - -### 文档碎片 - -- 文档碎片理论上可以提高 DOM 操作性能 - -- 文档碎片原理 - -- `document.createDocumentFragment()`:Vue 、MVVM 还有用到 - -- 代码: - - ```js - var element = document.getElementById('ul'); // assuming ul exists - var fragment = document.createDocumentFragment(); - var browsers = ['Firefox', 'Chrome', 'Opera', - 'Safari', 'Internet Explorer']; - - browsers.forEach(function(browser) { - var li = document.createElement('li'); - li.textContent = browser; - fragment.appendChild(li); - }); - - element.appendChild(fragment); - ``` - - - -## DOM操作应用高级 - -### 表格标签 - -| 表格 | 描述 | -| :--------- | :--------------------- | -| | 定义表格 | -| | 定义表格的行。 | -| | 定义表格的页眉。 | -| | 定义表格的主体。 | -| | 定义表格的页脚。 | -| | 定义用于表格列的属性。 | -| | 定义表格列的组。 | - -### 表格应用 - -- 获取 - - - `tBodies / tHead / tFoot / rows / cells ` - - ```js - var oTab = document.getElementById('tab1'); - alert(oTab.tBodies[0].rows[1].cells[1].innerHTML); - ``` - -- 隔行变色 - - - 鼠标移入高亮 - -- 添加/删除一行 - - - DOM 方法的使用 - -- 搜索 - - - 版本1:基础版本 -- 字符串比较 - - 版本2:忽略大小写 -- 大小写转换 `toLowerCase()/toUpperCase()`,返回字符串 - - 版本3:模糊搜索 -- `search()` 的使用,没找到返回 -1,找到则返回位置 - - 版本4:多关键词 -- `split()` 分割字符串,返回数组 - - 高亮显示、筛选 - -- 排序 - - - 移动 `li` ,使用`appendChild()`: 删除原有 `li`,尾部新增 `li` - - 元素排序:元素集合转换成数组 -- `sort()` 排序 -- `appendChild()`插入 - -- 代码: - - ```HTML - - - - - 表格操作 - - - - -
    - - - -
    -
    - - - - -
    -
    - - -
    -
    - - -
    - - - ``` - - - -### 表单应用 - -- 表单基础知识(本章学习事件的时候再详细说明) - - 什么是表单 - - 向服务器提交数据,比如:用户注册 - - `action ` : 提交到哪里 -- 表单事件 - - `onsubmit`:提交时发生 - - `onreset`:重置时发生 -- 表单内容验证 - - 阻止用户输入非法字符:阻止事件 - - 输入时、失去焦点时验证:`onkeyup` 和`onblur` - - 提交时检查:`onsubmit` - - 后台数据检查 - - - -## JS 运动基础 - -### 运动基础 - -- 让 `div` 动起来 -- 速度:物体运动快慢 -- 运动中的 Bug - - 不会停止 - - 速度取某些值会无法停止 - - 到达位置后点击还会运动 - - 重复点击速度加快 -- 匀速运动 - - 速度不变 - -### 运动框架及应用 - -- 运动框架 - - - 在开始运动时,关闭已有定时器 - - 把运动和停止隔开:`if / else` - -- 运动框架实例 - - - 例子1:“分享到” 侧边栏 - - 通过目标点,计算速度值 - - 例子2:淡入淡出图片 - - 用变量储存透明度 - - `filter:alpha(opacity=30); opacity: 0.3;` IE 用前者 - -- ```HTML - - - - - 运动框架及应用 - - - - -
    - 分享到 -
    -
    - - - ``` - -### 缓冲运动 - -- 逐渐变慢,最后停止 - -- 距离越大速度越大,**速度取整** - - - 速度由距离决定 - - 速度 = (目标值-当前值)/缩放系数 - - `Math.ceil`:向上取整 - - `Math.floor`:向下取整 - -- 例子:缓冲菜单 - - - Bug:速度取整 `Math.ceil`、`Math.floor` - - 跟随页面滚动的缓冲侧边栏 - - 潜在问题:目标不是整数时 - - 目标取整:`parseInt()` - - ` scrollTop = document.documentElement.scrollTop || document.body.scrollTop;` - - `document.documentElement.scrollTop`:IE、Firefox - - `document.body.scrollTop`:chrome - -- `Math.random()` - - - 返回一个等于0小于1的一个随机浮点数 - - 说明:求 n到 m之间的**随机整数的公式** - - `random = Math.floor(Math.random()*(m-n+1)+n)` - -- 代码: - - ```HTML - - - - - - 缓冲运动及停止条件 - - - - -
    - 分享到 -
    -
    -
    -
    - - - - -
    - - - - ``` - -### 运动的停止条件 - -- 运动终止条件 - - 匀速运动:两点足够近(直接改位置),`Math.abs()` 取绝对值 - - 缓冲运动:两点重合(取整后) -- 代码:同上 - -## JS 运动应用 - -### 多物体运动框架 - -- 多个物体同时运动 - - 例子:多个 `div` ,鼠标移入变宽 - - 单定时器,存在问题 - - 每个 `div` 一个定时器 -- 多物体运动框架 - - 定时器作为物体的属性 - - 参数的传递:物体、目标值 - - 例子:多个 `div` 淡入淡出 - - 所有东西都不能公用 - - 属性与运动对象绑定:速度、其它属性值(如透明度等) -- 代码:同下 - -### 任意值运动框架 - -- `offset` 属性的 Bug - - - 获取的是整个盒子模型的大小,有边框的 div 变宽 - - 用 `obj.currentStyle('name')` 和 `getComputedStyle(obj,'').name`代替 `offset` - -- 原有运动框架的问题 - - - 只能让某个值运动起来 - - 如果想让其他值运动起来,要修改程序 - -- 扩展的运动框架 - - - 运动属性作为参数 - - 封装 `opacity ` - - 小数精度问题:`Math.round()` 四舍五入取整 - -- 代码: - - ```HTML - - - - - - 缓冲运动及停止条件 - - - - -
    -
    -
    -
    -
    -
    -
    -
    -
    123adsfzv
    -
    -
    - - - ``` - - - -### 仿 Flash 图片展示 - -- 效果思路 - - - 两边的按钮:淡入淡出 - - 大图下拉:层级、高度变化 - - 下方的 `li` :多物体淡入淡出 - - 下方的 `ul` :位置计算 - -- 左右按钮 - - - 淡入淡出 - - 鼠标移动到按钮上,按钮会消失 - - 层级问题 - - 按钮和遮罩上都得加上事件 - -- 下方 `li` 效果 - - - 点击切换大图:选项卡 - - `li` 淡入淡出:移入移出 - - `ul` 移动:位置计算 - -- 大图片切换 - - - 图片层级:`z-Index` 一直 +1 - - 图片下拉效果(运动框架) - - 可以改为淡入淡出 - -- 加入自动播放 - - - 和选项卡一样 - -- 代码: - - ```HTML - - - - 仿Flash图片展示 - - - - - -
    -
    -
    -
      -
    • -
    • -
    • -
    • -
    • -
    • -
    • -
    • -
    -
    -
      -
    • -
    • -
    -
      -
    • -
    • 图片说明:introduction
    • -
    • 图片位置:
    • -
    -
    -
      -
    • -
    • -
    • -
    • -
    • -
    • -
    • -
    • -
    -
    -
    -
    - - - ``` - -- ```js - // ./lib/move.js - // 封装获取计算后元素样式函数,返回小数 - function getStyle(obj, name) { - if (obj.currentStyle) { - return obj.currentStyle[name]; - } else { - return getComputedStyle(obj, '') [name]; - } - } - // 任意值运动框架 - function startMove(obj, name, iTarget ) { - clearInterval(obj.timer); - obj.timer = setInterval(move, 30); - function move() { - var current = 0; - if (name === 'opacity') { - // 用 parseFloat 保留小数并去掉后面 px ,从左至右提取数字,遇到不是数字跳出 - // Math.round() 四舍五入取整 - current = Math.round(parseFloat(getStyle(obj, name))*100); - } else { - // 用 parseInt 去掉后面 px ,从左至右提取数字,遇到不是数字跳出 - current = parseInt(getStyle(obj, name)); - } - var speed = (iTarget - current)/3; - if (speed < 0) { - speed = Math.floor(speed); - } else { - speed = Math.ceil(speed); - } - if (iTarget === current) { - clearInterval(obj.timer); - } else { - if (name === 'opacity') { - obj.style[name] = (current + speed)/100; - obj.style.filter = "alpha("+[name]+ "=" + (current + speed) + ")"; - } else { - obj.style[name] = current + speed + 'px'; - } - } - // console.log('iTarget',iTarget,'current',current,'getStyle',getStyle(obj, name),speed) - } - } - ``` - - - -- 笔记:不让子元素继承父元素的 `opacity ` 属性 - - - 使用 `rgba(R,G,B,opacity)` 间接的设定 `opacity` 的值,这个属性不会向下继承 - - 或者把 `opacity` 属性放到同级元素实现 - -- 笔记:父级使用相对定位,子级才能在范围内绝对定位 - -## JS 运动中级 - -### 链式运动框架 - -- 回调函数:`startMove(obj, attr, iTarget, fn)` - - 运动停止时,执行函数 - - 运动停止时,开始下一次运动 - - 例子:土豆网右下角菜单 - -### 完美运动框架 - -- 多个值同时变化:`startMove(obj, json)` - - - `setStyle` 同时设置多个属性 - - 参数传递: - - `JSON` 的使用 - - `for in` 遍历属性 - -- 运用到运动框架 - -- 检测运动停止 - - - 标志变量 - -- 例子:伸缩同时淡入淡出的菜单 - -- 代码: - - ```js - // ./lib/move2.js - // 封装获取计算后元素样式函数,返回小数 - function getStyle(obj, name) { - if (obj.currentStyle) { - return obj.currentStyle[name]; - } else { - return getComputedStyle(obj, '') [name]; - } - } - // 任意值运动框架 - function startMove(obj, json, fnEnd ) { - clearInterval(obj.timer); - obj.timer = setInterval(move, 30); - function move() { - var current = 0; - var stop = true; - for (const attr in json) { - if (attr === 'opacity') { - // 用 parseFloat 保留小数并去掉后面 px ,从左至右提取数字,遇到不是数字跳出 - // Math.round() 四舍五入取整 - current = Math.round(parseFloat(getStyle(obj, attr))*100); - } else { - // 用 parseInt 去掉后面 px ,从左至右提取数字,遇到不是数字跳出 - current = parseInt(getStyle(obj, attr)); - } - var speed = (json[attr] - current)/4; - if (speed < 0) { - speed = Math.floor(speed); - } else { - speed = Math.ceil(speed); - } - if (json[attr] === current) { - stop = true; - } else { - stop = false; - if (attr === 'opacity') { - obj.style[attr] = (current + speed)/100; - obj.style.filter = "alpha("+[attr]+ "=" + (current + speed) + ")"; - } else { - obj.style[attr] = current + speed + 'px'; - } - } - console.log('json[attr]:',json[attr],'attr:', attr,'current:',current,'getStyle:',getStyle(obj, attr),'speed:',speed); - } - if (stop === true) { - clearInterval(obj.timer); - if (fnEnd) { - fnEnd() - } - } - } - } - ``` - -- ```HTML - - - - - 链式运动框架 - - - - - - -
    -
    -
    土豆
    -
    播放器
    - -
    - - - ``` - - - -### 运动框架总结 - -- 运动框架演变过程 - - `startMove(iTarget)` :运动框架 - - `startMove(obj, iTarget)` :多物体 - - `startMove(obj, attr, iTarget)` :任意值 - - `startMove(obj, attr, iTarget, fn)` :链式运动 - - `startMove(obj, json)` :多值运动 - - `startMove(obj, json, fn)` :完美运动框架 - -### 运动框架应用 - -- 运动框架应用 - - - 例子:幻灯片 - -- 例子:新浪微博 - - - 链式运动 - - - 笔记:CSS `white-space` 属性 保留换行 - - ``` - 值 描述 - normal 默认。空白会被浏览器忽略。 - pre 空白会被浏览器保留。其行为方式类似 HTML 中的
     标签。
    -    nowrap		文本不会换行,文本会在在同一行上继续,直到遇到 
    标签为止。 - pre-wrap 保留空白符序列,但是正常地进行换行。 - pre-line 合并空白符序列,但是保留换行符。 - inherit 规定应该从父元素继承 white-space 属性的值。 - ``` - -- 代码: - - ```HTML - - - - 幻灯片上下滑动和新浪微博效果 - - - - - -
    -
    -
    -
      -
    • -
    • -
    • -
    • -
    • -
    • -
    • -
    • -
    -
    -
      -
    • -
    • -
    -
      -
    • -
    • 图片说明:introduction
    • -
    • 图片位置:
    • -
    -
    -
      -
    • -
    • -
    • -
    • -
    • -
    • -
    • -
    • -
    -
    -
    -
    - - -
    -
    -
    -
    -
    -
    - - - ``` - -- ```css - /* 18.1.css */ - body { - width: 100%; - height: 100%; - background-color: cornsilk; - } - li { - float: left; - } - /* 居中 div */ - #div_center { - margin: 20px auto; - width: 640px; - height: 450px; - } - /* 定位 div */ - #div_position { - width: 640px; - height: 1100px; - overflow: hidden; - background-color: rgb(70, 70, 70); - position: absolute; - } - - /* 大图样式 */ - #div_pic { - width: 640px; - height: 360px; - overflow: hidden; - position: absolute; - } - .ul_pic { - position: absolute; - } - .li_pic { - position: absolute; - } - .li_pic img{ - width: 640px; - height: 360px; - } - - /* 左右键样式 */ - .ul_btn { - top: 0px; - width: 640px; - height: 360px; - position: absolute; - float: left; - } - .slider_btn_left, .slider_btn_right { - width: 150px; - height: 360px; - } - .slider_btn_right { - float: right; - } - .slider_btn_left img{ - padding: 150px 105px 150px 10px ; - position: relative; - width: 35px; - height: 60px; - opacity: 0; - filter: alpha(opacity=0); - float: left; - } - .slider_btn_right img{ - padding: 150px 10px 150px 105px ; - position: relative; - width: 35px; - height: 60px; - opacity: 0; - filter: alpha(opacity=0); - float: right; - } - - /* 小图样式 */ - #div_thumbnail { - top: 360px; - width: 620px; - background-color: rgb(70, 70, 70); - margin: 0 10px 0 5px; - overflow: hidden; - position: absolute; - } - .ul_thumbnail { - width: 640px; - height: 90px; - } - .li_thumnali { - opacity: 0.5; - filter: alpha(opacity=50); - } - .li_thumnali img{ - padding: 10px 0px 10px 10px; - width: 125px; - height: 70px; - } - - /* 图片文字栏 */ - .ul_txt { - width: 640px; - height: 20px; - position: absolute; - top: 340px; - } - .li4_background { - width: 640px; - height: 20px; - top: 0px; - background-color: rgb(0, 0, 0); - opacity: 0.5; - filter: alpha(opacity=50); - } - .li4_introduction { - top: -17px; - margin-left: 10px; - width: 500px; - position: relative; - color: rgb(255, 255, 255); - filter: alpha(opacity=80); - opacity: 0.8; - } - .li4_sum_num { - width: 120px; - top: -17px; - left: 10px; - position: relative; - color: rgb(255, 255, 255); - filter: alpha(opacity=80); - opacity: 0.8; - } - - /* 评论区 */ - #div_comments { - position: absolute; - display: block; - top: 450px; - padding-top: 20px; - width: 640px; - background-color: rgb(252, 229, 200); - } - #div_com_inp { - margin-top: 5px; - border-top: burlywood dashed 1px; - border-bottom: burlywood dashed 1px; - } - .text { - margin: 20px 0 20px 53px; - } - .btn { - margin: 20px 0 20px 20px; - width: 70px; - height: 70px; - } - #div_com_show { - height: 475px; - margin: 20px 50px; - padding: 0px 20px; - background-color: rgb(255, 255, 255); - overflow: hidden; - } - .li_comment { - white-space: pre-wrap; - padding: 10px 5px; - float: none; - border-bottom: cadetblue dashed 1px; - opacity: 0; - filter: alpha(opacity=0); - overflow: hidden; - } - ``` - - -## JS事件基础 - -### Event 对象和事件冒泡 - -- 什么是 Event 对象 - - 用来获取鼠标/键盘事件的信息:**鼠标位置、键盘按键** - - 例子:获取鼠标位置:`clientX` - - `document` 的本质是整个网页:`document.childNodes[0].tagName = ''` - - `body` 不加事件,因为没有内容就没高度 - -- 获取 `Event` 对象**(兼容性写法)** - - - `var oEvent = ev||event;` 火狐用 `ev` / IE 用 `event` - - 事件函数把事件对象最为参数传入:`btn.onclick = function(ev) { var oEvent = ev||event;}` - -- 事件流 - - 事件流冒泡:事件往父级传递 - - 取消冒泡:`oEvent.cancelBubble = true` - - 例子:仿 `select` 控件 - - `DOM` 事件流 - -- 代码: - - ```HTML - - - - - 键盘事件和仿select下拉框 - - - - - - -
    - - - ``` - - - -### 鼠标事件 - -- 鼠标位置 - - 可视区位置:`clientX`、`clientY` - - - 例子:跟随鼠标的 `Div` - - - 消除滚动条的影响:**可视区**与**页面顶部**的距离 - - - 代码: - - ```js - // 封装鼠标当前坐标函数 - function getPos(ev) { - var scrollTop = document.documentElement.scrollTop||document.body.scrollTop; - var scrollLeft = document.documentElement.scollLeft||document.body.scrollLeft; - - return {x: ev.clientX+scrollLeft, y: ev.clientY+scrollTop}; - } - ``` - - - 滚轮事件:`onmousewheel` 滚轮数据:`event.wheelDelta` - - - 代码:鼠标滚轮控制 `div` 移动 - - ```HTML - - - - - 事件绑定与鼠标滚轮 - - - - - -
    - - - ``` - - - -- 获取鼠标在页面的绝对位置 - - 封装函数 - - - 例子:一串跟随鼠标的 `Div` - - - 代码: - - ```HTML - - - - - 跟随鼠标的一串div - - - - - -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - - ``` - -### 键盘事件 - -- `keyCode` - - - 获取用户按下键盘的哪个键:`onkeydown` / `onkeyup` - - 例子:键盘控制 `Div` 移动 - -- 其它属性 - - `ctrlKey`、`shiftKey`、`altKey` - - 例子:提交留言 - - 回车提交 - - CTRL + 回车 提交 - -- 代码: - - ```HTML - - - - - 键盘控制元素移动和回车提交 - - - - - -
    -
    - - -
    -
    -

    CTRL + 回车 提交

    -

    键盘控制留言框位置

    -
    -
    - - - ``` - - - -## JS 事件中级 - -### 默认事件 - -- 默认事件 - - - 什么是默认事件 - -- 阻止默认事件 - - 普通写法:`return false;` - - 例子1:屏蔽右键菜单 - - ` document.oncontextmenu = function (ev) { return false; }` - - 弹出自定义右键菜单 - - 例子2:只能输入数字的输入框 - - ` oTxt.onkeydown = function (ev) { return false; }` - - `keydown`、`keyup` 事件区别 - -- 代码: - - ```HTML - - - - - 默认事件 - - - - - - -
    -
  • 123
  • -
  • 456
  • -
  • 789
  • -
  • 123
  • -
  • 456
  • -
  • 789
  • -
  • 123
  • -
  • 456
  • -
  • 789
  • -
    - - - ``` - - - -### 拖拽 - -- 简单拖拽 - - 拖拽原理 - - 鼠标按下位置到 div 距离不变 - - 三个事件:` onmousedown` `onmousemove` `onmouseup` - -- 靠谱拖拽 - - 原有拖拽的问题:移动太快鼠标会移出 div - - 直接给 `document` 加事件 - - FireFox 下,空 Div 拖拽 Bug - - 阻止默认事件:`onmousedown {return false}` - - 防止拖出页面 - - 修正位置:在可视区内 - -- 代码: - - ```HTML - - - - - 拖拽 - - - - - -
    - - - ``` - - - -## JS 事件高级应用 - -### 事件绑定 - -- IE 方式: - - `attachEvent(事件名称, 函数)`,绑定事件处理函数 - - `detachEvent(事件名称, 函数)`,接触绑定 - -- DOM 方式:不兼容 IE7 - - `addEventListener(事件名称, 函数, 捕获)` - - `removeEventListener(事件名称, 函数, 捕获)` - -- 何时使用绑定 - -- 绑定事件和 `this` - -- 绑定匿名函数,会无法删除 - -- 代码: - - ```HTML - - - - - 事件绑定 - - - - - - -
    - - - ``` - - - -### 高级拖拽 - -- 复习拖拽原理 - - - 距离不变 - - 三个事件 - -- 限制范围 - - - 对位置进行判断 - - 例子1:不能拖出窗口的 Div - - 例子2:不能拖出指定窗口的 Div - - 磁性吸附 - -- 图片拖拽 - - - 阻止默认事件 - -- **文字选中** - - - 阻止默认事件 `return false` 可以解决 `chrome` 、`FireFox` 、`IE9`的文字选中问题 - - IE 下拖动有问题: - - 事件捕获:`.setCapture()` 只兼容IE - - 取消捕获:`.releaseCapture()` - -- 与 DOM 配合 - - - 带框的拖拽 - - 保留原有位置的拖拽 - -- 代码: - - ```HTML - - - - - 高级拖拽 - - - - - -
    - asdfasdfas/sad'234 -
    asdfasdfas/sad
    - asdfasdfas/sad'234 -
    - - - ``` - - - -### 自定义滚动条 - -- 拖拽 - - - 只有横向拖拽 - - 限制范围:范围的大小 - - 计算比例:当前值/最大值 - -- 控制其他对象 - - - 例子1:控制物体的大小 - - 例子2:控制物体的透明度 - - 例子3:控制文字滚动 - -- 代码: - - ```HTML - - - - - 自定义滚动条 - - - - - -
    -
    -
    -
    -
    -
    -
    -
    -
    - 值 描述 - normal 默认。空白会被浏览器忽略。 - pre 空白会被浏览器保留。其行为方式类似 HTML 中的 标签。inherit 规定应该从父元素继承 white-space 属性的值。 - nowrap 文本不会换行,文本会在在同一行上继续,直到遇到 标签为止。 - pre-wrap 保留空白符序列,但是正常地进行换行。 - pre-line 合并空白符序列,但是保留换行符。 - inherit 规定应该从父元素继承 white-space 属性的值。 - - 拖拽 - - 只有横向拖拽 - - 限制范围:范围的大小 - - 计算比例:当前值/最大值 - - 控制其他对象 - - 例子1:控制物体的大小 - - 例子2:控制物体的透明度 - - 例子3:控制文字滚动 - - 代码:- 拖拽 - - 只有横向拖拽 - - 限制范围:范围的大小 - - 计算比例:当前值/最大值 - - 控制其他对象 - - 例子1:控制物体的大小 - - 例子2:控制物体的透明度 - - 例子3:控制文字滚动 - - 代码:- 代码:- 拖拽 - - 只有横向拖拽 - - 限制范围:范围的大小 - - 计算比例:当前值/最大值 - - 控制其他对象 -
    -
    -
    - - - ``` - - - -## Ajax 基础 - -### Ajax 是什么 - -- 什么是服务器 - - 网页浏览过程分析 - - 如何配置自己的服务器程序 -- 什么是 **Ajax = Asynchronous JavaScript and XML**(异步的 JavaScript 和 XML) - - 无刷新数据读取 - - 用户注册、在线聊天室 - - 异步、同步 - -### 使用 Ajax - -- 基础:请求并显示静态 `txt `文件 - - 字符集编码:必须统一编码 - - 缓存、阻止缓存: - - 根据 `URL` 缓存:让 `URL` 一直在变化,在 URL 后加时间戳 -- 动态数据:请求 JS(或 json )文件,获取过来是字符串,需要解析 - - `eval` 的使用:解析成 JS 元素 - - DOM 创建元素 -- 局部刷新:请求并显示部分网页文件 - -### Ajax 原理 - -- HTTP 请求方法 - - `GET` ---- 用于获取数据(如:浏览帖子) - - `POST`---- 用于上传数据(如:用户注册) - - GET/POST 的区别 - - `GET` 是在 `url` 里传数据:安全性差、容量小、有缓存 - - `POST` 不通过 `url` :安全性较高,容量大(2G)、无缓存 - -## Ajax 中级 - -### 编写 Ajax - -- 创建 Ajax 对象 - - - `ActiveXObject("Microsoft.XMLHTTP)` -- `XMLHttpRequest()` - - 笔记:变量是 `Window` 的属性 - - - 使用未定义的变量 —— 报错 - - 使用未定义的属性 —— `undefined` - - 用 `window.XMLHttpRequest` 返回真则是 chrome FF IE7, - - 用 `window.ActiveXObject("Microsoft.XMLHTTP")` 返回真则是 IE6 - -- 连接服务器 - - - `open(方法,文件名,异步传输)` - - *method*:请求的类型;`GET` 或 `POST` ,**必须大写** - - *url*:文件在服务器上的位置,GET 请求要避免缓存,请向 URL 添加一个唯一的 ID - - *async*:true(异步)或 false(同步) - -- 发送请求 - - - `send()` - - *string*:仅用于 POST 请求 - -- 接收返回值 - -- 请求状态监控 - - - `onreadystatechange` 事件 - - `readyState` 属性:请求状态 - - - `0: 未初始化 ` 还没有调用 `open()` 方法 - - `1: 开始载入 ` 已调用 `send()` 方法,正在发送请求 - - `2: 载入完成 ` `send()` 发送完成,已收到全部响应内容 - - `3: 解析 ` 正在解析响应内容 - - `4: 完成` 响应内容解析完成,可以在客户端调用了 - - - `status` 属性( http 状态码):请求结果,`200: 成功` - - - `responseText` 获得字符串形式的响应数据 - - ```js - document.getElementById("myDiv").innerHTML=xmlhttp.responseText; - ``` - -> ## POST 请求 -> -> 一个简单 POST 请求: -> -> 实例 -> -> ```js -> xmlhttp.open("POST","/try/ajax/demo_post.php",true); xmlhttp.send(); -> ``` -> -> 如果需要像 HTML 表单那样 POST 数据,请使用 setRequestHeader() 来添加 HTTP 头。然后在 send() 方法中规定您希望发送的数据: -> -> 实例 -> -> ```js -> xmlhttp.open("POST","/try/ajax/demo_post2.php",true); xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded"); xmlhttp.send("fname=Henry&lname=Ford"); -> ``` -> -> | 方法 | 描述 | -> | :------------------------------- | :----------------------------------------------------------- | -> | setRequestHeader(*header,value*) | 向请求添加 HTTP 头。 *header*: 规定头的名称 *value*: 规定头的值 | - -- 代码: - - ```HTML - - - - - - -

    - - - - - ``` - - - -### Ajax 数据 - -- 数据类型 - - 什么叫数据类型——英语/中文 - - `XML` / `JSON` -- 字符集( 文件编码 ) - - 所有文件字符集相同 - -## JS 面对对象基础 - -### 面对对象是什么 - -- 什么是对象 - - 什么是收音机,许多成分构成的整体,提供一些功能 - - 对象是一个整体,对外界提供一些操作 -- 什么是面对对象 - - 使用对象时,只关注对象提供的功能,不关注其内部细节 - - 比如 JQuery -- 面向对象是一种通用思想,并非只有编程中能用,任何事情都可以面对对象 - -### JS 中的面对对象 - -- 面对对象编程(OOP)的特点 - - 抽象:抓住核心问题,把主要特征、相关特征抽出来 - - 封装:不考虑内部实现,只考虑功能使用 - - 继承:基于已有对象,继承出新的对象 - - 多态继承:同时具有几个父对象的特性 - - 多态:JAVA 等强类型语言常用,JS 不常用 -- 对象的组成 - - 方法——函数:过程、动态的 - - 函数:不属于对象 - - 方法:属于对象的函数 - - 属性——变量:状态、静态的 - - 变量:不属于对象 - - 属性:属于对象的变量 - -### 第一个面对对象的程序 - -- 为对象添加方法和属性 - - `this` 详解,事件处理中 `this` 的本质 - - `window` - - `this` —— 函数属于谁 - - 不能在系统对象中随意附加方法、属性,否则会覆盖已有方法、属性 - - `Object` 对象:系统空白对象 - -### 工厂方式 - -- 工厂方式 - - 用构造函数创建一个类 - - 什么是类、对象(实例):模具和零件 - - 笔记:构造函数/工厂函数 - - 构建对象的函数 - - `constructor` 属性 返回所有 `JavaScript` 变量的构造器函数。 -- 工厂方式的问题 - - 没有 new - - 函数重复定义:函数内容一样却不相等,浪费大量系统资源 -- 问题解决:**构造函数加上** `new` , **然后用原型**`Prototype` 为对象添加**方法** - - `new` 做了两件事 - - **替你创建了一个空白对象**:`var this = new Object()` - - **替你返回了这个空白对象**:`return this ` - - `new` 和 `this` - -### 原型:Prototype - -- 原型是什么 - - 原型是 `class`,修改它可以影响一类元素 - - 在已有对象中加入自己的属性、方法 - -- 为所有 `Array` 添加 `Sum` 方法:`Array.prototype.sum = function () {} ` - - 给对象添加方法,类似于行间样式 - - **给原型添加方法,类似于 `class`** - -- 原型的小缺陷 - - - 无法限制覆盖 - -- 类和对象的区别 - - 类:生产对象的模板 `Array` - - `var arr = new Array()` - - 对象:产品 `arr` - -- 总结:**用构造函数加属性,用原型加方法,叫做混合方式构造对象** - -- 代码: - - ```HTML - - - - - 面对对象基础 - - - - - - - ``` - - - -### 面对对象编程方式 - -- 用混合方式构造对象 - - 混合的构造函数 / 原型方式 - - `Mixed Constructor Function` / `Prototype Method` -- 原则 - - 构造函数:加属性 - - 原型:加方法 -- 对象命名规范 - - 类名首字母大写 - -## JS 面对对象实例 - -### 面对对象的选项卡 - -- 把面向过程的程序,改写成面向对象的形式 - - - 原则:不能有函数套函数,但可以有全局变量 - - 过程: - - `onload`:构造函数 - - 全局变量:属性 - - 函数:方法 - - 改错: - - `this`、事件、闭包、传参 - -- 对象与闭包 - - - 通过闭包传递 `this` - -- 代码: - - ```HTML - - - - - 面对对象的选项卡 - - - - -
    -
    - 11 - 22 - 33 - 44 -
    -
    -
      -
    • 1
    • -
    -
      -
    • 2
    • -
    -
      -
    • 3
    • -
    -
      -
    • 4
    • -
    -
    -
    - - - ``` - - - -## JS 面对对象高级 - -### Json 方式的面向对象 - -- 把方法包在一个 `Json` 里:简单 单体 不适合多个对象 - - 有人管它叫:**命名空间** - - 把同一类方法,放在一起 - -- 代码: - - ```js - var json = { - name: 'zhangsan', - QQ: 34543643, - age: 23, - showName: function () { - console.log(this.name); - }, - showQQ: function () { - console.log(this.QQ); - } - } - json.showName(); - json.showQQ(); - ``` - - - -### 拖拽和继承 - -- 面向对象的拖拽 - - 改写原有拖拽,代码同下 -- 对象的继承 - - 什么是继承 - - 在原有类的基础上略作修改,得到一个新类 - - 不影响原有类的功能 - - `instanceof` 运算符:返回 `true`,如果对象是对象类型的实例。 - - **查看对象是否是某个类的实例** - -### 使用继承 - -- 限制范围的拖拽类 - - - 构造函数的伪装 - - - 属性的继承 - - - 原理 - - - `call` 的使用 - - ```js - function A() { - this.abc = 12; - } - A.rototype.show = { - alert(this.abc); - } - function B() { - A.call(this); // 用 call 继承属性,把B传入A函数内 - } - // B.prototype = A.prototype; // 浅复制方法是引用,指向同一个内存空间 - for (var i in A.prototype) { - B.prototype[i] = A.ptoyotype[i]; // 深度复制就不会引用,直接复制内容 - } - var obj = new B(); - alert(obj.abc); - obj.show.call(); // call 一般省略 - ``` - -- 原型链 - - - 方法的继承 - - 原理:**复制方法是引用,指向同一个内存空间** - - 覆盖原型的方法复制 - - `for in` 深度复制就不会引用,直接复制内容 - -- 代码:拖拽改写为面对对象并继承一个新的对象 - - ```HTML - - - - - 面对对象的拖拽 - - - - - - - -
    普通拖拽
    -
    限制范围的拖拽
    - - - ``` - - ```JS - function Drag(id) { - this.disX = ''; - this.disY = ''; - this.oDiv = document.getElementById(id); - var _this = this; - this.oDiv.onmousedown = function (ev) { - _this.fnDown(ev); - return false; - }; - } - Drag.prototype.fnDown = function (ev) { - var ev = event||ev; - var _this = this; - // 鼠标可视区位置 - div左边距 = 鼠标在div内的位置 - this.disX = ev.clientX - this.oDiv.offsetLeft; - this.disY = ev.clientY - this.oDiv.offsetTop; - console.log(this.disX,'可视区鼠标X:', ev.clientX, '鼠标Y:',ev.clientY); - document.onmousemove = function (ev) { - _this.mouseMove(ev); - } - document.onmouseup = function (ev) { - _this.mouseUp(ev); - } - } - Drag.prototype.mouseMove = function(ev) { - // 不断获取Event 对象,坐标才会不断更新 - var ev = event||ev; - // console.log('可视区鼠标X:', ev.clientX, '鼠标Y:',ev.clientY); - // div位置 = 鼠标可视区新的位置 - 鼠标与div的距离 - this.oDiv.style.left = ev.clientX - this.disX + 'px'; - this.oDiv.style.top = ev.clientY - this.disY + 'px'; - } - Drag.prototype.mouseUp = function () { - document.onmousemove = ''; - document.onmouseup = ''; - } - ``` - - ```JS - // 继承属性 - function LimitDrag(id) { - Drag.call(this, id); - } - // 继承原型 - for (var i in Drag.prototype) { - LimitDrag.prototype[i] = Drag.prototype[i]; - } - - LimitDrag.prototype.mouseMove = function(ev) { - // 不断获取Event 对象,坐标才会不断更新 - var ev = event||ev; - // console.log('可视区鼠标X:', ev.clientX, '鼠标Y:',ev.clientY); - // div位置 = 鼠标可视区新的位置 - 鼠标与div的距离 - var l = ev.clientX - this.disX; - var t = ev.clientY - this.disY; - if (l < 0) { - l = 0; - } else if (l > document.documentElement.clientWidth - this.oDiv.offsetWidth) { - l = document.documentElement.clientWidth - this.oDiv.offsetWidth; - } - if ( t < 0) { - t = 0; - } else if (t > document.documentElement.clientHeight - this.oDiv.offsetHeight) { - t = document.documentElement.clientHeight - this.oDiv.offsetHeight; - } - this.oDiv.style.top = t + 'px'; - this.oDiv.style.left = l + 'px'; - } - ``` - - - -### 系统对象 - -- 本地对象 - - 什么是本地对象 - - 常用对象:可以实例化( `new` ) - - `Object` / `Function` / `Array` / `String` / `Boolean` / `Number` / `Date` / `RegExp` / `Error` -- 内置对象(静态对象):不能实例化 - - 什么是本地对象 - - `Global(无法使用)` / `Math` -- 宿主对象(由浏览器提供的对象) - - `DOM` / `BOM` - -## BOM 应用 - -### BOM 基础 - -- 打开、关闭窗口 - - `open(url, 打开方式)`:`open('ablout.blank', '_blank')` - - 例子:页面内运行代码功能 - - `close(url, 打开方式)`:`window.close()` 关闭当前窗口 - - 例子:关闭时提示问题 - - 只能关闭自己 `open` 的窗口 -- 常用属性 - - `window.navigator.userAgent` - - `navigator`:包含大量信息 - - `userAgent`:浏览器信息 - - `window.location` - - `href`:当前网页地址 - - `hostname`:主机域名 - - `pathname`:页面路径和文件名 - - `port`:端口 - - `protocol`:http协议 - - `assign`:加载新文档,url - - `window.history` - - `back()`:后退 - - `forward()`:前进 - - `go()`:历史中某个页面,-1 用于登陆后回跳 - -### 尺寸及坐标 - -- 窗口尺寸、工作区尺寸 - - 可视区尺寸 - - `document.documentElement.clientWidth` - - `document.documentElement.clientHeight` - - 滚动距离 - - `document.body.scrollTop`:旧版本 chrome 和没有 DOCTYPE 声明的 IE - - `document.documentElement.scrollTop`:IE FF - - 完美的获取 `scrollTop` 赋值短语 : - `var scrollTop = document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop;` - -### 常用方法和事件 - -- 系统对话框 - - - 警告框:`alert("内容")`,没有返回值 - - 选择框:`confirm("提问的内容")`,返回 `boolean` - - 输入框:`prompt()`,返回字符串或 `null` - -- `window` 对象常用事件 - - - `onload`:页面加载完发生 - - `onscroll`:页面滚动时发生 - - `onresize`:事件会在窗口或框架被调整大小时发生 - - 例子:回到顶部按钮、侧边栏广告 - - 闪烁问题 - - `userAgent > IE6` 用 `position:fixed;` - - `userAgent < IE6` 用运动; - -- 代码: - - ```HTML - - - - - Bom应用 - - - - - - - - - ``` - - - -## COOKIE 基础与应用 - -### 什么是 cookie - -- 页面用来保存信息 - - 比如:自动登录、记住用户名 -- `cookie 的特征 - - 同一网站中所有页面共享一套 `cookie - - 数量、大小有限 - - 过期时间 -- JS 中使用 `cookie` - - `document.cookie - -### 使用 cookie - -- 设置 `cookie` - - - 格式:`名字 = 值` - - - 赋值时不会覆盖 - - - 过期时间:`expires = 时间` - - - 设置前一个 cookie 数据的过期时间,expires 放在数据后面: - - `document.cookie = 'password=123;expires='+ oDate;` - - 日期对象的使用 - - - 封装函数 - - ```js - // 封装 setCookie 函数 - function setCookie(name, value, iTime) { - var oDate = new Date(); - oDate.setTime(oDate.getTime() + iTime); // 毫秒 - document.cookie = name + '=' + value + ';expires=' + oDate; - } - setCookie('username', '张三', 1000*60*60); - ``` - - - -- 读取 `cookie` - - - 字符串分割 - - ```js - // 封装 getCookie 函数 - getCookie(name) { - var arr = document.cookie.split('; '); - for (var i in arr) { - var arr2 = arr[i].split('='); - if (arr2[0] === name){ - return arr2[1]; - } - } - return ''; - } - console.log(getCookie('username')); - ``` - - - -- 删除 `cookie` - - - 已经过期 - - ```js - // 封装 removeCookie 函数 - function removeCookie(name) { - setCookie(name, '', -1) - } - removeCookie('username'); - ``` - - - -- 例子:使用 `cookie` 记录上次登陆的用户名 - - - 提交时:记录用户名 - - - `window.onload`:读取用户名 - - - 代码: - - ```HTML - - - - - 28.1.登陆后cookie读取用户名 - - - - -
    - - - - - - - ``` - - - -## JS 中的正则表达式 - -### 正则表达式基础 - -- 复习字符串操作:`var str = 'asdf1234';` - - `search`:**查找位置** `str.search('3')` - - `substring`:获取子字符串, - - **截取某段**字符串, **不包含结束位**: `str.substring(2,5)` - - 获取起点以后的字符串:`str.substring(2)` - - `charAt`:**获取某个**字符串 `str.charAt(2)` - - `split`:**分割**某个字符串 ` str.split('-')` -- 找出字符串中所有的数字 - - 用传统字符串操作完成 - - 用正则表达式完成 -- 什么是正则表达式 - - 什么叫正则? - - 规则、模式 - - 强大的**字符串匹配工具** - - 是一种人类很难读懂的文字 - - `RegExp` 对象 - - `JS` 风格:`new RegExp( "a" , "i" )` - - `perl` 风格:`/a/i` - -### 字符串与正则配合 - -- `search`:字符串搜索,返回位置或 -1 - - 返回出现的位置 - - 忽略大小写:`i`:ignore - - 判断浏览器类型 -- `match`:获取匹配的项目,返回元素或 - - 量词:`+` (若干个) - - 量词变化:`\d`(单个数字一组) `\d\d`(两个数字一组) 和 `\d+`(若干连续数字) - - 全局匹配:`g`:global - - 例子:找出所有数字 -- `replace(reg/str,replacement)`:替换所有匹配 - - 返回替换后的字符串 - - 例子:敏感词过滤 - -### 字符串 - -- 任意字符:`[]`方括号(元字符) - - `[abc]` - - 例子:`a[usb]t`:`obt` `ost` `out` -- 范围 - - `[a-z]` `[0-9]` - - 例子:`id[0-9]`:`id0` `id5` -- 排除 - - `[^a]` - - 例子:`o[^0-9]`:`oat ` `o?t` `ot` -- 组合 - - `[a-z0-9A-Z]` -- 实例:偷小说 - - 过滤 HTML 标签, - - 正则贪婪特性,从最长的内容开始过滤 - - 自定义 `innerText` 方法 - - 代码:同下 -- 转义字符 - - `.`(点) :任意字符 - - `\d` (数字):`[0-9] ` - - `\w` (数字、英文、下划线) :`[a-z0-9_]` - - `\s` (空白字符):`[ ]` - - `\D` (除了数字):`[^0-9]` - - `\W` (除了数字英文下划线) :`[^a-z0-9_]` - - `\S` (除了空白字符):`[^ ]` -- 行首、行尾 - - `^` :行首 - - `$`:行尾 -- 逻辑 - - `|` : 将两个匹配条件进行逻辑“或”(or)运算 - -### 量词 - -- 什么是量词 - - - `{n}`:刚好出现 n 次 - - `{n,m}` 至少出现 n 次,最多 m 次 - - 例子:查找 QQ 号 - -- 常用量词 - - - `{n,}` 至少 n 次,无上限 - - - `*` 任意次 `{0,}` 可以为0次,不建议使用 - - - `?` 零次或一次 `{0,1}` - - ``` - 固定电话:010-23456789-1234 或 23456789 - (0\d{2,3}-)?[1-9]\d{7}(-\d{1,5})? - ``` - - - `+` 一次或任意次`{1,}` - - - `{n}` 正好 n 次 - -### 常用正则例子 - -- 表单校验实例 - - - 检验邮箱 - - 行首行尾 - -- ```HTML - - - - - 正则表达式应用 - - - - - -
    - - - - -
    - - - - ``` - - -## JS Template 模板引擎 - -> https://www.jb51.net/article/100095.htm - -### 1、特性 - -(1)、性能卓越,执行速度通常是 Mustache 与 tmpl 的 20 多倍(性能测试) - -(2)、支持运行时调试,可精确定位异常模板所在语句(演示) - -(3)、对 NodeJS Express 友好支持 - -(4)、安全,默认对输出进行转义、在沙箱中运行编译后的代码(Node版本可以安全执行用户上传的模板) - -(5)、支持include语句 - -(6)、可在浏览器端实现按路径加载模板(详情) - -(7)、支持预编译,可将模板转换成为非常精简的 js 文件 - -(8)、模板语句简洁,无需前缀引用数据,有简洁版本与原生语法版本可选 - -(9)、支持所有流行的浏览器 - -### 2、语法 - -(1)、使用 - -引用简洁语法的引擎版本,例如:` ` - -(2)、表达式 - -{{ 与 }} 符号包裹起来的语句则为模板的逻辑表达式。 - -`template('test', data)` : 渲染 - -(3)、输出表达式 - -对内容编码(转义)输出:` {{content}} ` -不编码(转义)输出:` {{#content}} ` -编码可以防止数据中含有 HTML 字符串,避免引起 XSS 攻击。 - -(4)、条件表达式 - -```html -{{if admin}} -

    admin

    -{{else if code > 0}} -

    master

    -{{else}} -

    error!

    -{{/if}} -``` - -(5)、遍历表达式 - -无论数组或者对象都可以用 each 进行遍历。 - -```html -{{each list as value index}} -
  • {{index}} - {{value.user}}
  • -{{/each}} -// 亦可以被简写:$ 特指当前函数中的变量 -{{each list}} -
  • {{$index}} - {{$value.user}}
  • -{{/each}} -``` - -(6)、模板包含表达式 - -用于嵌入子模板。 - -`{{include 'template_name'}} ` - -子模板默认共享当前数据,亦可以指定数据:`{{include 'template_name' news_list}} ` - -(7)、辅助方法 - -使用 `template.defaults.imports.dateFormat = function(arg1,arg2){} `注册公用辅助方法: - -```js -template.defaults.imports.dateFormat = function(arg1,arg2) { - // .. - return value; -}); -``` - -模板中使用的方式:` {{time | dateFormat:'yyyy-MM-dd hh:mm:ss'}} ` -支持传入参数与嵌套使用: `{{time | say:'cd' | ubb | link}} ` - -### 3、实例 - -```html - - - - - - - - Document - - - - -
    - - - - - - - - -``` - -![image-20200126152808449](readme.assets/image-20200126152808449.png) - - - -```html - - - - -no escape-demo - - - - -

    不转义HTML

    -
    - - - - - -``` - -![image-20200126152827260](readme.assets/image-20200126152827260.png) - -```html - - - - -include-demo - - - - -
    - - - - - - -``` - -![image-20200126152842459](readme.assets/image-20200126152842459.png) - -```html - -``` - -![image-20200126152920878](readme.assets/image-20200126152920878.png) - - - -# 表达式和运算符分类 - -左侧工具栏是按字母表排序的列表。 - -### 主要表达式 - - - -JavaScript中基本关键字和常用表达式。 - -- [`this`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/this) - - `this` 关键字指向函数的执行上下文。 - -- [`function`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/function) - - `function` 关键字定义了函数表达式。 - -- [`class`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/class) - - `class` 关键字定义了类表达式。 - -- [`function*`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/function*) - - `function*` 关键字定义了一个 generator 函数表达式。 - -- [`yield`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/yield) - - 暂停和恢复 generator 函数。 - -- [`yield*`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/yield*) - - 委派给另外一个generator函数或可迭代的对象。 - -- `async function` - - `async function` 定义一个异步函数表达式。 - -- [`await`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/await) - - 暂停或恢复执行异步函数,并等待promise的resolve/reject回调。 - -- [`[\]`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array) - - 数组初始化/字面量语法。 - -- [`{}`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Object_initializer) - - 对象初始化/字面量语法。 - -- [`/ab+c/i`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/RegExp) - - 正则表达式字面量语法。 - -- [`( )`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Grouping) - - 分组操作符。 - -### 左表达式 - - - -左边的值是赋值的目标。 - -- [属性访问符](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Property_accessors) - - 成员运算符提供了对对象的属性或方法的访问 (`object.property` 和 `object["property"]`). - -- [`new`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/new) - - `new` 运算符创建了构造函数实例。 - -- [`new.target`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/new.target) - - 在构造器中,`new.target` 指向[`new`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/new)调用的构造器。 - -- [`super`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/super) - - `super` 关键字调用父类的构造器. - -- [`...obj`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Spread_operator) - - 展开运算符可以将一个可迭代的对象在函数调用的位置展开成为多个参数,或者在数组字面量中展开成多个数组元素。 - -### 自增和自减 - - - -前置/后置自增运算符和前置/后置自减运算符. - -- [`A++`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators#Increment) - - 后置自增运算符. - -- [`A--`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators#Decrement) - - 后置自减运算符. - -- [`++A`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators#Increment) - - 前置自增运算符. - -- [`--A`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators#Decrement) - - 前置自减运算符. - -### 一元运算符 - - - -一元运算符只有一个操作数. - -- [`delete`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/delete) - - `delete` 运算符用来删除对象的属性. - -- [`void`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/void) - - `void` 运算符表示表达式放弃返回值. - -- [`typeof`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/typeof) - - `typeof` 运算符用来判断给定对象的类型. - -- [`+`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators#Unary_plus) - - 一元加运算符将操作转换为Number类型. - -- [`-`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators#Unary_negation) - - 一元减运算符将操作转换为Number类型并取反. - -- [`~`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators#Bitwise_NOT) - - 按位非运算符. - -- [`!`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Logical_Operators#Logical_NOT) - - 逻辑非运算符. - -### 算术运算符 - - - -算术运算符以二个数值(字面量或变量)作为操作数,并返回单个数值。 - -- [`+`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators#Addition) - - 加法运算符. - -- [`-`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators#Subtraction) - - 减法运算符. - -- [`/`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators#Division) - - 除法运算符. - -- [`*`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators#Multiplication) - - 乘法运算符. - -- [`%`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators#Remainder) - - 取模运算符. - -### 关系运算符 - - - -比较运算符比较二个操作数并返回基于比较结果的`Boolean`值。 - -- [`in`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/in) - - `in运算符用来判断对象是否拥有给定属性`. - -- [`instanceof`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/instanceof) - - `instanceof` 运算符判断一个对象是否是另一个对象的实例. - -- [`<`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Comparison_Operators#Less_than_operator) - - 小于运算符 - -- [`>`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Comparison_Operators#Greater_than_operator) - - 大于运算符. - -- [`<=`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Comparison_Operators#Less_than_or_equal_operator) - - 小于等于运算符. - -- [`>=`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Comparison_Operators#Greater_than_or_equal_operator) - - 大于等于运算符。 - -**注意: =>** 不是运算符,而是[`箭头函数`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Functions/Arrow_functions)的表示符。 - -### 相等运算符 - - - -如果相等,操作符返回的是Boolean(布尔)类型的true,否则是false。 - -- [`==`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Comparison_Operators#Equality) - - 相等 运算符. - -- [`!=`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Comparison_Operators#Inequality) - - 不等 运算符. - -- [`===`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Comparison_Operators#Identity) - - 全等 运算符. - -- [`!==`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Comparison_Operators#Nonidentity) - - 非全等 运算符. - -### 位移运算符 - - - -在二进制的基础上对数字进行移动操作 - -- [`<<`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators#Left_shift) - - 按位左移运算符。 - -- [`>>`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators#Right_shift) - - 按位右移运算符。 - -- [`>>>`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators#Unsigned_right_shift) - - 按位无符号右移运算符。 - -### 二进制位运算符 - - - -二进制运算符将它们的操作数作为32个二进制位(0或1)的集合,并返回标准的JavaScript数值。 - -- [`&`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators#Bitwise_AND) - - 二进制位与(AND)。 - -- [`|`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators#Bitwise_OR) - - 二进制位或(OR)。 - -- [`^`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators#Bitwise_XOR) - - 二进制位异或(XOR)。 - -### 二元逻辑运算符 - - - -逻辑运算符典型的用法是用于boolean(逻辑)值运算, 它们返回boolean值。 - -- [`&&`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Logical_Operators#Logical_AND) - - 逻辑与. - -- [`||`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Logical_Operators#Logical_OR) - - 逻辑或. - -### 条件(三元)运算符 - - - -- [`(condition ? ifTrue : ifFalse)`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Conditional_Operator) - - 条件元素运算符把两个结果中其中一个符合运算逻辑的值返回。 - -### 赋值运算符 - - - -赋值元素符会将右边的操作数的值分配给左边的操作数,并将其值修改为右边操作数相等的值。 - -- [`=`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Assignment_Operators#Assignment) - - 赋值运算符。 - -- [`*=`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Assignment_Operators#Multiplication_assignment) - - 赋值乘积。 - -- [`/=`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Assignment_Operators#Division_assignment) - - 赋值商。 - -- [`%=`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Assignment_Operators#Remainder_assignment) - - 赋值求余。 - -- [`+=`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Assignment_Operators#Addition_assignment) - - 赋值求和。 - -- [`-=`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Assignment_Operators#Subtraction_assignment) - - 赋值求差。 - -- [`<<=`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Assignment_Operators#Left_shift_assignment) - - 左位移。 - -- [`>>=`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Assignment_Operators#Right_shift_assignment) - - 右位移。 - -- [`>>>=`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Assignment_Operators#Unsigned_right_shift_assignment) - - 无符号右位移。 - -- [`&=`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Assignment_Operators#Bitwise_AND_assignment) - - 赋值与。 - -- [`^=`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Assignment_Operators#Bitwise_XOR_assignment) - - 赋值按位异或。 - -- [`|=`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Assignment_Operators#Bitwise_OR_assignment) - - 赋值或。 - -- [`[a, b\] = [1, 2]`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment) [`{a, b} = {a:1, b:2}`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment) - - 解构赋值允许你分配数组或者对象变量的属性通过使用规定的语法,其看起来和数组和对象字面量很相似。 - -- 逗号操作符 - -- [`,`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Comma_Operator) - - 逗号操作符允许在一个判断状态中有多个表达式去进行运算并且最后返回最后一个表达式的值。 \ No newline at end of file +# JavaScript 学习笔记集和代码库 + +## 1. [JavaScript 从入门到精通.md](JavaScript从入门到精通+w3school.md) + +- [代码](JavaScript_code) + +## 2. [再学 JavaScript ES6-10.md](JavaScriptES6-10.md) + +- [代码](ES6-10) + +## 3. [JavaScript 高级程序设计第四版-笔记.md](JavaScript高级程序设计第四版-笔记.md) + +## 4. [再学 JavaScript ES6-ES11.md](再学JavaScriptES6-ES11.md) + +## 5. [HTML 前端工程师面试必备技巧.md](HTML前端工程师面试必备技巧.md) + +## 6. [快速搞定前端技术一面 匹配大厂面试要求.md](快速搞定前端技术一面%20匹配大厂面试要求.md) + +- [代码](fast-interview-code) + +## 7. [Typescript 学习笔记](Typescript学习笔记.md) + +- [支持热重载、代码格式化的 TypeScript 模板](typescript) diff --git a/typescript/.eslintrc.cjs b/typescript/.eslintrc.cjs new file mode 100644 index 0000000..581bf2d --- /dev/null +++ b/typescript/.eslintrc.cjs @@ -0,0 +1,24 @@ +module.exports = { + parser: '@typescript-eslint/parser', // 定义ESLint的解析器 + extends: ['eslint:recommended', 'plugin:@typescript-eslint/recommended', 'prettier'], // 定义文件继承的子规范 + plugins: ['prettier'], // 定义了该eslint文件所依赖的插件 + env: { + // 指定代码的运行环境 + browser: true, + node: true, + es2021: true, + }, + parserOptions: { + // 指定ESLint可以解析JSX语法 + ecmaFeatures: { + jsx: true, + }, + ecmaVersion: 'latest', + sourceType: 'module', + }, + rules: { + 'no-console': 'off', + 'import/prefer-default-export': 'off', + '@typescript-eslint/no-unused-vars': 'warn', + }, +} diff --git a/typescript/.prettierrc.cjs b/typescript/.prettierrc.cjs new file mode 100644 index 0000000..0c0ce00 --- /dev/null +++ b/typescript/.prettierrc.cjs @@ -0,0 +1,11 @@ +module.exports = { + printWidth: 120, //一行的字符数,如果超过会进行换行,默认为80 + tabWidth: 2, //一个tab代表几个空格数,默认为80 + useTabs: false, //是否使用tab进行缩进,默认为false,表示用空格进行缩减 + singleQuote: true, //字符串是否使用单引号,默认为false,使用双引号 + semi: false, //行位是否使用分号,默认为true + trailingComma: 'es5', //是否使用尾逗号,有三个可选值"" + bracketSpacing: true, //对象大括号直接是否有空格,默认为true,效果:{ foo: bar } + arrowParens: 'always', // 箭头函数单个参数加分号 + bracketSameLine: true, +}; diff --git a/typescript/nodemon.json b/typescript/nodemon.json new file mode 100644 index 0000000..a472a8e --- /dev/null +++ b/typescript/nodemon.json @@ -0,0 +1,10 @@ +{ + "watch": ["src"], + "ext": "ts,js", + "ignore": ["*.test.ts"], + "delay": "0", + "execMap": { + "ts": "ts-node", + "js": "node --harmony" + } +} diff --git a/typescript/package-lock.json b/typescript/package-lock.json new file mode 100644 index 0000000..bc33682 --- /dev/null +++ b/typescript/package-lock.json @@ -0,0 +1,3577 @@ +{ + "name": "typescript", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "typescript", + "version": "1.0.0", + "license": "ISC", + "devDependencies": { + "@types/node": "^18.6.5", + "@typescript-eslint/eslint-plugin": "^5.33.0", + "@typescript-eslint/parser": "^5.33.0", + "eslint": "^8.21.0", + "eslint-config-prettier": "^8.5.0", + "eslint-plugin-prettier": "^4.2.1", + "nodemon": "^2.0.19", + "prettier": "^2.7.1", + "ts-node": "^10.9.1", + "typescript": "^4.7.4" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmmirror.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/@eslint/eslintrc/-/eslintrc-1.3.0.tgz", + "integrity": "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.3.2", + "globals": "^13.15.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@eslint/eslintrc/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.10.4", + "resolved": "https://registry.npmmirror.com/@humanwhocodes/config-array/-/config-array-0.10.4.tgz", + "integrity": "sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@humanwhocodes/gitignore-to-minimatch": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz", + "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==", + "dev": true + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmmirror.com/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmmirror.com/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/@tsconfig/node16/-/node16-1.0.3.tgz", + "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", + "dev": true + }, + "node_modules/@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, + "node_modules/@types/node": { + "version": "18.6.5", + "resolved": "https://registry.npmmirror.com/@types/node/-/node-18.6.5.tgz", + "integrity": "sha512-Xjt5ZGUa5WusGZJ4WJPbOT8QOqp6nDynVFRKcUt32bOgvXEoc6o085WNkYTMO7ifAj2isEfQQ2cseE+wT6jsRw==", + "dev": true + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.33.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.33.0.tgz", + "integrity": "sha512-jHvZNSW2WZ31OPJ3enhLrEKvAZNyAFWZ6rx9tUwaessTc4sx9KmgMNhVcqVAl1ETnT5rU5fpXTLmY9YvC1DCNg==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.33.0", + "@typescript-eslint/type-utils": "5.33.0", + "@typescript-eslint/utils": "5.33.0", + "debug": "^4.3.4", + "functional-red-black-tree": "^1.0.1", + "ignore": "^5.2.0", + "regexpp": "^3.2.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { + "version": "7.3.7", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "5.33.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/parser/-/parser-5.33.0.tgz", + "integrity": "sha512-cgM5cJrWmrDV2KpvlcSkelTBASAs1mgqq+IUGKJvFxWrapHpaRy5EXPQz9YaKF3nZ8KY18ILTiVpUtbIac86/w==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.33.0", + "@typescript-eslint/types": "5.33.0", + "@typescript-eslint/typescript-estree": "5.33.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.33.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/scope-manager/-/scope-manager-5.33.0.tgz", + "integrity": "sha512-/Jta8yMNpXYpRDl8EwF/M8It2A9sFJTubDo0ATZefGXmOqlaBffEw0ZbkbQ7TNDK6q55NPHFshGBPAZvZkE8Pw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.33.0", + "@typescript-eslint/visitor-keys": "5.33.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.33.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/type-utils/-/type-utils-5.33.0.tgz", + "integrity": "sha512-2zB8uEn7hEH2pBeyk3NpzX1p3lF9dKrEbnXq1F7YkpZ6hlyqb2yZujqgRGqXgRBTHWIUG3NGx/WeZk224UKlIA==", + "dev": true, + "dependencies": { + "@typescript-eslint/utils": "5.33.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@typescript-eslint/types": { + "version": "5.33.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/types/-/types-5.33.0.tgz", + "integrity": "sha512-nIMt96JngB4MYFYXpZ/3ZNU4GWPNdBbcB5w2rDOCpXOVUkhtNlG2mmm8uXhubhidRZdwMaMBap7Uk8SZMU/ppw==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.33.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.33.0.tgz", + "integrity": "sha512-tqq3MRLlggkJKJUrzM6wltk8NckKyyorCSGMq4eVkyL5sDYzJJcMgZATqmF8fLdsWrW7OjjIZ1m9v81vKcaqwQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.33.0", + "@typescript-eslint/visitor-keys": "5.33.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.3.7", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "5.33.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/utils/-/utils-5.33.0.tgz", + "integrity": "sha512-JxOAnXt9oZjXLIiXb5ZIcZXiwVHCkqZgof0O8KPgz7C7y0HS42gi75PdPlqh1Tf109M0fyUw45Ao6JLo7S5AHw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.33.0", + "@typescript-eslint/types": "5.33.0", + "@typescript-eslint/typescript-estree": "5.33.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.33.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.33.0.tgz", + "integrity": "sha512-/XsqCzD4t+Y9p5wd9HZiptuGKBlaZO5showwqODii5C0nZawxWLF+Q6k5wYHBrQv96h6GYKyqqMHCSTqta8Kiw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.33.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.8.0", + "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.8.0.tgz", + "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmmirror.com/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmmirror.com/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/chalk/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmmirror.com/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint": { + "version": "8.21.0", + "resolved": "https://registry.npmmirror.com/eslint/-/eslint-8.21.0.tgz", + "integrity": "sha512-/XJ1+Qurf1T9G2M5IHrsjp+xrGT73RZf23xA1z5wB1ZzzEAWSZKvRwhWxTFp1rvkvCfwcvAUNAP31bhKTTGfDA==", + "dev": true, + "dependencies": { + "@eslint/eslintrc": "^1.3.0", + "@humanwhocodes/config-array": "^0.10.4", + "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.1", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.3", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^6.0.1", + "globals": "^13.15.0", + "globby": "^11.1.0", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint-config-prettier": { + "version": "8.5.0", + "resolved": "https://registry.npmmirror.com/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", + "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "4.2.1", + "resolved": "https://registry.npmmirror.com/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", + "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "eslint": ">=7.28.0", + "prettier": ">=2.0.0" + }, + "peerDependenciesMeta": { + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/eslint/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/espree": { + "version": "9.3.3", + "resolved": "https://registry.npmmirror.com/espree/-/espree-9.3.3.tgz", + "integrity": "sha512-ORs1Rt/uQTqUKjDdGCyrtYxbazf5umATSf/K4qxjmZHORR6HJk+2s/2Pqe+Kk49HHINC/xNIrGfgh8sZcll0ng==", + "dev": true, + "dependencies": { + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.2.11", + "resolved": "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmmirror.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmmirror.com/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmmirror.com/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.6", + "resolved": "https://registry.npmmirror.com/flatted/-/flatted-3.2.6.tgz", + "integrity": "sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==", + "dev": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", + "dev": true + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globals": { + "version": "13.17.0", + "resolved": "https://registry.npmmirror.com/globals/-/globals-13.17.0.tgz", + "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmmirror.com/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "dev": true + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmmirror.com/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmmirror.com/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmmirror.com/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmmirror.com/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmmirror.com/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/nodemon": { + "version": "2.0.19", + "resolved": "https://registry.npmmirror.com/nodemon/-/nodemon-2.0.19.tgz", + "integrity": "sha512-4pv1f2bMDj0Eeg/MhGqxrtveeQ5/G/UVe9iO6uTZzjnRluSA4PVWf8CW99LUPwGB3eNIA7zUFoP77YuI7hOc0A==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^3.2.7", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.0.4", + "pstree.remy": "^1.1.8", + "semver": "^5.7.1", + "simple-update-notifier": "^1.0.7", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmmirror.com/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmmirror.com/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "2.7.1", + "resolved": "https://registry.npmmirror.com/prettier/-/prettier-2.7.1.tgz", + "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmmirror.com/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmmirror.com/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/simple-update-notifier": { + "version": "1.0.7", + "resolved": "https://registry.npmmirror.com/simple-update-notifier/-/simple-update-notifier-1.0.7.tgz", + "integrity": "sha512-BBKgR84BJQJm6WjWFMHgLVuo61FBDSj1z/xSFUIozqO6wO7ii0JxCqlIud7Enr/+LhlbNI0whErq96P2qHNWew==", + "dev": true, + "dependencies": { + "semver": "~7.0.0" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/simple-update-notifier/node_modules/semver": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/touch": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, + "dependencies": { + "nopt": "~1.0.10" + }, + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmmirror.com/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmmirror.com/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmmirror.com/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmmirror.com/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/typescript": { + "version": "4.7.4", + "resolved": "https://registry.npmmirror.com/typescript/-/typescript-4.7.4.tgz", + "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmmirror.com/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + } + } + }, + "dependencies": { + "@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmmirror.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "0.3.9" + } + }, + "@eslint/eslintrc": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/@eslint/eslintrc/-/eslintrc-1.3.0.tgz", + "integrity": "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.3.2", + "globals": "^13.15.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "@humanwhocodes/config-array": { + "version": "0.10.4", + "resolved": "https://registry.npmmirror.com/@humanwhocodes/config-array/-/config-array-0.10.4.tgz", + "integrity": "sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "@humanwhocodes/gitignore-to-minimatch": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz", + "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==", + "dev": true + }, + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmmirror.com/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmmirror.com/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "@tsconfig/node16": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/@tsconfig/node16/-/node16-1.0.3.tgz", + "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", + "dev": true + }, + "@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, + "@types/node": { + "version": "18.6.5", + "resolved": "https://registry.npmmirror.com/@types/node/-/node-18.6.5.tgz", + "integrity": "sha512-Xjt5ZGUa5WusGZJ4WJPbOT8QOqp6nDynVFRKcUt32bOgvXEoc6o085WNkYTMO7ifAj2isEfQQ2cseE+wT6jsRw==", + "dev": true + }, + "@typescript-eslint/eslint-plugin": { + "version": "5.33.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.33.0.tgz", + "integrity": "sha512-jHvZNSW2WZ31OPJ3enhLrEKvAZNyAFWZ6rx9tUwaessTc4sx9KmgMNhVcqVAl1ETnT5rU5fpXTLmY9YvC1DCNg==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "5.33.0", + "@typescript-eslint/type-utils": "5.33.0", + "@typescript-eslint/utils": "5.33.0", + "debug": "^4.3.4", + "functional-red-black-tree": "^1.0.1", + "ignore": "^5.2.0", + "regexpp": "^3.2.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "semver": { + "version": "7.3.7", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@typescript-eslint/parser": { + "version": "5.33.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/parser/-/parser-5.33.0.tgz", + "integrity": "sha512-cgM5cJrWmrDV2KpvlcSkelTBASAs1mgqq+IUGKJvFxWrapHpaRy5EXPQz9YaKF3nZ8KY18ILTiVpUtbIac86/w==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "5.33.0", + "@typescript-eslint/types": "5.33.0", + "@typescript-eslint/typescript-estree": "5.33.0", + "debug": "^4.3.4" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "@typescript-eslint/scope-manager": { + "version": "5.33.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/scope-manager/-/scope-manager-5.33.0.tgz", + "integrity": "sha512-/Jta8yMNpXYpRDl8EwF/M8It2A9sFJTubDo0ATZefGXmOqlaBffEw0ZbkbQ7TNDK6q55NPHFshGBPAZvZkE8Pw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.33.0", + "@typescript-eslint/visitor-keys": "5.33.0" + } + }, + "@typescript-eslint/type-utils": { + "version": "5.33.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/type-utils/-/type-utils-5.33.0.tgz", + "integrity": "sha512-2zB8uEn7hEH2pBeyk3NpzX1p3lF9dKrEbnXq1F7YkpZ6hlyqb2yZujqgRGqXgRBTHWIUG3NGx/WeZk224UKlIA==", + "dev": true, + "requires": { + "@typescript-eslint/utils": "5.33.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "@typescript-eslint/types": { + "version": "5.33.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/types/-/types-5.33.0.tgz", + "integrity": "sha512-nIMt96JngB4MYFYXpZ/3ZNU4GWPNdBbcB5w2rDOCpXOVUkhtNlG2mmm8uXhubhidRZdwMaMBap7Uk8SZMU/ppw==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.33.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.33.0.tgz", + "integrity": "sha512-tqq3MRLlggkJKJUrzM6wltk8NckKyyorCSGMq4eVkyL5sDYzJJcMgZATqmF8fLdsWrW7OjjIZ1m9v81vKcaqwQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.33.0", + "@typescript-eslint/visitor-keys": "5.33.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "semver": { + "version": "7.3.7", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@typescript-eslint/utils": { + "version": "5.33.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/utils/-/utils-5.33.0.tgz", + "integrity": "sha512-JxOAnXt9oZjXLIiXb5ZIcZXiwVHCkqZgof0O8KPgz7C7y0HS42gi75PdPlqh1Tf109M0fyUw45Ao6JLo7S5AHw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.33.0", + "@typescript-eslint/types": "5.33.0", + "@typescript-eslint/typescript-estree": "5.33.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + }, + "dependencies": { + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + } + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.33.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.33.0.tgz", + "integrity": "sha512-/XsqCzD4t+Y9p5wd9HZiptuGKBlaZO5showwqODii5C0nZawxWLF+Q6k5wYHBrQv96h6GYKyqqMHCSTqta8Kiw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.33.0", + "eslint-visitor-keys": "^3.3.0" + } + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "acorn": { + "version": "8.8.0", + "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.8.0.tgz", + "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", + "dev": true + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "requires": {} + }, + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmmirror.com/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmmirror.com/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmmirror.com/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "eslint": { + "version": "8.21.0", + "resolved": "https://registry.npmmirror.com/eslint/-/eslint-8.21.0.tgz", + "integrity": "sha512-/XJ1+Qurf1T9G2M5IHrsjp+xrGT73RZf23xA1z5wB1ZzzEAWSZKvRwhWxTFp1rvkvCfwcvAUNAP31bhKTTGfDA==", + "dev": true, + "requires": { + "@eslint/eslintrc": "^1.3.0", + "@humanwhocodes/config-array": "^0.10.4", + "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.1", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.3", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^6.0.1", + "globals": "^13.15.0", + "globby": "^11.1.0", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "eslint-config-prettier": { + "version": "8.5.0", + "resolved": "https://registry.npmmirror.com/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", + "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", + "dev": true, + "requires": {} + }, + "eslint-plugin-prettier": { + "version": "4.2.1", + "resolved": "https://registry.npmmirror.com/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", + "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", + "dev": true, + "requires": { + "prettier-linter-helpers": "^1.0.0" + } + }, + "eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^2.0.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true + } + } + }, + "eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true + }, + "espree": { + "version": "9.3.3", + "resolved": "https://registry.npmmirror.com/espree/-/espree-9.3.3.tgz", + "integrity": "sha512-ORs1Rt/uQTqUKjDdGCyrtYxbazf5umATSf/K4qxjmZHORR6HJk+2s/2Pqe+Kk49HHINC/xNIrGfgh8sZcll0ng==", + "dev": true, + "requires": { + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.3.0" + } + }, + "esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, + "fast-glob": { + "version": "3.2.11", + "resolved": "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmmirror.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmmirror.com/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmmirror.com/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.2.6", + "resolved": "https://registry.npmmirror.com/flatted/-/flatted-3.2.6.tgz", + "integrity": "sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", + "dev": true + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globals": { + "version": "13.17.0", + "resolved": "https://registry.npmmirror.com/globals/-/globals-13.17.0.tgz", + "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmmirror.com/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + } + }, + "grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmmirror.com/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true + }, + "ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmmirror.com/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmmirror.com/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmmirror.com/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmmirror.com/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "nodemon": { + "version": "2.0.19", + "resolved": "https://registry.npmmirror.com/nodemon/-/nodemon-2.0.19.tgz", + "integrity": "sha512-4pv1f2bMDj0Eeg/MhGqxrtveeQ5/G/UVe9iO6uTZzjnRluSA4PVWf8CW99LUPwGB3eNIA7zUFoP77YuI7hOc0A==", + "dev": true, + "requires": { + "chokidar": "^3.5.2", + "debug": "^3.2.7", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.0.4", + "pstree.remy": "^1.1.8", + "semver": "^5.7.1", + "simple-update-notifier": "^1.0.7", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + } + }, + "nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmmirror.com/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmmirror.com/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, + "prettier": { + "version": "2.7.1", + "resolved": "https://registry.npmmirror.com/prettier/-/prettier-2.7.1.tgz", + "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", + "dev": true + }, + "prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "requires": { + "fast-diff": "^1.1.2" + } + }, + "pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmmirror.com/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmmirror.com/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "simple-update-notifier": { + "version": "1.0.7", + "resolved": "https://registry.npmmirror.com/simple-update-notifier/-/simple-update-notifier-1.0.7.tgz", + "integrity": "sha512-BBKgR84BJQJm6WjWFMHgLVuo61FBDSj1z/xSFUIozqO6wO7ii0JxCqlIud7Enr/+LhlbNI0whErq96P2qHNWew==", + "dev": true, + "requires": { + "semver": "~7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true + } + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "touch": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, + "requires": { + "nopt": "~1.0.10" + } + }, + "ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmmirror.com/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "requires": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmmirror.com/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmmirror.com/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmmirror.com/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + }, + "typescript": { + "version": "4.7.4", + "resolved": "https://registry.npmmirror.com/typescript/-/typescript-4.7.4.tgz", + "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", + "dev": true + }, + "undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmmirror.com/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true + } + } +} diff --git a/typescript/package.json b/typescript/package.json new file mode 100644 index 0000000..7194928 --- /dev/null +++ b/typescript/package.json @@ -0,0 +1,25 @@ +{ + "name": "typescript", + "version": "1.0.0", + "description": "", + "scripts": { + "dev:ts": "nodemon src/index.ts", + "dev:js": "nodemon src/index.js", + "lint": "eslint ./src --fix" + }, + "author": "", + "type": "module", + "license": "ISC", + "devDependencies": { + "@types/node": "^18.6.5", + "@typescript-eslint/eslint-plugin": "^5.33.0", + "@typescript-eslint/parser": "^5.33.0", + "eslint": "^8.21.0", + "eslint-config-prettier": "^8.5.0", + "eslint-plugin-prettier": "^4.2.1", + "nodemon": "^2.0.19", + "prettier": "^2.7.1", + "ts-node": "^10.9.1", + "typescript": "^4.7.4" + } +} diff --git a/typescript/readme.md b/typescript/readme.md new file mode 100644 index 0000000..e2cbcb5 --- /dev/null +++ b/typescript/readme.md @@ -0,0 +1,3 @@ +## nodemon + +https://github.com/remy/nodemon/blob/master/doc/sample-nodemon.md diff --git a/typescript/src/index.js b/typescript/src/index.js new file mode 100644 index 0000000..b97bbc9 --- /dev/null +++ b/typescript/src/index.js @@ -0,0 +1,4 @@ +import './nowcoder/examHuawei.js' +import './nowcoder/examTop101.js' +import './nowcoder/quickSort.js' +import './nowcoder/microTask.js' diff --git a/typescript/src/index.ts b/typescript/src/index.ts new file mode 100644 index 0000000..8552167 --- /dev/null +++ b/typescript/src/index.ts @@ -0,0 +1,9 @@ +import './utilityType' + +const welcome = 'App is running...' + +export function hello(who: string = welcome): string { + return `[INFO] ${who}` +} + +console.log(hello()) diff --git a/typescript/src/nowcoder/examHuawei.js b/typescript/src/nowcoder/examHuawei.js new file mode 100644 index 0000000..ccaa98e --- /dev/null +++ b/typescript/src/nowcoder/examHuawei.js @@ -0,0 +1,259 @@ +// 华为机试 +// https://www.nowcoder.com/exam/oj/ta?page=1&tpId=37&type=37 + +console.time('time') +function test1() { + const line = 'hello nowcoder' + const tokens = line.split(' ') + console.log(tokens[tokens.length - 1].length) +} + +let text = '' +function test2(line) { + if (!text) { + text = line + } else { + const reg = new RegExp(line, 'gi') + console.log(text.match(reg)?.length ?? 0) + } +} +// test2('ABCabc') +// test2('A') + +let total = 0 +const set = new Set() +function test3(line) { + if (total === 0) { + total = line + } else { + set.add(line) + } +} +// test3(4) +// test3(123) +// test3(2) +// test3(27) +// test3(2) +// test3(1) +// Array.from(set) +// .sort((a, b) => a - b) +// .forEach((s) => console.log(s)) + +function test4() { + let line = '123456789123456789123456789123456789123456789' + // for (let i = 0; i <= parseInt((line.length - 1) / 8); i++) { + // let str = line.slice(i * 8, i * 8 + 8) + // if (str.length < 8) { + // str = str + '0'.repeat(8 - str.length) + // // str = str.padEnd(8, '0') + // } + // console.log(str) + // } + let str = line + '00000000' + for (let i = 8; i < str.length; i += 8) { + console.log(str.substring(i - 8, i)) + } +} +// test4() + +function test5(number) { + console.log(parseInt(number, 16)) + console.log(Number(number)) + console.log(number.toString(10)) +} +// test5('0xAA') + +function test6() { + let num = 180 + const arr = [] + for (let i = 2; i * i <= num; i++) { + while (num % i === 0) { + console.log(num, i) + arr.push(i) + num = num / i + } + } + if (num > 1) { + arr.push(num) + } + console.log(arr.join(' ')) +} +// test6() + +function test7(num) { + console.log(Number(num).toFixed(0)) +} +// test7('5.5') +// test7('5.4') +// test7('2.499') + +const obj8 = {} +function test8(str) { + const strs = str.split(' ') + if (strs[1]) { + const value = obj8[strs[0]] + if (value) { + obj8[strs[0]] = Number(strs[1]) + Number(value) + } else { + obj8[strs[0]] = strs[1] + } + } +} +// test8('4') +// test8('3 4') +// test8('0 1') +// test8('1 2') +// test8('0 2') +// test8('0 2') +// Object.entries(map) +// .sort(([ak], [bk]) => ak - bk) +// .forEach(([k, v]) => console.log(k, v)) + +function test9(str) { + console.log([...new Set([...str].reverse())].join('')) + // console.log([...new Set(str)].reverse().join('')) +} +// test9('9876673') + +function test10(str) { + // const map10 = new Map() + // for (let i = 0; i < str.length; i++) { + // const s = str[i] + // const value = map10.get(s) + // map10.set(s, value) + // } + // console.log(map10.size) + console.log(new Set([...str]).size) +} +// test10('abc') +// test10('aaa') + +function test11(str) { + console.log([...str].reverse().join('')) +} +// test11('1516000') + +function test12(str) { + console.log([...str].reverse().join('')) +} +// test12('abcd') + +function test13(str) { + const strs = str.split(' ') + console.log(strs.reverse().join(' ')) +} +// test13('I am a boy') + +const arr14 = [] +let count14 +function test14(str) { + if (!count14) { + count14 = str + } else { + arr14.push(str) + } +} +// test14('9') +// test14('cap') +// test14('too') +// test14('boot') +// arr14.sort().forEach((a) => console.log(a)) + +function test15(str) { + console.log(parseInt(str, 10).toString(2).match(/1/g).length) +} +// test15('5') + +function shoppingCart() { + let items16 = [] + let n + let m + let id = 1 + function test16(str) { + const strs = str.split(' ') + const q = strs[2] + if (q === undefined) { + n = strs[0] + m = strs[1] + } else { + const v = strs[0] + const p = strs[1] + items16.push([v, p, q, id]) + id++ + } + } + test16('1000 5') + // test16('20 3 5') + // test16('20 3 5') + // test16('10 3 0') + // test16('10 2 0') + // test16('10 1 0') + test16('800 2 0') + test16('400 5 1') + test16('300 5 1') + test16('400 3 0') + test16('500 2 0') + // 分类 + // subItems16.forEach((si) => { + // // console.log(si) + // const index = mainItems16.findIndex((mi) => mi[3] == si[2]) + // mainItems16[index].childs.push(si) + // }) + // 穷举购物车 + function getAllSubsets(arr) { + const subsets = [[]] + for (const item of arr) { + const newSubsets = subsets.map((subset) => { + // console.log(subset, 'subset') + return [...subset, item] + }) + subsets.push(...newSubsets) + } + return subsets + } + items16 = getAllSubsets(items16) + // console.log(subsets) + + // 穷举结果 + let results = [] + items16 = items16.filter((sbs) => { + if (sbs.length == 0) { + return true + } else if (sbs.length == 1) { + if (sbs[0][0] < n) { + return true + } + } + let isParentIn = true + const childs = sbs.filter((sb) => sb[2] != 0) + if (childs.length) { + isParentIn = childs.every((s) => sbs.some((b) => b[3] == s[2])) + } + if (isParentIn) { + return true + } + }) + + items16 = items16.forEach((sbs) => { + let totalPrice = 0 + let satisfaction = 0 + sbs.forEach((item) => { + totalPrice += Number(item[0]) + satisfaction += Number(item[0]) * Number(item[1]) + // console.log(item) + }) + // console.log(sbs) + + if (totalPrice <= n) { + // console.log(totalPrice) + results.push(satisfaction) + } + }) + items16 = undefined + // console.log(results) + results = results.sort((a, b) => b - a) + + console.log(results[0]) +} + +console.timeEnd('time') diff --git a/typescript/src/nowcoder/examTop101.js b/typescript/src/nowcoder/examTop101.js new file mode 100644 index 0000000..cf78d1e --- /dev/null +++ b/typescript/src/nowcoder/examTop101.js @@ -0,0 +1,129 @@ +// 面试必刷TOP101 +// https://www.nowcoder.com/exam/oj?page=1 + +function BM1() { + class ListNode { + constructor(x) { + this.val = x + if (x < 3) { + this.next = new ListNode(x + 1) + } + } + } + + function ReverseList(head) { + // write code here + let pre = null + let cur = head + while (cur) { + // 前插法 + const nextTemp = cur.next + cur.next = pre // 反转当前节点 + pre = cur // 前置节点后移 + cur = nextTemp // 当前节点后移 + } + return pre + } + + console.log(new ListNode(1)) + console.log(ReverseList(new ListNode(1))) +} +// BM1() + +function BM17() { + // 二分查找 + const target = 13 + const arr = [-1, 0, 3, 4, 6, 10, 13, 14] + + const search = function (nums, target) { + // 在区间[left,right]中查找元素,左闭右闭 + let left = 0 + let right = nums.length - 1 + while (left <= right) { + // 计算中间点 + let mid = parseInt(left + (right - left) / 2) + if (target == nums[mid]) { + return mid + // 如果target < nums[mid],表示目标值可能在左半边 + } else if (target < nums[mid]) { + right = mid - 1 + // 如果target > nums[mid],表示目标值可能在右半边 + } else if (target > nums[mid]) { + left = mid + 1 + } + } + // 未找到返回-1 + return -1 + } + + console.log(search(arr, target)) +} +// BM17() + +function BM23() { + // 二叉树的前序遍历 + class TreeNode { + constructor(val) { + this.val = val + this.left = null + this.right = null + } + } + + function preorderTraversal(root) { + const result = [] + + function traverse(node) { + if (node === null) { + return + } + // 访问当前节点的值 + result.push(node.val) + // 递归遍历左子树 + traverse(node.left) + // 递归遍历右子树 + traverse(node.right) + } + + traverse(root) // 从根节点开始遍历 + + return result + } + + // 创建一个二叉树 + const root = new TreeNode(1) + root.left = new TreeNode(2) + root.right = new TreeNode(3) + root.left.left = new TreeNode(4) + root.left.right = new TreeNode(5) + + // 执行前序遍历 + const result = preorderTraversal(root) + console.log(result) // 输出 [1, 2, 4, 5, 3] +} +// BM23() + +function match() { + const str = 'aeiou wolppzxc alwmdf String prototype' + const result = str.match(/a|e|i|o|u/g) + console.log(result, result.length) +} +// match() + +function getMaxDepth() { + const arr = [1, 1, [2, 2], [2, [3, 3, [4, 4], [4, [5, 5]]]]] + const depth = [] + const getDepth = (arr, deep) => { + arr.forEach((a) => { + if (Array.isArray(a)) { + getDepth(a, deep + 1) + } else { + depth.push(deep) + } + }) + } + + getDepth(arr, 1) + console.log(Math.max(...depth)) +} +getMaxDepth() diff --git a/typescript/src/nowcoder/microTask.js b/typescript/src/nowcoder/microTask.js new file mode 100644 index 0000000..311be5b --- /dev/null +++ b/typescript/src/nowcoder/microTask.js @@ -0,0 +1,58 @@ +// 面试题目一 + +function events() { + async function async1() { + console.log('async1 start') // 2 + await async2() + console.log('async1 end') // 7 + } + + async function async2() { + console.log('async2') // 3 + } + + console.log('script start') // 1 + + setTimeout(function () { + console.log('setTimeout0') + }, 0) // 12 + + setTimeout(function () { + console.log('setTimeout2') + }, 300) // 13 + + setImmediate(() => console.log('setImmediate')) // 11 + + process.nextTick(() => console.log('nextTick1')) // 9 + + async1() // 2 + + new Promise(function (resolve) { + console.log('promise1') // 4 + resolve() + console.log('promise2') // 5 + }).then(function () { + console.log('promise3') // 8 + }) + + process.nextTick(() => console.log('nextTick2')) // 10 + + console.log('script end') // 6 +} +// events() + +/** + * script start +async1 start +async2 +promise1 +promise2 +script end +async1 end +promise3 +nextTick1 +nextTick2 +setImmediate +setTimeout0 +setTimeout2 + */ diff --git a/typescript/src/nowcoder/quickSort.js b/typescript/src/nowcoder/quickSort.js new file mode 100644 index 0000000..1d71964 --- /dev/null +++ b/typescript/src/nowcoder/quickSort.js @@ -0,0 +1,54 @@ +function partition(arr, start, end) { + // 以最后一个元素为基准 + const pivotValue = arr[end] + let pivotIndex = start + for (let i = start; i < end; i++) { + if (arr[i] < pivotValue) { + // 交换元素 + ;[arr[i], arr[pivotIndex]] = [arr[pivotIndex], arr[i]] + // 移动到下一个元素 + pivotIndex++ + } + } + + // 把基准值放在中间 + ;[arr[pivotIndex], arr[end]] = [arr[end], arr[pivotIndex]] + return pivotIndex +} + +function quickSortRecursive(arr, start, end) { + // 终止条件 + if (start >= end) { + return + } + + // 返回 pivotIndex + let index = partition(arr, start, end) + + // 将相同的逻辑递归地用于左右子数组 + quickSortRecursive(arr, start, index - 1) + quickSortRecursive(arr, index + 1, end) +} +const array = [7, -2, 4, 7, 1, 3, 6, 5, 3, 0, -4, 2] +// quickSortRecursive(array, 0, array.length - 1) +// console.log(array) + +const myQuickSort = (arr) => { + if (arr.length <= 1) { + return arr + } + const pivotIndex = Math.floor(arr.length / 2) + const pivot = arr.splice(pivotIndex, 1)[0] + const left = [] + const right = [] + + arr.forEach((num) => { + if (num < pivot) { + left.push(num) + } else { + right.push(num) + } + }) + return myQuickSort(left).concat([pivot], myQuickSort(right)) +} +// console.log(myQuickSort(array)) diff --git a/typescript/src/utilityType.ts b/typescript/src/utilityType.ts new file mode 100644 index 0000000..8bc572d --- /dev/null +++ b/typescript/src/utilityType.ts @@ -0,0 +1,92 @@ +/* eslint-disable @typescript-eslint/no-unused-vars */ +enum Direction { + up = 'up', + left = 'left', + right = 'right', + down = 'down', +} + +interface Facing { + front: string + back: string +} + +type Dev = { + html: string + css: string +} + +type DirectionType = keyof typeof Direction + +// Partial +const directionPartial: Partial = 'down' + +// Readonly +const directionReadonly: Readonly = { + front: '1', + back: '2', +} +// directionReadonly.back = 3 + +// Record +const directionRecord: Record = { + right: '-90', + left: '90', + up: '180', + down: '0', +} + +const facingRecord: Partial> = { + front: 'f', +} + +// Pick +// const directionPick: Pick = { +// up: '180', +// } +enum KeysToBePickedFrom { + KEY_ONE = 'Key One', + KEY_TWO = 'Key Number Two', + KEY_THREE = 'Another key n. 3', + LAST_KEY = 'Here is the last Key', +} + +type PickKey = Extract + +type Picked_KeysOfEnum = PickKey + +interface KeysPickedForType { + keyone: Picked_KeysOfEnum +} + +const picks: KeysPickedForType = { + keyone: 'KEY_ONE', // KEY_ONE | LAST_KEY +} + +// Omit +const directionOmit: Omit = 'up' // 无效 +const directionOmit2: Omit = 'down' // 无效 +const facingOmit: Omit = { + back: 'b', +} +const devOmit: Omit = { css: 'css' } + +// Exclude +type UnionType = DirectionType | Facing | Dev +const directionExclude: Exclude = 'down' +const unionTypeExclude: Exclude = { + html: 'html', + css: 'css', +} +// const facingExclude: Exclude = { +// back: 'b', +// } +// const devExclude: Exclude = { css: 'css' } + +// Extract +type DirectionExtract = Extract +const directionExtract: DirectionExtract = 'up' +const unionTypeExtract: Extract = { + html: 'html', + css: 'css', +} diff --git a/typescript/tsconfig.json b/typescript/tsconfig.json new file mode 100644 index 0000000..dc9a5de --- /dev/null +++ b/typescript/tsconfig.json @@ -0,0 +1,55 @@ +{ + // "extends": "@tsconfig/node16/tsconfig.json", + "compilerOptions": { + /* 基本选项 */ + "target": "ES6", // 指定 ECMAScript 目标版本: 'ES3' (default), 'ES5', 'ES6'/'ES2015', 'ES2016', 'ES2017', or 'ESNEXT' + "module": "CommonJS", // 指定使用模块: 'commonjs', 'amd', 'system', 'umd' or 'es2015' + "lib": [], // 指定要包含在编译中的库文件 + "allowJs": true, // 允许编译 javascript 文件 + "checkJs": true, // 报告 javascript 文件中的错误 + "jsx": "preserve", // 指定 jsx 代码的生成: 'preserve', 'react-native', or 'react' + "declaration": true, // 生成相应的 '.d.ts' 文件 + // "sourceMap": true, // 生成相应的 '.map' 文件 + // "outFile": "./", // 将输出文件合并为一个文件 + "outDir": "./build", // 指定输出目录 + "rootDir": "./", // 用来控制输出目录结构 --outDir. + "removeComments": true, // 删除编译后的所有的注释 + "noEmit": false, // 不生成输出文件 + "importHelpers": false, // 从 tslib 导入辅助工具函数 + "isolatedModules": false, // 将每个文件作为单独的模块 (与 'ts.transpileModule' 类似). + + /* 严格的类型检查选项 */ + "strict": true, // 启用所有严格类型检查选项 + "noImplicitAny": true, // 在表达式和声明上有隐含的 any类型时报错 + "strictNullChecks": true, // 启用严格的 null 检查 + "noImplicitThis": true, // 当 this 表达式值为 any 类型的时候,生成一个错误 + "alwaysStrict": true, // 以严格模式检查每个模块,并在每个文件里加入 'use strict' + + /* 额外的检查 */ + "noUnusedLocals": false, // 有未使用的变量时,抛出错误 + "noUnusedParameters": false, // 有未使用的参数时,抛出错误 + "noImplicitReturns": true, // 并不是所有函数里的代码都有返回值时,抛出错误 + "noFallthroughCasesInSwitch": true, // 报告 switch 语句的 fallthrough 错误。(即,不允许 switch 的 case 语句贯穿) + + /* 模块解析选项 */ + "moduleResolution": "node", // 选择模块解析策略: 'node' (Node.js) or 'classic' (TypeScript pre-1.6) + "baseUrl": "./", // 用于解析非相对模块名称的基目录 + "paths": {}, // 模块名到基于 baseUrl 的路径映射的列表 + "rootDirs": [], // 根文件夹列表,其组合内容表示项目运行时的结构内容 + // "typeRoots": [], // 包含类型声明的文件列表 + // "types": [], // 需要包含的类型声明文件名列表 + "allowSyntheticDefaultImports": true, // 允许从没有设置默认导出的模块中默认导入。 + + /* Source Map Options */ + // "sourceRoot": "./", // 指定调试器应该找到 TypeScript 文件而不是源文件的位置 + // "mapRoot": "./", // 指定调试器应该找到映射文件而不是生成文件的位置 + // "inlineSourceMap": true, // 生成单个 soucemaps 文件,而不是将 sourcemaps 生成不同的文件 + // "inlineSources": true, // 将代码与 sourcemaps 生成到一个文件中,要求同时设置了 --inlineSourceMap 或 --sourceMap 属性 + + /* 其他选项 */ + "experimentalDecorators": true, // 启用装饰器 + "emitDecoratorMetadata": true // 为装饰器提供元数据的支持 + }, + "include": ["./src/**/*.ts"], + "exclude": ["./node_modules", "**/*.js"] +} diff --git "a/\345\206\215\345\255\246JavaScriptES6-ES11.md" "b/\345\206\215\345\255\246JavaScriptES6-ES11.md" new file mode 100644 index 0000000..4b108f6 --- /dev/null +++ "b/\345\206\215\345\255\246JavaScriptES6-ES11.md" @@ -0,0 +1,112 @@ +〖课程介绍〗: +JS是前端立身之本,不管框架多花哨,不会JS也是白扯。这门课可以帮助你夯实前端基础,掌握最新的ES6到11语法,稳步提升编程能力。课程带你熟练掌握语法,很多依赖# 第三方库才能做到的事用原生JS寥寥几行代码就可迎刃而解。 + +〖课程目录〗: +# 第1章 课程介绍&环境搭建 +本章将介绍学习ES新特性的重要性以及课程特点。JS作为前端的立身之本,通过本课程学习不仅会帮助大家掌握ES6的核心语法,还会掌握到ES7~ES11的相关拓展,同时考虑到很多同学刚刚接触前端或者对工程化方法不太了解,为了帮助大家快速进入到学习状态,课程提供配置完整的ES开发脚手架,开箱即用,让大家不再纠结于环境配置而... + +## 1-1 课程介绍 +## 1-2 Node安装与NPM源切换 +## 1-3 构建开发环境 +# 第2章 ECMAScript2015(ES6)之必备知识 +本章详细介绍ES6中新的声明方式、解构赋值、数组扩展、函数扩展、对象扩展等内容,通过与ES5语法的对比讲解,突显出ES新特性的魅力所在。通过这些必备知识的学习,能够使我们的代码更加严谨,开发效率大大提高。 + +## 2-1 新的声明方式let(上) +## 2-2 新的声明方式let(下) +## 2-3 新的声明方式const +## 2-4 解构赋值 +## 2-5 数组的各种遍历方式 +## 2-6 数组的扩展 +## 2-7 函数的参数 +## 2-8 扩展运算符与rest参数 +## 2-9 箭头函数 +## 2-10 对象的扩展 +## 2-11 深拷贝与浅拷贝(上) +## 2-12 深拷贝与浅拷贝(下) +# 第3章 ECMAScript2015(ES6)之新特性 +本章详细介绍ES6中引入的新特性包括Class、Symbol、Set、Map、Proxy、Reflect,以及字符串、数值、正则表达式的扩展,通过这些新特性的学习,我们能够更快速的通过这些新特性实现我们想要的功能,更加深刻的体会到ES6的强大之处。... + +## 3-1 面向过程与面向对象 +## 3-2 ES5中的类与继承 +## 3-3 ES6中的类与继承 +## 3-4 新的原始数据类型Symbol +## 3-5 新的数据结构Set(上) +## 3-6 新的数据结构Set(下) +## 3-7 新的数据结构Map +## 3-8 字符串的扩展(上) +## 3-9 字符串的扩展(下) +## 3-10 正则表达式的扩展 +## 3-11 数值的扩展 +## 3-12 代理Proxy(上) +## 3-13 代理Proxy(下) +## 3-14 反射Reflect +# 第4章 ECMAScript2015(ES6)之异步编程与模块化 +本章详细介绍ES6中异步编程解决方案:Promise与Generator,异步编程是ES中的重点与难点,通过对异步编程必备知识的讲解使大家了解异步编程的关键点与新语法的优势。并且本章还讲解了迭代器Iterator与模块化Module,通过案例使大家了解如何使不可迭代的数据结构也可以通过for...of迭代出来,通过模块化学习可以使我们代码更... + +## ## 4-1 异步操作必备知识 +## 4-2 Ajax原理与Callback Hell +## 4-3 异步编程解决方案Promise(1) +## 4-4 异步编程解决方案Promise(2) +## 4-5 异步编程解决方案Promise(3) +## 4-6 异步编程解决方案Promise(4) +## 4-7 Promise的静态方法 +## 4-8 异步编程解决方案Generator(上) +## 4-9 异步编程解决方案Generator(下) +## 4-10 迭代器Iterator +## 4-11 模块化Module +# 第5章 ECMAScript2016(ES7)之数组&数值拓展 +ES7相当于ES6.1版,相较ES6新增了数组实例的includes方法和幂运算符。 + +## 5-1 数组扩展:Array.prototype.includes() +## 5-2 数值扩展:幂运算符 +# 第6章 ECMAScript2017(ES8)之异步编程&对象拓展 +ES8扩展了更加优雅的异步编程解决方案,同时在Object、String等方面做了进一步的功能补充,让代码编写更加优雅。 + +## 6-1 异步编程解决方案Async Await +## 6-2 对象扩展:Object.values(),Object.entries() +## 6-3 对象属性描述:Object.getOwnPropertyDescriptors() +## 6-4 字符串扩展:String.prototype.padStart(),String.prototype.padEnd() +## 6-5 尾逗号Trailing commas +# 第7章 ECMAScript2018(ES9)之异步迭代&对象操作升级 +ES9为异步迭代提供了更好的解决方案,同时对正则表达式、Object、String进行了功能扩展,并且更加丰富了Promise对象的方法。 + +## 7-1 异步迭代:for await of +## 7-2 正则表达式扩展:dotAll,具名组匹配,后行断言 +## 7-3 对象扩展:Rest & Spread +## 7-4 Promise扩展:Promise.prototype.finally() +## 7-5 字符串扩展:放松模板字符串文字限制 +# 第8章 ECMAScript2019(ES10)之效率再提升 +ES10中对Object、String、Array进行了进一步的功能扩展,并且对原有一些能力进行了增强,让代码编写更加高效。 + +## 8-1 对象扩展:Object.fromEntries() +## 8-2 字符串扩展:String.prototype.trimStart() ,String.prototype.trimEnd()- +## 8-3 数组扩展:Array.prototype.flat(),Array.prototype.flatMap() +## 8-4 修订Function.prototype.toString()- +## 8-5 可选的Catch Binding +## 8-6 JSON扩展:JSON superset,JSON.stringify()增强能力 +## 8-7 Symbol扩展:Symbol.prototype.description +# 第9章 ECMAScript2020(ES11)之新特性初探 +ES11正式版将在2020年6月份正式发布,本章中对已通过定案阶段的语法进行讲解。这个版本扩充了原型数据类型BigInt,并扩展了多个实用的新功能。 + +## 9-1 全局模式捕获:String.prototype.matchAll() +## 9-2 动态导入:Dynamic import() +## 9-3 新的原始数据类型:BigInt +## 9-4 Promise扩展:Promise.allSettled() +## 9-5 全局对象:globalThis +## 9-6 可选链:Optional chaining +## 9-7 空值合并运算符:Nullish coalescing Operator +# 第10章 ES新特性在Vue实战中的应用 +Vue是很多前端同学必用的框架,如何把原生语法在Vue项目里运用的活灵活现至关重要,在本章中,将带领大家通过Vue CLI构建Vue开发环境,并通过实际需求讲解ES新特性在实战项目中的应用,着重讲解异步操作的使用,学的懂,更要用的活,才是真正的掌握。... + +## 10-1 初始化环境 +## 10-2 获取用户信息列表 +## 10-3 使用Proxy代理用户信息 +## 10-4 图片上传逻辑与阿里云OSS使用 +## 10-5 异步操作多张图片上传云存储 +## 10-6 更加优雅的异步操作 +## 10-7 组件按需加载 +# 第11章 Webpack构建环境 +针对当前浏览器中无法全部兼容新语法的问题,我们需要通过构建的方式把代码转换成浏览器可兼容的代码,而Webpack的使用已经成为前端开发工程师的必备技能之一!本章将通过Webpack完成开发环境构建,最终帮助浏览器能够准确的识别ES的语法。 ... + +# 第12章 课程回顾 +本章对整体课程进行回顾与总结,并给出大家学习建议。 \ No newline at end of file diff --git "a/\345\277\253\351\200\237\346\220\236\345\256\232\345\211\215\347\253\257\346\212\200\346\234\257\344\270\200\351\235\242 \345\214\271\351\205\215\345\244\247\345\216\202\351\235\242\350\257\225\350\246\201\346\261\202.md" "b/\345\277\253\351\200\237\346\220\236\345\256\232\345\211\215\347\253\257\346\212\200\346\234\257\344\270\200\351\235\242 \345\214\271\351\205\215\345\244\247\345\216\202\351\235\242\350\257\225\350\246\201\346\261\202.md" new file mode 100644 index 0000000..64feadc --- /dev/null +++ "b/\345\277\253\351\200\237\346\220\236\345\256\232\345\211\215\347\253\257\346\212\200\346\234\257\344\270\200\351\235\242 \345\214\271\351\205\215\345\244\247\345\216\202\351\235\242\350\257\225\350\246\201\346\261\202.md" @@ -0,0 +1,662 @@ +# 快速搞定前端技术一面 匹配大厂面试要求 + +## 第 1 章 课程介绍 + +> 讲师:双越 +> +> 【说说面试的那些事儿】本章会出几个面试题,分析每道题目设计的知识点,然后总结出一个完整的知识体系。让我们开始 “题目->知识点->解题” 的快乐之旅吧。 + +### 1-1 导学-升级(前端面试题) + +1. **前端面试中的重要考点** + 1. HTML 和 CSS + 2. 原型、作用域、异步 + 3. DOM 事件和 Ajax + 4. 性能优化 + 5. 各种手写代码 + 6. HTTP 协议 +2. **知识点介绍** + 1. CSS + 1. 布局 + 2. 定位 + 3. 移动端响应式 + 2. ES 语法 + 1. 原型、原型链 + 2. 作用域、闭包 + 3. 异步、单线程 + 3. Web Api + 1. DOM、Bom + 2. Ajax 跨域 + 3. 事件存储 + 4. 开发环境 + 1. 版本管理 + 2. 调试抓包 + 3. 打包构建 + 5. 运行环境 + 1. 页面渲染 + 2. 性能优化 + 3. Web 安全 + 6. 网络通讯 + 1. headers + 2. Restful API + 3. 缓存策略 + +### 1-2 看了这节课你就知道该怎么准备面试了 + +#### 关于面试 + +- 基层工程师:基础知识 +- 高级工程师:基础知识+项目经验 +- 架构师:解决方案能力 + +#### 关于基础 + +- 工程师的自我修养:基础知识 +- 扎实的基础能让你高效学习新技术 + +### 1-3 面试题和分析 + +#### 题目-1 + +1. `typeof` 能判断哪些类型? + - 考点:JS 变量类型 +2. 何时使用`===`何时使用 `==` + - 考点:强制类型转换 +3. `window.onload` 和 `DOMContentLoaded` 的区别? + - 考点:页面加载过程 + +#### 题目-2 + +1. JS 创建 10 个``标签,点击的时候弹出对应的序号 + - 考点:JS 作用域 +2. 手写节流 `throttle`、防抖 `debounce` + - 考点:性能、体验优化 +3. `Promise` 解决了什么问题? + - 考点:JS 异步 + +#### 思考 + +1. 拿到一个面试题,你第一时间看到的是什么? + - 拿到一个面试题,第一时间看到->**考点** +2. 如何看待网上搜出来的永远做不完的题海? + - 如何看到做不完的题海->**不变应万变**(题可变,**考点**不变) +3. 如何对待接下来遇到的面试题? + - 如何对待接下来的题目->题目到**知识点**,再到题目 + +#### 答案: + +第四章 + +### 1-5 知识体系 + +#### 什么是知识体系? + +1. 高效学习三部曲:找准知识体系;刻意训练;及时反馈 +2. 知识体系:结构化的知识范围 +3. 涵盖所有知识点;结构化、有组织、易扩展 + +#### 从哪些方面梳理 + +1. W3C 标准 +2. ECMA262 标准 +3. 开发环境 +4. 运行环境 + +#### 知识体系 + +1. CSS 基础知识 +2. JS 基础语法 +3. JS-Web-API +4. 开发环境 +5. 运行环境 +6. HTTP 协议 + +## 第 2 章 面试前的准备 + +> 【要知己知彼,不打无准备之仗】 +> 本章介绍面试之前你需要准备什么,以及如何解读 JD ,如何写好简历,还有些面试的注意事项。帮大家规避一些非技术的风险和问题。 + +### 2-1 面试之前需要准备你什么 + +### 2-2 投递简历的几种方式 + +### 2-3 面试的主要环节 + +2-4 JD 分析-知己知彼(上) + +2-5 JD 分析-知己知彼(下) + +### 2-6 如何写简历 + +1. 简历包含的内容 +2. 简历中需要注意的问题 +3. 案例 + +简历就像高考作文——阅卷时间非常短 + +内容简洁 + +直击重点,表现出自己的优势 + +#### 简历包含的内容 + +- 个人信息 + - 简历内容-基本信息 + - 必备:姓名 性别 电话 邮箱 籍贯 年龄可写 +- 教育经历 + - 写上最高学历即可 + - 学校,专业,入学和毕业时间 + - 不要写上高中,显的很不专业 +- 专业技能 + - 表现出自己的核心竞争力 + - 内容不要太多,3、5 条即可 + - 太基础的不要写,例如会用 vscode +- 项目经历 + - 写 2-4 个具有说服力的项目(视工作时间) + - 项目描述,技术栈,个人角色 + - 技巧:可以把别人的项目写上,只要你能 hod 住 +- 工作经历 + - 如实写 + - 写明公司,职位,入职离职时间即可,多写无益 + - 如果有空窗期,如实写明即可 +- 博客和开源 + - 有博客或者开源作品,会让你更有竞争力 + - 切记:需要真的有内容,不可临时抱佛脚 + - 可以从现在开始,慢慢积累 +- 注意事项 + - 界面不要太花哨,简洁明了即可 + - 注意用词,“精通”“熟练”等慎用 + - 不可造假,会被拉入黑名单(项目经历那里,不是造假!!) + +### 2-7 简历案例分析 + +### 2-8 面试前的准备工作和注意事项 + +#### 准备工作 + +- 看 JD,是否需要临时准备一下 +- 打印纸质简历,带着纸和笔 +- 最好带着自己的电脑,现场可能手写代码 + +#### 面试前的注意事项 + +- 要有时间观念,如果迟到或者推迟,要提前说 +- 衣着适当,不用正装,也不要太随意 +- 为何离职?——不要吐槽前东家,说自己的原因 +- 能加班吗?——能!除非你特别自信,能找到其他机会 +- 不要挑战面试官,即便他错了 +- 遇到不会的问题,要表现出自己积极的一面 + +## 第 3 章 CSS 面试题 + +> 【不多说了,前端面试 CSS 是必考知识,不过关直接回家】 +> 本章讲解 CSS 中常考和必考的知识点,包括布局、定位、响应式等。其中会讲到很多常考问题,如 BFC、居中对齐、flex 布局等。前端一面中,CSS 一般最先考察,不过关则直接宣告失败。 + +### 3-1 html、css 面试介绍 + +#### HTML 面试题 + +1. 如何理解 HTML 语义化? + - 让人更容易读懂(增加代码可读性) + - 让搜索引擎更容易读懂(SEO) +2. 默认情况下,哪些 HTML 标签是块级元素、哪些是内联元素? + - display:block/table;有 div h1 h2 table ul ol p 等 + - display: inline/inline-block; 有 span img input button 等 + - [CSS 基础-块级元素与行内元素](https://juejin.cn/post/6844903593955328007) + +#### CSS 面试题 + +分析知识模块: + +1. **布局** + 1. **盒子模型的宽度如何计算?** + - `offsetWidth=(内容宽度+内边距+边框)`,无外边距 + - `box-sizing:border-box`,设置 `width` 为总宽度 + 2. **margin 纵向重叠的问题** + - 相邻元素的 margin-top 和 margIn-bottom 会发生重叠 + - 空白内容的`

    `也会重叠 + 3. **margin 负值的问题** + - margin 的 top left right bottom 设置负值,有何效果? + - margin-top 和 margin-left 负值,元素**向上**、**向左**移动 + - margin-right 负值,**右侧元素左移**,自身不受影响 + - margin-bottom 负值,**下方元素上移**,自身不受影响 + 4. **BFC 理解和应用** + - 什么是 BFC?如何应用? + - Block format context,块级格式化上下文 + - 一块独立渲染区域,内部元素的渲染不会影响边界以外的元素 + - 形成 BFC 的常见条件 + - float 不是 none + - position 是 absolute 或 fixed + - overflow 不是 visible + - display 是 flex inline-block 等 + - BFC 的常见应用 + - 清除浮动 + 5. **float 布局的问题,以及 clearfix** + - 如何实现圣杯布局和双飞翼布局 + - 圣杯布局和双飞翼布局的目的 + - 三栏布局,中间一栏最先加载和渲染(內容最重要 + - 两侧内容固定,中间内容随着宽度自适应 + - 一般用于 PC 网页 + - 圣杯布局和双飞翼布局的技术总结 + - 使用 float 布局 + - 两侧使用 margin 负值,以便和中间内容横向重叠 + - 防止中间内容被两侧覆盖,一个用 padding 一个用 margin + - 手写 clearfix + 6. **flex 画色子** + - flex 实现一个三点的色子 + - 常用语法回顾:必须熟练掌握 + - flex-direction + - justify-content + - align-items + - flex-wrap + - align-self + - 两端对齐 + - 垂直居中对齐 + - 水平居中对齐、尾对齐 +2. **定位** + 1. **absolute 和 relative 分别依据什么定位?** + - relative 依据自身定位 + - absolute 依据最近一层的定位元素定位 + - 定位元素 + - absolute relative fixed + - body + 2. **居中对齐有哪些实现方式?** + - 水平居中 + - inline 元素:text-align:center + - block 元素:margIn:auto + - absolute 元素:left:50%+ margin-left 负值 + - 垂直居中 + - inline 元素:line-height 的值等于 height 值 + - absolute 元素:top:50%+ margIn-top 负值 + - absolute 元素:transform(-50%,-50%) + - absolute 元素:`top,left,bottom right = 0; margin:auto` +3. **响应式** + 1. rem 是什么? + - rem 是一个长度单位 + - px,绝对长度单位,最常用 + - em,相对长度单位,相对于父元素,不常用 + - rem,相对长度单位,相对于根元素,常用于响应式布局 + - 用 font-size 定义,对所有长度生效 + 2. 如何实现响应式?响应式布局的常用方案 + - media-query,根据不同的屏幕宽度设置根元素 font-size + - rem,基于根元素的相对单位 + 3. **`vw/vh`** + - rem 的弊端:台阶性,不同 font-size 需手动设置 + - 网页视口尺寸 + - window.screen.height // 屏幕高度 + - **window.innerHeight // 网页视口高度** + - document body.clientHeight // body 高度 + - `vw/vh` + - **vh 网页视口高度的 1/100** + - **vw 网页视口宽度的 1/100** + - vmax 取两者最大值作为单位;vmin 取两者最小值 +4. **CSS3** + 1. 动画 +5. **图文样式** + 1. **line-height 如何继承** + - 写具体数值,如 30px,则继承该值(比较好理解) + - 写比例,如 2/1.5,则继承该比例(比较好理解) + - 写百分比,如 200%,则继承计算出来的值(考点) + +3-2 html 面试题 + +3-3 布局-题目 + +3-4 布局-解题-1 + +3-5 布局-解题-2 + +3-6 布局-解题-3 + +3-7 布局-解题-4 + +3-8 布局-解题-5 + +3-9 定位-解题-1 + +3-10 定位-解题-2 + +3-11 图文样式-解题 + +3-12 响应式-解题 + +3-13 2 css-响应式-vw-wh + +3-14 css 面试总结 + +## 第 4 章 JS 基础-变量类型和计算 + +> 【不会变量,别说你会 JS】 +> 本章介绍变量的类型和计算的知识点和题目,包括值类型和引用类型区别,类型判断,深拷贝等。变量和类型是一个任何一门语言的基础,不了解的话,会被认为是 JS 语法不过关。 + +### 4-1 JS 值类型和引用类型的区别 + +### 4-2 手写 JS 深拷贝 + +### 4-3 变量计算 - 注意某些类型转换的坑 + +### 4-4 变量类型相关的面试题 + +## 第 5 章 JS 基础-原型和原型链 + +> 【三座大山之一,必考!!!】 +> 本章介绍原型、原型链和 class 相关的知识点和题目。包括 class ,继承,原型,原型链,instanceof。原型是“JS 三座大山”之一,原型和原型链也是必考知识点。 + +### 5-1 JS 原型的考点和面试题 + +### 5-2 如何用 class 实现继承 + +### 5-3 如何理解 JS 原型(隐式原型和显示原型) + +### 5-4 instanceof 是基于原型链实现的 + +### 5-5 JS 原型本章相关的面试题 + +## 第 6 章 JS 基础-作用域和闭包 + +> 【三座大山之二,不会闭包,基本不会通过】 +> 本章介绍作用域和闭包的知识点和题目。包括作用域,自由变量,闭包,this 等部分。作用域是“JS 三座大山”之二,不知道闭包的话,面试通过概率不大。 + +### 6-1 什么是作用域?什么是自由变量? + +### 6-2 什么是闭包?闭包会用在哪里? 试看 + +### 6-3 this 有几种赋值情况 + +### 6-4 作用域相关的面试题 - part1 + +### 6-5 作用域相关的面试题 - part2 + +### 6-6 补充 - 原型中的 this + +## 第 7 章 JS 基础-异步 + +> 【三座大山之三,必考!!!】 +> 本章介绍异步的知识点和题目。包括异步和同步的区别,异步应用场景,以及 Promise 。异步是“JS 三座大山”之三,所有公司的 JS 面试,100% 会考察异步和 Promise 。 + +### 7-1 同步和异步有何不同 + +### 7-2 异步的应用场景有哪些 + +### 7-3 promise 的基本使用 + +### 7-4 JS 异步相关的面试题 + +### 7-5 JS 基础部分的考点总结 + +## 第 8 章 JS 异步进阶 + +> 【想要进大厂,更多异步的问题等着你】 +> JS 的特色就是异步编程,所有有很多关于异步的考点,本章都会讲解。如 event loop、promise、async-await、微任务和宏任务。学不会这些,就不算是精通 JS ,也无法进大厂。 + +### 8-1 本章考点介绍 + +### 8-2 看几个异步的面试题 + +### 8-3 什么是 event loop + +### 8-4 event loop 的执行过程 + +### 8-5 DOM 事件和 event loop 的关系 + +### 8-6 Promise 有哪三种状态 + +### 8-7 Promise 的 then 和 catch 如何影响状态的变化 + +### 8-8 Promise 关于 then 和 catch 的面试题 + +### 8-9 async-await 语法介绍-part1 + +### 8-10 async-await 和 Promise 有什么关系 + +### 8-11 async-await 是语法糖,异步的本质还是回调函数 + +### 8-12 for-of 的应用场景 + +### 8-13 什么是宏任务和微任务 + +### 8-14 event-loop 和 DOM 渲染的关系 + +### 8-15 为什么微任务比宏任务执行更早 + +### 8-16 微任务和宏任务的根本区别 + +### 8-17 解答 JS 异步的面试题 + +### 8-18 本章考点总结 + +## 第 9 章 JS-Web-API-DOM + +> 【学会 DOM,才能具备网页开发的基础】 +> 本章介绍 DOM 操作的知识点和题目。包括 DOM 结构,常用 DOM 操作,DOM 性能优化等。DOM 是网页结构的基础,学会 DOM 操作才可以做网页开发。 + +### 9-1 从 JS 基础到 JS-Web-API + +### 9-2 DOM 的本质是什么 + +### 9-3 DOM 节点操作 + +### 9-4 DOM 结构操作 + +### 9-5 如何优化 DOM 操作的性能 + +### 9-6 DOM 操作相关的面试题 + +## 第 10 章 JS-Web-API-BOM + +> 【内容虽然不多,但是你不能不会】 +> 本章介绍 BOM 操作的知识点和题目。本章内容虽然不多,但不可不会。 + +### 10-1 BOM 操作相关的面试题 + +## 第 11 章 JS-Web-API-事件 + +> 【事件不会,等于残废,必考!必考!】 +> 本章介绍事件绑定的知识点和题目。包括事件绑定,事件冒泡机制,事件代理。事件能让网页和鼠标、键盘进行交互,初级 JS 面试必考。 + +### 11-1 事件绑定和事件冒泡 + +### 11-2 什么是事件代理(面试必考) + +### 11-3 DOM 事件相关的面试题 + +## 第 12 章 JS-Web-API-Ajax + +> 【每个工程师必须熟练掌握的技能】 +> 本章介绍 ajax 相关的知识点和题目。包括 XMLHttpRequest ,同源策略,跨域方式,以及常用插件介绍。我们早就进入了动态网页时代,而当下的前后端分离开发方式,更加要求每个工程师必须熟练掌握 ajax 。 + +### 12-1 ajax 的核心 API - XMLHttpRequest + +### 12-2 什么是浏览器的同源策略 + +### 12-3 实现跨域的常见方式 - jsonp 和 CORS + +### 12-4 ajax 相关的面试题 - part1 + +### 12-5 ajax 本章相关的面试题 - part2 + +### 12-6 实际项目中 ajax 的常用插件 + +## 第 13 章 JS-Web-API-存储 + +> 【内容虽然不多,但不可不会】 +> 本章介绍存储的知识点和题目。包括 cookie、localStorage 和 sessionStorage 。本章内容虽然不多,但不可不会。 + +### 13-1 如何理解 cookie + +### 13-2 localStorage SessionStorage 和 cookie 的区别 + +## 第 14 章 http 面试题 + +> 【前后端分离的时代,网络请求是前端的生命线】 +> 前端工程师做出网页,需要通过网络请求向后端获取数据,因此 http 协议是前端面试的必考内容。本章讲解 http 协议常考的知识点,如状态码、header、method、缓存等。特别是 http 缓存策略,非常重要。 + +### 14-1 http 的几个面试题 + +### 14-2 http 常见的状态码有哪些-part1 + +### 14-3 http 常见的状态码有哪些-part2 + +### 14-4 什么是 Restful-API + +### 14-5 http 哪些常见 header + +### 14-6 http 为何需要缓存 + +### 14-7 cache-control 是什么意思-http 强制缓存 + +### 14-8 Etag 和 Last-Modified 是什么意思-http 协商缓存 + +### 14-9 刷新页面对 http 缓存的影响 + +### 14-10 http 考点总结 + +## 第 15 章 开发环境 + +> 【不会这些,你就会被认定是菜鸟小白,没做过项目】 +> 本章介绍开发环境相关的知识点和题目。包括 git ,调试工具,抓包工具,webpack 和 babel ,以及 linux 常用命令。熟练使用开发环境的各个工具,才能证明你真的做过前端开发,真的有项目经验,否则只能被认定为菜鸟小白。 + +### 15-1 前端开发常用的开发工具 + +### 15-2 什么是 git + +### 15-3 git 的常用命令有哪些 + +### 15-4 git 常用命令演示 + +### 15-5 如何用 chrome 调试 js 代码 + +### 15-6 移动端 h5 如何抓包网络请求 + +### 15-7 如何配置 webpack + +### 15-8 如何配置 babel + +### 15-9 ES6 模块化规范是什么 + +### 15-10 如何配置 webpack 生产环境 + +### 15-11 前端用到的 linux 常用命令有哪些 + +### 15-12 开发环境的考点总结 + +## 第 16 章 运行环境 + +> 【这些会了,你就可以飞了】 +> 本章介绍运行环境相关的知识点和题目。包括浏览器加载和渲染机制,性能优化,web 安全。网页在浏览器加载和运行,这些内容必须掌握,也是面试常考。 + +### 16-1 JS 上线之后在什么哪里运行? + +### 16-2 网页是如何加载并渲染出来的 + +### 16-3 网页加载和渲染的示例 + +### 16-4 网页加载和渲染相关的面试题 + +### 16-5 前端性能优化有哪些方式 + +### 16-6 前端性能优化的示例 + +### 16-7 手写防抖 debounce + +### 16-8 手写节流 throttle + +### 16-9 如何预防 xss 攻击 + +### 16-10 如何预防 xsrf 攻击 + +### 16-11 运行环境的考点总结 + +## 第 17 章 课程总结 + +> 【很有必要带你避免面试犯低级错误】 +> 本章回顾所有题目和知识点,总结课程内容。还会介绍一些实用的面试技巧,避免你在面试中犯一些低级错误。 + +17-1 课程总结~ +17-2 面试技巧 + +## 第 18 章 真题模拟 + +> 【我是来告诉你答案是什么】 +> 本章节,通过一部分高频面试真题,带大家分析面试,以及如何解答。 + +### 18-1 章节介绍 + +### 18-2 题目讲解-1:何为变量提升? + +### 18-3 题目讲解-2:手写深度比较 isEqual + +### 18-4 题目讲解-3:你是否真的会用数组 map + +#### 数组 slice 和 splice 的区别 + +`slice` 不影响原元素 + +```javascript +arr = [0, 1, 2, 3, 4, 5]; +arr.slice(); // [0, 1, 2, 3, 4, 5] +arr.slice(1); //  [1, 2, 3, 4, 5] +arr.slice(1, 3); // [1, 2] +arr.slice(-2); // [4, 5] +``` + +`splice` 返回被剪切的元素 + +```javascript +arr = [0, 1, 2, 3, 4, 5]; +arrSplice = arr.splice(1, 1, 'o'); // [1] +console.log(arr); // [0, "o", 2, 3, 4, 5] +``` + +#### [10,20,30].map(parseInt) 返回结果是什么? + +```javascript +[10, 20, 30].map(parseInt(curr, index)); +// [10, NaN, NaN] +``` + +**`parseInt(string, radix)`** 解析一个字符串并**返回指定基数的十进制整数**, `radix` 是`2-36`之间的整数,表示被解析字符串的基数。 + +#### ajax 请求 get 和 post 的区别? + +- ajax 请求 get 和 post 的区别 +- get 一般用于查询操作,post 一般用户提交操作 get 参数拼接在 url 上,post 放在请求体内(数据体积可更大) +- 安全性:post 易于防止 CSRF + +### 18-5 题目讲解-4:再学闭包 + +### 18-6 面试讲解-5:回顾 DOM 操作和优化 + +#### 如何阻止事件冒泡和默认行为? + +event. stopPropagation + +event. preventDefault + +#### 查找、添加、删除、移动DOM节点的方法? + +#### 如何减少DOM操作? + +### 18-7 面试讲解-6:jsonp 本质是 ajax 吗 + +#### 解释 Jsonp的原理,为何它不是真正的ajax? + +- 浏览器的同源策略(服务端没有同源策略)和跨域 +- img script 所有 src 的标签,video audio link iframe +- 解释 jsonp原理 + +#### document load 和 ready 的区别 + +#### `==和===`的不同 + +### 18-8 面试讲解-7:是否用过 Object.create() + +### 18-9 面试讲解-8:常见的正则表达式 + +### 18-10 面试讲解-9:如何获取最大值 + +### 18-11 面试讲解-10:解析 url 参数 + +### 18-12 面试讲解-11:数组去重有几种方式? + +### 18-13 面试讲解-12:是否用过 requestAnimationFrame
    | 定义表格标题。 | -|
    | 定义表格的表头。 | -|
    | 定义表格单元。 | -|