diff --git a/.gitignore b/.gitignore index 1538210768..1dc69bff9f 100644 --- a/.gitignore +++ b/.gitignore @@ -65,6 +65,7 @@ jspm_packages/ # End of https://www.gitignore.io/api/node lib/ +dist/ .DS_Store public diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000000..7da54ea95c --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2017 Alipay.inc + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/babel.config.js b/babel.config.js index 3830e7567d..3a9db5974d 100644 --- a/babel.config.js +++ b/babel.config.js @@ -38,6 +38,9 @@ module.exports = (api) => { browsers: 'Last 2 Chrome versions, Firefox ESR', node: 'current', }, + // set `modules: false` when building CDN bundle, let rollup do commonjs works + // @see https://github.com/rollup/rollup-plugin-babel#modules + modules: api.env('bundle') ? false : 'auto', }, ], [ @@ -65,8 +68,11 @@ module.exports = (api) => { } ], '@babel/plugin-syntax-dynamic-import', - '@babel/plugin-transform-modules-commonjs', - [ + // let rollup do commonjs works + // @see https://github.com/rollup/rollup-plugin-babel#modules + api.env('bundle') ? {} : '@babel/plugin-transform-modules-commonjs', + // 开发模式下以原始文本引入,便于调试 + api.env('bundle') ? {} : [ // import glsl as raw text 'babel-plugin-inline-import', { @@ -84,11 +90,10 @@ module.exports = (api) => { transform: 'constObject', } ], - // TODO:减少最终打包产物大小 - // 1. 去除 Shader 中的注释 - // @see https://www.npmjs.com/package/babel-plugin-remove-glsl-comments - // 2. 内联 WebGL 常量 - // @see https://www.npmjs.com/package/babel-plugin-inline-webgl-constants + // 按需引用 @see https://github.com/lodash/babel-plugin-lodash + 'lodash', + // 内联 WebGL 常量 @see https://www.npmjs.com/package/babel-plugin-inline-webgl-constants + api.env('bundle') ? 'inline-webgl-constants' : {}, ], env: { build: { diff --git a/build/bundle.ts b/build/bundle.ts new file mode 100644 index 0000000000..ce3a796bbe --- /dev/null +++ b/build/bundle.ts @@ -0,0 +1,4 @@ +// @ts-ignore +export * from '@l7/scene'; +// @ts-ignore +export * from '@l7/layers'; diff --git a/build/rollup-plugin-glsl.js b/build/rollup-plugin-glsl.js new file mode 100644 index 0000000000..892ddbe944 --- /dev/null +++ b/build/rollup-plugin-glsl.js @@ -0,0 +1,33 @@ +import { createFilter } from 'rollup-pluginutils'; + +// borrow from https://github.com/uber/luma.gl/blob/master/dev-modules/babel-plugin-remove-glsl-comments/index.js#L4-L5 +const INLINE_COMMENT_REGEX = /\s*\/\/.*[\n\r]/g; +const BLOCK_COMMENT_REGEX = /\s*\/\*(\*(?!\/)|[^*])*\*\//g; + +// 生产环境压缩 GLSL +export default function glsl(include, minify) { + const filter = createFilter(include); + return { + name: 'glsl', + transform(code, id) { + if (!filter(id)) return; + + if (minify) { + code = code + .trim() // strip whitespace at the start/end + .replace(/\n+/g, '\n') // collapse multi line breaks + // remove comments + .replace(INLINE_COMMENT_REGEX, '\n') + .replace(BLOCK_COMMENT_REGEX, '') + .replace(/\n\s+/g, '\n') // strip identation + // .replace(/\s?([+-\/*=,])\s?/g, '$1') // strip whitespace around operators + // .replace(/([;\(\),\{\}])\n(?=[^#])/g, '$1'); // strip more line breaks + } + + return { + code: `export default ${JSON.stringify(code)};`, + map: { mappings: '' } + }; + } + }; +} \ No newline at end of file diff --git a/build/rollup.config.js b/build/rollup.config.js new file mode 100644 index 0000000000..cf07153724 --- /dev/null +++ b/build/rollup.config.js @@ -0,0 +1,79 @@ +import path from 'path'; +import alias from '@rollup/plugin-alias'; +import json from '@rollup/plugin-json'; +import resolve from 'rollup-plugin-node-resolve'; +import commonjs from 'rollup-plugin-commonjs'; +import { terser } from "rollup-plugin-terser"; +import analyze from 'rollup-plugin-analyzer'; +import babel from 'rollup-plugin-babel'; +import glsl from './rollup-plugin-glsl'; + +function resolveFile(filePath) { + return path.join(__dirname, '..', filePath) +} + +module.exports = [ + { + input: resolveFile('build/bundle.ts'), + output: { + file: resolveFile('dist/bundle.js'), + format: 'umd', + name: 'L7', + globals: { + 'mapbox-gl': 'mapboxgl', + }, + }, + external: [ + 'mapbox-gl', + ], + treeshake: true, + plugins: [ + alias( + { + resolve: ['.tsx', '.ts'], + entries: [ + { + find: /^@l7\/(.*)/, + replacement: resolveFile('packages/$1/src'), + }, + ] + }, + ), + resolve({ + browser: true, + preferBuiltins: false, + extensions: ['.js', '.ts'], + }), + glsl( + ['**/*.glsl'], + true, + ), + json(), + // @see https://github.com/rollup/rollup-plugin-node-resolve#using-with-rollup-plugin-commonjs + commonjs({ + namedExports: { + eventemitter3: [ 'EventEmitter' ], + // @see https://github.com/rollup/rollup-plugin-commonjs/issues/266 + lodash: [ + 'isNil', + 'uniq', + 'clamp', + 'isObject', + 'isFunction', + 'cloneDeep', + 'isString', + 'isNumber', + ], + } + }), + babel({ + extensions: ['.js', '.ts'], + }), + terser(), + analyze({ + summaryOnly: true, + limit: 20, + }), + ], + }, +]; diff --git a/dev-docs/使用方法.md b/dev-docs/使用方法.md new file mode 100644 index 0000000000..912ac3639b --- /dev/null +++ b/dev-docs/使用方法.md @@ -0,0 +1,230 @@ +# 使用方法 + +L7 提供三种使用方式:CDN、Submodule 以及 React 组件。 + +## 通过 CDN 使用 + +首先在 `` 中引入 L7 CDN 版本的 JS 和 CSS 文件: +```html + + + + +``` + +如果使用 Mapbox,还需要额外引入 Mapbox 的 JS 和 CSS 文件,这一步可以参考 [Mapbox 文档](https://docs.mapbox.com/mapbox-gl-js/overview/#quickstart): +```html + + + + + +``` +⚠️高德采用异步加载,因此不需要引入任何额外静态文件。 + +然后在 `` 中定义一个容器并设置一个 `id`。通过全局 `L7` 这个命名空间可以获取场景 `L7.Scene` 和图层 `L7.PolygonLayer`: +```html + +
+ + +``` + +⚠️需要获取高德或者 Mapbox 的使用 token 并传入 `L7.Scene` 的构造函数,获取方式如下: +* 高德地图开发者 Key [申请方法](https://lbs.amap.com/dev/key/) +* [Mapbox Access Tokens](https://docs.mapbox.com/help/how-mapbox-works/access-tokens/#creating-and-managing-access-tokens) + +## 通过 Submodule 使用 + +首先通过 `npm/yarn` 安装 `@l7/scene` 和 `@l7/layers`: +```bash +npm install --save @l7/scene @l7/layers +// or +yarn add @l7/scene @l7/layers +``` + +然后就可以使用其中包含的场景和各类图层: +```typescript +import { Scene } from '@l7/scene'; +import { PolygonLayer } from '@l7/layers'; + +(async function() { + // 获取数据 + const response = await fetch( + 'https://gw.alipayobjects.com/os/basement_prod/d2e0e930-fd44-4fca-8872-c1037b0fee7b.json', + ); + const data = await response.json(); + + // 创建场景 + const scene = new Scene({ + center: [110.19382669582967, 50.258134], + id: 'map', + pitch: 0, + style: 'dark', + type: 'amap', + zoom: 3, + token: 'pg.xxx', // 高德或者 Mapbox 的 token + }); + + // 创建图层 + const layer = new PolygonLayer({}); + layer + .source(data) + .size('name', [0, 10000, 50000, 30000, 100000]) + .color('name', [ + '#2E8AE6', + '#69D1AB', + '#DAF291', + '#FFD591', + '#FF7A45', + '#CF1D49', + ]) + .shape('fill') + .style({ + opacity: 0.8, + }); + + // 添加图层到场景中 + scene.addLayer(layer); + + // 渲染场景 + scene.render(); +})(); +``` + +最后在 `` 中引入 L7 CDN 版本的 CSS 文件: +```html + + + +``` + +L7 目前的文档都通过这种方式使用,可以参考项目中的 stories: +* [高德地图](https://github.com/antvis/L7/blob/next/stories/MapAdaptor/components/AMap.tsx) +* [Mapbox](https://github.com/antvis/L7/blob/next/stories/MapAdaptor/components/Mapbox.tsx) + + +## [WIP] React + +React 组件待开发,目前可以暂时以 Submodule 方式使用: +```tsx +import { Scene } from '@l7/scene'; +import { PolygonLayer } from '@l7/layers'; +import * as React from 'react'; + +export default class AMap extends React.Component { + private scene: Scene; + + public componentWillUnmount() { + this.scene.destroy(); + } + + public async componentDidMount() { + const response = await fetch( + 'https://gw.alipayobjects.com/os/basement_prod/d2e0e930-fd44-4fca-8872-c1037b0fee7b.json', + ); + const scene = new Scene({ + center: [110.19382669582967, 50.258134], + id: 'map', + pitch: 0, + style: 'dark', + type: 'amap', + zoom: 3, + token: 'pg.xxx', // 高德或者 Mapbox 的 token + }); + const layer = new PolygonLayer({}); + + layer + .source(await response.json()) + .size('name', [0, 10000, 50000, 30000, 100000]) + .color('name', [ + '#2E8AE6', + '#69D1AB', + '#DAF291', + '#FFD591', + '#FF7A45', + '#CF1D49', + ]) + .shape('fill') + .style({ + opacity: 0.8, + }); + scene.addLayer(layer); + scene.render(); + this.scene = scene; + } + + public render() { + return ( +
+ ); + } +} +``` + +⚠️组件 Unmount 时需要通过 `scene.destroy()` 手动销毁场景。 diff --git a/dev-docs/构建方案.md b/dev-docs/构建方案.md new file mode 100644 index 0000000000..d371cec52c --- /dev/null +++ b/dev-docs/构建方案.md @@ -0,0 +1,286 @@ +# 构建方案 + +考虑到 L7 提供的三种[使用方法](./使用方法.md):CDN、Submodule 和 React 组件,我们需要提供对应的构建方案。 + +由于 React 组件待开发,下面我们将从方案技术细节、优化手段两方面介绍 CDN 和 Submodule 的构建方案。 + +## CDN + +考虑到后续将引入 WebWorker 特性,目前 Webpack4 暂时还不支持多种 target(web + webworker)混合的输出模式,相关 [ISSUE](https://github.com/webpack/webpack/issues/6525)。 +如果后续支持,配合 SplitChunksPlugin 应该能解决在 Worker 和不同 entry 之间共享代码的问题。 + +因此目前和 Mapbox 做法一样,我们使用 Rollup 构建 CDN Bundler。 + +打包命令如下,会在 `dist/` 下输出产物: +```bash +yarn bundle +``` + +### UMD + +以 L7 为命名空间,让用户可以通过类似 `L7.Scene` 的方式使用。同时以 UMD 为构建目标: +```javascript +{ + input: resolveFile('build/bundle.ts'), + output: { + file: resolveFile('dist/bundle.js'), + format: 'umd', + name: 'L7', + }, +} +``` + +目前只需要暴露场景以及图层相关的 API,因此 Bundler 非常简单: +```typescript +// build/bundle.ts +export * from '@l7/scene'; +export * from '@l7/layers'; +``` + +### Alias + +为了帮助 resolver 定位 lerna packages,需要重命名类似 `@l7/scene` 这样的依赖路径: +```javascript +import alias from '@rollup/plugin-alias'; + +plugins: [ + alias( + { + resolve: ['.tsx', '.ts'], + entries: [ + { + find: /^@l7\/(.*)/, + replacement: resolveFile('packages/$1/src'), + }, + ] + }, + ), +] +``` + +配合 [`terser`](https://github.com/TrySound/rollup-plugin-terser) 压缩后,我们就能得到可运行的 CDN 版本了,但从减少构建产物大小出发还有很多优化可以做。 + +### 减少包大小 + +除了 Rollup 提供的 TreeShaking,我们主要从三个方面考虑: +* 减少第三方依赖大小尤其是 Lodash +* external Mapbox 依赖 +* 压缩 GLSL 代码 + * 去除多余空格、换行符和注释 + * 内联 WebGL 常量 + * 预计算 define 变量 + +#### Lodash 按需引用 + +通过 analysis 插件可以看到第三方依赖大小占比: +``` +/node_modules/lodash/lodash.js +███████████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 23.79 % (540.328 KB) +/node_modules/regl/dist/regl.js +██████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 12.21 % (277.403 KB) +/node_modules/hammerjs/hammer.js +█░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 3.25 % (73.847 KB) +/node_modules/uri-js/dist/es5/uri.all.js +█░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 2.28 % (51.721 KB) +``` + +仔细查看 Lodash 的引用情况: +``` +███████████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ +file: /node_modules/lodash/lodash.js +bundle space: 23.79 % +rendered size: 540.328 KB +original size: 540.51 KB +code reduction: 0.03 % +dependents: 13 + - /packages/core/src/services/layer/StyleAttribute.ts + - /packages/core/src/services/shader/ShaderModuleService.ts + - /packages/core/src/services/renderer/passes/post-processing/BlurHPass.ts +``` + +按需引用 Lodash 常见的做法有几种: +* [loash-es](https://github.com/lodash/lodash/tree/es) +* babel-plugin-lodash +* lodash-webpack-plugin + +由于我们使用 Rollup 以及 `rollup-plugin-babel`,[babel-plugin-lodash](https://github.com/lodash/babel-plugin-lodash) 可以很好地解决这个问题。该插件的[原理](https://github.com/rollup/rollup/issues/610#issuecomment-270801483)其实也是引用 `lodash-es`: +```javascript +// this... +import { template } from 'lodash-es'; + +// ...basically becomes this: +import template from 'lodash-es/template.js'; +``` + +最终的效果还是很明显的: +``` +/node_modules/regl/dist/regl.js +████████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 16.55 % (277.403 KB) +/node_modules/hammerjs/hammer.js +██░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 4.41 % (73.847 KB) +/node_modules/uri-js/dist/es5/uri.all.js +█░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 3.09 % (51.721 KB) +/node_modules/lodash.mergewith/index.js +█░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 3.06 % (51.256 KB) +``` + +#### 剔除 Mapbox + +不同于高德异步加载的方式,Mapbox 用户需要手动引入 Mapbox 的 JS 和 CSS,因此 L7 CDN 版本就需要剔除了。通过 `globals` 假定用户负责引入 Mapbox 的 CDN 版本: +```javascript +{ + output: { + globals: { + 'mapbox-gl': 'mapboxgl', + }, + }, + external: [ + 'mapbox-gl', + ], +} +``` + +这样 L7 Bundler 中就不包含 Mapbox 的 Module Bundler(mapbox-gl) 了。 + +#### 内联 WebGL 常量 + +在构建阶段可以将 WebGL 常量替换成对应的值,可以减少字符长度: +```javascript +// from +const max = gl.MAX_VERTEX_ATTRIBS; +// to +const max = 34921; +``` + +luma.gl 和 deck.gl 都使用了 [babel-plugin-inline-webgl-constants](https://www.npmjs.com/package/babel-plugin-inline-webgl-constants)。 + +来看一下实际效果,在压缩前就能减少字符长度: +```javascript +// 内联前 +const usageMap = { + [gl.STATIC_DRAW]: 'static', + [gl.DYNAMIC_DRAW]: 'dynamic', + [gl.STREAM_DRAW]: 'stream' +}; +// 内联后 +const usageMap = { + [35044]: 'static', + [35048]: 'dynamic', + [35040]: 'stream' +}; +``` + +#### 压缩 GLSL 代码 + +在开发编写 Shader 时,我们是不需要对 GLSL 代码进行压缩的,因为在 Shader 编译失败时能根据错误信息定位到具体行列。 + +但是在生产环境下,我们就需要把 GLSL 源代码中包含的**多余**的换行、空格以及注释去掉,减少最终引入字符串的大小。 + +这里需要注意的是并不是所有换行都可以简单去除,例如 `define` 语句末尾的换行一定要保留。 + +luma.gl 和 deck.gl 使用了 [babel-plugin-remove-glsl-comments](https://github.com/uber/luma.gl/tree/master/dev-modules/babel-plugin-remove-glsl-comments) 简单地移除注释,但很明显,多余的空格和换行符依然存在。 + +因此我们需要写一个简单的 Rollup 插件: +```javascript +export default function glsl(include, minify) { + const filter = createFilter(include); + return { + name: 'glsl', + transform(code, id) { + if (!filter(id)) return; + + if (minify) { + code = code + .trim() // strip whitespace at the start/end + .replace(/\n+/g, '\n') // collapse multi line breaks + // remove comments + .replace(INLINE_COMMENT_REGEX, '\n') + .replace(BLOCK_COMMENT_REGEX, '') + .replace(/\n\s+/g, '\n') // strip identation + } + + return { + code: `export default ${JSON.stringify(code)};`, + map: { mappings: '' } + }; + } + }; +} +``` + +#### GLSL minifier + +以上针对 GLSL 的压缩仅限于字符替换,更彻底的优化必然需要生成 GLSL 对应的 AST,从而进行变量重命名、死代码消除等等更高级的优化手段。[glsl-minifier](https://github.com/TimvanScherpenzeel/glsl-minifier) 就是这样一个 CLI 工具。 + +其中的预计算特性有点类似 [Prepack](https://github.com/facebook/prepack),在构建阶段就计算出 `define` 变量的值: +```glsl +#define SPREAD 8.00 +#define MAX_DIR_LIGHTS 0 +#define MAX_POINT_LIGHTS 0 +#define MAX_SPOT_LIGHTS 0 +#define MAX_HEMI_LIGHTS 0 +#define MAX_SHADOWS 0 +#define GAMMA_FACTOR 2 + +uniform mat4 viewMatrix; +uniform vec3 cameraPosition; + +uniform vec2 resolution; +uniform float time; +uniform sampler2D texture; + +void main() { + vec2 uv = gl_FragCoord.xy / resolution.xy; + + float v = texture2D( texture, uv ).x; + + if (v == 1000.) discard; + v = sqrt(v); + + gl_FragColor = vec4( vec3( 1. - v / SPREAD ), 1.0 ); +} +``` + +上述代码压缩结果如下,`define` 统统不见了,变量名也进行了改写: +```glsl +uniform highp vec2 resolution;uniform sampler2D texture;void main(){highp vec2 a;a=(gl_FragCoord.xy/resolution);lowp vec4 b;b=texture2D(texture,a);if((b.x==1000.0)){discard;}lowp vec4 c;c.w=1.0;c.xyz=vec3((1.0-(sqrt(b.x)/8.0)));gl_FragColor=c;} +``` + +当然 glsl-minifier 做的远不止这些,还会应用变量名改写、死代码消除等等优化手段: +> Optimisations include function inlining, dead code removal, copy propagation, constant folding, constant propagation, arithmetic optimizations and so on. Minifications includes variable rewriting and whitespace trimming. + +显然这种手段要求我们的 Shader 代码在构建时是稳定的,然而 L7 使用的 GLSL 模块化方案需要在运行时进行模块拼接,如果在构建时代码片段中包含的变量发生了改写,势必影响运行时的拼接结果。另外 minifier 会校验代码的正确性,不理解我们自定义的模块引入语句 `pragma include 'module'` 是一定会报错的。 + +以这样的 Shader 为例: +```glsl +#pragma include "project" + +void main() { + // 从 project 模块引入方法 + project(position); +} +``` + +执行压缩时会报错: +```bash +$ node_modules/.bin/glsl-minifier -i ./build/example.frag -o ./build/example.min.frag +Error: +(28,2): error: no function with name 'project' + +Exiting glsl-minifier! +``` + +因此要想使用这个终极压缩方案,需要修改 L7 目前的 GLSL 模块化方案,代码拼接不能在运行时而需要在构建时完成。但这样就很难兼顾扩展性,毕竟用户自定义图层的 Shader 代码肯定只有运行时才能拿到。 + +所以一个折中的办法是在构建时先对 L7 内置图层的 Shader 代码进行模块化处理,得到最终的 GLSL 文本,然后再 minify。同时保留运行时模块化拼接的能力,应对用户自定义图层。 + +## Submodule + +使用 Yarn workspaces + Lerna。 + +### 异步加载 Mapbox + +以 L7 Bundler 方式使用时,由于需要在运行时根据用户配置项选择地图底图,会导致构建时需要将全部地图依赖引入,无法进行 TreeShaking。 +目前高德地图使用运行时异步加载方式引入,不会导致该问题,但 Mapbox 同样使用 Bundler,对于高德用户就多余了。 + +一个可能的方案是对于 Mapbox 使用 CodeSplitting。在容器首次获取 Mapbox 地图服务时异步加载并缓存。 \ No newline at end of file diff --git a/lerna.json b/lerna.json index 129044dfec..9d523790c5 100644 --- a/lerna.json +++ b/lerna.json @@ -4,10 +4,7 @@ ], "command": { "publish": { - "npmClient": "yarn", "ignoreChanges": ["*.md"], - "verifyAccess": false, - "verifyRegistry": false, "allowBranch": [ "master", "develop", @@ -18,5 +15,8 @@ }, "version": "0.0.1", "npmClient": "yarn", - "useWorkspaces": true + "useWorkspaces": true, + "publishConfig": { + "access": "public" + } } \ No newline at end of file diff --git a/package.json b/package.json index 8ca1cd7d9d..f42e50ab96 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,8 @@ "@babel/preset-typescript": "^7.3.3", "@commitlint/cli": "^8.1.0", "@commitlint/config-conventional": "^8.1.0", + "@rollup/plugin-alias": "^2.2.0", + "@rollup/plugin-json": "^4.0.0", "@storybook/addon-actions": "^5.1.9", "@storybook/addon-console": "^1.2.1", "@storybook/addon-info": "^5.1.9", @@ -37,6 +39,8 @@ "babel-plugin-const-enum": "^0.0.2", "babel-plugin-css-modules-transform": "^1.6.2", "babel-plugin-inline-import": "^3.0.0", + "babel-plugin-inline-webgl-constants": "^1.0.1", + "babel-plugin-lodash": "^3.3.4", "babel-plugin-transform-postcss": "^0.3.0", "babel-preset-gatsby": "^0.2.20", "clean-webpack-plugin": "^0.1.19", @@ -54,6 +58,7 @@ "geotiff": "^1.0.0-beta.6", "gh-pages": "^2.1.1", "gl": "^4.4.0", + "glsl-minifier": "^0.0.13", "html-webpack-plugin": "^3.2.0", "husky": "^3.0.9", "jest": "^24.9.0", @@ -71,6 +76,13 @@ "react-dom": "^16.8.6", "react-i18next": "^11.0.1", "rimraf": "^2.6.2", + "rollup": "^1.27.0", + "rollup-plugin-analyzer": "^3.2.2", + "rollup-plugin-babel": "^4.3.3", + "rollup-plugin-commonjs": "^10.1.0", + "rollup-plugin-node-resolve": "^5.2.0", + "rollup-plugin-terser": "^5.1.2", + "rollup-pluginutils": "^2.8.2", "sass-loader": "^7.1.0", "style-loader": "^1.0.0", "styled-components": "^3.4.6", @@ -109,13 +121,15 @@ "commit": "git-cz", "version": "lerna version --conventional-commits", "prerelease": "yarn build", - "release": "lerna publish from-git", + "release": "lerna publish from-package --registry https://registry.npmjs.com/", "storybook": "start-storybook -p 6006", "test": "jest", "coveralls": "jest --coverage && cat ./tests/coverage/lcov.info | coveralls", "tsc": "tsc", "build:declarations": "lerna exec --stream --no-bail 'tsc --project ./tsconfig.build.json'", - "watch": "lerna exec --parallel 'BABEL_ENV=build babel --watch src --root-mode upward --out-dir dist --source-maps --extensions .ts,.tsx --delete-dir-on-start --no-comments'" + "watch": "lerna exec --parallel 'BABEL_ENV=build babel --watch src --root-mode upward --out-dir dist --source-maps --extensions .ts,.tsx --delete-dir-on-start --no-comments'", + "bundle": "NODE_ENV=bundle node_modules/.bin/rollup -c ./build/rollup.config.js", + "glsl-minify": "node_modules/.bin/glsl-minifier -i ./build/example.frag -o ./build/example.min.frag" }, "workspaces": [ "packages/*", diff --git a/packages/component/package.json b/packages/component/package.json index f787d917e7..73f46470ca 100644 --- a/packages/component/package.json +++ b/packages/component/package.json @@ -24,10 +24,13 @@ "@l7/core": "0.0.1", "@l7/utils": "0.0.1", "@turf/distance": "^6.0.1", - "eventemitter3": "^3.1.0", + "eventemitter3": "^4.0.0", "inversify": "^5.0.1", "inversify-inject-decorators": "^3.1.0", "inversify-logging": "^0.2.1" }, - "devDependencies": {} + "gitHead": "0563f357f3a07c099bf1ffa9350e6fa3c88353ae", + "publishConfig": { + "access": "public" + } } diff --git a/packages/component/src/control/BaseControl.ts b/packages/component/src/control/BaseControl.ts index d3ce12e732..6911adb15a 100644 --- a/packages/component/src/control/BaseControl.ts +++ b/packages/component/src/control/BaseControl.ts @@ -8,7 +8,6 @@ import { } from '@l7/core'; import { DOM } from '@l7/utils'; import { EventEmitter } from 'eventemitter3'; -import { inject } from 'inversify'; export enum PositionType { 'TOPRIGHT' = 'topright', diff --git a/packages/core/package.json b/packages/core/package.json index f142886cd2..39779b6c9d 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -22,7 +22,7 @@ "@l7/utils": "0.0.1", "@mapbox/tiny-sdf": "^1.1.1", "ajv": "^6.10.2", - "eventemitter3": "^3.1.0", + "eventemitter3": "^4.0.0", "gl-matrix": "^3.1.0", "hammerjs": "^2.0.8", "inversify": "^5.0.1", @@ -40,5 +40,9 @@ "@types/hammerjs": "^2.0.36", "@types/lodash": "^4.14.138", "@types/viewport-mercator-project": "^6.1.0" + }, + "gitHead": "0563f357f3a07c099bf1ffa9350e6fa3c88353ae", + "publishConfig": { + "access": "public" } } diff --git a/packages/core/src/inversify.config.ts b/packages/core/src/inversify.config.ts index be2e81e98d..6249fa31f5 100644 --- a/packages/core/src/inversify.config.ts +++ b/packages/core/src/inversify.config.ts @@ -64,7 +64,8 @@ container .inSingletonScope(); container .bind(TYPES.IStyleAttributeService) - .to(StyleAttributeService); + .to(StyleAttributeService) + .inRequestScope(); container .bind(TYPES.ICameraService) .to(CameraService) @@ -126,9 +127,11 @@ export const lazyInject = ( // make it work as usual original.call(this, proto, key); // return link to proto, so own value wont be 'undefined' after component's creation - descriptor!.initializer = () => { - return proto[key]; - }; + if (descriptor) { + descriptor.initializer = () => { + return proto[key]; + }; + } }; }; export const lazyMultiInject = ( @@ -145,10 +148,12 @@ export const lazyMultiInject = ( ): void { // make it work as usual original.call(this, proto, key); - // return link to proto, so own value wont be 'undefined' after component's creation - descriptor!.initializer = () => { - return proto[key]; - }; + if (descriptor) { + // return link to proto, so own value wont be 'undefined' after component's creation + descriptor!.initializer = () => { + return proto[key]; + }; + } }; }; diff --git a/packages/core/src/services/layer/StyleAttributeService.ts b/packages/core/src/services/layer/StyleAttributeService.ts index cb11db5b3d..94dbbe3ce4 100644 --- a/packages/core/src/services/layer/StyleAttributeService.ts +++ b/packages/core/src/services/layer/StyleAttributeService.ts @@ -23,6 +23,8 @@ const bytesPerElementMap = { [gl.UNSIGNED_SHORT]: 2, }; +let counter = 0; + /** * 每个 Layer 都拥有一个,用于管理样式属性的注册和更新 */ @@ -33,6 +35,8 @@ export default class StyleAttributeService implements IStyleAttributeService { private attributes: IStyleAttribute[] = []; + private c = counter++; + private featureLayout: { sizePerElement: number; elements: Array<{ diff --git a/packages/core/src/services/renderer/gl.ts b/packages/core/src/services/renderer/gl.ts index 21210d721d..6b58e0386f 100644 --- a/packages/core/src/services/renderer/gl.ts +++ b/packages/core/src/services/renderer/gl.ts @@ -1,7 +1,7 @@ /** * WebGL 枚举值 * @see http://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14 - * TODO: 使用 babel 插件对常量进行内联,以减少最终打包产物大小 + * 使用 babel 插件对常量进行内联,以减少最终打包产物大小 * @see https://github.com/uber/deck.gl/blob/7.1-release/dev-docs/roadmaps/dist-size-roadmap.md#inline-gl-constants */ diff --git a/packages/core/src/services/scene/ISceneService.ts b/packages/core/src/services/scene/ISceneService.ts index e0b742e5d4..373238cf55 100644 --- a/packages/core/src/services/scene/ISceneService.ts +++ b/packages/core/src/services/scene/ISceneService.ts @@ -1,5 +1,3 @@ -import { EventEmitter } from 'eventemitter3'; -import { IImage } from '../asset/IIconService'; import { ILayer } from '../layer/ILayerService'; import { IMapConfig } from '../map/IMapService'; import { IRenderConfig } from '../renderer/IRendererService'; diff --git a/packages/layers/package.json b/packages/layers/package.json index e96ded78e8..b62d4f93eb 100644 --- a/packages/layers/package.json +++ b/packages/layers/package.json @@ -23,20 +23,20 @@ "@l7/source": "^0.0.1", "@l7/utils": "^0.0.1", "@mapbox/martini": "^0.1.0", - "reflect-metadata": "^0.1.13", "@turf/meta": "^6.0.2", "@types/d3-color": "^1.2.2", "d3-array": "^2.3.1", "d3-color": "^1.4.0", "d3-scale": "^3.1.0", "earcut": "^2.2.1", - "eventemitter3": "^3.1.0", + "eventemitter3": "^4.0.0", "gl-matrix": "^3.1.0", "gl-vec2": "^1.3.0", "inversify": "^5.0.1", "lodash": "^4.17.15", "merge-json-schemas": "1.0.0", "polyline-miter-util": "^1.0.1", + "reflect-metadata": "^0.1.13", "tapable": "^2.0.0-beta.8" }, "devDependencies": { @@ -45,5 +45,9 @@ "@types/earcut": "^2.1.0", "@types/gl-matrix": "^2.4.5", "@types/lodash": "^4.14.138" + }, + "gitHead": "0563f357f3a07c099bf1ffa9350e6fa3c88353ae", + "publishConfig": { + "access": "public" } } diff --git a/packages/layers/src/raster/index.ts b/packages/layers/src/raster/index.ts deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/packages/maps/package.json b/packages/maps/package.json index ecb4f0c73e..9e2e404c3f 100644 --- a/packages/maps/package.json +++ b/packages/maps/package.json @@ -21,10 +21,10 @@ "license": "ISC", "dependencies": { "@l7/core": "^0.0.1", + "@l7/utils": "0.0.1", "gl-matrix": "^3.1.0", "inversify": "^5.0.1", "mapbox-gl": "^1.2.1", - "@l7/utils": "0.0.1", "viewport-mercator-project": "^6.2.1" }, "devDependencies": { @@ -32,5 +32,9 @@ "@types/gl-matrix": "^2.4.5", "@types/mapbox-gl": "^0.54.3", "@types/viewport-mercator-project": "^6.1.0" + }, + "gitHead": "0563f357f3a07c099bf1ffa9350e6fa3c88353ae", + "publishConfig": { + "access": "public" } } diff --git a/packages/maps/src/amap/index.ts b/packages/maps/src/amap/index.ts index 7c4db32837..6263ab1702 100644 --- a/packages/maps/src/amap/index.ts +++ b/packages/maps/src/amap/index.ts @@ -186,6 +186,7 @@ export default class AMapService implements IMapService { style = 'light', minZoom = 0, maxZoom = 18, + token = AMAP_API_KEY, ...rest } = mapConfig; @@ -212,7 +213,7 @@ export default class AMapService implements IMapService { resolve(); }; - const url: string = `https://webapi.amap.com/maps?v=${AMAP_VERSION}&key=${AMAP_API_KEY}&plugin=Map3D&callback=onload`; + const url: string = `https://webapi.amap.com/maps?v=${AMAP_VERSION}&key=${token}&plugin=Map3D&callback=onload`; this.$jsapi = document.createElement('script'); this.$jsapi.charset = 'utf-8'; this.$jsapi.src = url; diff --git a/packages/maps/src/mapbox/index.ts b/packages/maps/src/mapbox/index.ts index c96dee68eb..e316a5ae17 100644 --- a/packages/maps/src/mapbox/index.ts +++ b/packages/maps/src/mapbox/index.ts @@ -26,8 +26,7 @@ const EventMap: { camerachange: 'move', }; import { MapTheme } from './theme'; -mapboxgl.accessToken = - 'pk.eyJ1IjoieGlhb2l2ZXIiLCJhIjoiY2pxcmc5OGNkMDY3cjQzbG42cXk5NTl3YiJ9.hUC5Chlqzzh0FFd_aEc-uQ'; + const LNGLAT_OFFSET_ZOOM_THRESHOLD = 12; /** @@ -45,7 +44,6 @@ export default class MapboxService implements IMapService { private markerContainer: HTMLElement; private cameraChangedCallback: (viewport: IViewport) => void; private $mapContainer: HTMLElement | null; - private $link: HTMLLinkElement; // init public addMarkerContainer(): void { @@ -175,6 +173,7 @@ export default class MapboxService implements IMapService { id, attributionControl = false, style = 'light', + token = 'pk.eyJ1IjoieGlhb2l2ZXIiLCJhIjoiY2pxcmc5OGNkMDY3cjQzbG42cXk5NTl3YiJ9.hUC5Chlqzzh0FFd_aEc-uQ', ...rest } = mapConfig; this.$mapContainer = document.getElementById(id); @@ -185,6 +184,7 @@ export default class MapboxService implements IMapService { * TODO: 使用 mapbox v0.53.x 版本 custom layer,需要共享 gl context * @see https://github.com/mapbox/mapbox-gl-js/blob/master/debug/threejs.html#L61-L64 */ + mapboxgl.accessToken = token; // @ts-ignore this.map = new mapboxgl.Map({ container: id, @@ -197,20 +197,13 @@ export default class MapboxService implements IMapService { // 不同于高德地图,需要手动触发首次渲染 this.handleCameraChanged(); - - this.$link = document.createElement('link'); - this.$link.href = - 'https://api.tiles.mapbox.com/mapbox-gl-js/v1.2.1/mapbox-gl.css'; this.removeLogoControl(); - this.$link.rel = 'stylesheet'; - document.head.appendChild(this.$link); } public destroy() { this.eventEmitter.removeAllListeners(); if (this.map) { this.map.remove(); - document.head.removeChild(this.$link); this.$mapContainer = null; } } diff --git a/packages/renderer/package.json b/packages/renderer/package.json index 9ead971908..4ac550ae11 100644 --- a/packages/renderer/package.json +++ b/packages/renderer/package.json @@ -20,10 +20,14 @@ "license": "ISC", "dependencies": { "@l7/core": "^0.0.1", + "gl": "^4.4.0", "inversify": "^5.0.1", "inversify-logging": "^0.2.1", "reflect-metadata": "^0.1.13", - "regl": "^1.3.11", - "gl": "^4.4.0" + "regl": "^1.3.11" + }, + "gitHead": "0563f357f3a07c099bf1ffa9350e6fa3c88353ae", + "publishConfig": { + "access": "public" } } diff --git a/packages/scene/package.json b/packages/scene/package.json index 1787e32e86..280684d364 100644 --- a/packages/scene/package.json +++ b/packages/scene/package.json @@ -19,13 +19,17 @@ "author": "xiaoiver", "license": "ISC", "dependencies": { + "@l7/component": "^0.0.1", "@l7/core": "^0.0.1", "@l7/maps": "^0.0.1", "@l7/renderer": "^0.0.1", - "@l7/component": "^0.0.1", - "mapbox-gl": "^1.2.1", "inversify": "^5.0.1", "inversify-inject-decorators": "^3.1.0", + "mapbox-gl": "^1.2.1", "reflect-metadata": "^0.1.13" + }, + "gitHead": "0563f357f3a07c099bf1ffa9350e6fa3c88353ae", + "publishConfig": { + "access": "public" } } diff --git a/packages/source/package.json b/packages/source/package.json index c96f31b7bd..65d79c2026 100644 --- a/packages/source/package.json +++ b/packages/source/package.json @@ -29,7 +29,7 @@ "@turf/meta": "^6.0.2", "d3-dsv": "^1.1.1", "d3-hexbin": "^0.2.2", - "eventemitter3": "^3.1.0", + "eventemitter3": "^4.0.0", "gl-matrix": "^3.1.0", "inversify": "^5.0.1", "inversify-inject-decorators": "^3.1.0", @@ -45,5 +45,9 @@ "@types/gl-matrix": "^2.4.5", "@types/lodash": "^4.14.138", "@types/viewport-mercator-project": "^6.1.0" + }, + "gitHead": "0563f357f3a07c099bf1ffa9350e6fa3c88353ae", + "publishConfig": { + "access": "public" } } diff --git a/packages/utils/package.json b/packages/utils/package.json index 81efd0c239..9bec371a4d 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -20,7 +20,7 @@ "license": "ISC", "dependencies": { "@turf/helpers": "^6.1.4", - "eventemitter3": "^3.1.0", + "eventemitter3": "^4.0.0", "gl-matrix": "^3.1.0", "inversify": "^5.0.1", "inversify-inject-decorators": "^3.1.0", @@ -32,5 +32,9 @@ "devDependencies": { "@types/gl-matrix": "^2.4.5", "@types/lodash": "^4.14.138" + }, + "gitHead": "0563f357f3a07c099bf1ffa9350e6fa3c88353ae", + "publishConfig": { + "access": "public" } } diff --git a/yarn.lock b/yarn.lock index 1787145932..d2a5018382 100644 --- a/yarn.lock +++ b/yarn.lock @@ -553,7 +553,7 @@ dependencies: "@babel/types" "^7.0.0" -"@babel/helper-module-imports@^7.7.0": +"@babel/helper-module-imports@^7.0.0-beta.49", "@babel/helper-module-imports@^7.7.0": version "7.7.0" resolved "https://registry.npm.taobao.org/@babel/helper-module-imports/download/@babel/helper-module-imports-7.7.0.tgz#99c095889466e5f7b6d66d98dffc58baaf42654d" integrity sha1-mcCViJRm5fe21m2Y3/xYuq9CZU0= @@ -1723,7 +1723,7 @@ lodash "^4.17.13" to-fast-properties "^2.0.0" -"@babel/types@^7.7.0", "@babel/types@^7.7.1", "@babel/types@^7.7.2": +"@babel/types@^7.0.0-beta.49", "@babel/types@^7.7.0", "@babel/types@^7.7.1", "@babel/types@^7.7.2": version "7.7.2" resolved "https://registry.npm.taobao.org/@babel/types/download/@babel/types-7.7.2.tgz#550b82e5571dcd174af576e23f0adba7ffc683f7" integrity sha1-VQuC5VcdzRdK9XbiPwrbp//Gg/c= @@ -3190,6 +3190,11 @@ npmlog "^4.1.2" write-file-atomic "^2.3.0" +"@luma.gl/constants@^7.3.0-alpha.1": + version "7.3.2" + resolved "https://registry.npm.taobao.org/@luma.gl/constants/download/@luma.gl/constants-7.3.2.tgz#99c5d665f9e6d21192525038e47ec4acfbbbe0a6" + integrity sha1-mcXWZfnm0hGSUlA45H7ErPu74KY= + "@mapbox/geojson-area@0.2.2": version "0.2.2" resolved "https://registry.yarnpkg.com/@mapbox/geojson-area/-/geojson-area-0.2.2.tgz#18d7814aa36bf23fbbcc379f8e26a22927debf10" @@ -3423,6 +3428,20 @@ react-lifecycles-compat "^3.0.4" warning "^3.0.0" +"@rollup/plugin-alias@^2.2.0": + version "2.2.0" + resolved "https://registry.npm.taobao.org/@rollup/plugin-alias/download/@rollup/plugin-alias-2.2.0.tgz#3ac52ece8b39583249884adb90fb316484389fe5" + integrity sha1-OsUuzos5WDJJiErbkPsxZIQ4n+U= + dependencies: + slash "^3.0.0" + +"@rollup/plugin-json@^4.0.0": + version "4.0.0" + resolved "https://registry.npm.taobao.org/@rollup/plugin-json/download/@rollup/plugin-json-4.0.0.tgz#4462e83c7ad5544bef4a601a6e8450daedc4b69b" + integrity sha1-RGLoPHrVVEvvSmAaboRQ2u3Etps= + dependencies: + rollup-pluginutils "^2.5.0" + "@samverschueren/stream-to-observable@^0.3.0": version "0.3.0" resolved "https://registry.yarnpkg.com/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz#ecdf48d532c58ea477acfcab80348424f8d0662f" @@ -4129,7 +4148,7 @@ resolved "https://registry.npm.taobao.org/@types/eslint-visitor-keys/download/@types/eslint-visitor-keys-1.0.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Feslint-visitor-keys%2Fdownload%2F%40types%2Feslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d" integrity sha1-HuMNeVRMqE1o1LPNsK9PIFZj3S0= -"@types/estree@*": +"@types/estree@*", "@types/estree@0.0.39": version "0.0.39" resolved "https://registry.npm.taobao.org/@types/estree/download/@types/estree-0.0.39.tgz?cache=0&sync_timestamp=1572461973040&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Festree%2Fdownload%2F%40types%2Festree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" integrity sha1-4Xfmme4bjCLSMXTKqnQiZEOJUJ8= @@ -4365,6 +4384,13 @@ "@types/prop-types" "*" csstype "^2.2.0" +"@types/resolve@0.0.8": + version "0.0.8" + resolved "https://registry.npm.taobao.org/@types/resolve/download/@types/resolve-0.0.8.tgz#f26074d238e02659e323ce1a13d041eee280e194" + integrity sha1-8mB00jjgJlnjI84aE9BB7uKA4ZQ= + dependencies: + "@types/node" "*" + "@types/semver@^6.0.1": version "6.2.0" resolved "https://registry.yarnpkg.com/@types/semver/-/semver-6.2.0.tgz#d688d574400d96c5b0114968705366f431831e1a" @@ -5056,7 +5082,7 @@ are-we-there-yet@~1.1.2: delegates "^1.0.0" readable-stream "^2.0.6" -argparse@^1.0.7: +argparse@^1.0.10, argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== @@ -5581,6 +5607,13 @@ babel-plugin-inline-import@^3.0.0: dependencies: require-resolve "0.0.2" +babel-plugin-inline-webgl-constants@^1.0.1: + version "1.0.1" + resolved "https://registry.npm.taobao.org/babel-plugin-inline-webgl-constants/download/babel-plugin-inline-webgl-constants-1.0.1.tgz#ca81b3e3c3816356a23414a44bf367f51c5b7a89" + integrity sha1-yoGz48OBY1aiNBSkS/Nn9Rxbeok= + dependencies: + "@luma.gl/constants" "^7.3.0-alpha.1" + babel-plugin-istanbul@^5.1.0: version "5.2.0" resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz#df4ade83d897a92df069c4d9a25cf2671293c854" @@ -5598,6 +5631,17 @@ babel-plugin-jest-hoist@^24.9.0: dependencies: "@types/babel__traverse" "^7.0.6" +babel-plugin-lodash@^3.3.4: + version "3.3.4" + resolved "https://registry.npm.taobao.org/babel-plugin-lodash/download/babel-plugin-lodash-3.3.4.tgz#4f6844358a1340baed182adbeffa8df9967bc196" + integrity sha1-T2hENYoTQLrtGCrb7/qN+ZZ7wZY= + dependencies: + "@babel/helper-module-imports" "^7.0.0-beta.49" + "@babel/types" "^7.0.0-beta.49" + glob "^7.1.1" + lodash "^4.17.10" + require-package-name "^2.0.1" + babel-plugin-macros@2.6.1, babel-plugin-macros@^2.0.0, babel-plugin-macros@^2.4.5, babel-plugin-macros@^2.6.1: version "2.6.1" resolved "https://registry.npm.taobao.org/babel-plugin-macros/download/babel-plugin-macros-2.6.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbabel-plugin-macros%2Fdownload%2Fbabel-plugin-macros-2.6.1.tgz#41f7ead616fc36f6a93180e89697f69f51671181" @@ -5697,6 +5741,13 @@ babel-plugin-react-docgen@^3.0.0: react-docgen "^4.1.1" recast "^0.14.7" +babel-plugin-remove-glsl-comments@^1.0.0: + version "1.0.0" + resolved "https://registry.npm.taobao.org/babel-plugin-remove-glsl-comments/download/babel-plugin-remove-glsl-comments-1.0.0.tgz#62c0910707798a60504b70d09f9e2733ae10fc93" + integrity sha1-YsCRBwd5imBQS3DQn54nM64Q/JM= + dependencies: + minimatch "^3.0.0" + babel-plugin-remove-graphql-queries@^2.7.15: version "2.7.15" resolved "https://registry.npm.taobao.org/babel-plugin-remove-graphql-queries/download/babel-plugin-remove-graphql-queries-2.7.15.tgz#d1f9dcf885dfc0141cf3ac203f94050bf0f94ea4" @@ -6446,7 +6497,7 @@ builtin-modules@^1.1.1: resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= -builtin-modules@^3.0.0: +builtin-modules@^3.0.0, builtin-modules@^3.1.0: version "3.1.0" resolved "https://registry.npm.taobao.org/builtin-modules/download/builtin-modules-3.1.0.tgz#aad97c15131eb76b65b50ef208e7584cd76a7484" integrity sha1-qtl8FRMet2tltQ7yCOdYTNdqdIQ= @@ -7999,6 +8050,20 @@ css@^2.2.4: source-map-resolve "^0.5.2" urix "^0.1.0" +cssauron-glsl@X.X.X: + version "1.0.0" + resolved "https://registry.npm.taobao.org/cssauron-glsl/download/cssauron-glsl-1.0.0.tgz#9873641442b52bae08b9103f8546885af69c74cc" + integrity sha1-mHNkFEK1K64IuRA/hUaIWvacdMw= + dependencies: + cssauron "~1.0.0" + +cssauron@~1.0.0: + version "1.0.0" + resolved "https://registry.npm.taobao.org/cssauron/download/cssauron-1.0.0.tgz#3c9891541075be90ee59c0c2a3d400e4fffec42d" + integrity sha1-PJiRVBB1vpDuWcDCo9QA5P/+xC0= + dependencies: + through X.X.X + csscolorparser@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/csscolorparser/-/csscolorparser-1.0.3.tgz#b34f391eea4da8f3e98231e2ccd8df9c041f171b" @@ -9613,6 +9678,11 @@ estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== +estree-walker@^0.6.1: + version "0.6.1" + resolved "https://registry.npm.taobao.org/estree-walker/download/estree-walker-0.6.1.tgz?cache=0&sync_timestamp=1572191010814&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Festree-walker%2Fdownload%2Festree-walker-0.6.1.tgz#53049143f40c6eb918b23671d1fe3219f3a1b362" + integrity sha1-UwSRQ/QMbrkYsjZx0f4yGfOhs2I= + esutils@^2.0.0, esutils@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" @@ -11648,7 +11718,45 @@ globule@^1.0.0: lodash "~4.17.10" minimatch "~3.0.2" -glsl-tokenizer@^2.0.2: +glsl-deparser@^1.0.0: + version "1.0.0" + resolved "https://registry.npm.taobao.org/glsl-deparser/download/glsl-deparser-1.0.0.tgz#5e7eb363ec54af92916ccffc82ed03e9bfe33e0c" + integrity sha1-Xn6zY+xUr5KRbM/8gu0D6b/jPgw= + dependencies: + cssauron-glsl X.X.X + through "~1.1.2" + +glsl-min-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.npm.taobao.org/glsl-min-stream/download/glsl-min-stream-1.0.0.tgz#b6bfe6353a42b15b1fac354290cb3551e0582812" + integrity sha1-tr/mNTpCsVsfrDVCkMs1UeBYKBI= + dependencies: + cssauron-glsl X.X.X + shortest "0.0.0" + through "~1.1.2" + +glsl-minifier@^0.0.13: + version "0.0.13" + resolved "https://registry.npm.taobao.org/glsl-minifier/download/glsl-minifier-0.0.13.tgz#12c92150f6da4a4f417059ff02ead2b986552fee" + integrity sha1-EskhUPbaSk9BcFn/AurSuYZVL+4= + dependencies: + argparse "^1.0.10" + glsl-deparser "^1.0.0" + glsl-min-stream "^1.0.0" + glsl-parser "^2.0.1" + glsl-tokenizer "^2.1.4" + string-to-stream "^1.1.1" + +glsl-parser@^2.0.1: + version "2.0.1" + resolved "https://registry.npm.taobao.org/glsl-parser/download/glsl-parser-2.0.1.tgz#3ffac4ee05cc4d8141fd6b1e41e82b3766ff61b9" + integrity sha1-P/rE7gXMTYFB/WseQegrN2b/Ybk= + dependencies: + glsl-tokenizer "^2.1.4" + through "2.3.4" + through2 "^0.6.3" + +glsl-tokenizer@^2.0.2, glsl-tokenizer@^2.1.4: version "2.1.5" resolved "https://registry.yarnpkg.com/glsl-tokenizer/-/glsl-tokenizer-2.1.5.tgz#1c2e78c16589933c274ba278d0a63b370c5fee1a" integrity sha512-XSZEJ/i4dmz3Pmbnpsy3cKh7cotvFlBiZnDOwnj/05EwNp2XrhQ4XKJxT7/pDt4kp4YcpRSKz8eTV7S+mwV6MA== @@ -13228,6 +13336,11 @@ is-jpg@^2.0.0: resolved "https://registry.npm.taobao.org/is-jpg/download/is-jpg-2.0.0.tgz#2e1997fa6e9166eaac0242daae443403e4ef1d97" integrity sha1-LhmX+m6RZuqsAkLarkQ0A+TvHZc= +is-module@^1.0.0: + version "1.0.0" + resolved "https://registry.npm.taobao.org/is-module/download/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" + integrity sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE= + is-natural-number@^4.0.1: version "4.0.1" resolved "https://registry.npm.taobao.org/is-natural-number/download/is-natural-number-4.0.1.tgz#ab9d76e1db4ced51e35de0c72ebecf09f734cde8" @@ -13347,6 +13460,13 @@ is-redirect@^1.0.0: resolved "https://registry.npm.taobao.org/is-redirect/download/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" integrity sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ= +is-reference@^1.1.2: + version "1.1.4" + resolved "https://registry.npm.taobao.org/is-reference/download/is-reference-1.1.4.tgz#3f95849886ddb70256a3e6d062b1a68c13c51427" + integrity sha1-P5WEmIbdtwJWo+bQYrGmjBPFFCc= + dependencies: + "@types/estree" "0.0.39" + is-regex@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" @@ -14779,7 +14899,7 @@ lodash@4.17.14: resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.14.tgz#9ce487ae66c96254fe20b599f21b6816028078ba" integrity sha512-mmKYbW3GLuJeX+iGP+Y7Gp1AiGHGbXHCOh/jZmrawMmsE7MS4znI3RL2FsjbqOyMayHInjOeykW7PEajUk1/xw== -lodash@4.17.15, lodash@^4.0.0, lodash@^4.0.1, lodash@^4.11.1, lodash@^4.15.0, lodash@^4.16.5, lodash@^4.17.0, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.1, lodash@^4.3.0, lodash@~4.17.10, lodash@~4.17.5: +lodash@4.17.15, lodash@^4.0.0, lodash@^4.0.1, lodash@^4.11.1, lodash@^4.15.0, lodash@^4.16.5, lodash@^4.17.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.1, lodash@^4.3.0, lodash@~4.17.10, lodash@~4.17.5: version "4.17.15" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== @@ -14968,6 +15088,13 @@ macos-release@^2.2.0: resolved "https://registry.yarnpkg.com/macos-release/-/macos-release-2.3.0.tgz#eb1930b036c0800adebccd5f17bc4c12de8bb71f" integrity sha512-OHhSbtcviqMPt7yfw5ef5aghS2jzFVKEFyCJndQt2YpSQ9qRVSEv2axSJI1paVThEu+FFGs584h/1YhxjVqajA== +magic-string@^0.25.2: + version "0.25.4" + resolved "https://registry.npm.taobao.org/magic-string/download/magic-string-0.25.4.tgz#325b8a0a79fc423db109b77fd5a19183b7ba5143" + integrity sha1-MluKCnn8Qj2xCbd/1aGRg7e6UUM= + dependencies: + sourcemap-codec "^1.4.4" + make-dir@^1.0.0, make-dir@^1.2.0: version "1.3.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" @@ -15513,7 +15640,7 @@ minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= -"minimatch@2 || 3", minimatch@3.0.4, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4, minimatch@~3.0.2: +"minimatch@2 || 3", minimatch@3.0.4, minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4, minimatch@~3.0.2: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== @@ -19406,7 +19533,7 @@ read@1, read@^1.0.7, read@~1.0.1: dependencies: mute-stream "~0.0.4" -"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6: +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.0, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== @@ -19988,6 +20115,11 @@ require-main-filename@^2.0.0: resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== +require-package-name@^2.0.1: + version "2.0.1" + resolved "https://registry.npm.taobao.org/require-package-name/download/require-package-name-2.0.1.tgz#c11e97276b65b8e2923f75dabf5fb2ef0c3841b9" + integrity sha1-wR6XJ2tluOKSP3Xav1+y7ww4Qbk= + require-resolve@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/require-resolve/-/require-resolve-0.0.2.tgz#bab410ab1aee2f3f55b79317451dd3428764e6f3" @@ -20059,7 +20191,7 @@ resolve@1.1.7: resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= -resolve@1.x, resolve@^1.1.6, resolve@^1.10.0, resolve@^1.11.0, resolve@^1.12.0, resolve@^1.3.2, resolve@^1.5.0, resolve@^1.8.1: +resolve@1.x, resolve@^1.1.6, resolve@^1.10.0, resolve@^1.11.0, resolve@^1.11.1, resolve@^1.12.0, resolve@^1.3.2, resolve@^1.5.0, resolve@^1.8.1: version "1.12.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.12.0.tgz#3fc644a35c84a48554609ff26ec52b66fa577df6" integrity sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w== @@ -20169,6 +20301,68 @@ rmc-feedback@^2.0.0: babel-runtime "6.x" classnames "^2.2.5" +rollup-plugin-analyzer@^3.2.2: + version "3.2.2" + resolved "https://registry.npm.taobao.org/rollup-plugin-analyzer/download/rollup-plugin-analyzer-3.2.2.tgz#1ea109d164ac8cdbfeaacf1cf271bb66ca643d94" + integrity sha1-HqEJ0WSsjNv+qs8c8nG7ZspkPZQ= + +rollup-plugin-babel@^4.3.3: + version "4.3.3" + resolved "https://registry.npm.taobao.org/rollup-plugin-babel/download/rollup-plugin-babel-4.3.3.tgz#7eb5ac16d9b5831c3fd5d97e8df77ba25c72a2aa" + integrity sha1-frWsFtm1gxw/1dl+jfd7olxyoqo= + dependencies: + "@babel/helper-module-imports" "^7.0.0" + rollup-pluginutils "^2.8.1" + +rollup-plugin-commonjs@^10.1.0: + version "10.1.0" + resolved "https://registry.npm.taobao.org/rollup-plugin-commonjs/download/rollup-plugin-commonjs-10.1.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frollup-plugin-commonjs%2Fdownload%2Frollup-plugin-commonjs-10.1.0.tgz#417af3b54503878e084d127adf4d1caf8beb86fb" + integrity sha1-QXrztUUDh44ITRJ6300cr4vrhvs= + dependencies: + estree-walker "^0.6.1" + is-reference "^1.1.2" + magic-string "^0.25.2" + resolve "^1.11.0" + rollup-pluginutils "^2.8.1" + +rollup-plugin-node-resolve@^5.2.0: + version "5.2.0" + resolved "https://registry.npm.taobao.org/rollup-plugin-node-resolve/download/rollup-plugin-node-resolve-5.2.0.tgz#730f93d10ed202473b1fb54a5997a7db8c6d8523" + integrity sha1-cw+T0Q7SAkc7H7VKWZen24xthSM= + dependencies: + "@types/resolve" "0.0.8" + builtin-modules "^3.1.0" + is-module "^1.0.0" + resolve "^1.11.1" + rollup-pluginutils "^2.8.1" + +rollup-plugin-terser@^5.1.2: + version "5.1.2" + resolved "https://registry.npm.taobao.org/rollup-plugin-terser/download/rollup-plugin-terser-5.1.2.tgz#3e41256205cb75f196fc70d4634227d1002c255c" + integrity sha1-PkElYgXLdfGW/HDUY0In0QAsJVw= + dependencies: + "@babel/code-frame" "^7.0.0" + jest-worker "^24.6.0" + rollup-pluginutils "^2.8.1" + serialize-javascript "^1.7.0" + terser "^4.1.0" + +rollup-pluginutils@^2.5.0, rollup-pluginutils@^2.8.1, rollup-pluginutils@^2.8.2: + version "2.8.2" + resolved "https://registry.npm.taobao.org/rollup-pluginutils/download/rollup-pluginutils-2.8.2.tgz?cache=0&sync_timestamp=1568405888956&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frollup-pluginutils%2Fdownload%2Frollup-pluginutils-2.8.2.tgz#72f2af0748b592364dbd3389e600e5a9444a351e" + integrity sha1-cvKvB0i1kjZNvTOJ5gDlqURKNR4= + dependencies: + estree-walker "^0.6.1" + +rollup@^1.27.0: + version "1.27.0" + resolved "https://registry.npm.taobao.org/rollup/download/rollup-1.27.0.tgz?cache=0&sync_timestamp=1573576528242&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frollup%2Fdownload%2Frollup-1.27.0.tgz#7afe0da89c967cec5ccea7e919da6c89a1a68666" + integrity sha1-ev4NqJyWfOxczqfpGdpsiaGmhmY= + dependencies: + "@types/estree" "*" + "@types/node" "*" + acorn "^7.1.0" + rst-selector-parser@^2.2.3: version "2.2.3" resolved "https://registry.yarnpkg.com/rst-selector-parser/-/rst-selector-parser-2.2.3.tgz#81b230ea2fcc6066c89e3472de794285d9b03d91" @@ -20683,6 +20877,11 @@ shellwords@^0.1.1: resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== +shortest@0.0.0: + version "0.0.0" + resolved "https://registry.npm.taobao.org/shortest/download/shortest-0.0.0.tgz#dc4c8d0722e7a9208ec7d2098e4cda8cac6e567d" + integrity sha1-3EyNByLnqSCOx9IJjkzajKxuVn0= + sift@^5.1.0: version "5.1.0" resolved "https://registry.npm.taobao.org/sift/download/sift-5.1.0.tgz?cache=0&sync_timestamp=1571575345522&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsift%2Fdownload%2Fsift-5.1.0.tgz#1bbf2dfb0eb71e56c4cc7fb567fbd1351b65015e" @@ -21005,9 +21204,15 @@ source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== +<<<<<<< HEAD sourcemap-codec@^1.4.1: version "1.4.6" resolved "https://registry.npm.taobao.org/sourcemap-codec/download/sourcemap-codec-1.4.6.tgz?cache=0&sync_timestamp=1562200915929&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsourcemap-codec%2Fdownload%2Fsourcemap-codec-1.4.6.tgz#e30a74f0402bad09807640d39e971090a08ce1e9" +======= +sourcemap-codec@^1.4.4: + version "1.4.6" + resolved "https://registry.npm.taobao.org/sourcemap-codec/download/sourcemap-codec-1.4.6.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsourcemap-codec%2Fdownload%2Fsourcemap-codec-1.4.6.tgz#e30a74f0402bad09807640d39e971090a08ce1e9" +>>>>>>> next integrity sha1-4wp08EArrQmAdkDTnpcQkKCM4ek= space-separated-tokens@^1.0.0: @@ -21305,6 +21510,14 @@ string-similarity@^1.2.2: lodash.map "^4.6.0" lodash.maxby "^4.6.0" +string-to-stream@^1.1.1: + version "1.1.1" + resolved "https://registry.npm.taobao.org/string-to-stream/download/string-to-stream-1.1.1.tgz#aba78f73e70661b130ee3e1c0192be4fef6cb599" + integrity sha1-q6ePc+cGYbEw7j4cAZK+T+9stZk= + dependencies: + inherits "^2.0.1" + readable-stream "^2.1.0" + string-width@^1.0.1, string-width@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" @@ -21964,6 +22177,15 @@ terser-webpack-plugin@1.4.1, terser-webpack-plugin@^1.2.4, terser-webpack-plugin webpack-sources "^1.4.0" worker-farm "^1.7.0" +terser@^4.1.0: + version "4.4.0" + resolved "https://registry.npm.taobao.org/terser/download/terser-4.4.0.tgz?cache=0&sync_timestamp=1573407784308&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fterser%2Fdownload%2Fterser-4.4.0.tgz#22c46b4817cf4c9565434bfe6ad47336af259ac3" + integrity sha1-IsRrSBfPTJVlQ0v+atRzNq8lmsM= + dependencies: + commander "^2.20.0" + source-map "~0.6.1" + source-map-support "~0.5.12" + terser@^4.1.2: version "4.3.9" resolved "https://registry.yarnpkg.com/terser/-/terser-4.3.9.tgz#e4be37f80553d02645668727777687dad26bbca8" @@ -22045,11 +22267,21 @@ through2@^3.0.0: dependencies: readable-stream "2 || 3" -through@2, "through@>=2.2.7 <3", through@^2.3.4, through@^2.3.6, through@^2.3.8, through@~2.3.4: +through@2, "through@>=2.2.7 <3", through@X.X.X, through@^2.3.4, through@^2.3.6, through@^2.3.8, through@~2.3.4: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= +through@2.3.4: + version "2.3.4" + resolved "https://registry.npm.taobao.org/through/download/through-2.3.4.tgz#495e40e8d8a8eaebc7c275ea88c2b8fc14c56455" + integrity sha1-SV5A6Nio6uvHwnXqiMK4/BTFZFU= + +through@~1.1.2: + version "1.1.2" + resolved "https://registry.npm.taobao.org/through/download/through-1.1.2.tgz#344a5425a3773314ca7e0eb6512fbafaf76c0bfe" + integrity sha1-NEpUJaN3MxTKfg62US+6+vdsC/4= + thunky@^1.0.2: version "1.1.0" resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d"