diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..a06ad62 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,12 @@ +root = true +charset = utf-8 +end_of_line = lf +trim_trailing_whitespace = true +insert_final_newline = true +indent_style = space + +[*] +indent_size = 4 + +[{.*rc,ts*.json,package.json}] +indent_size = 2 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2978361 --- /dev/null +++ b/.gitignore @@ -0,0 +1,25 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. +/es +/dist +.rpt2_cache +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# production +/build + +# misc +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local + +npm-debug.log* +yarn-debug.log* +yarn-error.log* diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..17d12ff --- /dev/null +++ b/.prettierignore @@ -0,0 +1,3 @@ +*.test.tsx +package.json +package-lock.json diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..043fedf --- /dev/null +++ b/.prettierrc @@ -0,0 +1,7 @@ +{ + "trailingComma": "all", + "printWidth": 120, + "semi": false, + "singleQuote": true, + "jsxBracketSameLine": true +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..af79634 --- /dev/null +++ b/package.json @@ -0,0 +1,27 @@ +{ + "name": "@holoflows/kit", + "version": "0.1.0", + "module": "./es/index.js", + "main": "./dist/out.js", + "typings": "./es/", + "dependencies": { + "@types/lodash-es": "^4.1.4", + "@types/node": "10.12.23", + "events": "^3.0.0", + "lodash-es": "^4.1.2" + }, + "scripts": { + "start": "npm-run-all --parallel start-tsc start-rollup", + "start-tsc": "tsc --watch", + "start-rollup": "rollup -c -w" + }, + "devDependencies": { + "npm-run-all": "^4.1.5", + "rollup": "^1.1.2", + "rollup-plugin-commonjs": "^9.2.0", + "rollup-plugin-node-resolve": "^4.0.0", + "rollup-plugin-replace": "^2.1.0", + "rollup-plugin-typescript2": "^0.19.2", + "typescript": "3.3.3" + } +} diff --git a/rollup.config.js b/rollup.config.js new file mode 100644 index 0000000..12b259b --- /dev/null +++ b/rollup.config.js @@ -0,0 +1,31 @@ +import typescript from 'rollup-plugin-typescript2' +import commonjs from 'rollup-plugin-commonjs' +import nodeResolve from 'rollup-plugin-node-resolve' +import replace from 'rollup-plugin-replace' + +const config = { + input: './src/index.ts', + output: { + file: './dist/out.js', + format: 'iife', + name: 'HoloflowsKit', + }, + plugins: [ + nodeResolve({ + browser: true, + preferBuiltins: false, + }), + replace({ + 'process.env.NODE_ENV': JSON.stringify('production'), + }), + typescript({ tsconfigOverride: { compilerOptions: { target: 'es5' } } }), + commonjs({ + extensions: ['.js', '.ts', '.tsx'], + namedExports: { + events: ['EventEmitter'], + }, + }), + ], +} + +export default config diff --git a/src/DOMProxy.ts b/src/DOMProxy.ts new file mode 100644 index 0000000..d5f8638 --- /dev/null +++ b/src/DOMProxy.ts @@ -0,0 +1,294 @@ +/** + * DomProxy provide an interface that be stable even dom is changed. + */ +export const DomProxy = function() { + let destroyed = false + + let virtualBefore: HTMLSpanElement | null = null + let current: Element = document.createElement('div') + let virtualAfter: HTMLSpanElement | null = null + /** All changes applied on the `proxy` */ + let changes: (ActionTypes[keyof ActionTypes])[] = [] + /** Read Traps */ + const readonlyTraps: ProxyHandler = { + ownKeys: () => { + changes.push({ type: 'ownKeys', op: undefined }) + if (current) return Object.getOwnPropertyNames(current) + return [] + }, + get: (t, key, r) => { + changes.push({ type: 'get', op: key }) + const current_: any = current + if (current) { + if (typeof current_[key] === 'function') + return new Proxy(current_[key], { + apply: (target, thisArg, args) => { + changes.push({ type: 'callMethods', op: { name: key, param: args, thisArg } }) + current_[key](...args) + }, + }) + else if (key === 'style') + return new Proxy((current as HTMLElement).style, { + set: (t, styleKey, styleValue, r) => { + changes.push({ type: 'modifyStyle', op: { name: styleKey, value: styleValue } }) + current_.style[styleKey] = styleValue + return true + }, + }) + return current_[key] + } + return undefined + }, + has: (t, key) => { + changes.push({ type: 'has', op: key }) + if (current) return key in current + return false + }, + getOwnPropertyDescriptor: (t, key) => { + changes.push({ type: 'getOwnPropertyDescriptor', op: key }) + if (current) { + return Reflect.getOwnPropertyDescriptor(current, key) + } + return { + configurable: true, + enumerable: false, + value: undefined, + writable: true, + } + }, + isExtensible: t => { + changes.push({ type: 'isExtensible', op: undefined }) + if (current) return Reflect.isExtensible(current) + return true + }, + getPrototypeOf: t => { + changes.push({ type: 'getPrototypeOf', op: undefined }) + if (current) return Reflect.getPrototypeOf(current) + return {} + }, + } + /** Write Traps */ + const modifyTraps: (record: boolean) => ProxyHandler = record => ({ + deleteProperty: (t, key: keyof HTMLElement) => { + record && changes.push({ type: 'delete', op: key }) + if (current) { + return Reflect.deleteProperty(current, key) + } + return false + }, + set: (t, key: keyof HTMLElement, value, r) => { + record && changes.push({ type: 'set', op: [key, value] }) + if (current) { + return ((current as any)[key] = value) + } + return true + }, + defineProperty: (t, key, attributes) => { + record && changes.push({ type: 'defineProperty', op: [key, attributes] }) + if (current) { + return Reflect.defineProperty(current, key, attributes) + } + return true + }, + preventExtensions: t => { + record && changes.push({ type: 'preventExtensions', op: undefined }) + if (current) return Reflect.preventExtensions(current) + return true + }, + setPrototypeOf: (t, prototype) => { + record && changes.push({ type: 'setPrototypeOf', op: prototype }) + if (current) return Reflect.setPrototypeOf(current, prototype) + return true + }, + }) + const modifyTrapsWrite = modifyTraps(true) + const modifyTrapsNotWrite = modifyTraps(false) + const proxy = Proxy.revocable({}, { ...readonlyTraps, ...modifyTrapsWrite }) + /** Call before realCurrent change */ + function undoEffects() { + for (const change of changes) { + if (change.type !== 'callMethods') continue + if (change.op.name !== 'addEventListener') continue + current.removeEventListener(...(change.op.param as [any, any, any])) + } + } + /** Call after realCurrent change */ + function redoEffects() { + const t = {} + for (const change of changes) { + if (change.type === 'setPrototypeOf') modifyTrapsNotWrite.setPrototypeOf(t, change.op) + else if (change.type === 'preventExtensions') modifyTrapsNotWrite.preventExtensions(t) + else if (change.type === 'defineProperty') modifyTrapsNotWrite.defineProperty(t, change.op[0], change.op[1]) + else if (change.type === 'set') modifyTrapsNotWrite.set(t, change.op[0], change.op[1], t) + else if (change.type === 'delete') modifyTrapsNotWrite.deleteProperty(t, change.op) + else if (change.type === 'callMethods') { + const replayable: (keyof Element)[] = ['appendChild', 'addEventListener', 'before', 'after'] + const key: keyof Element = change.op.name as any + if (replayable.indexOf(key) !== -1) { + ;(current[key] as any)(...change.op.param) + } + } else if (change.type === 'modifyStyle') { + ;(current as HTMLElement).style[change.op.name as any] = change.op.value + } + } + } + return { + /** + * A `span` element that always located at the before of `realCurrent` + */ + get before() { + if (destroyed) return null + if (!virtualBefore) virtualBefore = document.createElement('span') + current.before(virtualBefore) + return virtualBefore + }, + /** + * A proxy that always point to `realCurrent`, + * and if `realCurrent` changes, all action will be forwarded to new `realCurrent` + */ + get current() { + if (destroyed) return null + return proxy.proxy as HTMLSuperSet + }, + /** + * A `span` element that always located at the after of `current` + */ + get after() { + if (destroyed) return null + if (!virtualAfter) virtualAfter = document.createElement('span') + current.after(virtualAfter) + return virtualAfter + }, + get realCurrent() { + if (destroyed) return null + return current as any + }, + set realCurrent(node: Element | null | undefined) { + if (destroyed) throw new TypeError('You can not set current for a destroyed proxy') + if (node === current) return + undoEffects() + if (node === null || node === undefined) { + current = document.createElement('div') + if (virtualBefore) virtualBefore.remove() + if (virtualAfter) virtualAfter.remove() + } else { + current = node + if (virtualAfter) current.after(virtualAfter) + if (virtualBefore) current.before(virtualBefore) + redoEffects() + } + }, + destroy() { + destroyed = true + proxy.revoke() + if (virtualBefore) virtualBefore.remove() + if (virtualAfter) virtualAfter.remove() + virtualBefore = null + virtualAfter = null + current = null + }, + } +} +export type DomProxy = ReturnType +//#region HTMLSuperSet +type HTMLSuperSet = HTMLElement & + HTMLAnchorElement & + HTMLAppletElement & + HTMLAreaElement & + HTMLAudioElement & + HTMLBaseElement & + HTMLBaseFontElement & + HTMLQuoteElement & + HTMLBodyElement & + HTMLBRElement & + HTMLButtonElement & + HTMLCanvasElement & + HTMLTableCaptionElement & + HTMLTableColElement & + HTMLTableColElement & + HTMLDataElement & + HTMLDataListElement & + HTMLModElement & + HTMLDetailsElement & + HTMLDialogElement & + HTMLDirectoryElement & + HTMLDivElement & + HTMLDListElement & + HTMLEmbedElement & + HTMLFieldSetElement & + HTMLFontElement & + HTMLFormElement & + HTMLFrameElement & + HTMLFrameSetElement & + HTMLHeadingElement & + HTMLHeadingElement & + HTMLHeadingElement & + HTMLHeadingElement & + HTMLHeadingElement & + HTMLHeadingElement & + HTMLHeadElement & + HTMLHRElement & + HTMLHtmlElement & + HTMLIFrameElement & + HTMLImageElement & + HTMLInputElement & + HTMLModElement & + HTMLLabelElement & + HTMLLegendElement & + HTMLLIElement & + HTMLLinkElement & + HTMLMapElement & + HTMLMarqueeElement & + HTMLMenuElement & + HTMLMetaElement & + HTMLMeterElement & + HTMLObjectElement & + HTMLOListElement & + HTMLOptGroupElement & + HTMLOptionElement & + HTMLOutputElement & + HTMLParagraphElement & + HTMLParamElement & + HTMLPictureElement & + HTMLPreElement & + HTMLProgressElement & + HTMLQuoteElement & + HTMLScriptElement & + HTMLSelectElement & + HTMLSlotElement & + HTMLSourceElement & + HTMLSpanElement & + HTMLStyleElement & + HTMLTableElement & + HTMLTableSectionElement & + HTMLTableDataCellElement & + HTMLTemplateElement & + HTMLTextAreaElement & + HTMLTableSectionElement & + HTMLTableHeaderCellElement & + HTMLTableSectionElement & + HTMLTimeElement & + HTMLTitleElement & + HTMLTableRowElement & + HTMLTrackElement & + HTMLUListElement & + HTMLVideoElement & + HTMLElement +//#endregion +type Keys = string | number | symbol +type ActionRecord = { type: T; op: F } +interface ActionTypes { + delete: ActionRecord<'delete', Keys> + set: ActionRecord<'set', [Keys, any]> + defineProperty: ActionRecord<'defineProperty', [Keys, PropertyDescriptor]> + preventExtensions: ActionRecord<'preventExtensions', void> + setPrototypeOf: ActionRecord<'setPrototypeOf', any> + get: ActionRecord<'get', Keys> + ownKeys: ActionRecord<'ownKeys', undefined> + has: ActionRecord<'has', Keys> + getOwnPropertyDescriptor: ActionRecord<'getOwnPropertyDescriptor', Keys> + isExtensible: ActionRecord<'isExtensible', undefined> + getPrototypeOf: ActionRecord<'getPrototypeOf', undefined> + callMethods: ActionRecord<'callMethods', { name: Keys; param: any[]; thisArg: any }> + modifyStyle: ActionRecord<'modifyStyle', { name: Keys; value: string }> +} diff --git a/src/LiveSelector.ts b/src/LiveSelector.ts new file mode 100644 index 0000000..0c15e7d --- /dev/null +++ b/src/LiveSelector.ts @@ -0,0 +1,144 @@ +type ChainType = { type: T; param: F } +interface SelectorChainType { + querySelector: ChainType<'querySelector', string> + querySelectorAll: ChainType<'querySelectorAll', string> + filter: ChainType<'filter', (element: any, index: number, array: any[]) => boolean> + map: ChainType<'map', (element: any) => any> + concat: ChainType<'concat', LiveSelector> + reverse: ChainType<'reverse', undefined> + slice: ChainType<'slice', [number | undefined, number | undefined]> + sort: ChainType<'sort', (a: any, b: any) => number> + flat: ChainType<'flat', undefined> + first: ChainType<'first', undefined> + last: ChainType<'last', undefined> +} +type TypeKeys = SelectorChainType[keyof SelectorChainType]['type'] +type TypeParams = { [key in keyof SelectorChainType]: SelectorChainType[key]['param'] } +/** Create a live selector that can continuously select the element you want */ +export class LiveSelector { + private generateMethod = (type: Key) => (param: TypeParams[Key]) => { + this.selectorChain.push({ type: type as any, param: param as any }) + return this as LiveSelector + } + private readonly selectorChain: (SelectorChainType[keyof SelectorChainType])[] = [] + //#region Add elements + /** + * Select the first element that is a descendant of node that matches selectors. + */ + querySelector(selectors: K): LiveSelector + querySelector(selectors: K): LiveSelector + querySelector(selectors: string): LiveSelector + querySelector(selectors: string): LiveSelector { + return this.generateMethod('querySelector')(selectors) + } + /** + * Select all element descendants of node that match selectors. + */ + querySelectorAll(selectors: K): LiveSelector + querySelectorAll(selectors: K): LiveSelector + querySelectorAll(selectors: string): LiveSelector + querySelectorAll(selectors: string): LiveSelector { + return this.generateMethod('querySelectorAll')(selectors) + } + //#endregion + + //#region Modify + /** + * Select the elements of a LiveSelector that meet the condition specified in a callback function. + */ + filter: // + ((callbackfn: (value: T, index: number, array: T[]) => value is S) => LiveSelector) & + (( + callbackfn: (value: T, index: number, array: T[]) => any, + ) => LiveSelector>) = this.generateMethod('filter') + /** + * Calls a defined callback function on each element of a LiveSelector, and continues with the results. + */ + map: (callbackfn: (element: T) => NextType) => LiveSelector> = this.generateMethod( + 'map', + ) + /** + * Combines two LiveSelector. + * @param item Additional LiveSelector to combine. + */ + concat: (newEle: LiveSelector) => LiveSelector = this.generateMethod('concat') + /** + * Reverses the elements in an Array. + */ + reverse(): LiveSelector { + return this.generateMethod('reverse')(undefined) + } + /** + * Returns a section of an array. + * @param start The beginning of the specified portion of the array. + * @param end The end of the specified portion of the array. + */ + slice: (start?: number, end?: number) => LiveSelector = (a, b) => this.generateMethod('slice')([a, b]) + /** + * Sorts an array. + * @param compareFn The name of the function used to determine the order of the elements. If omitted, the elements are sorted in ascending, ASCII character order. + */ + sort: (compareFn?: (a: T, b: T) => number) => LiveSelector = this.generateMethod('sort') + /** + * Flat T[][] to T[] + */ + flat(): LiveSelector ? U : never> { + return this.generateMethod('flat')(undefined) + } + first(): LiveSelector { + return this.generateMethod('first')(undefined) + } + last(): LiveSelector { + return this.generateMethod('last')(undefined) + } + //#endregion + + //#region Build + evaluateOnce() { + let arr: T[] = [] + for (const op of this.selectorChain) { + switch (op.type) { + case 'querySelector': + const e = document.querySelector(op.param) as any + e && arr.push(e) + break + case 'querySelectorAll': + arr.push(...(document.querySelectorAll(op.param) as any)) + break + case 'filter': + arr = arr.filter(op.param).filter(x => x !== null) + break + case 'map': + arr = arr.map(op.param).filter(x => x !== null) + break + case 'concat': + arr = arr.concat(op.param.evaluateOnce()) + break + case 'reverse': + arr = arr.reverse() + break + case 'slice': + arr = arr.slice(op.param[0], op.param[1]) + break + case 'sort': + arr = arr.sort(op.param) + break + case 'first': + arr = [arr[0]] + break + case 'last': + arr = [arr[arr.length - 1]] + break + case 'flat': + const newArr: any[] = [] + arr.forEach(x => newArr.push(...(x as any))) + arr = newArr + break + default: + throw new TypeError('Unknown operation type') + } + } + return arr.filter(x => x) as T[] + } + //#endregion +} diff --git a/src/Watcher.ts b/src/Watcher.ts new file mode 100644 index 0000000..592ebb4 --- /dev/null +++ b/src/Watcher.ts @@ -0,0 +1,250 @@ +import { DomProxy } from './DOMProxy' +import { EventEmitter } from 'events' +import { LiveSelector } from './LiveSelector' + +import { differenceWith, intersectionWith, uniqWith } from 'lodash-es' + +type RequireNode = T extends Element ? V : never +interface SingleNodeWatcher { + virtualNode: RequireNode +} +type EffectReturnFn = + | void + | (() => void) + | { + remove?: (old: T) => void + onCurrentChange: (old: T, newT: T) => void + } +/** Watcher for multiple node */ +interface MultipleNodeWatcher { + /** + * To help identify same nodes in different iteration, + * you need to implement a map function that map `node` => `key` + * + * If the key is changed, the same node will call through `forEachRemove` then `forEach` + * + * *Param map*: `node` => `key`, defaults to `node => node` + * + * *Param comparer*: compare between two keys, defaults to `===` + */ + assignKeys: RequireNode< + T, + ( + assigner: (node: T, index: number, arr: T[]) => Q, + comparer?: (a: Q, b: Q) => boolean, + ) => Watcher + > + /** + * Just like React hooks. + * + * @param fn will be called every node update. + * If `fn` return a `function`, when `node` removed from the list, it will be called. + */ + useNodeForeach: RequireNode< + T, + (fn: (virtualNode: DomProxy, key: unknown, realNode: T) => EffectReturnFn) => Watcher + > + /** + * Get virtual node by key. + * Virtual node will be unavailable if it is deleted + */ + getVirtualNodeByKey: RequireNode DomProxy> +} +type EventFn = (fn: CustomEvent & { data: T }) => void +/** Use LiveSelector to watch dom change + * + * **You must call `stopWatch` if you won't use it anymore** + */ +export class Watcher extends EventEmitter implements SingleNodeWatcher, MultipleNodeWatcher { + constructor( + private liveSelector: LiveSelector, + /** The element that won't change during the whole watching lifetime. This may improve performance. */ + private consistentWatchRoot: Element | Document = document.body, + ) { + super() + } + //#region Watcher + /** Observe whole document change */ + private observer: MutationObserver = new MutationObserver(this.onMutation.bind(this)) + /** Limit onMutation computation by rAF */ + private rAFLock = false + private onMutation(mutations: MutationRecord[], observer: MutationObserver) { + if (this.rAFLock) return + this.rAFLock = true + requestAnimationFrame(this.watcherCallback) + } + private watching = false + private lastKeyList: unknown[] = [] + private lastNodeList: T[] = [] + private lastUndoEffectMap = new Map>() + private lastVirtualNodesMap = new Map() + private findNodeFromListByKey = (list: T[], keys: unknown[]) => (key: unknown) => { + const i = keys.findIndex(x => this.keyComparer(x, key)) + if (i === -1) return null + return list[i] + } + private watcherCallback = () => { + if (!this.watching) return + this.rAFLock = false + + const thisNodes = this.liveSelector.evaluateOnce() + const thisKeyList = thisNodes.map(this.mapNodeToKey) + + //#region Warn about repeated keys + { + const uniq = uniqWith(thisKeyList, this.keyComparer) + if (uniq.length < thisKeyList.length) { + console.warn('There are repeated keys in your watcher. [uniqKeys, allKeys] = ', uniq, thisKeyList) + } + } + //#endregion + + // New maps in the next generation + const nextUndoEffectMap = new Map>() + const nextVirtualNodesMap = new Map() + + //#region Key is gone + // Do: Delete node + const findFromLast = this.findNodeFromListByKey(this.lastNodeList, this.lastKeyList) + const goneKeys = differenceWith(this.lastKeyList, thisKeyList, this.keyComparer) + { + for (const oldKey of goneKeys) { + const virtualNode = this.lastVirtualNodesMap.get(oldKey) + if (virtualNode) virtualNode.destroy() + const undoFn = this.lastUndoEffectMap.get(oldKey) + if (undoFn) + typeof undoFn === 'function' + ? undoFn() + : typeof undoFn.remove === 'function' && undoFn.remove(findFromLast(oldKey)) + } + } + //#endregion + + //#region Key is new + // Do: Add node + const findFromNew = this.findNodeFromListByKey(thisNodes, thisKeyList) + const newKeys = differenceWith(thisKeyList, this.lastKeyList, this.keyComparer) + { + for (const newKey of newKeys) { + if (!this.useNodeForeachFn) break + const node = findFromNew(newKey) + if (node instanceof Element) { + const virtualNode = DomProxy() + virtualNode.realCurrent = node + const undoFn = this.useNodeForeachFn(virtualNode, newKey, node) + nextUndoEffectMap.set(newKey, undoFn) + nextVirtualNodesMap.set(newKey, virtualNode) + } + } + } + //#endregion + + //#region Key is the same, but node is changed + // Do: Change reference + const oldSameKeys = intersectionWith(this.lastKeyList, thisKeyList, this.keyComparer) + const newSameKeys = intersectionWith(thisKeyList, this.lastKeyList, this.keyComparer) + type U = [T, T, unknown, unknown] + const changedNodes = oldSameKeys + .map(x => [findFromLast(x), findFromNew(x), x, newSameKeys.find(newK => this.keyComparer(newK, x))] as U) + .filter(([a, b]) => a !== b) + for (const [oldNode, newNode, oldKey] of changedNodes) { + if (newNode instanceof Element) { + const virtualNode = this.lastVirtualNodesMap.get(oldKey) + virtualNode.realCurrent = newNode + const fn = this.lastUndoEffectMap.get(oldKey) + if (fn) typeof fn === 'function' ? undefined : fn.onCurrentChange(oldNode, newNode) + } + } + //#endregion + + // Key is the same, node is the same + // Do: nothing + + // Final: Copy the same keys + for (const newKey of newSameKeys) { + const oldKey = oldSameKeys.find(oldKey => this.keyComparer(newKey, oldKey)) + nextUndoEffectMap.set(newKey, this.lastUndoEffectMap.get(oldKey)) + nextVirtualNodesMap.set(newKey, this.lastVirtualNodesMap.get(oldKey)) + this.lastUndoEffectMap = nextUndoEffectMap + this.lastVirtualNodesMap = nextVirtualNodesMap + } + this.lastKeyList = thisKeyList + this.lastNodeList = thisNodes + + this.emit('onChangeFull', thisNodes) + this.emit( + 'onChange', + changedNodes.map(([oldNode, newNode, oldKey, newKey]) => ({ oldNode, newNode, oldKey, newKey })), + ) + this.emit('onRemove', goneKeys.map(key => ({ key, node: findFromLast(key) }))) + this.emit('onAdd', newKeys.map(key => ({ key, node: findFromNew(key) }))) + + // For single node mode + const first = thisNodes[0] + if (first instanceof HTMLElement || first === undefined || first === null) { + this.virtualNode.realCurrent = first as any + } + } + startWatch(options?: MutationObserverInit) { + this.stopWatch() + this.watching = true + const option = { + attributes: true, + characterData: true, + childList: true, + subtree: true, + ...options, + } + this.observer.observe(this.consistentWatchRoot, option) + this.watcherCallback() + return this + } + stopWatch() { + this.watching = false + this.observer.disconnect() + } + //#endregion + + //#region events + addListener(event: 'onChange', fn: EventFn<{ oldNode: T; newNode: T; oldKey: unknown; newKey: unknown }[]>): this + addListener(event: 'onChangeFull', fn: EventFn): this + addListener(event: 'onRemove', fn: EventFn<{ node: T; key: unknown }[]>): this + addListener(event: 'onAdd', fn: EventFn<{ node: T; key: unknown }[]>): this + addListener(event: string | symbol, fn: (...args: any[]) => void) { + super.addListener(event, fn) + return this + } + emit(event: 'onChange', data: { oldNode: T; newNode: T; oldKey: unknown; newKey: unknown }[]): boolean + emit(event: 'onChangeFull', data: T[]): boolean + emit(event: 'onRemove', data: { node: T; key: unknown }[]): boolean + emit(event: 'onAdd', data: { node: T; key: unknown }[]): boolean + emit(event: string | symbol, data: any) { + return super.emit(event, { data }) + } + //#endregion + virtualNode: RequireNode = DomProxy() as any + + //#region For multiple nodes injection + private mapNodeToKey: Parameters['assignKeys']>[0] = node => node + private keyComparer(a: unknown, b: unknown) { + return a === b + } + assignKeys: MultipleNodeWatcher['assignKeys'] = ((...args: Parameters['assignKeys']>) => { + this.mapNodeToKey = args[0] + if (args[1]) this.keyComparer = args[1] + return this + }) as any + private useNodeForeachFn: Parameters['useNodeForeach']>[0] | null = null + useNodeForeach: MultipleNodeWatcher['useNodeForeach'] = (( + ...args: Parameters['useNodeForeach']> + ) => { + this.useNodeForeachFn = args[0] + return this + }) as any + getVirtualNodeByKey: MultipleNodeWatcher['getVirtualNodeByKey'] = ((key: unknown) => { + return this.lastVirtualNodesMap.get( + [...this.lastVirtualNodesMap.keys()].find(_ => this.keyComparer(_, key)), + ) as ReturnType['getVirtualNodeByKey']> + }) as any + //#endregion +} diff --git a/src/global.d.ts b/src/global.d.ts new file mode 100644 index 0000000..5e49d79 --- /dev/null +++ b/src/global.d.ts @@ -0,0 +1,7 @@ +declare namespace React { + const createElement: any + const useState: any +} +declare namespace ReactDOM { + const render: any +} diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..90cdbc7 --- /dev/null +++ b/src/index.ts @@ -0,0 +1,3 @@ +export { LiveSelector } from './LiveSelector' +export { DomProxy } from './DOMProxy' +export { Watcher } from './Watcher' diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..98108d3 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,22 @@ +{ + "compilerOptions": { + "allowSyntheticDefaultImports": true, + "declaration": true, + "declarationMap": true, + "downlevelIteration": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "noFallthroughCasesInSwitch": true, + "lib": ["es2018", "dom", "dom.iterable"], + "module": "esnext", + "moduleResolution": "node", + "noImplicitAny": true, + "noImplicitThis": true, + "noImplicitReturns": true, + "sourceMap": true, + "pretty": true, + "target": "es2018", + "outDir": "./es/" + }, + "include": ["./src/**/*"] +} diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..ac90bc3 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,1391 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@types/estree@0.0.39": + version "0.0.39" + resolved "http://registry.npm.taobao.org/@types/estree/download/@types/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" + integrity sha1-4Xfmme4bjCLSMXTKqnQiZEOJUJ8= + +"@types/lodash-es@^4.1.4": + version "4.17.2" + resolved "http://registry.npm.taobao.org/@types/lodash-es/download/@types/lodash-es-4.17.2.tgz#32914ee99ce45a570f8fe739376a205e649372a5" + integrity sha1-MpFO6ZzkWlcPj+c5N2ogXmSTcqU= + dependencies: + "@types/lodash" "*" + +"@types/lodash@*": + version "4.14.121" + resolved "http://registry.npm.taobao.org/@types/lodash/download/@types/lodash-4.14.121.tgz#9327e20d49b95fc2bf983fc2f045b2c6effc80b9" + integrity sha1-kyfiDUm5X8K/mD/C8EWyxu/8gLk= + +"@types/node@10.12.23": + version "10.12.23" + resolved "http://registry.npm.taobao.org/@types/node/download/@types/node-10.12.23.tgz#308a3acdc5d1c842aeadc50b867d99c46cfae868" + integrity sha1-MIo6zcXRyEKurcULhn2ZxGz66Gg= + +"@types/node@^11.9.5": + version "11.10.4" + resolved "http://registry.npm.taobao.org/@types/node/download/@types/node-11.10.4.tgz#3f5fc4f0f322805f009e00ab35a2ff3d6b778e42" + integrity sha1-P1/E8PMigF8AngCrNaL/PWt3jkI= + +acorn@^6.1.1: + version "6.1.1" + resolved "http://registry.npm.taobao.org/acorn/download/acorn-6.1.1.tgz#7d25ae05bb8ad1f9b699108e1094ecd7884adc1f" + integrity sha1-fSWuBbuK0fm2mRCOEJTs14hK3B8= + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "http://registry.npm.taobao.org/ansi-styles/download/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0= + dependencies: + color-convert "^1.9.0" + +arr-diff@^2.0.0: + version "2.0.0" + resolved "http://registry.npm.taobao.org/arr-diff/download/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" + integrity sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8= + dependencies: + arr-flatten "^1.0.1" + +arr-diff@^4.0.0: + version "4.0.0" + resolved "http://registry.npm.taobao.org/arr-diff/download/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= + +arr-flatten@^1.0.1, arr-flatten@^1.1.0: + version "1.1.0" + resolved "http://registry.npm.taobao.org/arr-flatten/download/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha1-NgSLv/TntH4TZkQxbJlmnqWukfE= + +arr-union@^3.1.0: + version "3.1.0" + resolved "http://registry.npm.taobao.org/arr-union/download/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= + +array-filter@~0.0.0: + version "0.0.1" + resolved "http://registry.npm.taobao.org/array-filter/download/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec" + integrity sha1-fajPLiZijtcygDWB/SH2fKzS7uw= + +array-map@~0.0.0: + version "0.0.0" + resolved "http://registry.npm.taobao.org/array-map/download/array-map-0.0.0.tgz#88a2bab73d1cf7bcd5c1b118a003f66f665fa662" + integrity sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI= + +array-reduce@~0.0.0: + version "0.0.0" + resolved "http://registry.npm.taobao.org/array-reduce/download/array-reduce-0.0.0.tgz#173899d3ffd1c7d9383e4479525dbe278cab5f2b" + integrity sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys= + +array-unique@^0.2.1: + version "0.2.1" + resolved "http://registry.npm.taobao.org/array-unique/download/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" + integrity sha1-odl8yvy8JiXMcPrc6zalDFiwGlM= + +array-unique@^0.3.2: + version "0.3.2" + resolved "http://registry.npm.taobao.org/array-unique/download/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/assign-symbols/download/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= + +atob@^2.1.1: + version "2.1.2" + resolved "http://registry.npm.taobao.org/atob/download/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha1-bZUX654DDSQ2ZmZR6GvZ9vE1M8k= + +balanced-match@^1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/balanced-match/download/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + +base@^0.11.1: + version "0.11.2" + resolved "http://registry.npm.taobao.org/base/download/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha1-e95c7RRbbVUakNuH+DxVi060io8= + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "http://registry.npm.taobao.org/brace-expansion/download/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0= + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^1.8.2: + version "1.8.5" + resolved "http://registry.npm.taobao.org/braces/download/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" + integrity sha1-uneWLhLf+WnWt2cR6RS3N4V79qc= + dependencies: + expand-range "^1.8.1" + preserve "^0.2.0" + repeat-element "^1.1.2" + +braces@^2.3.1: + version "2.3.2" + resolved "http://registry.npm.taobao.org/braces/download/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha1-WXn9PxTNUxVl5fot8av/8d+u5yk= + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +builtin-modules@^3.0.0: + version "3.0.0" + resolved "http://registry.npm.taobao.org/builtin-modules/download/builtin-modules-3.0.0.tgz#1e587d44b006620d90286cc7a9238bbc6129cab1" + integrity sha1-Hlh9RLAGYg2QKGzHqSOLvGEpyrE= + +cache-base@^1.0.1: + version "1.0.1" + resolved "http://registry.npm.taobao.org/cache-base/download/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha1-Cn9GQWgxyLZi7jb+TnxZ129marI= + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + +chalk@^2.4.1: + version "2.4.2" + resolved "http://registry.npm.taobao.org/chalk/download/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ= + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +class-utils@^0.3.5: + version "0.3.6" + resolved "http://registry.npm.taobao.org/class-utils/download/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha1-+TNprouafOAv1B+q0MqDAzGQxGM= + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +collection-visit@^1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/collection-visit/download/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.9.0: + version "1.9.3" + resolved "http://registry.npm.taobao.org/color-convert/download/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg= + dependencies: + color-name "1.1.3" + +color-name@1.1.3: + version "1.1.3" + resolved "http://registry.npm.taobao.org/color-name/download/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +component-emitter@^1.2.1: + version "1.2.1" + resolved "http://registry.npm.taobao.org/component-emitter/download/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" + integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY= + +concat-map@0.0.1: + version "0.0.1" + resolved "http://registry.npm.taobao.org/concat-map/download/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "http://registry.npm.taobao.org/copy-descriptor/download/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + +cross-spawn@^6.0.5: + version "6.0.5" + resolved "http://registry.npm.taobao.org/cross-spawn/download/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha1-Sl7Hxk364iw6FBJNus3uhG2Ay8Q= + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +debug@^2.2.0, debug@^2.3.3: + version "2.6.9" + resolved "http://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8= + dependencies: + ms "2.0.0" + +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "http://registry.npm.taobao.org/decode-uri-component/download/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= + +define-properties@^1.1.2: + version "1.1.3" + resolved "http://registry.npm.taobao.org/define-properties/download/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha1-z4jabL7ib+bbcJT2HYcMvYTO6fE= + dependencies: + object-keys "^1.0.12" + +define-property@^0.2.5: + version "0.2.5" + resolved "http://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/define-property/download/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "http://registry.npm.taobao.org/define-property/download/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha1-1Flono1lS6d+AqgX+HENcCyxbp0= + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +error-ex@^1.3.1: + version "1.3.2" + resolved "http://registry.npm.taobao.org/error-ex/download/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha1-tKxAZIEH/c3PriQvQovqihTU8b8= + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.4.3: + version "1.13.0" + resolved "http://registry.npm.taobao.org/es-abstract/download/es-abstract-1.13.0.tgz#ac86145fdd5099d8dd49558ccba2eaf9b88e24e9" + integrity sha1-rIYUX91QmdjdSVWMy6Lq+biOJOk= + dependencies: + 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@^1.2.0: + version "1.2.0" + resolved "http://registry.npm.taobao.org/es-to-primitive/download/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377" + integrity sha1-7fckeAM0VujdqO8J4ArZZQcH83c= + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "http://registry.npm.taobao.org/escape-string-regexp/download/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +estree-walker@^0.5.2: + version "0.5.2" + resolved "http://registry.npm.taobao.org/estree-walker/download/estree-walker-0.5.2.tgz#d3850be7529c9580d815600b53126515e146dd39" + integrity sha1-04UL51KclYDYFWALUxJlFeFG3Tk= + +estree-walker@^0.6.0: + version "0.6.0" + resolved "http://registry.npm.taobao.org/estree-walker/download/estree-walker-0.6.0.tgz#5d865327c44a618dde5699f763891ae31f257dae" + integrity sha1-XYZTJ8RKYY3eVpn3Y4ka4x8lfa4= + +events@^3.0.0: + version "3.0.0" + resolved "http://registry.npm.taobao.org/events/download/events-3.0.0.tgz#9a0a0dfaf62893d92b875b8f2698ca4114973e88" + integrity sha1-mgoN+vYok9krh1uPJpjKQRSXPog= + +expand-brackets@^0.1.4: + version "0.1.5" + resolved "http://registry.npm.taobao.org/expand-brackets/download/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" + integrity sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s= + dependencies: + is-posix-bracket "^0.1.0" + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "http://registry.npm.taobao.org/expand-brackets/download/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +expand-range@^1.8.1: + version "1.8.2" + resolved "http://registry.npm.taobao.org/expand-range/download/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" + integrity sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc= + dependencies: + fill-range "^2.1.0" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "http://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "http://registry.npm.taobao.org/extend-shallow/download/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extglob@^0.3.1: + version "0.3.2" + resolved "http://registry.npm.taobao.org/extglob/download/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" + integrity sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE= + dependencies: + is-extglob "^1.0.0" + +extglob@^2.0.4: + version "2.0.4" + resolved "http://registry.npm.taobao.org/extglob/download/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha1-rQD+TcYSqSMuhxhxHcXLWrAoVUM= + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +filename-regex@^2.0.0: + version "2.0.1" + resolved "http://registry.npm.taobao.org/filename-regex/download/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" + integrity sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY= + +fill-range@^2.1.0: + version "2.2.4" + resolved "http://registry.npm.taobao.org/fill-range/download/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" + integrity sha1-6x53OrsFbc2N8r/favWbizqTZWU= + dependencies: + is-number "^2.1.0" + isobject "^2.0.0" + randomatic "^3.0.0" + repeat-element "^1.1.2" + repeat-string "^1.5.2" + +fill-range@^4.0.0: + version "4.0.0" + resolved "http://registry.npm.taobao.org/fill-range/download/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +for-in@^1.0.1, for-in@^1.0.2: + version "1.0.2" + resolved "http://registry.npm.taobao.org/for-in/download/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= + +for-own@^0.1.4: + version "0.1.5" + resolved "http://registry.npm.taobao.org/for-own/download/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" + integrity sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4= + dependencies: + for-in "^1.0.1" + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "http://registry.npm.taobao.org/fragment-cache/download/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= + dependencies: + map-cache "^0.2.2" + +fs-extra@7.0.1: + version "7.0.1" + resolved "http://registry.npm.taobao.org/fs-extra/download/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" + integrity sha1-TxicRKoSO4lfcigE9V6iPq3DSOk= + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +function-bind@^1.0.2, function-bind@^1.1.1: + version "1.1.1" + resolved "http://registry.npm.taobao.org/function-bind/download/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0= + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "http://registry.npm.taobao.org/get-value/download/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= + +glob-base@^0.3.0: + version "0.3.0" + resolved "http://registry.npm.taobao.org/glob-base/download/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" + integrity sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q= + dependencies: + glob-parent "^2.0.0" + is-glob "^2.0.0" + +glob-parent@^2.0.0: + version "2.0.0" + resolved "http://registry.npm.taobao.org/glob-parent/download/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" + integrity sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg= + dependencies: + is-glob "^2.0.0" + +graceful-fs@^4.1.2, graceful-fs@^4.1.6: + version "4.1.15" + resolved "http://registry.npm.taobao.org/graceful-fs/download/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" + integrity sha1-/7cD4QZuig7qpMi4C6klPu77+wA= + +has-flag@^3.0.0: + version "3.0.0" + resolved "http://registry.npm.taobao.org/has-flag/download/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-symbols@^1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/has-symbols/download/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" + integrity sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q= + +has-value@^0.3.1: + version "0.3.1" + resolved "http://registry.npm.taobao.org/has-value/download/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/has-value/download/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "http://registry.npm.taobao.org/has-values/download/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= + +has-values@^1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/has-values/download/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +has@^1.0.1, has@^1.0.3: + version "1.0.3" + resolved "http://registry.npm.taobao.org/has/download/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha1-ci18v8H2qoJB8W3YFOAR4fQeh5Y= + dependencies: + function-bind "^1.1.1" + +hosted-git-info@^2.1.4: + version "2.7.1" + resolved "http://registry.npm.taobao.org/hosted-git-info/download/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" + integrity sha1-l/I2l3vW4SVAiTD/bePuxigewEc= + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "http://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY= + dependencies: + kind-of "^6.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "http://registry.npm.taobao.org/is-arrayish/download/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + +is-buffer@^1.1.5: + version "1.1.6" + resolved "http://registry.npm.taobao.org/is-buffer/download/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha1-76ouqdqg16suoTqXsritUf776L4= + +is-callable@^1.1.4: + version "1.1.4" + resolved "http://registry.npm.taobao.org/is-callable/download/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" + integrity sha1-HhrfIZ4e62hNaR+dagX/DTCiTXU= + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "http://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc= + dependencies: + kind-of "^6.0.0" + +is-date-object@^1.0.1: + version "1.0.1" + resolved "http://registry.npm.taobao.org/is-date-object/download/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" + integrity sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY= + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "http://registry.npm.taobao.org/is-descriptor/download/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco= + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "http://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw= + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-dotfile@^1.0.0: + version "1.0.3" + resolved "http://registry.npm.taobao.org/is-dotfile/download/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" + integrity sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE= + +is-equal-shallow@^0.1.3: + version "0.1.3" + resolved "http://registry.npm.taobao.org/is-equal-shallow/download/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" + integrity sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ= + dependencies: + is-primitive "^2.0.0" + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "http://registry.npm.taobao.org/is-extendable/download/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + +is-extendable@^1.0.1: + version "1.0.1" + resolved "http://registry.npm.taobao.org/is-extendable/download/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ= + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/is-extglob/download/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" + integrity sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA= + +is-glob@^2.0.0, is-glob@^2.0.1: + version "2.0.1" + resolved "http://registry.npm.taobao.org/is-glob/download/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" + integrity sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM= + dependencies: + is-extglob "^1.0.0" + +is-module@^1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/is-module/download/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" + integrity sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE= + +is-number@^2.1.0: + version "2.1.0" + resolved "http://registry.npm.taobao.org/is-number/download/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" + integrity sha1-Afy7s5NGOlSPL0ZszhbezknbkI8= + dependencies: + kind-of "^3.0.2" + +is-number@^3.0.0: + version "3.0.0" + resolved "http://registry.npm.taobao.org/is-number/download/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= + dependencies: + kind-of "^3.0.2" + +is-number@^4.0.0: + version "4.0.0" + resolved "http://registry.npm.taobao.org/is-number/download/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" + integrity sha1-ACbjf1RU1z41bf5lZGmYZ8an8P8= + +is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "http://registry.npm.taobao.org/is-plain-object/download/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc= + dependencies: + isobject "^3.0.1" + +is-posix-bracket@^0.1.0: + version "0.1.1" + resolved "http://registry.npm.taobao.org/is-posix-bracket/download/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" + integrity sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q= + +is-primitive@^2.0.0: + version "2.0.0" + resolved "http://registry.npm.taobao.org/is-primitive/download/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" + integrity sha1-IHurkWOEmcB7Kt8kCkGochADRXU= + +is-regex@^1.0.4: + version "1.0.4" + resolved "http://registry.npm.taobao.org/is-regex/download/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" + integrity sha1-VRdIm1RwkbCTDglWVM7SXul+lJE= + dependencies: + has "^1.0.1" + +is-symbol@^1.0.2: + version "1.0.2" + resolved "http://registry.npm.taobao.org/is-symbol/download/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38" + integrity sha1-oFX2rlcZLK7jKeeoYBGLSXqVDzg= + dependencies: + has-symbols "^1.0.0" + +is-windows@^1.0.2: + version "1.0.2" + resolved "http://registry.npm.taobao.org/is-windows/download/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha1-0YUOuXkezRjmGCzhKjDzlmNLsZ0= + +isarray@1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isexe@^2.0.0: + version "2.0.0" + resolved "http://registry.npm.taobao.org/isexe/download/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isobject@^2.0.0: + version "2.1.0" + resolved "http://registry.npm.taobao.org/isobject/download/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "http://registry.npm.taobao.org/isobject/download/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + +json-parse-better-errors@^1.0.1: + version "1.0.2" + resolved "http://registry.npm.taobao.org/json-parse-better-errors/download/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha1-u4Z8+zRQ5pEHwTHRxRS6s9yLyqk= + +jsonfile@^4.0.0: + version "4.0.0" + resolved "http://registry.npm.taobao.org/jsonfile/download/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= + optionalDependencies: + graceful-fs "^4.1.6" + +jsonify@~0.0.0: + version "0.0.0" + resolved "http://registry.npm.taobao.org/jsonify/download/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "http://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "http://registry.npm.taobao.org/kind-of/download/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "http://registry.npm.taobao.org/kind-of/download/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha1-cpyR4thXt6QZofmqZWhcTDP1hF0= + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.2" + resolved "http://registry.npm.taobao.org/kind-of/download/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" + integrity sha1-ARRrNqYhjmTljzqNZt5df8b20FE= + +load-json-file@^4.0.0: + version "4.0.0" + resolved "http://registry.npm.taobao.org/load-json-file/download/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" + integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= + dependencies: + graceful-fs "^4.1.2" + parse-json "^4.0.0" + pify "^3.0.0" + strip-bom "^3.0.0" + +lodash-es@^4.1.2: + version "4.17.11" + resolved "http://registry.npm.taobao.org/lodash-es/download/lodash-es-4.17.11.tgz#145ab4a7ac5c5e52a3531fb4f310255a152b4be0" + integrity sha1-FFq0p6xcXlKjUx+08xAlWhUrS+A= + +magic-string@^0.25.1: + version "0.25.2" + resolved "http://registry.npm.taobao.org/magic-string/download/magic-string-0.25.2.tgz#139c3a729515ec55e96e69e82a11fe890a293ad9" + integrity sha1-E5w6cpUV7FXpbmnoKhH+iQopOtk= + dependencies: + sourcemap-codec "^1.4.4" + +map-cache@^0.2.2: + version "0.2.2" + resolved "http://registry.npm.taobao.org/map-cache/download/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= + +map-visit@^1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/map-visit/download/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + dependencies: + object-visit "^1.0.0" + +math-random@^1.0.1: + version "1.0.4" + resolved "http://registry.npm.taobao.org/math-random/download/math-random-1.0.4.tgz#5dd6943c938548267016d4e34f057583080c514c" + integrity sha1-XdaUPJOFSCZwFtTjTwV1gwgMUUw= + +memorystream@^0.3.1: + version "0.3.1" + resolved "http://registry.npm.taobao.org/memorystream/download/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" + integrity sha1-htcJCzDORV1j+64S3aUaR93K+bI= + +micromatch@^2.3.11: + version "2.3.11" + resolved "http://registry.npm.taobao.org/micromatch/download/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" + integrity sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU= + dependencies: + arr-diff "^2.0.0" + array-unique "^0.2.1" + braces "^1.8.2" + expand-brackets "^0.1.4" + extglob "^0.3.1" + filename-regex "^2.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.1" + kind-of "^3.0.2" + normalize-path "^2.0.1" + object.omit "^2.0.0" + parse-glob "^3.0.4" + regex-cache "^0.4.2" + +micromatch@^3.1.10: + version "3.1.10" + resolved "http://registry.npm.taobao.org/micromatch/download/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha1-cIWbyVyYQJUvNZoGij/En57PrCM= + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + +minimatch@^3.0.2, minimatch@^3.0.4: + version "3.0.4" + resolved "http://registry.npm.taobao.org/minimatch/download/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM= + dependencies: + brace-expansion "^1.1.7" + +mixin-deep@^1.2.0: + version "1.3.1" + resolved "http://registry.npm.taobao.org/mixin-deep/download/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" + integrity sha1-pJ5yaNzhoNlpjkUybFYm3zVD0P4= + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +ms@2.0.0: + version "2.0.0" + resolved "http://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +nanomatch@^1.2.9: + version "1.2.13" + resolved "http://registry.npm.taobao.org/nanomatch/download/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha1-uHqKpPwN6P5r6IiVs4mD/yZb0Rk= + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +nice-try@^1.0.4: + version "1.0.5" + resolved "http://registry.npm.taobao.org/nice-try/download/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha1-ozeKdpbOfSI+iPybdkvX7xCJ42Y= + +normalize-package-data@^2.3.2: + version "2.5.0" + resolved "http://registry.npm.taobao.org/normalize-package-data/download/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha1-5m2xg4sgDB38IzIl0SyzZSDiNKg= + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^2.0.1: + version "2.1.1" + resolved "http://registry.npm.taobao.org/normalize-path/download/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= + dependencies: + remove-trailing-separator "^1.0.1" + +npm-run-all@^4.1.5: + version "4.1.5" + resolved "http://registry.npm.taobao.org/npm-run-all/download/npm-run-all-4.1.5.tgz#04476202a15ee0e2e214080861bff12a51d98fba" + integrity sha1-BEdiAqFe4OLiFAgIYb/xKlHZj7o= + dependencies: + ansi-styles "^3.2.1" + chalk "^2.4.1" + cross-spawn "^6.0.5" + memorystream "^0.3.1" + minimatch "^3.0.4" + pidtree "^0.3.0" + read-pkg "^3.0.0" + shell-quote "^1.6.1" + string.prototype.padend "^3.0.0" + +object-copy@^0.1.0: + version "0.1.0" + resolved "http://registry.npm.taobao.org/object-copy/download/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-keys@^1.0.12: + version "1.1.0" + resolved "http://registry.npm.taobao.org/object-keys/download/object-keys-1.1.0.tgz#11bd22348dd2e096a045ab06f6c85bcc340fa032" + integrity sha1-Eb0iNI3S4JagRasG9shbzDQPoDI= + +object-visit@^1.0.0: + version "1.0.1" + resolved "http://registry.npm.taobao.org/object-visit/download/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + dependencies: + isobject "^3.0.0" + +object.omit@^2.0.0: + version "2.0.1" + resolved "http://registry.npm.taobao.org/object.omit/download/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" + integrity sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo= + dependencies: + for-own "^0.1.4" + is-extendable "^0.1.1" + +object.pick@^1.3.0: + version "1.3.0" + resolved "http://registry.npm.taobao.org/object.pick/download/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + dependencies: + isobject "^3.0.1" + +parse-glob@^3.0.4: + version "3.0.4" + resolved "http://registry.npm.taobao.org/parse-glob/download/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" + integrity sha1-ssN2z7EfNVE7rdFz7wu246OIORw= + dependencies: + glob-base "^0.3.0" + is-dotfile "^1.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.0" + +parse-json@^4.0.0: + version "4.0.0" + resolved "http://registry.npm.taobao.org/parse-json/download/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +pascalcase@^0.1.1: + version "0.1.1" + resolved "http://registry.npm.taobao.org/pascalcase/download/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + +path-key@^2.0.1: + version "2.0.1" + resolved "http://registry.npm.taobao.org/path-key/download/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + +path-parse@^1.0.5, path-parse@^1.0.6: + version "1.0.6" + resolved "http://registry.npm.taobao.org/path-parse/download/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" + integrity sha1-1i27VnlAXXLEc37FhgDp3c8G0kw= + +path-type@^3.0.0: + version "3.0.0" + resolved "http://registry.npm.taobao.org/path-type/download/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + integrity sha1-zvMdyOCho7sNEFwM2Xzzv0f0428= + dependencies: + pify "^3.0.0" + +pidtree@^0.3.0: + version "0.3.0" + resolved "http://registry.npm.taobao.org/pidtree/download/pidtree-0.3.0.tgz#f6fada10fccc9f99bf50e90d0b23d72c9ebc2e6b" + integrity sha1-9vraEPzMn5m/UOkNCyPXLJ68Lms= + +pify@^3.0.0: + version "3.0.0" + resolved "http://registry.npm.taobao.org/pify/download/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "http://registry.npm.taobao.org/posix-character-classes/download/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= + +preserve@^0.2.0: + version "0.2.0" + resolved "http://registry.npm.taobao.org/preserve/download/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" + integrity sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks= + +randomatic@^3.0.0: + version "3.1.1" + resolved "http://registry.npm.taobao.org/randomatic/download/randomatic-3.1.1.tgz#b776efc59375984e36c537b2f51a1f0aff0da1ed" + integrity sha1-t3bvxZN1mE42xTey9RofCv8Noe0= + dependencies: + is-number "^4.0.0" + kind-of "^6.0.0" + math-random "^1.0.1" + +read-pkg@^3.0.0: + version "3.0.0" + resolved "http://registry.npm.taobao.org/read-pkg/download/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" + integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= + dependencies: + load-json-file "^4.0.0" + normalize-package-data "^2.3.2" + path-type "^3.0.0" + +regex-cache@^0.4.2: + version "0.4.4" + resolved "http://registry.npm.taobao.org/regex-cache/download/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" + integrity sha1-db3FiioUls7EihKDW8VMjVYjNt0= + dependencies: + is-equal-shallow "^0.1.3" + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "http://registry.npm.taobao.org/regex-not/download/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha1-H07OJ+ALC2XgJHpoEOaoXYOldSw= + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "http://registry.npm.taobao.org/remove-trailing-separator/download/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= + +repeat-element@^1.1.2: + version "1.1.3" + resolved "http://registry.npm.taobao.org/repeat-element/download/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" + integrity sha1-eC4NglwMWjuzlzH4Tv7mt0Lmsc4= + +repeat-string@^1.5.2, repeat-string@^1.6.1: + version "1.6.1" + resolved "http://registry.npm.taobao.org/repeat-string/download/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + +resolve-url@^0.2.1: + version "0.2.1" + resolved "http://registry.npm.taobao.org/resolve-url/download/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= + +resolve@1.8.1: + version "1.8.1" + resolved "http://registry.npm.taobao.org/resolve/download/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" + integrity sha1-gvHsGaQjrB+9CAsLqwa6NuhKeiY= + dependencies: + path-parse "^1.0.5" + +resolve@^1.10.0: + version "1.10.0" + resolved "http://registry.npm.taobao.org/resolve/download/resolve-1.10.0.tgz#3bdaaeaf45cc07f375656dfd2e54ed0810b101ba" + integrity sha1-O9qur0XMB/N1ZW39LlTtCBCxAbo= + dependencies: + path-parse "^1.0.6" + +ret@~0.1.10: + version "0.1.15" + resolved "http://registry.npm.taobao.org/ret/download/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha1-uKSCXVvbH8P29Twrwz+BOIaBx7w= + +rollup-plugin-commonjs@^9.2.0: + version "9.2.1" + resolved "http://registry.npm.taobao.org/rollup-plugin-commonjs/download/rollup-plugin-commonjs-9.2.1.tgz#bb151ca8fa23600c7a03e25f9f0a45b1ee922dac" + integrity sha1-uxUcqPojYAx6A+JfnwpFse6SLaw= + dependencies: + estree-walker "^0.5.2" + magic-string "^0.25.1" + resolve "^1.10.0" + rollup-pluginutils "^2.3.3" + +rollup-plugin-node-resolve@^4.0.0: + version "4.0.1" + resolved "http://registry.npm.taobao.org/rollup-plugin-node-resolve/download/rollup-plugin-node-resolve-4.0.1.tgz#f95765d174e5daeef9ea6268566141f53aa9d422" + integrity sha1-+Vdl0XTl2u756mJoVmFB9Tqp1CI= + dependencies: + builtin-modules "^3.0.0" + is-module "^1.0.0" + resolve "^1.10.0" + +rollup-plugin-replace@^2.1.0: + version "2.1.0" + resolved "http://registry.npm.taobao.org/rollup-plugin-replace/download/rollup-plugin-replace-2.1.0.tgz#f9c07a4a89a2f8be912ee54b3f0f68d91e9ed0ae" + integrity sha1-+cB6Somi+L6RLuVLPw9o2R6e0K4= + dependencies: + magic-string "^0.25.1" + minimatch "^3.0.2" + rollup-pluginutils "^2.0.1" + +rollup-plugin-typescript2@^0.19.2: + version "0.19.3" + resolved "http://registry.npm.taobao.org/rollup-plugin-typescript2/download/rollup-plugin-typescript2-0.19.3.tgz#713063233461765f030a2baa2640905c2656164f" + integrity sha1-cTBjIzRhdl8DCiuqJkCQXCZWFk8= + dependencies: + fs-extra "7.0.1" + resolve "1.8.1" + rollup-pluginutils "2.3.3" + tslib "1.9.3" + +rollup-pluginutils@2.3.3: + version "2.3.3" + resolved "http://registry.npm.taobao.org/rollup-pluginutils/download/rollup-pluginutils-2.3.3.tgz#3aad9b1eb3e7fe8262820818840bf091e5ae6794" + integrity sha1-Oq2bHrPn/oJigggYhAvwkeWuZ5Q= + dependencies: + estree-walker "^0.5.2" + micromatch "^2.3.11" + +rollup-pluginutils@^2.0.1, rollup-pluginutils@^2.3.3: + version "2.4.1" + resolved "http://registry.npm.taobao.org/rollup-pluginutils/download/rollup-pluginutils-2.4.1.tgz#de43ab54965bbf47843599a7f3adceb723de38db" + integrity sha1-3kOrVJZbv0eENZmn863OtyPeONs= + dependencies: + estree-walker "^0.6.0" + micromatch "^3.1.10" + +rollup@^1.1.2: + version "1.4.0" + resolved "http://registry.npm.taobao.org/rollup/download/rollup-1.4.0.tgz#fdc965b4ea7948e0b8e1a9051067dce1a61b3a24" + integrity sha1-/clltOp5SOC44akFEGfc4aYbOiQ= + dependencies: + "@types/estree" "0.0.39" + "@types/node" "^11.9.5" + acorn "^6.1.1" + +safe-regex@^1.1.0: + version "1.1.0" + resolved "http://registry.npm.taobao.org/safe-regex/download/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + dependencies: + ret "~0.1.10" + +"semver@2 || 3 || 4 || 5", semver@^5.5.0: + version "5.6.0" + resolved "http://registry.npm.taobao.org/semver/download/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" + integrity sha1-fnQlb7qknHWqfHogXMInmcrIAAQ= + +set-value@^0.4.3: + version "0.4.3" + resolved "http://registry.npm.taobao.org/set-value/download/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" + integrity sha1-fbCPnT0i3H945Trzw79GZuzfzPE= + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.1" + to-object-path "^0.3.0" + +set-value@^2.0.0: + version "2.0.0" + resolved "http://registry.npm.taobao.org/set-value/download/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" + integrity sha1-ca5KiPD+77v1LR6mBPP7MV67YnQ= + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "http://registry.npm.taobao.org/shebang-command/download/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + dependencies: + shebang-regex "^1.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/shebang-regex/download/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + +shell-quote@^1.6.1: + version "1.6.1" + resolved "http://registry.npm.taobao.org/shell-quote/download/shell-quote-1.6.1.tgz#f4781949cce402697127430ea3b3c5476f481767" + integrity sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c= + dependencies: + array-filter "~0.0.0" + array-map "~0.0.0" + array-reduce "~0.0.0" + jsonify "~0.0.0" + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "http://registry.npm.taobao.org/snapdragon-node/download/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha1-bBdfhv8UvbByRWPo88GwIaKGhTs= + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "http://registry.npm.taobao.org/snapdragon-util/download/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha1-+VZHlIbyrNeXAGk/b3uAXkWrVuI= + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "http://registry.npm.taobao.org/snapdragon/download/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha1-ZJIufFZbDhQgS6GqfWlkJ40lGC0= + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + +source-map-resolve@^0.5.0: + version "0.5.2" + resolved "http://registry.npm.taobao.org/source-map-resolve/download/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" + integrity sha1-cuLMNAlVQ+Q7LGKyxMENSpBU8lk= + dependencies: + 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-url@^0.4.0: + version "0.4.0" + resolved "http://registry.npm.taobao.org/source-map-url/download/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= + +source-map@^0.5.6: + version "0.5.7" + resolved "http://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +sourcemap-codec@^1.4.4: + version "1.4.4" + resolved "http://registry.npm.taobao.org/sourcemap-codec/download/sourcemap-codec-1.4.4.tgz#c63ea927c029dd6bd9a2b7fa03b3fec02ad56e9f" + integrity sha1-xj6pJ8Ap3WvZorf6A7P+wCrVbp8= + +spdx-correct@^3.0.0: + version "3.1.0" + resolved "http://registry.npm.taobao.org/spdx-correct/download/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" + integrity sha1-+4PlBERSaPFUsHTiGMh8ADzTHfQ= + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.2.0" + resolved "http://registry.npm.taobao.org/spdx-exceptions/download/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" + integrity sha1-LqRQrudPKom/uUUZwH/Nb0EyKXc= + +spdx-expression-parse@^3.0.0: + version "3.0.0" + resolved "http://registry.npm.taobao.org/spdx-expression-parse/download/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" + integrity sha1-meEZt6XaAOBUkcn6M4t5BII7QdA= + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.3" + resolved "http://registry.npm.taobao.org/spdx-license-ids/download/spdx-license-ids-3.0.3.tgz#81c0ce8f21474756148bbb5f3bfc0f36bf15d76e" + integrity sha1-gcDOjyFHR1YUi7tfO/wPNr8V124= + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "http://registry.npm.taobao.org/split-string/download/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha1-fLCd2jqGWFcFxks5pkZgOGguj+I= + dependencies: + extend-shallow "^3.0.0" + +static-extend@^0.1.1: + version "0.1.2" + resolved "http://registry.npm.taobao.org/static-extend/download/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +string.prototype.padend@^3.0.0: + version "3.0.0" + resolved "http://registry.npm.taobao.org/string.prototype.padend/download/string.prototype.padend-3.0.0.tgz#f3aaef7c1719f170c5eab1c32bf780d96e21f2f0" + integrity sha1-86rvfBcZ8XDF6rHDK/eA2W4h8vA= + dependencies: + define-properties "^1.1.2" + es-abstract "^1.4.3" + function-bind "^1.0.2" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "http://registry.npm.taobao.org/strip-bom/download/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + +supports-color@^5.3.0: + version "5.5.0" + resolved "http://registry.npm.taobao.org/supports-color/download/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha1-4uaaRKyHcveKHsCzW2id9lMO/I8= + dependencies: + has-flag "^3.0.0" + +to-object-path@^0.3.0: + version "0.3.0" + resolved "http://registry.npm.taobao.org/to-object-path/download/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "http://registry.npm.taobao.org/to-regex-range/download/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "http://registry.npm.taobao.org/to-regex/download/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha1-E8/dmzNlUvMLUfM6iuG0Knp1mc4= + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +tslib@1.9.3: + version "1.9.3" + resolved "http://registry.npm.taobao.org/tslib/download/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" + integrity sha1-1+TdeSRdhUKMTX5IIqeZF5VMooY= + +typescript@3.3.3: + version "3.3.3" + resolved "http://registry.npm.taobao.org/typescript/download/typescript-3.3.3.tgz#f1657fc7daa27e1a8930758ace9ae8da31403221" + integrity sha1-8WV/x9qifhqJMHWKzpro2jFAMiE= + +union-value@^1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/union-value/download/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" + integrity sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ= + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^0.4.3" + +universalify@^0.1.0: + version "0.1.2" + resolved "http://registry.npm.taobao.org/universalify/download/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha1-tkb2m+OULavOzJ1mOcgNwQXvqmY= + +unset-value@^1.0.0: + version "1.0.0" + resolved "http://registry.npm.taobao.org/unset-value/download/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +urix@^0.1.0: + version "0.1.0" + resolved "http://registry.npm.taobao.org/urix/download/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + +use@^3.1.0: + version "3.1.1" + resolved "http://registry.npm.taobao.org/use/download/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha1-1QyMrHmhn7wg8pEfVuuXP04QBw8= + +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "http://registry.npm.taobao.org/validate-npm-package-license/download/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha1-/JH2uce6FchX9MssXe/uw51PQQo= + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +which@^1.2.9: + version "1.3.1" + resolved "http://registry.npm.taobao.org/which/download/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha1-pFBD1U9YBTFtqNYvn1CRjT2nCwo= + dependencies: + isexe "^2.0.0"