├── .editorconfig ├── .eslintrc.js ├── .gitignore ├── .htaccess ├── .npmrc ├── LICENSE ├── README.md ├── assets ├── DamagedHelmet-13-37-27.usdz ├── DamagedHelmet.obj ├── DamagedHelmet.usda ├── DamagedHelmet │ ├── DamagedHelmet.bin │ ├── DamagedHelmet.glb │ ├── DamagedHelmet.gltf │ ├── Default_AO.jpg │ ├── Default_albedo.jpg │ ├── Default_emissive.jpg │ ├── Default_metalRoughness.jpg │ ├── Default_normal.jpg │ └── LICENSE.md ├── DamagedHelmet_baseColorTexture.jpg ├── DamagedHelmet_emissiveTexture.jpg ├── DamagedHelmet_metallicTexture.jpg ├── DamagedHelmet_normalTexture.jpg ├── DamagedHelmet_occlusionTexture.jpg ├── DamagedHelmet_roughnessTexture.jpg ├── DamagedHelmet_usda_from_usdc.usda ├── helmet_including_preview.jpg └── preview.jpg ├── bin └── gltf-to-usdz.js ├── index.html ├── lib ├── argsHandler.js ├── constants.js ├── converter │ ├── constructOBJ.js │ ├── constructUSDA.js │ ├── handleTextures.js │ ├── index.js │ └── parseGLTF.js ├── fileLoader.js ├── index.js └── utilities.js ├── package.json └── yarn.lock /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | insert_final_newline = true 5 | trim_trailing_whitespace = true 6 | indent_style = space 7 | indent_size = 2 8 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | extends: 'airbnb-base', 3 | rules: { 4 | 'import/prefer-default-export': 0, 5 | 'no-bitwise': 0, 6 | 'no-underscore-dangle': 0, 7 | 'sort-imports': [ 8 | 'error', 9 | { 10 | ignoreCase: false, 11 | ignoreMemberSort: false, 12 | memberSyntaxSortOrder: ['none', 'all', 'multiple', 'single'], 13 | }, 14 | ], 15 | }, 16 | }; 17 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | 3 | node_modules 4 | -------------------------------------------------------------------------------- /.htaccess: -------------------------------------------------------------------------------- 1 | 2 | AddType model/vnd.pixar.usd .usdz 3 | AddType model/usd usdz 4 | 5 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | package-lock=false 2 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Tim van Scherpenzeel 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # glTF to USDZ research 2 | 3 | Research and proof of concept of converting glTF to USDZ for AR Quick Look (iOS 12+). 4 | 5 | ## Reasoning 6 | 7 | Even though I think the intentions of Apple / Pixar are great with the open source [USD](https://github.com/PixarAnimationStudios/USD) pipeline I think we as an industry should be relying more on truly open formats that are not controlled by a single entity. Installing `USD` is cumbersome, requires a lot of disk space and is completely overkill for most situations (if your goal is to convert some 3D models to USDZ and show them using `AR Quick Look`). I'm hoping that as we get closer to the public release of `iOS 12` more tools will pop up that directly convert to `USDZ` so that we can get cross-platform support. 8 | 9 | In order to move away from using the [USD](https://github.com/PixarAnimationStudios/USD) pipeline solution offered by Pixar I think it would be wise to try and manipulate the intermediary readeable `USDA` format. Unfortunately there are very little examples available of `USDA` files. 10 | 11 | The general idea is to dynamically generate / manipulate the intermediary a general `USDA` file-structure and pass that to the `usdz-converter` to handle the further conversion to `USDZ`. 12 | 13 | After some work, debugging and friendly help from [@domenicopanacea](https://twitter.com/domenicopanacea/status/1011577221310447618) and [@virakri](https://twitter.com/virakri/status/1010356558742589440) I got it to work. Most of the findings on `OBJ` support come from `@trayser` who posted details regarding `OBJ` to `USDZ` conversion on [developers.apple.com](https://forums.developer.apple.com/thread/104042). The `OBJ` files that are generated by `gltf-to-usdz` only use the supported tags as mentioned by `@trayser`. 14 | 15 | Please note that this is just an experimental setup and should be seen as a proof of concept. As it stands I've only tested it with the `DamagedHelmet` glTF asset included in `/assets/`. You will very likely run into issues with the current code. 16 | 17 | My goal of this research is to inspire others to make proper converters that handle all the complexities. 18 | 19 | ## Live demo 20 | 21 | [Live demo](https://timvanscherpenzeel.github.io/gltf-to-usdz-research/) 22 | 23 | ![Screenshot](/assets/helmet_including_preview.jpg?raw=true) 24 | 25 | ## Limitations 26 | 27 | - `.glb` files are not yet accepted. Please use `glTF` files with seperate textures. 28 | 29 | - Only the first mesh in the `glTF` file will be parsed and exported. Make sure you merge all meshes. 30 | 31 | - Only `glTF` files with external textures are currently handled (as opposed to embedded base64 encoded textures). 32 | 33 | - Animations from the glTF are not yet transferred, it seems possible to transfer skeleton animation and regular transformations. Unfortunately due to the shadow being baked on the first frame of the animation you can't really do large moving animations. Besides that the filesize increases quite dramatically. It is not recommended to have animations that move a character away from the origin as it results in tracking problems. Your best bet are micro-animations that enhance a character or model instead of large animations. 34 | 35 | ## To do 36 | 37 | - ~~Convert the example `USDZ` examples to `USDA` structures by converting `USDC` to `USDA`. Unfortunately I think this requires the installation of the [USD pipeline](https://github.com/PixarAnimationStudios/USD) and the use of [usdcat](https://github.com/PixarAnimationStudios/USD/blob/e6ce9e884a65e7d6acd762e9dbc961dcf9aa36bb/pxr/usd/bin/usdcat/usdcat.py).~~ 38 | 39 | Thanks to [@wave-electron](https://github.com/wave-electron) the `USDC`'s of the examples of the AR Quick Look gallery have been converted to `USDA`. Due to copyright concerns I unfortunately won't be able to upload them to this repo. I've had a look at them and for the most part look very similar compared to the USDA file generated by `gltf-to-usdz`. I've since also been able to convert the examples myself using `usdcat`. 40 | 41 | ## Installation 42 | 43 | - Make sure you have [Node.js](http://nodejs.org/) installed 44 | 45 | - Upgrade your operating system to macOS High Sierra 10.13.4 or newer 46 | 47 | - Download Xcode 10 beta and put it in `/Applications/` 48 | 49 | ``` 50 | https://developer.apple.com/download/ 51 | ``` 52 | 53 | - Link to the beta version instead of the normal version 54 | 55 | ``` 56 | sudo xcode-select --switch /Applications/Xcode-beta.app 57 | ``` 58 | 59 | - Construct a new `.usda` using `gltf-to-usdz` and run it through the `usdz_converter` 60 | 61 | ``` 62 | node ./bin/gltf-to-usdz.js -i ./assets/DamagedHelmet/DamagedHelmet.gltf -o ./assets/DamagedHelmet.usda -s 10.0 && xcrun usdz_converter ./assets/DamagedHelmet.usda ./assets/DamagedHelmet-`date +"%H-%M-%S"`.usdz 63 | ``` 64 | 65 | - On succes the following should be outputted to the console 66 | 67 | ``` 68 | 2018-06-20 17:21:23.364 usdz_converter[82749:13335731] 69 | 70 | 71 | Converting asset file 'DamagedHelmet.usda' ... 72 | ``` 73 | 74 | In order to see the contents of the outputted `USDZ` change the extension to `.zip` and unzip it. You will see a `.usdc` and several textures (if the original glTF file had textures). 75 | 76 | ## Development 77 | 78 | In order to install [USD](https://github.com/PixarAnimationStudios/USD) on MacOS please follow the following instructions: 79 | 80 | - Upgrade your operating system to macOS High Sierra 10.13.4 or newer 81 | 82 | - Download Xcode 10 beta and put it in `/Applications/` 83 | 84 | ``` 85 | https://developer.apple.com/download/ 86 | ``` 87 | 88 | - Link to the beta version instead of the normal version 89 | 90 | ``` 91 | sudo xcode-select --switch /Applications/Xcode-beta.app 92 | ``` 93 | 94 | - Install Cmake and QT. If you get any [issues](https://github.com/TimvanScherpenzeel/gltf-to-usdz-research/issues/1) during compiling or installing you might have to install QT5. 95 | 96 | ``` 97 | brew install cmake 98 | brew install qt@4 99 | ``` 100 | 101 | - Install PyOpenGL 102 | 103 | ``` 104 | pip install PyOpenGL 105 | ``` 106 | 107 | - Install PySide2 108 | 109 | ``` 110 | pip install --index-url=http://download.qt.io/snapshots/ci/pyside/5.9/latest/ pyside2 --trusted-host download.qt.io 111 | ``` 112 | 113 | - Update OpenImageIO release version from `Release-1.7.14.zip` to `Release-1.8.12.zip` and add the following section in `build_scripts/build_usd.py` as mentioned as a [solution](https://github.com/PixarAnimationStudios/USD/issues/19#issuecomment-399918369) by `@robpieke` to an earlier Python crash I was experiencing. 114 | 115 | ```diff 116 | diff --git a/build_scripts/build_usd.py b/build_scripts/build_usd.py 117 | index 37fb2a5e..3c940b3b 100644 118 | --- a/build_scripts/build_usd.py 119 | +++ b/build_scripts/build_usd.py 120 | @@ -692,7 +692,7 @@ PTEX = Dependency("Ptex", InstallPtex, "include/PtexVersion.h") 121 | ############################################################ 122 | # OpenImageIO 123 | 124 | -OIIO_URL = "https://github.com/OpenImageIO/oiio/archive/Release-1.7.14.zip" 125 | +OIIO_URL = "https://github.com/OpenImageIO/oiio/archive/Release-1.8.12.zip" 126 | 127 | def InstallOpenImageIO(context, force): 128 | with CurrentWorkingDirectory(DownloadURL(OIIO_URL, context, force)): 129 | @@ -855,6 +855,12 @@ def InstallUSD(context): 130 | 131 | if context.buildPython: 132 | extraArgs.append('-DPXR_ENABLE_PYTHON_SUPPORT=ON') 133 | + if MacOS(): 134 | + import distutils.sysconfig 135 | + pyLibPath = distutils.sysconfig.get_config_var('LIBDIR') 136 | + pyIncPath = distutils.sysconfig.get_config_var('INCLUDEPY') 137 | + extraArgs.append('-DPYTHON_LIBRARY=' + pyLibPath + '/libpython2.7.dylib') 138 | + extraArgs.append('-DPYTHON_INCLUDE_DIR=' + pyIncPath) 139 | else: 140 | extraArgs.append('-DPXR_ENABLE_PYTHON_SUPPORT=OFF') 141 | ``` 142 | 143 | - Run `python USD/build_scripts/build_usd.py BUILD`, it will take roughly 1 hour the first time you build because of all the dependencies that need to be compiled, resulting in the following output if succesfully installed: 144 | 145 | ``` 146 | ➜ pixar python USD/build_scripts/build_usd.py BUILD 147 | 148 | Building with settings: 149 | USD source directory /Users/timvanscherpenzeel/Projects/pixar/USD 150 | USD install directory /Users/timvanscherpenzeel/Projects/pixar/BUILD 151 | 3rd-party source directory /Users/timvanscherpenzeel/Projects/pixar/BUILD/src 152 | 3rd-party install directory /Users/timvanscherpenzeel/Projects/pixar/BUILD 153 | Build directory /Users/timvanscherpenzeel/Projects/pixar/BUILD/build 154 | CMake generator Default 155 | Downloader curl 156 | 157 | Building Shared libraries 158 | Imaging On 159 | Ptex support: Off 160 | UsdImaging On 161 | Python support On 162 | Documentation Off 163 | Tests Off 164 | Alembic Plugin Off 165 | HDF5 support: Off 166 | Maya Plugin Off 167 | Katana Plugin Off 168 | Houdini Plugin Off 169 | 170 | Dependencies zlib, boost, TBB, JPEG, TIFF, PNG, OpenEXR, GLEW, OpenImageIO, OpenSubdiv 171 | 172 | STATUS: Installing zlib... 173 | STATUS: Installing boost... 174 | STATUS: Installing TBB... 175 | STATUS: Installing JPEG... 176 | STATUS: Installing TIFF... 177 | STATUS: Installing PNG... 178 | STATUS: Installing OpenEXR... 179 | STATUS: Installing GLEW... 180 | STATUS: Installing OpenImageIO... 181 | STATUS: Installing OpenSubdiv... 182 | STATUS: Installing USD... 183 | 184 | Success! To use USD, please ensure that you have: 185 | 186 | The following in your PYTHONPATH environment variable: 187 | /Users/timvanscherpenzeel/Projects/pixar/BUILD/lib/python 188 | 189 | The following in your PATH environment variable: 190 | /Users/timvanscherpenzeel/Projects/pixar/BUILD/bin 191 | ``` 192 | 193 | ## Taking apart a USDZ file 194 | 195 | To take apart a `USDZ` file one should follow the following steps: 196 | 197 | 1. Follow the steps mentioned in `Development` to install USD 198 | 2. Change the extension of the `usdz` file from `.usdz` to `.zip` 199 | 3. Unzip the file using `Archive Utility` (comes with MacOS) or likely any other unzipping tool 200 | 201 | The folder will contain the included textures seperated out and a `.udsc` file. 202 | 203 | 4. Now use `usdcat` to convert the `USDC` file to readeable `USDA`: `usdcat input.usdc -o output.usda` 204 | 205 | The resulting `USDA` file will contain the mesh data. 206 | 207 | ## Resources 208 | 209 | - https://graphics.pixar.com/usd/docs/Converting-Between-Layer-Formats.html 210 | 211 | - https://forums.developer.apple.com/thread/104042 212 | 213 | - https://graphics.pixar.com/usd/docs/UsdPreviewSurface-Proposal.html 214 | 215 | - https://developer.apple.com/videos/play/wwdc2018/603/ 216 | 217 | - https://devstreaming-cdn.apple.com/videos/wwdc/2018/603augiuv41xoowslk8/603/603_integrating_apps_and_content_with_ar_quick_look.pdf?dl=1 218 | 219 | ## Contributing 220 | 221 | As it is my goal to create a community project I welcome you to submit any pull requests or open a ticket if you spot an issue. Please be aware that as of now the project is in a very experimental state and only serves as a proof of concept so there are probably lots of things wrong and the code is far from clean. 222 | 223 | ## Licence 224 | 225 | `gltf-to-usdz` is released under the [MIT licence](https://raw.githubusercontent.com/TimvanScherpenzeel/gltf-to-usdz-research/master/LICENSE). 226 | -------------------------------------------------------------------------------- /assets/DamagedHelmet-13-37-27.usdz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TimvanScherpenzeel/gltf-to-usdz-research/4baa7859dfcea95a74eb8375a6d14842811ab286/assets/DamagedHelmet-13-37-27.usdz -------------------------------------------------------------------------------- /assets/DamagedHelmet.usda: -------------------------------------------------------------------------------- 1 | #usda 1.0 2 | ( 3 | endTimeCode = 200 4 | startTimeCode = 1 5 | timeCodesPerSecond = 24 6 | upAxis = "Y" 7 | ) 8 | 9 | def Scope "Materials" 10 | { 11 | 12 | def Material "StingrayPBS_0" 13 | { 14 | token inputs:frame:stPrimvarName = "Texture_uv" 15 | token outputs:displacement.connect = 16 | token outputs:surface.connect = 17 | 18 | def Shader "pbrMat1" 19 | { 20 | uniform token info:id = "UsdPreviewSurface" 21 | float inputs:clearcoat = 0 22 | float inputs:clearcoatRoughness = 0 23 | color3f inputs:diffuseColor.connect = 24 | float inputs:displacement = 0 25 | color3f inputs:emissiveColor.connect = 26 | float inputs:ior = 1.5 27 | float inputs:metallic.connect = 28 | normal3f inputs:normal.connect = 29 | float inputs:occlusion.connect = 30 | float inputs:opacity = 1 31 | float inputs:roughness.connect = 32 | color3f inputs:specularColor = (1, 1, 1) 33 | int inputs:useSpecularWorkflow = 0 34 | token outputs:displacement 35 | token outputs:surface 36 | } 37 | 38 | def Shader "Primvar" 39 | { 40 | uniform token info:id = "UsdPrimvarReader_float2" 41 | float2 inputs:default = (0, 0) 42 | token inputs:varname.connect = 43 | float2 outputs:result 44 | } 45 | 46 | def Shader "color_map" 47 | { 48 | uniform token info:id = "UsdUVTexture" 49 | float4 inputs:default = (0, 0, 0, 1) 50 | asset inputs:file = @DamagedHelmet_baseColorTexture.jpg@ 51 | float2 inputs:st.connect = 52 | token inputs:wrapS = "repeat" 53 | token inputs:wrapT = "repeat" 54 | float3 outputs:rgb 55 | } 56 | 57 | def Shader "emissive_map" 58 | { 59 | uniform token info:id = "UsdUVTexture" 60 | float4 inputs:default = (0, 0, 0, 1) 61 | asset inputs:file = @DamagedHelmet_emissiveTexture.jpg@ 62 | float2 inputs:st.connect = 63 | token inputs:wrapS = "repeat" 64 | token inputs:wrapT = "repeat" 65 | float3 outputs:rgb 66 | } 67 | 68 | def Shader "metallic_map" 69 | { 70 | uniform token info:id = "UsdUVTexture" 71 | float4 inputs:default = (0, 0, 0, 1) 72 | asset inputs:file = @DamagedHelmet_metallicTexture.jpg@ 73 | float2 inputs:st.connect = 74 | token inputs:wrapS = "repeat" 75 | token inputs:wrapT = "repeat" 76 | float3 outputs:rgb 77 | } 78 | 79 | def Shader "normal_map" 80 | { 81 | uniform token info:id = "UsdUVTexture" 82 | float4 inputs:default = (0, 0, 0, 1) 83 | asset inputs:file = @DamagedHelmet_normalTexture.jpg@ 84 | float2 inputs:st.connect = 85 | token inputs:wrapS = "repeat" 86 | token inputs:wrapT = "repeat" 87 | float3 outputs:rgb 88 | } 89 | 90 | def Shader "ao_map" 91 | { 92 | uniform token info:id = "UsdUVTexture" 93 | float4 inputs:default = (0, 0, 0, 1) 94 | asset inputs:file = @DamagedHelmet_occlusionTexture.jpg@ 95 | float2 inputs:st.connect = 96 | token inputs:wrapS = "repeat" 97 | token inputs:wrapT = "repeat" 98 | float3 outputs:rgb 99 | } 100 | 101 | def Shader "roughness_map" 102 | { 103 | uniform token info:id = "UsdUVTexture" 104 | float4 inputs:default = (0, 0, 0, 1) 105 | asset inputs:file = @DamagedHelmet_roughnessTexture.jpg@ 106 | float2 inputs:st.connect = 107 | token inputs:wrapS = "repeat" 108 | token inputs:wrapT = "repeat" 109 | float3 outputs:rgb 110 | } 111 | } 112 | } 113 | def "Mesh_0" ( 114 | add references = @DamagedHelmet.obj@ 115 | ) 116 | { 117 | rel material:binding = 118 | float3 xformOp:scale = (10.0, 10.0, 10.0) 119 | uniform token[] xformOpOrder = ["xformOp:scale"] 120 | } -------------------------------------------------------------------------------- /assets/DamagedHelmet/DamagedHelmet.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TimvanScherpenzeel/gltf-to-usdz-research/4baa7859dfcea95a74eb8375a6d14842811ab286/assets/DamagedHelmet/DamagedHelmet.bin -------------------------------------------------------------------------------- /assets/DamagedHelmet/DamagedHelmet.glb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TimvanScherpenzeel/gltf-to-usdz-research/4baa7859dfcea95a74eb8375a6d14842811ab286/assets/DamagedHelmet/DamagedHelmet.glb -------------------------------------------------------------------------------- /assets/DamagedHelmet/DamagedHelmet.gltf: -------------------------------------------------------------------------------- 1 | { 2 | "accessors" : [ 3 | { 4 | "bufferView" : 0, 5 | "componentType" : 5123, 6 | "count" : 46356, 7 | "max" : [ 8 | 14555 9 | ], 10 | "min" : [ 11 | 0 12 | ], 13 | "type" : "SCALAR" 14 | }, 15 | { 16 | "bufferView" : 1, 17 | "componentType" : 5126, 18 | "count" : 14556, 19 | "max" : [ 20 | 0.9424954056739807, 21 | 0.8128451108932495, 22 | 0.900973916053772 23 | ], 24 | "min" : [ 25 | -0.9474585652351379, 26 | -1.18715500831604, 27 | -0.9009949564933777 28 | ], 29 | "type" : "VEC3" 30 | }, 31 | { 32 | "bufferView" : 2, 33 | "componentType" : 5126, 34 | "count" : 14556, 35 | "max" : [ 36 | 1.0, 37 | 1.0, 38 | 1.0 39 | ], 40 | "min" : [ 41 | -1.0, 42 | -1.0, 43 | -1.0 44 | ], 45 | "type" : "VEC3" 46 | }, 47 | { 48 | "bufferView" : 3, 49 | "componentType" : 5126, 50 | "count" : 14556, 51 | "max" : [ 52 | 0.9999759793281555, 53 | 1.998665988445282 54 | ], 55 | "min" : [ 56 | 0.002448640065267682, 57 | 1.0005531199858524 58 | ], 59 | "type" : "VEC2" 60 | } 61 | ], 62 | "asset" : { 63 | "generator" : "Khronos Blender glTF 2.0 exporter", 64 | "version" : "2.0" 65 | }, 66 | "bufferViews" : [ 67 | { 68 | "buffer" : 0, 69 | "byteLength" : 92712, 70 | "byteOffset" : 0, 71 | "target" : 34963 72 | }, 73 | { 74 | "buffer" : 0, 75 | "byteLength" : 174672, 76 | "byteOffset" : 92712, 77 | "target" : 34962 78 | }, 79 | { 80 | "buffer" : 0, 81 | "byteLength" : 174672, 82 | "byteOffset" : 267384, 83 | "target" : 34962 84 | }, 85 | { 86 | "buffer" : 0, 87 | "byteLength" : 116448, 88 | "byteOffset" : 442056, 89 | "target" : 34962 90 | } 91 | ], 92 | "buffers" : [ 93 | { 94 | "byteLength" : 558504, 95 | "uri" : "DamagedHelmet.bin" 96 | } 97 | ], 98 | "images" : [ 99 | { 100 | "uri" : "Default_albedo.jpg" 101 | }, 102 | { 103 | "uri" : "Default_metalRoughness.jpg" 104 | }, 105 | { 106 | "uri" : "Default_emissive.jpg" 107 | }, 108 | { 109 | "uri" : "Default_AO.jpg" 110 | }, 111 | { 112 | "uri" : "Default_normal.jpg" 113 | } 114 | ], 115 | "materials" : [ 116 | { 117 | "emissiveFactor" : [ 118 | 1.0, 119 | 1.0, 120 | 1.0 121 | ], 122 | "emissiveTexture" : { 123 | "index" : 2 124 | }, 125 | "name" : "Material_MR", 126 | "normalTexture" : { 127 | "index" : 4 128 | }, 129 | "occlusionTexture" : { 130 | "index" : 3 131 | }, 132 | "pbrMetallicRoughness" : { 133 | "baseColorTexture" : { 134 | "index" : 0 135 | }, 136 | "metallicRoughnessTexture" : { 137 | "index" : 1 138 | } 139 | } 140 | } 141 | ], 142 | "meshes" : [ 143 | { 144 | "name" : "mesh_helmet_LP_13930damagedHelmet", 145 | "primitives" : [ 146 | { 147 | "attributes" : { 148 | "NORMAL" : 2, 149 | "POSITION" : 1, 150 | "TEXCOORD_0" : 3 151 | }, 152 | "indices" : 0, 153 | "material" : 0 154 | } 155 | ] 156 | } 157 | ], 158 | "nodes" : [ 159 | { 160 | "mesh" : 0, 161 | "name" : "node_damagedHelmet_-6514", 162 | "rotation" : [ 163 | 0.7071068286895752, 164 | 0.0, 165 | -0.0, 166 | 0.7071068286895752 167 | ] 168 | } 169 | ], 170 | "samplers" : [ 171 | {} 172 | ], 173 | "scene" : 0, 174 | "scenes" : [ 175 | { 176 | "name" : "Scene", 177 | "nodes" : [ 178 | 0 179 | ] 180 | } 181 | ], 182 | "textures" : [ 183 | { 184 | "sampler" : 0, 185 | "source" : 0 186 | }, 187 | { 188 | "sampler" : 0, 189 | "source" : 1 190 | }, 191 | { 192 | "sampler" : 0, 193 | "source" : 2 194 | }, 195 | { 196 | "sampler" : 0, 197 | "source" : 3 198 | }, 199 | { 200 | "sampler" : 0, 201 | "source" : 4 202 | } 203 | ] 204 | } 205 | -------------------------------------------------------------------------------- /assets/DamagedHelmet/Default_AO.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TimvanScherpenzeel/gltf-to-usdz-research/4baa7859dfcea95a74eb8375a6d14842811ab286/assets/DamagedHelmet/Default_AO.jpg -------------------------------------------------------------------------------- /assets/DamagedHelmet/Default_albedo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TimvanScherpenzeel/gltf-to-usdz-research/4baa7859dfcea95a74eb8375a6d14842811ab286/assets/DamagedHelmet/Default_albedo.jpg -------------------------------------------------------------------------------- /assets/DamagedHelmet/Default_emissive.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TimvanScherpenzeel/gltf-to-usdz-research/4baa7859dfcea95a74eb8375a6d14842811ab286/assets/DamagedHelmet/Default_emissive.jpg -------------------------------------------------------------------------------- /assets/DamagedHelmet/Default_metalRoughness.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TimvanScherpenzeel/gltf-to-usdz-research/4baa7859dfcea95a74eb8375a6d14842811ab286/assets/DamagedHelmet/Default_metalRoughness.jpg -------------------------------------------------------------------------------- /assets/DamagedHelmet/Default_normal.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TimvanScherpenzeel/gltf-to-usdz-research/4baa7859dfcea95a74eb8375a6d14842811ab286/assets/DamagedHelmet/Default_normal.jpg -------------------------------------------------------------------------------- /assets/DamagedHelmet/LICENSE.md: -------------------------------------------------------------------------------- 1 | Battle Damaged Sci-fi Helmet - PBR by [theblueturtle_](https://sketchfab.com/theblueturtle_), published under 2 | a Creative Commons Attribution-NonCommercial license 3 | 4 | https://sketchfab.com/models/b81008d513954189a063ff901f7abfe4 5 | -------------------------------------------------------------------------------- /assets/DamagedHelmet_baseColorTexture.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TimvanScherpenzeel/gltf-to-usdz-research/4baa7859dfcea95a74eb8375a6d14842811ab286/assets/DamagedHelmet_baseColorTexture.jpg -------------------------------------------------------------------------------- /assets/DamagedHelmet_emissiveTexture.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TimvanScherpenzeel/gltf-to-usdz-research/4baa7859dfcea95a74eb8375a6d14842811ab286/assets/DamagedHelmet_emissiveTexture.jpg -------------------------------------------------------------------------------- /assets/DamagedHelmet_metallicTexture.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TimvanScherpenzeel/gltf-to-usdz-research/4baa7859dfcea95a74eb8375a6d14842811ab286/assets/DamagedHelmet_metallicTexture.jpg -------------------------------------------------------------------------------- /assets/DamagedHelmet_normalTexture.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TimvanScherpenzeel/gltf-to-usdz-research/4baa7859dfcea95a74eb8375a6d14842811ab286/assets/DamagedHelmet_normalTexture.jpg -------------------------------------------------------------------------------- /assets/DamagedHelmet_occlusionTexture.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TimvanScherpenzeel/gltf-to-usdz-research/4baa7859dfcea95a74eb8375a6d14842811ab286/assets/DamagedHelmet_occlusionTexture.jpg -------------------------------------------------------------------------------- /assets/DamagedHelmet_roughnessTexture.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TimvanScherpenzeel/gltf-to-usdz-research/4baa7859dfcea95a74eb8375a6d14842811ab286/assets/DamagedHelmet_roughnessTexture.jpg -------------------------------------------------------------------------------- /assets/helmet_including_preview.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TimvanScherpenzeel/gltf-to-usdz-research/4baa7859dfcea95a74eb8375a6d14842811ab286/assets/helmet_including_preview.jpg -------------------------------------------------------------------------------- /assets/preview.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TimvanScherpenzeel/gltf-to-usdz-research/4baa7859dfcea95a74eb8375a6d14842811ab286/assets/preview.jpg -------------------------------------------------------------------------------- /bin/gltf-to-usdz.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | require('../lib/index'); 3 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | USDZ 8 | 31 | 32 | 33 | 34 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /lib/argsHandler.js: -------------------------------------------------------------------------------- 1 | // Vendor 2 | const { ArgumentParser } = require('argparse'); 3 | 4 | // Package 5 | const pkg = require('../package.json'); 6 | 7 | const createParserArguments = () => { 8 | const parser = new ArgumentParser({ 9 | version: pkg.version, 10 | addHelp: true, 11 | description: pkg.description, 12 | }); 13 | 14 | // File input flag 15 | parser.addArgument(['-i', '--input'], { 16 | help: 'Input file including path', 17 | required: true, 18 | }); 19 | 20 | // File output flag 21 | parser.addArgument(['-o', '--output'], { 22 | help: 'Output file including path', 23 | required: true, 24 | }); 25 | 26 | // Model scale 27 | parser.addArgument(['-s', '--scale'], { 28 | help: 'Scale of the model', 29 | defaultValue: '1.0', 30 | required: false, 31 | }); 32 | 33 | return parser.parseArgs(); 34 | }; 35 | 36 | const args = createParserArguments(); 37 | 38 | module.exports = args; 39 | -------------------------------------------------------------------------------- /lib/constants.js: -------------------------------------------------------------------------------- 1 | const constants = { 2 | SUPPORTED_INPUT_TYPES: ['.gltf'], 3 | SUPPORTED_OUTPUT_TYPES: ['.usda'], 4 | }; 5 | 6 | module.exports = constants; 7 | -------------------------------------------------------------------------------- /lib/converter/constructOBJ.js: -------------------------------------------------------------------------------- 1 | // Native 2 | const fs = require('fs'); 3 | const path = require('path'); 4 | 5 | // Arguments 6 | const { input, output } = require('./../argsHandler'); 7 | 8 | // Utilities 9 | const { getFilename } = require('../utilities'); 10 | 11 | function constructOBJ(mesh) { 12 | const { 13 | vertices, uvs, normals, indices, 14 | } = mesh; 15 | 16 | const verticesData = vertices.bufferData; 17 | const verticesMax = vertices.max; 18 | const uvsData = uvs.bufferData; 19 | const normalsData = normals.bufferData; 20 | const indicesData = indices.bufferData; 21 | 22 | function packToUInt16Array(data) { 23 | const uintArray = new Uint16Array(data.length / 2); 24 | let byteOffset = 0; 25 | 26 | for (let i = 0; i < uintArray.length; i += 1) { 27 | [uintArray[i]] = new Uint16Array( 28 | new Uint8Array([data[byteOffset], data[byteOffset + 1]]).buffer, 29 | ); 30 | byteOffset += 2; 31 | } 32 | return uintArray; 33 | } 34 | 35 | function packToFloat32Array(data) { 36 | const floatArray = new Float32Array(data.length / 4); 37 | let byteOffset = 0; 38 | 39 | for (let i = 0; i < floatArray.length; i += 1) { 40 | [floatArray[i]] = new Float32Array( 41 | new Uint8Array([ 42 | data[byteOffset], 43 | data[byteOffset + 1], 44 | data[byteOffset + 2], 45 | data[byteOffset + 3], 46 | ]).buffer, 47 | ); 48 | 49 | byteOffset += 4; 50 | } 51 | 52 | return floatArray; 53 | } 54 | 55 | const inputFileName = path.basename(input); 56 | const outputFilePath = path.resolve(path.dirname(output)); 57 | 58 | let objData = '# gltf-to-usdz\n'; 59 | objData += '#\n'; 60 | objData += '# https://github.com/TimvanScherpenzeel/gltf-to-usdz\n'; 61 | objData += '#\n'; 62 | objData += 'g model\n'; 63 | 64 | // vertices: Float32Array; (3) 65 | if (verticesData) { 66 | const verticesFloatArray = packToFloat32Array(verticesData); 67 | 68 | // Order and sign is normally wrong (due to different coordinate system?) (x, y, z) 69 | // v 0.646051287651062 -0.6916618943214417 -0.047537729144096375 70 | 71 | // Which should be (x, z, y) 72 | // v 0.646051287651062 0.0475378284621125 -0.6916619808652279 73 | 74 | for (let i = 0; i < verticesFloatArray.length; i += 3) { 75 | const x = verticesFloatArray[i]; 76 | const y = verticesFloatArray[i + 1]; 77 | 78 | // Move pivot point to the bottom of the model (from the center) 79 | // I originally thought this would be verticesMax[2] / 2 as you would 80 | // move from the center to the bottom but when testing it shows lower 81 | // than the reference apple.obj model (which was confirmed to be correct) 82 | const z = verticesFloatArray[i + 2] - verticesMax[2]; 83 | 84 | objData += `v ${x} ${z * -1.0} ${y}\n`; 85 | } 86 | } 87 | 88 | // uvs: Float32Array; (2) 89 | if (uvsData) { 90 | const uvsFloatArray = packToFloat32Array(uvsData); 91 | 92 | for (let i = 0; i < uvsFloatArray.length; i += 2) { 93 | const x = uvsFloatArray[i]; 94 | const y = uvsFloatArray[i + 1]; 95 | 96 | objData += `vt ${x} ${y}\n`; 97 | } 98 | } 99 | 100 | // normals: Float32Array; (3) 101 | if (normalsData) { 102 | const normalsFloatArray = packToFloat32Array(normalsData); 103 | 104 | // Order and sign is normally wrong (due to different coordinate system?) (x, y, z) 105 | // vn 0 -0.5976134538650513 0.8017517328262329 106 | 107 | // Which should be (x, z, y) 108 | // vn 0 -0.8017515448091482 -0.5976134812928081 109 | 110 | for (let i = 0; i < normalsFloatArray.length; i += 3) { 111 | const x = normalsFloatArray[i]; 112 | const y = normalsFloatArray[i + 1]; 113 | const z = normalsFloatArray[i + 2]; 114 | 115 | objData += `vn ${x} ${z * -1.0} ${y}\n`; 116 | } 117 | } 118 | 119 | // indices: Uint16Array; (3) 120 | if (indicesData) { 121 | const indicesFloatArray = packToUInt16Array(indicesData); 122 | 123 | for (let i = 0; i < indicesFloatArray.length; i += 3) { 124 | const v1 = indicesFloatArray[i] + 1; 125 | const v2 = indicesFloatArray[i + 1] + 1; 126 | const v3 = indicesFloatArray[i + 2] + 1; 127 | 128 | objData += `f ${v1}/${v1}/${v1} ${v2}/${v2}/${v2} ${v3}/${v3}/${v3}\n`; 129 | } 130 | } 131 | 132 | const objFullpath = `${outputFilePath}/${getFilename(inputFileName)}.obj`; 133 | 134 | try { 135 | fs.writeFileSync(objFullpath, objData); 136 | } catch (err) { 137 | return Promise.reject(err); 138 | } 139 | 140 | console.log('Written file to', objFullpath); 141 | 142 | return Promise.resolve({ 143 | objPath: `${getFilename(inputFileName)}.obj`, 144 | }); 145 | } 146 | 147 | module.exports = constructOBJ; 148 | -------------------------------------------------------------------------------- /lib/converter/constructUSDA.js: -------------------------------------------------------------------------------- 1 | function constructUSDA(options = {}) { 2 | Object.assign(this, options); 3 | 4 | // glTF 2.0 uses lower left corner as origin 5 | // USD also user lower left corner as origin 6 | // [(0, 0), (1, 0), (1,1), (0, 1)] 7 | function createMapSection(fileName, filePath) { 8 | return `def Shader "${fileName}" 9 | { 10 | uniform token info:id = "UsdUVTexture" 11 | float4 inputs:default = (0, 0, 0, 1) 12 | asset inputs:file = @${filePath}@ 13 | float2 inputs:st.connect = 14 | token inputs:wrapS = "repeat" 15 | token inputs:wrapT = "repeat" 16 | float3 outputs:rgb 17 | }`; 18 | } 19 | 20 | return `#usda 1.0 21 | ( 22 | endTimeCode = 200 23 | startTimeCode = 1 24 | timeCodesPerSecond = 24 25 | upAxis = "Y" 26 | ) 27 | 28 | def Scope "Materials" 29 | { 30 | 31 | def Material "StingrayPBS_0" 32 | { 33 | token inputs:frame:stPrimvarName = "Texture_uv" 34 | token outputs:displacement.connect = 35 | token outputs:surface.connect = 36 | 37 | def Shader "pbrMat1" 38 | { 39 | uniform token info:id = "UsdPreviewSurface" 40 | float inputs:clearcoat = 0 41 | float inputs:clearcoatRoughness = 0 42 | color3f inputs:diffuseColor.connect = 43 | float inputs:displacement = 0 44 | color3f inputs:emissiveColor.connect = 45 | float inputs:ior = 1.5 46 | float inputs:metallic.connect = 47 | normal3f inputs:normal.connect = 48 | float inputs:occlusion.connect = 49 | float inputs:opacity = 1 50 | float inputs:roughness.connect = 51 | color3f inputs:specularColor = (1, 1, 1) 52 | int inputs:useSpecularWorkflow = 0 53 | token outputs:displacement 54 | token outputs:surface 55 | } 56 | 57 | def Shader "Primvar" 58 | { 59 | uniform token info:id = "UsdPrimvarReader_float2" 60 | float2 inputs:default = (0, 0) 61 | token inputs:varname.connect = 62 | float2 outputs:result 63 | } 64 | 65 | ${this.colorTexture ? createMapSection('color_map', this.colorTexture) : ''} 66 | 67 | ${this.emissiveTexture ? createMapSection('emissive_map', this.emissiveTexture) : ''} 68 | 69 | ${this.metallicTexture ? createMapSection('metallic_map', this.metallicTexture) : ''} 70 | 71 | ${this.normalTexture ? createMapSection('normal_map', this.normalTexture) : ''} 72 | 73 | ${this.aoTexture ? createMapSection('ao_map', this.aoTexture) : ''} 74 | 75 | ${this.roughnessTexture ? createMapSection('roughness_map', this.roughnessTexture) : ''} 76 | } 77 | } 78 | def "Mesh_0" ( 79 | add references = @${this.objPath}@ 80 | ) 81 | { 82 | rel material:binding = 83 | float3 xformOp:scale = (${this.objScale}) 84 | uniform token[] xformOpOrder = ["xformOp:scale"] 85 | }`; 86 | } 87 | 88 | module.exports = constructUSDA; 89 | -------------------------------------------------------------------------------- /lib/converter/handleTextures.js: -------------------------------------------------------------------------------- 1 | // Native 2 | const fs = require('fs'); 3 | const path = require('path'); 4 | 5 | // Vendor 6 | const sharp = require('sharp'); 7 | 8 | // Arguments 9 | const { input, output } = require('./../argsHandler'); 10 | 11 | // Utilities 12 | const { getFilename } = require('../utilities'); 13 | 14 | function handleTextures(textures) { 15 | const convertedTextures = Object.assign({}, textures); 16 | const inputFileName = path.basename(input); 17 | const inputFilePath = path.resolve(path.dirname(input)); 18 | const outputFilePath = path.resolve(path.dirname(output)); 19 | 20 | const convertTexture = ([texture, texturePath]) => { 21 | // skip metallicRoughnessTexture because we need to make 2 textures out of it 22 | if (texture === 'metallicRoughnessTexture' || !texturePath) { 23 | return Promise.resolve(); 24 | } 25 | 26 | const inputTexturePath = path.join(inputFilePath, texturePath); 27 | if (!fs.existsSync(inputTexturePath)) { 28 | const err = new Error(`${texture} texture (${inputTexturePath}) does not exist`); 29 | 30 | return Promise.reject(err); 31 | } 32 | 33 | const outTextureName = `${getFilename(inputFileName)}_${texture}.jpg`; 34 | const outputTexturePath = path.join(outputFilePath, outTextureName); 35 | 36 | sharp(inputTexturePath) 37 | .flip() 38 | .toFile(outputTexturePath); 39 | 40 | console.log(`Written file to ${outputTexturePath}`); 41 | 42 | convertedTextures[texture] = outTextureName; 43 | 44 | return Promise.resolve(); 45 | }; 46 | 47 | const { metallicRoughnessTexture } = textures; 48 | 49 | if (metallicRoughnessTexture) { 50 | // Roughness is stored in the 'g' channel, metallic is stored in the 'b' channel. 51 | // This layout intentionally reserves the 'r' channel for (optional) occlusion map data 52 | const inputTexturePath = path.join(inputFilePath, metallicRoughnessTexture); 53 | 54 | if (!fs.existsSync(inputTexturePath)) { 55 | const err = new Error( 56 | `metallicRoughnessTexture texture (${inputTexturePath}) does not exist`, 57 | ); 58 | 59 | return Promise.reject(err); 60 | } 61 | 62 | const outputMetallicPath = path.join( 63 | outputFilePath, 64 | `${getFilename(inputFileName)}_metallicTexture.jpg`, 65 | ); 66 | 67 | const outputRoughnessPath = path.join( 68 | outputFilePath, 69 | `${getFilename(inputFileName)}_roughnessTexture.jpg`, 70 | ); 71 | 72 | sharp(inputTexturePath) 73 | .extractChannel('blue') 74 | .flip() 75 | .toFile(outputMetallicPath); 76 | 77 | console.log(`Written file to ${outputMetallicPath}`); 78 | 79 | convertedTextures.metallicTexture = `${getFilename(inputFileName)}_metallicTexture.jpg`; 80 | 81 | sharp(inputTexturePath) 82 | .extractChannel('green') 83 | .flip() 84 | .toFile(outputRoughnessPath); 85 | 86 | console.log(`Written file to ${outputRoughnessPath}`); 87 | 88 | convertedTextures.roughnessTexture = `${getFilename(inputFileName)}_roughnessTexture.jpg`; 89 | } 90 | 91 | return Promise.all(Object.entries(textures).map(convertTexture)).then(() => convertedTextures); 92 | } 93 | 94 | module.exports = handleTextures; 95 | -------------------------------------------------------------------------------- /lib/converter/index.js: -------------------------------------------------------------------------------- 1 | // Arguments 2 | const { scale } = require('./../argsHandler'); 3 | 4 | // Converter 5 | const constructOBJ = require('./constructOBJ'); 6 | const constructUSDA = require('./constructUSDA'); 7 | const handleTextures = require('./handleTextures'); 8 | const parseGLTF = require('./parseGLTF'); 9 | 10 | function convert(gltf) { 11 | return parseGLTF(gltf) 12 | .then((parsedGLTF) => { 13 | // Extract and write to disk all textures from the glTF file 14 | const textures = handleTextures(parsedGLTF.textures); 15 | 16 | // Construct and write to disk .obj file 17 | const objData = constructOBJ(parsedGLTF.meshes); 18 | 19 | return Promise.all([textures, objData]); 20 | }) 21 | .then(([textures, objData]) => { 22 | const { 23 | baseColorTexture, 24 | emissiveTexture, 25 | occlusionTexture, 26 | normalTexture, 27 | metallicTexture, 28 | roughnessTexture, 29 | } = textures; 30 | 31 | const { objPath } = objData; 32 | 33 | const usdaData = constructUSDA({ 34 | objPath: `${objPath}`, 35 | objScale: `${scale}, ${scale}, ${scale}`, 36 | colorTexture: baseColorTexture, 37 | emissiveTexture, 38 | metallicTexture, 39 | normalTexture, 40 | aoTexture: occlusionTexture, 41 | roughnessTexture, 42 | }); 43 | 44 | return usdaData; 45 | }); 46 | } 47 | 48 | module.exports = convert; 49 | -------------------------------------------------------------------------------- /lib/converter/parseGLTF.js: -------------------------------------------------------------------------------- 1 | // Native 2 | const path = require('path'); 3 | 4 | // Arguments 5 | const { input } = require('./../argsHandler'); 6 | 7 | // File loader 8 | const fileLoader = require('./../fileLoader'); 9 | 10 | function parseGLTF(gltf) { 11 | const inputFilePath = path.resolve(path.dirname(input)); 12 | 13 | const { 14 | accessors, buffers, bufferViews, images, materials, textures, meshes, 15 | } = gltf; 16 | 17 | // Geometry attributes 18 | // need to loop over all primitives since they each can use their own materials 19 | const meshAttributesData = meshes[0].primitives[0].attributes; 20 | 21 | // Geometry data 22 | const meshDataIndicesIndex = meshes[0].primitives[0].indices; 23 | const meshDataNormalIndex = meshAttributesData.NORMAL; 24 | const meshDataPositionIndex = meshAttributesData.POSITION; 25 | const meshDataTexcoordIndex = meshAttributesData.TEXCOORD_0; 26 | 27 | const meshList = fileLoader(path.join(inputFilePath, buffers[0].uri)).then((bin) => { 28 | const accessorFn = ({ 29 | min, max, componentType, bufferView, 30 | }) => { 31 | const ret = {}; 32 | 33 | if (min) { 34 | ret.min = min 35 | .toString() 36 | .split(',') 37 | .map(v => parseFloat(v)); 38 | } 39 | 40 | if (max) { 41 | ret.max = max 42 | .toString() 43 | .split(',') 44 | .map(v => parseFloat(v)); 45 | } 46 | 47 | const bufferViewData = bufferViews[bufferView]; 48 | const slicedBuffer = bin.slice( 49 | bufferViewData.byteOffset, 50 | bufferViewData.byteOffset + bufferViewData.byteLength, 51 | ); 52 | 53 | if (componentType === 5126) { 54 | ret.bufferData = new Float32Array(slicedBuffer); 55 | } else if (componentType === 5123) { 56 | ret.bufferData = new Uint16Array(slicedBuffer); 57 | } else { 58 | console.warn(`componentType ${componentType} is unknown`); 59 | } 60 | 61 | return ret; 62 | }; 63 | 64 | return accessors.map(accessorFn); 65 | }); 66 | 67 | // Texture data 68 | let textureList; 69 | let baseColorTexture = false; 70 | let metallicRoughnessTexture = false; 71 | let emissiveTexture = false; 72 | let occlusionTexture = false; 73 | let normalTexture = false; 74 | 75 | if (textures) { 76 | textureList = textures.map(texture => images[texture.source].uri); 77 | 78 | if (materials[0].pbrMetallicRoughness.baseColorTexture) { 79 | baseColorTexture = textureList[materials[0].pbrMetallicRoughness.baseColorTexture.index]; 80 | } 81 | 82 | if (materials[0].pbrMetallicRoughness.metallicRoughnessTexture) { 83 | // eslint-disable-next-line 84 | metallicRoughnessTexture = 85 | textureList[materials[0].pbrMetallicRoughness.metallicRoughnessTexture.index]; 86 | } 87 | 88 | if (materials[0].emissiveTexture) { 89 | emissiveTexture = textureList[materials[0].emissiveTexture.index]; 90 | } 91 | 92 | if (materials[0].occlusionTexture) { 93 | occlusionTexture = textureList[materials[0].occlusionTexture.index]; 94 | } 95 | 96 | if (materials[0].normalTexture) { 97 | normalTexture = textureList[materials[0].normalTexture.index]; 98 | } 99 | } 100 | 101 | return Promise.resolve(meshList).then((geometryData) => { 102 | const meshData = { 103 | textures: { 104 | baseColorTexture, 105 | metallicRoughnessTexture, 106 | emissiveTexture, 107 | occlusionTexture, 108 | normalTexture, 109 | }, 110 | meshes: { 111 | vertices: geometryData[meshDataPositionIndex], 112 | normals: geometryData[meshDataNormalIndex], 113 | indices: geometryData[meshDataIndicesIndex], 114 | uvs: geometryData[meshDataTexcoordIndex], 115 | }, 116 | }; 117 | 118 | return meshData; 119 | }); 120 | } 121 | 122 | module.exports = parseGLTF; 123 | -------------------------------------------------------------------------------- /lib/fileLoader.js: -------------------------------------------------------------------------------- 1 | // Native 2 | const fs = require('fs'); 3 | 4 | const fileLoader = (filename, type = '') => new Promise((resolve, reject) => { 5 | fs.readFile(filename, type, (error, data) => { 6 | if (error) { 7 | reject(error); 8 | } 9 | 10 | resolve(data); 11 | }); 12 | }); 13 | 14 | module.exports = fileLoader; 15 | -------------------------------------------------------------------------------- /lib/index.js: -------------------------------------------------------------------------------- 1 | // Native 2 | const fs = require('fs'); 3 | const path = require('path'); 4 | 5 | // Vendor 6 | const gltfValidator = require('gltf-validator'); 7 | 8 | // Converter 9 | const converter = require('./converter'); 10 | 11 | // Arguments 12 | const { input, output } = require('./argsHandler'); 13 | 14 | // Constants 15 | const { SUPPORTED_INPUT_TYPES, SUPPORTED_OUTPUT_TYPES } = require('./constants'); 16 | 17 | // File loader 18 | const fileLoader = require('./fileLoader'); 19 | 20 | const inputFileExtension = path.extname(input); 21 | const outputFileExtension = path.extname(output); 22 | 23 | if (!SUPPORTED_OUTPUT_TYPES.includes(outputFileExtension)) { 24 | console.error(`${outputFileExtension} is not supported.`); 25 | console.error(`The supported filetypes are: [${SUPPORTED_OUTPUT_TYPES}]`); 26 | 27 | process.exit(1); 28 | } 29 | 30 | if (!SUPPORTED_INPUT_TYPES.includes(inputFileExtension)) { 31 | console.error(`${inputFileExtension} is not supported.`); 32 | console.error(`The supported file extensions are: [${SUPPORTED_INPUT_TYPES}]`); 33 | } 34 | 35 | fileLoader(input, 'utf8') 36 | .then((gltf) => { 37 | const parsedGltf = JSON.parse(gltf); 38 | 39 | gltfValidator 40 | .validateBytes(new Uint8Array(Buffer.from(JSON.stringify(parsedGltf)))) 41 | .catch((error) => { 42 | console.warn('Validation failed: ', error); 43 | 44 | process.exit(1); 45 | }); 46 | 47 | return converter(parsedGltf); 48 | }) 49 | .then((data) => { 50 | try { 51 | fs.writeFileSync(output, data); 52 | } catch (err) { 53 | return Promise.reject(err); 54 | } 55 | 56 | console.log(`Written file to ${output}`); 57 | 58 | return Promise.resolve(); 59 | }) 60 | .catch((error) => { 61 | console.error(error); 62 | 63 | process.exit(1); 64 | }); 65 | -------------------------------------------------------------------------------- /lib/utilities.js: -------------------------------------------------------------------------------- 1 | // Native 2 | const path = require('path'); 3 | 4 | const utilities = { 5 | getFilename: filename => path.parse(filename).name, 6 | }; 7 | 8 | module.exports = utilities; 9 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "gltf-to-usdz-research", 3 | "version": "0.0.1", 4 | "description": "Proof of concept of converting glTF to USDZ for AR Quick Look (iOS 12+).", 5 | "main": "index.js", 6 | "bin": { 7 | "gltf-to-usdz": "gltf-to-usdz.js" 8 | }, 9 | "directories": { 10 | "lib": "lib" 11 | }, 12 | "repository": { 13 | "type": "git", 14 | "url": "git+https://github.com/TimvanScherpenzeel/gltf-to-usdz-research.git" 15 | }, 16 | "author": "Tim van Scherpenzeel", 17 | "license": "MIT", 18 | "bugs": { 19 | "url": "https://github.com/TimvanScherpenzeel/gltf-to-usdz-research/issues" 20 | }, 21 | "homepage": "https://github.com/TimvanScherpenzeel/gltf-to-usdz-research#readme", 22 | "scripts": { 23 | "lint": "eslint './**/*.js' --ignore-pattern '!.eslintrc.js' .eslintrc.js" 24 | }, 25 | "dependencies": { 26 | "argparse": "^1.0.10", 27 | "gltf-validator": "^2.0.0-dev.2.5", 28 | "sharp": "^0.20.8" 29 | }, 30 | "devDependencies": { 31 | "eslint": "^5.5.0", 32 | "eslint-config-airbnb-base": "^13.1.0", 33 | "eslint-plugin-import": "^2.14.0", 34 | "prettier": "^1.14.2", 35 | "prettier-eslint": "^8.8.2" 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@babel/code-frame@^7.0.0": 6 | version "7.0.0" 7 | resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8" 8 | dependencies: 9 | "@babel/highlight" "^7.0.0" 10 | 11 | "@babel/highlight@^7.0.0": 12 | version "7.0.0" 13 | resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0.tgz#f710c38c8d458e6dd9a201afb637fcb781ce99e4" 14 | dependencies: 15 | chalk "^2.0.0" 16 | esutils "^2.0.2" 17 | js-tokens "^4.0.0" 18 | 19 | acorn-jsx@^3.0.0: 20 | version "3.0.1" 21 | resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" 22 | dependencies: 23 | acorn "^3.0.4" 24 | 25 | acorn-jsx@^4.1.1: 26 | version "4.1.1" 27 | resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-4.1.1.tgz#e8e41e48ea2fe0c896740610ab6a4ffd8add225e" 28 | dependencies: 29 | acorn "^5.0.3" 30 | 31 | acorn@^3.0.4: 32 | version "3.3.0" 33 | resolved "http://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" 34 | 35 | acorn@^5.0.3, acorn@^5.5.0, acorn@^5.6.0: 36 | version "5.7.3" 37 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" 38 | 39 | ajv-keywords@^2.1.0: 40 | version "2.1.1" 41 | resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762" 42 | 43 | ajv-keywords@^3.0.0: 44 | version "3.2.0" 45 | resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.2.0.tgz#e86b819c602cf8821ad637413698f1dec021847a" 46 | 47 | ajv@^5.2.3, ajv@^5.3.0: 48 | version "5.5.2" 49 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" 50 | dependencies: 51 | co "^4.6.0" 52 | fast-deep-equal "^1.0.0" 53 | fast-json-stable-stringify "^2.0.0" 54 | json-schema-traverse "^0.3.0" 55 | 56 | ajv@^6.0.1, ajv@^6.5.3: 57 | version "6.5.3" 58 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.3.tgz#71a569d189ecf4f4f321224fecb166f071dd90f9" 59 | dependencies: 60 | fast-deep-equal "^2.0.1" 61 | fast-json-stable-stringify "^2.0.0" 62 | json-schema-traverse "^0.4.1" 63 | uri-js "^4.2.2" 64 | 65 | ansi-escapes@^3.0.0: 66 | version "3.1.0" 67 | resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.1.0.tgz#f73207bb81207d75fd6c83f125af26eea378ca30" 68 | 69 | ansi-regex@^2.0.0: 70 | version "2.1.1" 71 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 72 | 73 | ansi-regex@^3.0.0: 74 | version "3.0.0" 75 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" 76 | 77 | ansi-styles@^2.2.1: 78 | version "2.2.1" 79 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 80 | 81 | ansi-styles@^3.2.0, ansi-styles@^3.2.1: 82 | version "3.2.1" 83 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 84 | dependencies: 85 | color-convert "^1.9.0" 86 | 87 | aproba@^1.0.3: 88 | version "1.2.0" 89 | resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" 90 | 91 | are-we-there-yet@~1.1.2: 92 | version "1.1.5" 93 | resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" 94 | dependencies: 95 | delegates "^1.0.0" 96 | readable-stream "^2.0.6" 97 | 98 | argparse@^1.0.10, argparse@^1.0.7: 99 | version "1.0.10" 100 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" 101 | dependencies: 102 | sprintf-js "~1.0.2" 103 | 104 | array-union@^1.0.1: 105 | version "1.0.2" 106 | resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" 107 | dependencies: 108 | array-uniq "^1.0.1" 109 | 110 | array-uniq@^1.0.1: 111 | version "1.0.3" 112 | resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" 113 | 114 | arrify@^1.0.0: 115 | version "1.0.1" 116 | resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" 117 | 118 | babel-code-frame@^6.22.0: 119 | version "6.26.0" 120 | resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" 121 | dependencies: 122 | chalk "^1.1.3" 123 | esutils "^2.0.2" 124 | js-tokens "^3.0.2" 125 | 126 | babel-runtime@^6.26.0: 127 | version "6.26.0" 128 | resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" 129 | dependencies: 130 | core-js "^2.4.0" 131 | regenerator-runtime "^0.11.0" 132 | 133 | balanced-match@^1.0.0: 134 | version "1.0.0" 135 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 136 | 137 | bl@^1.0.0: 138 | version "1.2.2" 139 | resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.2.tgz#a160911717103c07410cef63ef51b397c025af9c" 140 | dependencies: 141 | readable-stream "^2.3.5" 142 | safe-buffer "^5.1.1" 143 | 144 | brace-expansion@^1.1.7: 145 | version "1.1.11" 146 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 147 | dependencies: 148 | balanced-match "^1.0.0" 149 | concat-map "0.0.1" 150 | 151 | buffer-alloc-unsafe@^1.1.0: 152 | version "1.1.0" 153 | resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" 154 | 155 | buffer-alloc@^1.1.0: 156 | version "1.2.0" 157 | resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" 158 | dependencies: 159 | buffer-alloc-unsafe "^1.1.0" 160 | buffer-fill "^1.0.0" 161 | 162 | buffer-fill@^1.0.0: 163 | version "1.0.0" 164 | resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" 165 | 166 | buffer-from@^1.0.0: 167 | version "1.1.1" 168 | resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" 169 | 170 | builtin-modules@^1.0.0: 171 | version "1.1.1" 172 | resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" 173 | 174 | caller-path@^0.1.0: 175 | version "0.1.0" 176 | resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" 177 | dependencies: 178 | callsites "^0.2.0" 179 | 180 | callsites@^0.2.0: 181 | version "0.2.0" 182 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" 183 | 184 | chalk@^1.1.3: 185 | version "1.1.3" 186 | resolved "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 187 | dependencies: 188 | ansi-styles "^2.2.1" 189 | escape-string-regexp "^1.0.2" 190 | has-ansi "^2.0.0" 191 | strip-ansi "^3.0.0" 192 | supports-color "^2.0.0" 193 | 194 | chalk@^2.0.0, chalk@^2.1.0: 195 | version "2.4.1" 196 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" 197 | dependencies: 198 | ansi-styles "^3.2.1" 199 | escape-string-regexp "^1.0.5" 200 | supports-color "^5.3.0" 201 | 202 | chardet@^0.4.0: 203 | version "0.4.2" 204 | resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" 205 | 206 | chardet@^0.7.0: 207 | version "0.7.0" 208 | resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" 209 | 210 | chownr@^1.0.1: 211 | version "1.0.1" 212 | resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181" 213 | 214 | circular-json@^0.3.1: 215 | version "0.3.3" 216 | resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" 217 | 218 | cli-cursor@^2.1.0: 219 | version "2.1.0" 220 | resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" 221 | dependencies: 222 | restore-cursor "^2.0.0" 223 | 224 | cli-width@^2.0.0: 225 | version "2.2.0" 226 | resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" 227 | 228 | co@^4.6.0: 229 | version "4.6.0" 230 | resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" 231 | 232 | code-point-at@^1.0.0: 233 | version "1.1.0" 234 | resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" 235 | 236 | color-convert@^1.9.0, color-convert@^1.9.1: 237 | version "1.9.3" 238 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 239 | dependencies: 240 | color-name "1.1.3" 241 | 242 | color-name@1.1.3, color-name@^1.0.0: 243 | version "1.1.3" 244 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 245 | 246 | color-string@^1.5.2: 247 | version "1.5.3" 248 | resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.3.tgz#c9bbc5f01b58b5492f3d6857459cb6590ce204cc" 249 | dependencies: 250 | color-name "^1.0.0" 251 | simple-swizzle "^0.2.2" 252 | 253 | color@^3.0.0: 254 | version "3.0.0" 255 | resolved "https://registry.yarnpkg.com/color/-/color-3.0.0.tgz#d920b4328d534a3ac8295d68f7bd4ba6c427be9a" 256 | dependencies: 257 | color-convert "^1.9.1" 258 | color-string "^1.5.2" 259 | 260 | common-tags@^1.4.0: 261 | version "1.8.0" 262 | resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.0.tgz#8e3153e542d4a39e9b10554434afaaf98956a937" 263 | 264 | concat-map@0.0.1: 265 | version "0.0.1" 266 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 267 | 268 | concat-stream@^1.6.0: 269 | version "1.6.2" 270 | resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" 271 | dependencies: 272 | buffer-from "^1.0.0" 273 | inherits "^2.0.3" 274 | readable-stream "^2.2.2" 275 | typedarray "^0.0.6" 276 | 277 | console-control-strings@^1.0.0, console-control-strings@~1.1.0: 278 | version "1.1.0" 279 | resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" 280 | 281 | contains-path@^0.1.0: 282 | version "0.1.0" 283 | resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" 284 | 285 | core-js@^2.4.0: 286 | version "2.5.7" 287 | resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.7.tgz#f972608ff0cead68b841a16a932d0b183791814e" 288 | 289 | core-util-is@~1.0.0: 290 | version "1.0.2" 291 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 292 | 293 | cross-spawn@^5.1.0: 294 | version "5.1.0" 295 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" 296 | dependencies: 297 | lru-cache "^4.0.1" 298 | shebang-command "^1.2.0" 299 | which "^1.2.9" 300 | 301 | cross-spawn@^6.0.5: 302 | version "6.0.5" 303 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" 304 | dependencies: 305 | nice-try "^1.0.4" 306 | path-key "^2.0.1" 307 | semver "^5.5.0" 308 | shebang-command "^1.2.0" 309 | which "^1.2.9" 310 | 311 | debug@^2.6.8, debug@^2.6.9: 312 | version "2.6.9" 313 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 314 | dependencies: 315 | ms "2.0.0" 316 | 317 | debug@^3.1.0: 318 | version "3.2.5" 319 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.5.tgz#c2418fbfd7a29f4d4f70ff4cea604d4b64c46407" 320 | dependencies: 321 | ms "^2.1.1" 322 | 323 | decompress-response@^3.3.0: 324 | version "3.3.0" 325 | resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" 326 | dependencies: 327 | mimic-response "^1.0.0" 328 | 329 | deep-extend@^0.6.0: 330 | version "0.6.0" 331 | resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" 332 | 333 | deep-is@~0.1.3: 334 | version "0.1.3" 335 | resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" 336 | 337 | define-properties@^1.1.2: 338 | version "1.1.3" 339 | resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" 340 | dependencies: 341 | object-keys "^1.0.12" 342 | 343 | del@^2.0.2: 344 | version "2.2.2" 345 | resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" 346 | dependencies: 347 | globby "^5.0.0" 348 | is-path-cwd "^1.0.0" 349 | is-path-in-cwd "^1.0.0" 350 | object-assign "^4.0.1" 351 | pify "^2.0.0" 352 | pinkie-promise "^2.0.0" 353 | rimraf "^2.2.8" 354 | 355 | delegates@^1.0.0: 356 | version "1.0.0" 357 | resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" 358 | 359 | detect-libc@^1.0.3: 360 | version "1.0.3" 361 | resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" 362 | 363 | dlv@^1.1.0: 364 | version "1.1.2" 365 | resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.2.tgz#270f6737b30d25b6657a7e962c784403f85137e5" 366 | 367 | doctrine@1.5.0: 368 | version "1.5.0" 369 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" 370 | dependencies: 371 | esutils "^2.0.2" 372 | isarray "^1.0.0" 373 | 374 | doctrine@^2.1.0: 375 | version "2.1.0" 376 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" 377 | dependencies: 378 | esutils "^2.0.2" 379 | 380 | end-of-stream@^1.0.0, end-of-stream@^1.1.0: 381 | version "1.4.1" 382 | resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" 383 | dependencies: 384 | once "^1.4.0" 385 | 386 | error-ex@^1.2.0: 387 | version "1.3.2" 388 | resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" 389 | dependencies: 390 | is-arrayish "^0.2.1" 391 | 392 | es-abstract@^1.6.1: 393 | version "1.12.0" 394 | resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.12.0.tgz#9dbbdd27c6856f0001421ca18782d786bf8a6165" 395 | dependencies: 396 | es-to-primitive "^1.1.1" 397 | function-bind "^1.1.1" 398 | has "^1.0.1" 399 | is-callable "^1.1.3" 400 | is-regex "^1.0.4" 401 | 402 | es-to-primitive@^1.1.1: 403 | version "1.1.1" 404 | resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d" 405 | dependencies: 406 | is-callable "^1.1.1" 407 | is-date-object "^1.0.1" 408 | is-symbol "^1.0.1" 409 | 410 | escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: 411 | version "1.0.5" 412 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 413 | 414 | eslint-config-airbnb-base@^13.1.0: 415 | version "13.1.0" 416 | resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-13.1.0.tgz#b5a1b480b80dfad16433d6c4ad84e6605052c05c" 417 | dependencies: 418 | eslint-restricted-globals "^0.1.1" 419 | object.assign "^4.1.0" 420 | object.entries "^1.0.4" 421 | 422 | eslint-import-resolver-node@^0.3.1: 423 | version "0.3.2" 424 | resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz#58f15fb839b8d0576ca980413476aab2472db66a" 425 | dependencies: 426 | debug "^2.6.9" 427 | resolve "^1.5.0" 428 | 429 | eslint-module-utils@^2.2.0: 430 | version "2.2.0" 431 | resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.2.0.tgz#b270362cd88b1a48ad308976ce7fa54e98411746" 432 | dependencies: 433 | debug "^2.6.8" 434 | pkg-dir "^1.0.0" 435 | 436 | eslint-plugin-import@^2.14.0: 437 | version "2.14.0" 438 | resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.14.0.tgz#6b17626d2e3e6ad52cfce8807a845d15e22111a8" 439 | dependencies: 440 | contains-path "^0.1.0" 441 | debug "^2.6.8" 442 | doctrine "1.5.0" 443 | eslint-import-resolver-node "^0.3.1" 444 | eslint-module-utils "^2.2.0" 445 | has "^1.0.1" 446 | lodash "^4.17.4" 447 | minimatch "^3.0.3" 448 | read-pkg-up "^2.0.0" 449 | resolve "^1.6.0" 450 | 451 | eslint-restricted-globals@^0.1.1: 452 | version "0.1.1" 453 | resolved "https://registry.yarnpkg.com/eslint-restricted-globals/-/eslint-restricted-globals-0.1.1.tgz#35f0d5cbc64c2e3ed62e93b4b1a7af05ba7ed4d7" 454 | 455 | eslint-scope@^3.7.1: 456 | version "3.7.3" 457 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.3.tgz#bb507200d3d17f60247636160b4826284b108535" 458 | dependencies: 459 | esrecurse "^4.1.0" 460 | estraverse "^4.1.1" 461 | 462 | eslint-scope@^4.0.0: 463 | version "4.0.0" 464 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.0.tgz#50bf3071e9338bcdc43331794a0cb533f0136172" 465 | dependencies: 466 | esrecurse "^4.1.0" 467 | estraverse "^4.1.1" 468 | 469 | eslint-utils@^1.3.1: 470 | version "1.3.1" 471 | resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.3.1.tgz#9a851ba89ee7c460346f97cf8939c7298827e512" 472 | 473 | eslint-visitor-keys@^1.0.0: 474 | version "1.0.0" 475 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" 476 | 477 | eslint@^4.0.0: 478 | version "4.19.1" 479 | resolved "http://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz#32d1d653e1d90408854bfb296f076ec7e186a300" 480 | dependencies: 481 | ajv "^5.3.0" 482 | babel-code-frame "^6.22.0" 483 | chalk "^2.1.0" 484 | concat-stream "^1.6.0" 485 | cross-spawn "^5.1.0" 486 | debug "^3.1.0" 487 | doctrine "^2.1.0" 488 | eslint-scope "^3.7.1" 489 | eslint-visitor-keys "^1.0.0" 490 | espree "^3.5.4" 491 | esquery "^1.0.0" 492 | esutils "^2.0.2" 493 | file-entry-cache "^2.0.0" 494 | functional-red-black-tree "^1.0.1" 495 | glob "^7.1.2" 496 | globals "^11.0.1" 497 | ignore "^3.3.3" 498 | imurmurhash "^0.1.4" 499 | inquirer "^3.0.6" 500 | is-resolvable "^1.0.0" 501 | js-yaml "^3.9.1" 502 | json-stable-stringify-without-jsonify "^1.0.1" 503 | levn "^0.3.0" 504 | lodash "^4.17.4" 505 | minimatch "^3.0.2" 506 | mkdirp "^0.5.1" 507 | natural-compare "^1.4.0" 508 | optionator "^0.8.2" 509 | path-is-inside "^1.0.2" 510 | pluralize "^7.0.0" 511 | progress "^2.0.0" 512 | regexpp "^1.0.1" 513 | require-uncached "^1.0.3" 514 | semver "^5.3.0" 515 | strip-ansi "^4.0.0" 516 | strip-json-comments "~2.0.1" 517 | table "4.0.2" 518 | text-table "~0.2.0" 519 | 520 | eslint@^5.5.0: 521 | version "5.5.0" 522 | resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.5.0.tgz#8557fcceab5141a8197da9ffd9904f89f64425c6" 523 | dependencies: 524 | "@babel/code-frame" "^7.0.0" 525 | ajv "^6.5.3" 526 | chalk "^2.1.0" 527 | cross-spawn "^6.0.5" 528 | debug "^3.1.0" 529 | doctrine "^2.1.0" 530 | eslint-scope "^4.0.0" 531 | eslint-utils "^1.3.1" 532 | eslint-visitor-keys "^1.0.0" 533 | espree "^4.0.0" 534 | esquery "^1.0.1" 535 | esutils "^2.0.2" 536 | file-entry-cache "^2.0.0" 537 | functional-red-black-tree "^1.0.1" 538 | glob "^7.1.2" 539 | globals "^11.7.0" 540 | ignore "^4.0.6" 541 | imurmurhash "^0.1.4" 542 | inquirer "^6.1.0" 543 | is-resolvable "^1.1.0" 544 | js-yaml "^3.12.0" 545 | json-stable-stringify-without-jsonify "^1.0.1" 546 | levn "^0.3.0" 547 | lodash "^4.17.5" 548 | minimatch "^3.0.4" 549 | mkdirp "^0.5.1" 550 | natural-compare "^1.4.0" 551 | optionator "^0.8.2" 552 | path-is-inside "^1.0.2" 553 | pluralize "^7.0.0" 554 | progress "^2.0.0" 555 | regexpp "^2.0.0" 556 | require-uncached "^1.0.3" 557 | semver "^5.5.1" 558 | strip-ansi "^4.0.0" 559 | strip-json-comments "^2.0.1" 560 | table "^4.0.3" 561 | text-table "^0.2.0" 562 | 563 | espree@^3.5.2, espree@^3.5.4: 564 | version "3.5.4" 565 | resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7" 566 | dependencies: 567 | acorn "^5.5.0" 568 | acorn-jsx "^3.0.0" 569 | 570 | espree@^4.0.0: 571 | version "4.0.0" 572 | resolved "https://registry.yarnpkg.com/espree/-/espree-4.0.0.tgz#253998f20a0f82db5d866385799d912a83a36634" 573 | dependencies: 574 | acorn "^5.6.0" 575 | acorn-jsx "^4.1.1" 576 | 577 | esprima@^4.0.0: 578 | version "4.0.1" 579 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" 580 | 581 | esquery@^1.0.0, esquery@^1.0.1: 582 | version "1.0.1" 583 | resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" 584 | dependencies: 585 | estraverse "^4.0.0" 586 | 587 | esrecurse@^4.1.0: 588 | version "4.2.1" 589 | resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" 590 | dependencies: 591 | estraverse "^4.1.0" 592 | 593 | estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1: 594 | version "4.2.0" 595 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" 596 | 597 | esutils@^2.0.2: 598 | version "2.0.2" 599 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" 600 | 601 | expand-template@^1.0.2: 602 | version "1.1.1" 603 | resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-1.1.1.tgz#981f188c0c3a87d2e28f559bc541426ff94f21dd" 604 | 605 | external-editor@^2.0.4: 606 | version "2.2.0" 607 | resolved "http://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5" 608 | dependencies: 609 | chardet "^0.4.0" 610 | iconv-lite "^0.4.17" 611 | tmp "^0.0.33" 612 | 613 | external-editor@^3.0.0: 614 | version "3.0.3" 615 | resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.0.3.tgz#5866db29a97826dbe4bf3afd24070ead9ea43a27" 616 | dependencies: 617 | chardet "^0.7.0" 618 | iconv-lite "^0.4.24" 619 | tmp "^0.0.33" 620 | 621 | fast-deep-equal@^1.0.0: 622 | version "1.1.0" 623 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" 624 | 625 | fast-deep-equal@^2.0.1: 626 | version "2.0.1" 627 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" 628 | 629 | fast-json-stable-stringify@^2.0.0: 630 | version "2.0.0" 631 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" 632 | 633 | fast-levenshtein@~2.0.4: 634 | version "2.0.6" 635 | resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" 636 | 637 | figures@^2.0.0: 638 | version "2.0.0" 639 | resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" 640 | dependencies: 641 | escape-string-regexp "^1.0.5" 642 | 643 | file-entry-cache@^2.0.0: 644 | version "2.0.0" 645 | resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" 646 | dependencies: 647 | flat-cache "^1.2.1" 648 | object-assign "^4.0.1" 649 | 650 | find-up@^1.0.0: 651 | version "1.1.2" 652 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" 653 | dependencies: 654 | path-exists "^2.0.0" 655 | pinkie-promise "^2.0.0" 656 | 657 | find-up@^2.0.0: 658 | version "2.1.0" 659 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" 660 | dependencies: 661 | locate-path "^2.0.0" 662 | 663 | flat-cache@^1.2.1: 664 | version "1.3.0" 665 | resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481" 666 | dependencies: 667 | circular-json "^0.3.1" 668 | del "^2.0.2" 669 | graceful-fs "^4.1.2" 670 | write "^0.2.1" 671 | 672 | fs-constants@^1.0.0: 673 | version "1.0.0" 674 | resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" 675 | 676 | fs-copy-file-sync@^1.1.1: 677 | version "1.1.1" 678 | resolved "https://registry.yarnpkg.com/fs-copy-file-sync/-/fs-copy-file-sync-1.1.1.tgz#11bf32c096c10d126e5f6b36d06eece776062918" 679 | 680 | fs-minipass@^1.2.5: 681 | version "1.2.5" 682 | resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" 683 | dependencies: 684 | minipass "^2.2.1" 685 | 686 | fs.realpath@^1.0.0: 687 | version "1.0.0" 688 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 689 | 690 | function-bind@^1.1.0, function-bind@^1.1.1: 691 | version "1.1.1" 692 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 693 | 694 | functional-red-black-tree@^1.0.1: 695 | version "1.0.1" 696 | resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" 697 | 698 | gauge@~2.7.3: 699 | version "2.7.4" 700 | resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" 701 | dependencies: 702 | aproba "^1.0.3" 703 | console-control-strings "^1.0.0" 704 | has-unicode "^2.0.0" 705 | object-assign "^4.1.0" 706 | signal-exit "^3.0.0" 707 | string-width "^1.0.1" 708 | strip-ansi "^3.0.1" 709 | wide-align "^1.1.0" 710 | 711 | github-from-package@0.0.0: 712 | version "0.0.0" 713 | resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" 714 | 715 | glob@^7.0.3, glob@^7.0.5, glob@^7.1.2: 716 | version "7.1.3" 717 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" 718 | dependencies: 719 | fs.realpath "^1.0.0" 720 | inflight "^1.0.4" 721 | inherits "2" 722 | minimatch "^3.0.4" 723 | once "^1.3.0" 724 | path-is-absolute "^1.0.0" 725 | 726 | globals@^11.0.1, globals@^11.7.0: 727 | version "11.7.0" 728 | resolved "https://registry.yarnpkg.com/globals/-/globals-11.7.0.tgz#a583faa43055b1aca771914bf68258e2fc125673" 729 | 730 | globby@^5.0.0: 731 | version "5.0.0" 732 | resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" 733 | dependencies: 734 | array-union "^1.0.1" 735 | arrify "^1.0.0" 736 | glob "^7.0.3" 737 | object-assign "^4.0.1" 738 | pify "^2.0.0" 739 | pinkie-promise "^2.0.0" 740 | 741 | gltf-validator@^2.0.0-dev.2.5: 742 | version "2.0.0-dev.2.5" 743 | resolved "https://registry.yarnpkg.com/gltf-validator/-/gltf-validator-2.0.0-dev.2.5.tgz#88c1507b99bae244dcd70605460551ba35b95b9e" 744 | 745 | graceful-fs@^4.1.2: 746 | version "4.1.11" 747 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" 748 | 749 | has-ansi@^2.0.0: 750 | version "2.0.0" 751 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 752 | dependencies: 753 | ansi-regex "^2.0.0" 754 | 755 | has-flag@^3.0.0: 756 | version "3.0.0" 757 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 758 | 759 | has-symbols@^1.0.0: 760 | version "1.0.0" 761 | resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" 762 | 763 | has-unicode@^2.0.0: 764 | version "2.0.1" 765 | resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" 766 | 767 | has@^1.0.1: 768 | version "1.0.3" 769 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 770 | dependencies: 771 | function-bind "^1.1.1" 772 | 773 | hosted-git-info@^2.1.4: 774 | version "2.7.1" 775 | resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" 776 | 777 | iconv-lite@^0.4.17, iconv-lite@^0.4.24: 778 | version "0.4.24" 779 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 780 | dependencies: 781 | safer-buffer ">= 2.1.2 < 3" 782 | 783 | ignore@^3.3.3: 784 | version "3.3.10" 785 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" 786 | 787 | ignore@^4.0.6: 788 | version "4.0.6" 789 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" 790 | 791 | imurmurhash@^0.1.4: 792 | version "0.1.4" 793 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 794 | 795 | indent-string@^3.2.0: 796 | version "3.2.0" 797 | resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" 798 | 799 | inflight@^1.0.4: 800 | version "1.0.6" 801 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 802 | dependencies: 803 | once "^1.3.0" 804 | wrappy "1" 805 | 806 | inherits@2, inherits@^2.0.3, inherits@~2.0.3: 807 | version "2.0.3" 808 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 809 | 810 | ini@~1.3.0: 811 | version "1.3.5" 812 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" 813 | 814 | inquirer@^3.0.6: 815 | version "3.3.0" 816 | resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" 817 | dependencies: 818 | ansi-escapes "^3.0.0" 819 | chalk "^2.0.0" 820 | cli-cursor "^2.1.0" 821 | cli-width "^2.0.0" 822 | external-editor "^2.0.4" 823 | figures "^2.0.0" 824 | lodash "^4.3.0" 825 | mute-stream "0.0.7" 826 | run-async "^2.2.0" 827 | rx-lite "^4.0.8" 828 | rx-lite-aggregates "^4.0.8" 829 | string-width "^2.1.0" 830 | strip-ansi "^4.0.0" 831 | through "^2.3.6" 832 | 833 | inquirer@^6.1.0: 834 | version "6.2.0" 835 | resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.2.0.tgz#51adcd776f661369dc1e894859c2560a224abdd8" 836 | dependencies: 837 | ansi-escapes "^3.0.0" 838 | chalk "^2.0.0" 839 | cli-cursor "^2.1.0" 840 | cli-width "^2.0.0" 841 | external-editor "^3.0.0" 842 | figures "^2.0.0" 843 | lodash "^4.17.10" 844 | mute-stream "0.0.7" 845 | run-async "^2.2.0" 846 | rxjs "^6.1.0" 847 | string-width "^2.1.0" 848 | strip-ansi "^4.0.0" 849 | through "^2.3.6" 850 | 851 | is-arrayish@^0.2.1: 852 | version "0.2.1" 853 | resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" 854 | 855 | is-arrayish@^0.3.1: 856 | version "0.3.2" 857 | resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" 858 | 859 | is-builtin-module@^1.0.0: 860 | version "1.0.0" 861 | resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" 862 | dependencies: 863 | builtin-modules "^1.0.0" 864 | 865 | is-callable@^1.1.1, is-callable@^1.1.3: 866 | version "1.1.4" 867 | resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" 868 | 869 | is-date-object@^1.0.1: 870 | version "1.0.1" 871 | resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" 872 | 873 | is-fullwidth-code-point@^1.0.0: 874 | version "1.0.0" 875 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" 876 | dependencies: 877 | number-is-nan "^1.0.0" 878 | 879 | is-fullwidth-code-point@^2.0.0: 880 | version "2.0.0" 881 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 882 | 883 | is-path-cwd@^1.0.0: 884 | version "1.0.0" 885 | resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" 886 | 887 | is-path-in-cwd@^1.0.0: 888 | version "1.0.1" 889 | resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52" 890 | dependencies: 891 | is-path-inside "^1.0.0" 892 | 893 | is-path-inside@^1.0.0: 894 | version "1.0.1" 895 | resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" 896 | dependencies: 897 | path-is-inside "^1.0.1" 898 | 899 | is-promise@^2.1.0: 900 | version "2.1.0" 901 | resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" 902 | 903 | is-regex@^1.0.4: 904 | version "1.0.4" 905 | resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" 906 | dependencies: 907 | has "^1.0.1" 908 | 909 | is-resolvable@^1.0.0, is-resolvable@^1.1.0: 910 | version "1.1.0" 911 | resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" 912 | 913 | is-symbol@^1.0.1: 914 | version "1.0.1" 915 | resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572" 916 | 917 | isarray@^1.0.0, isarray@~1.0.0: 918 | version "1.0.0" 919 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 920 | 921 | isexe@^2.0.0: 922 | version "2.0.0" 923 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 924 | 925 | js-tokens@^3.0.2: 926 | version "3.0.2" 927 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" 928 | 929 | js-tokens@^4.0.0: 930 | version "4.0.0" 931 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 932 | 933 | js-yaml@^3.12.0, js-yaml@^3.9.1: 934 | version "3.12.0" 935 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1" 936 | dependencies: 937 | argparse "^1.0.7" 938 | esprima "^4.0.0" 939 | 940 | json-schema-traverse@^0.3.0: 941 | version "0.3.1" 942 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" 943 | 944 | json-schema-traverse@^0.4.1: 945 | version "0.4.1" 946 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 947 | 948 | json-stable-stringify-without-jsonify@^1.0.1: 949 | version "1.0.1" 950 | resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" 951 | 952 | levn@^0.3.0, levn@~0.3.0: 953 | version "0.3.0" 954 | resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" 955 | dependencies: 956 | prelude-ls "~1.1.2" 957 | type-check "~0.3.2" 958 | 959 | load-json-file@^2.0.0: 960 | version "2.0.0" 961 | resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" 962 | dependencies: 963 | graceful-fs "^4.1.2" 964 | parse-json "^2.2.0" 965 | pify "^2.0.0" 966 | strip-bom "^3.0.0" 967 | 968 | locate-path@^2.0.0: 969 | version "2.0.0" 970 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" 971 | dependencies: 972 | p-locate "^2.0.0" 973 | path-exists "^3.0.0" 974 | 975 | lodash.merge@^4.6.0: 976 | version "4.6.1" 977 | resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.1.tgz#adc25d9cb99b9391c59624f379fbba60d7111d54" 978 | 979 | lodash.unescape@4.0.1: 980 | version "4.0.1" 981 | resolved "https://registry.yarnpkg.com/lodash.unescape/-/lodash.unescape-4.0.1.tgz#bf2249886ce514cda112fae9218cdc065211fc9c" 982 | 983 | lodash@^4.17.10, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.3.0: 984 | version "4.17.11" 985 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" 986 | 987 | loglevel-colored-level-prefix@^1.0.0: 988 | version "1.0.0" 989 | resolved "https://registry.yarnpkg.com/loglevel-colored-level-prefix/-/loglevel-colored-level-prefix-1.0.0.tgz#6a40218fdc7ae15fc76c3d0f3e676c465388603e" 990 | dependencies: 991 | chalk "^1.1.3" 992 | loglevel "^1.4.1" 993 | 994 | loglevel@^1.4.1: 995 | version "1.6.1" 996 | resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.1.tgz#e0fc95133b6ef276cdc8887cdaf24aa6f156f8fa" 997 | 998 | lru-cache@^4.0.1: 999 | version "4.1.3" 1000 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c" 1001 | dependencies: 1002 | pseudomap "^1.0.2" 1003 | yallist "^2.1.2" 1004 | 1005 | mimic-fn@^1.0.0: 1006 | version "1.2.0" 1007 | resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" 1008 | 1009 | mimic-response@^1.0.0: 1010 | version "1.0.1" 1011 | resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" 1012 | 1013 | minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4: 1014 | version "3.0.4" 1015 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 1016 | dependencies: 1017 | brace-expansion "^1.1.7" 1018 | 1019 | minimist@0.0.8: 1020 | version "0.0.8" 1021 | resolved "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 1022 | 1023 | minimist@^1.2.0: 1024 | version "1.2.0" 1025 | resolved "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" 1026 | 1027 | minipass@^2.2.1, minipass@^2.3.3: 1028 | version "2.3.4" 1029 | resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.4.tgz#4768d7605ed6194d6d576169b9e12ef71e9d9957" 1030 | dependencies: 1031 | safe-buffer "^5.1.2" 1032 | yallist "^3.0.0" 1033 | 1034 | minizlib@^1.1.0: 1035 | version "1.1.0" 1036 | resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.0.tgz#11e13658ce46bc3a70a267aac58359d1e0c29ceb" 1037 | dependencies: 1038 | minipass "^2.2.1" 1039 | 1040 | mkdirp@^0.5.0, mkdirp@^0.5.1: 1041 | version "0.5.1" 1042 | resolved "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 1043 | dependencies: 1044 | minimist "0.0.8" 1045 | 1046 | ms@2.0.0: 1047 | version "2.0.0" 1048 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 1049 | 1050 | ms@^2.1.1: 1051 | version "2.1.1" 1052 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" 1053 | 1054 | mute-stream@0.0.7: 1055 | version "0.0.7" 1056 | resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" 1057 | 1058 | nan@^2.11.0: 1059 | version "2.11.0" 1060 | resolved "https://registry.yarnpkg.com/nan/-/nan-2.11.0.tgz#574e360e4d954ab16966ec102c0c049fd961a099" 1061 | 1062 | natural-compare@^1.4.0: 1063 | version "1.4.0" 1064 | resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" 1065 | 1066 | nice-try@^1.0.4: 1067 | version "1.0.5" 1068 | resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" 1069 | 1070 | node-abi@^2.2.0: 1071 | version "2.4.3" 1072 | resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.4.3.tgz#43666b7b17e57863e572409edbb82115ac7af28b" 1073 | dependencies: 1074 | semver "^5.4.1" 1075 | 1076 | noop-logger@^0.1.1: 1077 | version "0.1.1" 1078 | resolved "https://registry.yarnpkg.com/noop-logger/-/noop-logger-0.1.1.tgz#94a2b1633c4f1317553007d8966fd0e841b6a4c2" 1079 | 1080 | normalize-package-data@^2.3.2: 1081 | version "2.4.0" 1082 | resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" 1083 | dependencies: 1084 | hosted-git-info "^2.1.4" 1085 | is-builtin-module "^1.0.0" 1086 | semver "2 || 3 || 4 || 5" 1087 | validate-npm-package-license "^3.0.1" 1088 | 1089 | npmlog@^4.0.1, npmlog@^4.1.2: 1090 | version "4.1.2" 1091 | resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" 1092 | dependencies: 1093 | are-we-there-yet "~1.1.2" 1094 | console-control-strings "~1.1.0" 1095 | gauge "~2.7.3" 1096 | set-blocking "~2.0.0" 1097 | 1098 | number-is-nan@^1.0.0: 1099 | version "1.0.1" 1100 | resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" 1101 | 1102 | object-assign@^4.0.1, object-assign@^4.1.0: 1103 | version "4.1.1" 1104 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 1105 | 1106 | object-keys@^1.0.11, object-keys@^1.0.12: 1107 | version "1.0.12" 1108 | resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.12.tgz#09c53855377575310cca62f55bb334abff7b3ed2" 1109 | 1110 | object.assign@^4.1.0: 1111 | version "4.1.0" 1112 | resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" 1113 | dependencies: 1114 | define-properties "^1.1.2" 1115 | function-bind "^1.1.1" 1116 | has-symbols "^1.0.0" 1117 | object-keys "^1.0.11" 1118 | 1119 | object.entries@^1.0.4: 1120 | version "1.0.4" 1121 | resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.0.4.tgz#1bf9a4dd2288f5b33f3a993d257661f05d161a5f" 1122 | dependencies: 1123 | define-properties "^1.1.2" 1124 | es-abstract "^1.6.1" 1125 | function-bind "^1.1.0" 1126 | has "^1.0.1" 1127 | 1128 | once@^1.3.0, once@^1.3.1, once@^1.4.0: 1129 | version "1.4.0" 1130 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1131 | dependencies: 1132 | wrappy "1" 1133 | 1134 | onetime@^2.0.0: 1135 | version "2.0.1" 1136 | resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" 1137 | dependencies: 1138 | mimic-fn "^1.0.0" 1139 | 1140 | optionator@^0.8.2: 1141 | version "0.8.2" 1142 | resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" 1143 | dependencies: 1144 | deep-is "~0.1.3" 1145 | fast-levenshtein "~2.0.4" 1146 | levn "~0.3.0" 1147 | prelude-ls "~1.1.2" 1148 | type-check "~0.3.2" 1149 | wordwrap "~1.0.0" 1150 | 1151 | os-homedir@^1.0.1: 1152 | version "1.0.2" 1153 | resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" 1154 | 1155 | os-tmpdir@~1.0.2: 1156 | version "1.0.2" 1157 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 1158 | 1159 | p-limit@^1.1.0: 1160 | version "1.3.0" 1161 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" 1162 | dependencies: 1163 | p-try "^1.0.0" 1164 | 1165 | p-locate@^2.0.0: 1166 | version "2.0.0" 1167 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" 1168 | dependencies: 1169 | p-limit "^1.1.0" 1170 | 1171 | p-try@^1.0.0: 1172 | version "1.0.0" 1173 | resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" 1174 | 1175 | parse-json@^2.2.0: 1176 | version "2.2.0" 1177 | resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" 1178 | dependencies: 1179 | error-ex "^1.2.0" 1180 | 1181 | path-exists@^2.0.0: 1182 | version "2.1.0" 1183 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" 1184 | dependencies: 1185 | pinkie-promise "^2.0.0" 1186 | 1187 | path-exists@^3.0.0: 1188 | version "3.0.0" 1189 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" 1190 | 1191 | path-is-absolute@^1.0.0: 1192 | version "1.0.1" 1193 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1194 | 1195 | path-is-inside@^1.0.1, path-is-inside@^1.0.2: 1196 | version "1.0.2" 1197 | resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" 1198 | 1199 | path-key@^2.0.1: 1200 | version "2.0.1" 1201 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" 1202 | 1203 | path-parse@^1.0.5: 1204 | version "1.0.6" 1205 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" 1206 | 1207 | path-type@^2.0.0: 1208 | version "2.0.0" 1209 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" 1210 | dependencies: 1211 | pify "^2.0.0" 1212 | 1213 | pify@^2.0.0: 1214 | version "2.3.0" 1215 | resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" 1216 | 1217 | pinkie-promise@^2.0.0: 1218 | version "2.0.1" 1219 | resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" 1220 | dependencies: 1221 | pinkie "^2.0.0" 1222 | 1223 | pinkie@^2.0.0: 1224 | version "2.0.4" 1225 | resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" 1226 | 1227 | pkg-dir@^1.0.0: 1228 | version "1.0.0" 1229 | resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" 1230 | dependencies: 1231 | find-up "^1.0.0" 1232 | 1233 | pluralize@^7.0.0: 1234 | version "7.0.0" 1235 | resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" 1236 | 1237 | prebuild-install@^4.0.0: 1238 | version "4.0.0" 1239 | resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-4.0.0.tgz#206ce8106ce5efa4b6cf062fc8a0a7d93c17f3a8" 1240 | dependencies: 1241 | detect-libc "^1.0.3" 1242 | expand-template "^1.0.2" 1243 | github-from-package "0.0.0" 1244 | minimist "^1.2.0" 1245 | mkdirp "^0.5.1" 1246 | node-abi "^2.2.0" 1247 | noop-logger "^0.1.1" 1248 | npmlog "^4.0.1" 1249 | os-homedir "^1.0.1" 1250 | pump "^2.0.1" 1251 | rc "^1.1.6" 1252 | simple-get "^2.7.0" 1253 | tar-fs "^1.13.0" 1254 | tunnel-agent "^0.6.0" 1255 | which-pm-runs "^1.0.0" 1256 | 1257 | prelude-ls@~1.1.2: 1258 | version "1.1.2" 1259 | resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" 1260 | 1261 | prettier-eslint@^8.8.2: 1262 | version "8.8.2" 1263 | resolved "https://registry.yarnpkg.com/prettier-eslint/-/prettier-eslint-8.8.2.tgz#fcb29a48ab4524e234680797fe70e9d136ccaf0b" 1264 | dependencies: 1265 | babel-runtime "^6.26.0" 1266 | common-tags "^1.4.0" 1267 | dlv "^1.1.0" 1268 | eslint "^4.0.0" 1269 | indent-string "^3.2.0" 1270 | lodash.merge "^4.6.0" 1271 | loglevel-colored-level-prefix "^1.0.0" 1272 | prettier "^1.7.0" 1273 | pretty-format "^23.0.1" 1274 | require-relative "^0.8.7" 1275 | typescript "^2.5.1" 1276 | typescript-eslint-parser "^16.0.0" 1277 | vue-eslint-parser "^2.0.2" 1278 | 1279 | prettier@^1.14.2, prettier@^1.7.0: 1280 | version "1.14.2" 1281 | resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.14.2.tgz#0ac1c6e1a90baa22a62925f41963c841983282f9" 1282 | 1283 | pretty-format@^23.0.1: 1284 | version "23.6.0" 1285 | resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-23.6.0.tgz#5eaac8eeb6b33b987b7fe6097ea6a8a146ab5760" 1286 | dependencies: 1287 | ansi-regex "^3.0.0" 1288 | ansi-styles "^3.2.0" 1289 | 1290 | process-nextick-args@~2.0.0: 1291 | version "2.0.0" 1292 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" 1293 | 1294 | progress@^2.0.0: 1295 | version "2.0.0" 1296 | resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" 1297 | 1298 | pseudomap@^1.0.2: 1299 | version "1.0.2" 1300 | resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" 1301 | 1302 | pump@^1.0.0: 1303 | version "1.0.3" 1304 | resolved "https://registry.yarnpkg.com/pump/-/pump-1.0.3.tgz#5dfe8311c33bbf6fc18261f9f34702c47c08a954" 1305 | dependencies: 1306 | end-of-stream "^1.1.0" 1307 | once "^1.3.1" 1308 | 1309 | pump@^2.0.1: 1310 | version "2.0.1" 1311 | resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" 1312 | dependencies: 1313 | end-of-stream "^1.1.0" 1314 | once "^1.3.1" 1315 | 1316 | punycode@^2.1.0: 1317 | version "2.1.1" 1318 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" 1319 | 1320 | rc@^1.1.6: 1321 | version "1.2.8" 1322 | resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" 1323 | dependencies: 1324 | deep-extend "^0.6.0" 1325 | ini "~1.3.0" 1326 | minimist "^1.2.0" 1327 | strip-json-comments "~2.0.1" 1328 | 1329 | read-pkg-up@^2.0.0: 1330 | version "2.0.0" 1331 | resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" 1332 | dependencies: 1333 | find-up "^2.0.0" 1334 | read-pkg "^2.0.0" 1335 | 1336 | read-pkg@^2.0.0: 1337 | version "2.0.0" 1338 | resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" 1339 | dependencies: 1340 | load-json-file "^2.0.0" 1341 | normalize-package-data "^2.3.2" 1342 | path-type "^2.0.0" 1343 | 1344 | readable-stream@^2.0.6, readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@^2.3.5: 1345 | version "2.3.6" 1346 | resolved "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" 1347 | dependencies: 1348 | core-util-is "~1.0.0" 1349 | inherits "~2.0.3" 1350 | isarray "~1.0.0" 1351 | process-nextick-args "~2.0.0" 1352 | safe-buffer "~5.1.1" 1353 | string_decoder "~1.1.1" 1354 | util-deprecate "~1.0.1" 1355 | 1356 | regenerator-runtime@^0.11.0: 1357 | version "0.11.1" 1358 | resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" 1359 | 1360 | regexpp@^1.0.1: 1361 | version "1.1.0" 1362 | resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-1.1.0.tgz#0e3516dd0b7904f413d2d4193dce4618c3a689ab" 1363 | 1364 | regexpp@^2.0.0: 1365 | version "2.0.0" 1366 | resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.0.tgz#b2a7534a85ca1b033bcf5ce9ff8e56d4e0755365" 1367 | 1368 | require-relative@^0.8.7: 1369 | version "0.8.7" 1370 | resolved "https://registry.yarnpkg.com/require-relative/-/require-relative-0.8.7.tgz#7999539fc9e047a37928fa196f8e1563dabd36de" 1371 | 1372 | require-uncached@^1.0.3: 1373 | version "1.0.3" 1374 | resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" 1375 | dependencies: 1376 | caller-path "^0.1.0" 1377 | resolve-from "^1.0.0" 1378 | 1379 | resolve-from@^1.0.0: 1380 | version "1.0.1" 1381 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" 1382 | 1383 | resolve@^1.5.0, resolve@^1.6.0: 1384 | version "1.8.1" 1385 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" 1386 | dependencies: 1387 | path-parse "^1.0.5" 1388 | 1389 | restore-cursor@^2.0.0: 1390 | version "2.0.0" 1391 | resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" 1392 | dependencies: 1393 | onetime "^2.0.0" 1394 | signal-exit "^3.0.2" 1395 | 1396 | rimraf@^2.2.8: 1397 | version "2.6.2" 1398 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" 1399 | dependencies: 1400 | glob "^7.0.5" 1401 | 1402 | run-async@^2.2.0: 1403 | version "2.3.0" 1404 | resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" 1405 | dependencies: 1406 | is-promise "^2.1.0" 1407 | 1408 | rx-lite-aggregates@^4.0.8: 1409 | version "4.0.8" 1410 | resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" 1411 | dependencies: 1412 | rx-lite "*" 1413 | 1414 | rx-lite@*, rx-lite@^4.0.8: 1415 | version "4.0.8" 1416 | resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" 1417 | 1418 | rxjs@^6.1.0: 1419 | version "6.3.2" 1420 | resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.3.2.tgz#6a688b16c4e6e980e62ea805ec30648e1c60907f" 1421 | dependencies: 1422 | tslib "^1.9.0" 1423 | 1424 | safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: 1425 | version "5.1.2" 1426 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 1427 | 1428 | "safer-buffer@>= 2.1.2 < 3": 1429 | version "2.1.2" 1430 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 1431 | 1432 | "semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1: 1433 | version "5.5.1" 1434 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.1.tgz#7dfdd8814bdb7cabc7be0fb1d734cfb66c940477" 1435 | 1436 | semver@5.5.0: 1437 | version "5.5.0" 1438 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" 1439 | 1440 | set-blocking@~2.0.0: 1441 | version "2.0.0" 1442 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 1443 | 1444 | sharp@^0.20.8: 1445 | version "0.20.8" 1446 | resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.20.8.tgz#e853f10b53b730824f0c3c5e453c79fa0812a48b" 1447 | dependencies: 1448 | color "^3.0.0" 1449 | detect-libc "^1.0.3" 1450 | fs-copy-file-sync "^1.1.1" 1451 | nan "^2.11.0" 1452 | npmlog "^4.1.2" 1453 | prebuild-install "^4.0.0" 1454 | semver "^5.5.1" 1455 | simple-get "^2.8.1" 1456 | tar "^4.4.6" 1457 | tunnel-agent "^0.6.0" 1458 | 1459 | shebang-command@^1.2.0: 1460 | version "1.2.0" 1461 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" 1462 | dependencies: 1463 | shebang-regex "^1.0.0" 1464 | 1465 | shebang-regex@^1.0.0: 1466 | version "1.0.0" 1467 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" 1468 | 1469 | signal-exit@^3.0.0, signal-exit@^3.0.2: 1470 | version "3.0.2" 1471 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" 1472 | 1473 | simple-concat@^1.0.0: 1474 | version "1.0.0" 1475 | resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.0.tgz#7344cbb8b6e26fb27d66b2fc86f9f6d5997521c6" 1476 | 1477 | simple-get@^2.7.0, simple-get@^2.8.1: 1478 | version "2.8.1" 1479 | resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-2.8.1.tgz#0e22e91d4575d87620620bc91308d57a77f44b5d" 1480 | dependencies: 1481 | decompress-response "^3.3.0" 1482 | once "^1.3.1" 1483 | simple-concat "^1.0.0" 1484 | 1485 | simple-swizzle@^0.2.2: 1486 | version "0.2.2" 1487 | resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" 1488 | dependencies: 1489 | is-arrayish "^0.3.1" 1490 | 1491 | slice-ansi@1.0.0: 1492 | version "1.0.0" 1493 | resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" 1494 | dependencies: 1495 | is-fullwidth-code-point "^2.0.0" 1496 | 1497 | spdx-correct@^3.0.0: 1498 | version "3.0.0" 1499 | resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.0.tgz#05a5b4d7153a195bc92c3c425b69f3b2a9524c82" 1500 | dependencies: 1501 | spdx-expression-parse "^3.0.0" 1502 | spdx-license-ids "^3.0.0" 1503 | 1504 | spdx-exceptions@^2.1.0: 1505 | version "2.1.0" 1506 | resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz#2c7ae61056c714a5b9b9b2b2af7d311ef5c78fe9" 1507 | 1508 | spdx-expression-parse@^3.0.0: 1509 | version "3.0.0" 1510 | resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" 1511 | dependencies: 1512 | spdx-exceptions "^2.1.0" 1513 | spdx-license-ids "^3.0.0" 1514 | 1515 | spdx-license-ids@^3.0.0: 1516 | version "3.0.1" 1517 | resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.1.tgz#e2a303236cac54b04031fa7a5a79c7e701df852f" 1518 | 1519 | sprintf-js@~1.0.2: 1520 | version "1.0.3" 1521 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 1522 | 1523 | string-width@^1.0.1: 1524 | version "1.0.2" 1525 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" 1526 | dependencies: 1527 | code-point-at "^1.0.0" 1528 | is-fullwidth-code-point "^1.0.0" 1529 | strip-ansi "^3.0.0" 1530 | 1531 | "string-width@^1.0.2 || 2", string-width@^2.1.0, string-width@^2.1.1: 1532 | version "2.1.1" 1533 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" 1534 | dependencies: 1535 | is-fullwidth-code-point "^2.0.0" 1536 | strip-ansi "^4.0.0" 1537 | 1538 | string_decoder@~1.1.1: 1539 | version "1.1.1" 1540 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" 1541 | dependencies: 1542 | safe-buffer "~5.1.0" 1543 | 1544 | strip-ansi@^3.0.0, strip-ansi@^3.0.1: 1545 | version "3.0.1" 1546 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 1547 | dependencies: 1548 | ansi-regex "^2.0.0" 1549 | 1550 | strip-ansi@^4.0.0: 1551 | version "4.0.0" 1552 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" 1553 | dependencies: 1554 | ansi-regex "^3.0.0" 1555 | 1556 | strip-bom@^3.0.0: 1557 | version "3.0.0" 1558 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" 1559 | 1560 | strip-json-comments@^2.0.1, strip-json-comments@~2.0.1: 1561 | version "2.0.1" 1562 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 1563 | 1564 | supports-color@^2.0.0: 1565 | version "2.0.0" 1566 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 1567 | 1568 | supports-color@^5.3.0: 1569 | version "5.5.0" 1570 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 1571 | dependencies: 1572 | has-flag "^3.0.0" 1573 | 1574 | table@4.0.2: 1575 | version "4.0.2" 1576 | resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36" 1577 | dependencies: 1578 | ajv "^5.2.3" 1579 | ajv-keywords "^2.1.0" 1580 | chalk "^2.1.0" 1581 | lodash "^4.17.4" 1582 | slice-ansi "1.0.0" 1583 | string-width "^2.1.1" 1584 | 1585 | table@^4.0.3: 1586 | version "4.0.3" 1587 | resolved "http://registry.npmjs.org/table/-/table-4.0.3.tgz#00b5e2b602f1794b9acaf9ca908a76386a7813bc" 1588 | dependencies: 1589 | ajv "^6.0.1" 1590 | ajv-keywords "^3.0.0" 1591 | chalk "^2.1.0" 1592 | lodash "^4.17.4" 1593 | slice-ansi "1.0.0" 1594 | string-width "^2.1.1" 1595 | 1596 | tar-fs@^1.13.0: 1597 | version "1.16.3" 1598 | resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-1.16.3.tgz#966a628841da2c4010406a82167cbd5e0c72d509" 1599 | dependencies: 1600 | chownr "^1.0.1" 1601 | mkdirp "^0.5.1" 1602 | pump "^1.0.0" 1603 | tar-stream "^1.1.2" 1604 | 1605 | tar-stream@^1.1.2: 1606 | version "1.6.1" 1607 | resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.1.tgz#f84ef1696269d6223ca48f6e1eeede3f7e81f395" 1608 | dependencies: 1609 | bl "^1.0.0" 1610 | buffer-alloc "^1.1.0" 1611 | end-of-stream "^1.0.0" 1612 | fs-constants "^1.0.0" 1613 | readable-stream "^2.3.0" 1614 | to-buffer "^1.1.0" 1615 | xtend "^4.0.0" 1616 | 1617 | tar@^4.4.6: 1618 | version "4.4.6" 1619 | resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.6.tgz#63110f09c00b4e60ac8bcfe1bf3c8660235fbc9b" 1620 | dependencies: 1621 | chownr "^1.0.1" 1622 | fs-minipass "^1.2.5" 1623 | minipass "^2.3.3" 1624 | minizlib "^1.1.0" 1625 | mkdirp "^0.5.0" 1626 | safe-buffer "^5.1.2" 1627 | yallist "^3.0.2" 1628 | 1629 | text-table@^0.2.0, text-table@~0.2.0: 1630 | version "0.2.0" 1631 | resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" 1632 | 1633 | through@^2.3.6: 1634 | version "2.3.8" 1635 | resolved "http://registry.npmjs.org/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 1636 | 1637 | tmp@^0.0.33: 1638 | version "0.0.33" 1639 | resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" 1640 | dependencies: 1641 | os-tmpdir "~1.0.2" 1642 | 1643 | to-buffer@^1.1.0: 1644 | version "1.1.1" 1645 | resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80" 1646 | 1647 | tslib@^1.9.0: 1648 | version "1.9.3" 1649 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" 1650 | 1651 | tunnel-agent@^0.6.0: 1652 | version "0.6.0" 1653 | resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" 1654 | dependencies: 1655 | safe-buffer "^5.0.1" 1656 | 1657 | type-check@~0.3.2: 1658 | version "0.3.2" 1659 | resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" 1660 | dependencies: 1661 | prelude-ls "~1.1.2" 1662 | 1663 | typedarray@^0.0.6: 1664 | version "0.0.6" 1665 | resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" 1666 | 1667 | typescript-eslint-parser@^16.0.0: 1668 | version "16.0.1" 1669 | resolved "https://registry.yarnpkg.com/typescript-eslint-parser/-/typescript-eslint-parser-16.0.1.tgz#b40681c7043b222b9772748b700a000b241c031b" 1670 | dependencies: 1671 | lodash.unescape "4.0.1" 1672 | semver "5.5.0" 1673 | 1674 | typescript@^2.5.1: 1675 | version "2.9.2" 1676 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.9.2.tgz#1cbf61d05d6b96269244eb6a3bce4bd914e0f00c" 1677 | 1678 | uri-js@^4.2.2: 1679 | version "4.2.2" 1680 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" 1681 | dependencies: 1682 | punycode "^2.1.0" 1683 | 1684 | util-deprecate@~1.0.1: 1685 | version "1.0.2" 1686 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 1687 | 1688 | validate-npm-package-license@^3.0.1: 1689 | version "3.0.4" 1690 | resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" 1691 | dependencies: 1692 | spdx-correct "^3.0.0" 1693 | spdx-expression-parse "^3.0.0" 1694 | 1695 | vue-eslint-parser@^2.0.2: 1696 | version "2.0.3" 1697 | resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-2.0.3.tgz#c268c96c6d94cfe3d938a5f7593959b0ca3360d1" 1698 | dependencies: 1699 | debug "^3.1.0" 1700 | eslint-scope "^3.7.1" 1701 | eslint-visitor-keys "^1.0.0" 1702 | espree "^3.5.2" 1703 | esquery "^1.0.0" 1704 | lodash "^4.17.4" 1705 | 1706 | which-pm-runs@^1.0.0: 1707 | version "1.0.0" 1708 | resolved "https://registry.yarnpkg.com/which-pm-runs/-/which-pm-runs-1.0.0.tgz#670b3afbc552e0b55df6b7780ca74615f23ad1cb" 1709 | 1710 | which@^1.2.9: 1711 | version "1.3.1" 1712 | resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" 1713 | dependencies: 1714 | isexe "^2.0.0" 1715 | 1716 | wide-align@^1.1.0: 1717 | version "1.1.3" 1718 | resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" 1719 | dependencies: 1720 | string-width "^1.0.2 || 2" 1721 | 1722 | wordwrap@~1.0.0: 1723 | version "1.0.0" 1724 | resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" 1725 | 1726 | wrappy@1: 1727 | version "1.0.2" 1728 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1729 | 1730 | write@^0.2.1: 1731 | version "0.2.1" 1732 | resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" 1733 | dependencies: 1734 | mkdirp "^0.5.1" 1735 | 1736 | xtend@^4.0.0: 1737 | version "4.0.1" 1738 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" 1739 | 1740 | yallist@^2.1.2: 1741 | version "2.1.2" 1742 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" 1743 | 1744 | yallist@^3.0.0, yallist@^3.0.2: 1745 | version "3.0.2" 1746 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9" 1747 | --------------------------------------------------------------------------------