├── .eslintignore ├── .eslintrc.json ├── .gitignore ├── .vscode └── launch.json ├── LICENSE ├── README.md ├── grids ├── 3D GRID DEMO.rvt ├── 3D Grid.dyn └── 3D Grid.rfa ├── index.html ├── level-section ├── docs │ └── Forge Viewer Sectioning.pdf ├── index.html ├── models ├── scripts │ ├── AdnLevelSectionPanel.js │ └── index.js └── styles │ └── index.css ├── markup3d ├── index.html ├── models ├── scripts │ ├── AdnMarkup3dTool.js │ └── index.js └── styles │ └── index.css ├── mock-server ├── db.json ├── expose.js ├── index.js └── routes.json ├── model-structure ├── index.html ├── models ├── scripts │ ├── AdnStructurePanel.js │ └── index.js └── styles │ └── index.css ├── models └── empty ├── package-lock.json ├── package.json └── properties ├── index.html ├── models ├── scripts ├── AdnPropsPanel.js └── index.js └── styles └── index.css /.eslintignore: -------------------------------------------------------------------------------- 1 | **/dist/* 2 | **/node_modules/* 3 | **/*.min.* -------------------------------------------------------------------------------- /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "parser": "babel-eslint", 3 | "env": { 4 | "browser": true, 5 | "commonjs": true, 6 | "es6": true, 7 | "node": true 8 | }, 9 | "extends": "eslint:recommended", 10 | "parserOptions": { 11 | "sourceType": "module", 12 | "allowImportExportEverywhere": false 13 | }, 14 | "globals": { 15 | "Autodesk": true, 16 | "THREE": true, 17 | "SVG": true 18 | }, 19 | "rules": { 20 | "indent": [ 21 | "error", 22 | 2, 23 | { 24 | "SwitchCase": 1 25 | } 26 | ], 27 | "linebreak-style": [ 28 | "error", 29 | "unix" 30 | ], 31 | "quotes": [ 32 | "error", 33 | "single" 34 | ], 35 | "semi": [ 36 | "error", 37 | "always" 38 | ], 39 | "no-console": 0, 40 | "no-undef": 1, 41 | "no-unused-vars": 1, 42 | "no-extra-boolean-cast": 0 43 | } 44 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Created by https://www.gitignore.io/api/linux,macos,windows,aspnetcore,visualstudio,visualstudiocode 2 | 3 | ### ASPNETCore ### 4 | ## Ignore Visual Studio temporary files, build results, and 5 | ## files generated by popular Visual Studio add-ons. 6 | 7 | # User-specific files 8 | *.suo 9 | *.user 10 | *.userosscache 11 | *.sln.docstates 12 | 13 | # User-specific files (MonoDevelop/Xamarin Studio) 14 | *.userprefs 15 | 16 | # Build results 17 | [Dd]ebug/ 18 | [Dd]ebugPublic/ 19 | [Rr]elease/ 20 | [Rr]eleases/ 21 | x64/ 22 | x86/ 23 | bld/ 24 | [Bb]in/ 25 | [Oo]bj/ 26 | [Ll]og/ 27 | 28 | # Visual Studio 2015 cache/options directory 29 | .vs/ 30 | # Uncomment if you have tasks that create the project's static files in wwwroot 31 | #wwwroot/ 32 | 33 | # MSTest test Results 34 | [Tt]est[Rr]esult*/ 35 | [Bb]uild[Ll]og.* 36 | 37 | # NUNIT 38 | *.VisualState.xml 39 | TestResult.xml 40 | 41 | # Build Results of an ATL Project 42 | [Dd]ebugPS/ 43 | [Rr]eleasePS/ 44 | dlldata.c 45 | 46 | # DNX 47 | project.lock.json 48 | project.fragment.lock.json 49 | artifacts/ 50 | 51 | *_i.c 52 | *_p.c 53 | *_i.h 54 | *.ilk 55 | *.meta 56 | *.obj 57 | *.pch 58 | *.pdb 59 | *.pgc 60 | *.pgd 61 | *.rsp 62 | *.sbr 63 | *.tlb 64 | *.tli 65 | *.tlh 66 | *.tmp 67 | *.tmp_proj 68 | *.log 69 | *.vspscc 70 | *.vssscc 71 | .builds 72 | *.pidb 73 | *.svclog 74 | *.scc 75 | 76 | # Chutzpah Test files 77 | _Chutzpah* 78 | 79 | # Visual C++ cache files 80 | ipch/ 81 | *.aps 82 | *.ncb 83 | *.opendb 84 | *.opensdf 85 | *.sdf 86 | *.cachefile 87 | *.VC.db 88 | *.VC.VC.opendb 89 | 90 | # Visual Studio profiler 91 | *.psess 92 | *.vsp 93 | *.vspx 94 | *.sap 95 | 96 | # TFS 2012 Local Workspace 97 | $tf/ 98 | 99 | # Guidance Automation Toolkit 100 | *.gpState 101 | 102 | # ReSharper is a .NET coding add-in 103 | _ReSharper*/ 104 | *.[Rr]e[Ss]harper 105 | *.DotSettings.user 106 | 107 | # JustCode is a .NET coding add-in 108 | .JustCode 109 | 110 | # TeamCity is a build add-in 111 | _TeamCity* 112 | 113 | # DotCover is a Code Coverage Tool 114 | *.dotCover 115 | 116 | # Visual Studio code coverage results 117 | *.coverage 118 | *.coveragexml 119 | 120 | # NCrunch 121 | _NCrunch_* 122 | .*crunch*.local.xml 123 | nCrunchTemp_* 124 | 125 | # MightyMoose 126 | *.mm.* 127 | AutoTest.Net/ 128 | 129 | # Web workbench (sass) 130 | .sass-cache/ 131 | 132 | # Installshield output folder 133 | [Ee]xpress/ 134 | 135 | # DocProject is a documentation generator add-in 136 | DocProject/buildhelp/ 137 | DocProject/Help/*.HxT 138 | DocProject/Help/*.HxC 139 | DocProject/Help/*.hhc 140 | DocProject/Help/*.hhk 141 | DocProject/Help/*.hhp 142 | DocProject/Help/Html2 143 | DocProject/Help/html 144 | 145 | # Click-Once directory 146 | publish/ 147 | 148 | # Publish Web Output 149 | *.[Pp]ublish.xml 150 | *.azurePubxml 151 | # TODO: Comment the next line if you want to checkin your web deploy settings 152 | # but database connection strings (with potential passwords) will be unencrypted 153 | *.pubxml 154 | *.publishproj 155 | 156 | # Microsoft Azure Web App publish settings. Comment the next line if you want to 157 | # checkin your Azure Web App publish settings, but sensitive information contained 158 | # in these scripts will be unencrypted 159 | PublishScripts/ 160 | 161 | # NuGet Packages 162 | *.nupkg 163 | # The packages folder can be ignored because of Package Restore 164 | **/packages/* 165 | # except build/, which is used as an MSBuild target. 166 | !**/packages/build/ 167 | # Uncomment if necessary however generally it will be regenerated when needed 168 | #!**/packages/repositories.config 169 | # NuGet v3's project.json files produces more ignoreable files 170 | *.nuget.props 171 | *.nuget.targets 172 | 173 | # Microsoft Azure Build Output 174 | csx/ 175 | *.build.csdef 176 | 177 | # Microsoft Azure Emulator 178 | ecf/ 179 | rcf/ 180 | 181 | # Windows Store app package directories and files 182 | AppPackages/ 183 | BundleArtifacts/ 184 | Package.StoreAssociation.xml 185 | _pkginfo.txt 186 | 187 | # Visual Studio cache files 188 | # files ending in .cache can be ignored 189 | *.[Cc]ache 190 | # but keep track of directories ending in .cache 191 | !*.[Cc]ache/ 192 | 193 | # Others 194 | ClientBin/ 195 | ~$* 196 | *~ 197 | *.dbmdl 198 | *.dbproj.schemaview 199 | *.jfm 200 | *.pfx 201 | *.publishsettings 202 | node_modules/ 203 | orleans.codegen.cs 204 | 205 | # Since there are multiple workflows, uncomment next line to ignore bower_components 206 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) 207 | #bower_components/ 208 | 209 | # RIA/Silverlight projects 210 | Generated_Code/ 211 | 212 | # Backup & report files from converting an old project file 213 | # to a newer Visual Studio version. Backup files are not needed, 214 | # because we have git ;-) 215 | _UpgradeReport_Files/ 216 | Backup*/ 217 | UpgradeLog*.XML 218 | UpgradeLog*.htm 219 | 220 | # SQL Server files 221 | *.mdf 222 | *.ldf 223 | 224 | # Business Intelligence projects 225 | *.rdl.data 226 | *.bim.layout 227 | *.bim_*.settings 228 | 229 | # Microsoft Fakes 230 | FakesAssemblies/ 231 | 232 | # GhostDoc plugin setting file 233 | *.GhostDoc.xml 234 | 235 | # Node.js Tools for Visual Studio 236 | .ntvs_analysis.dat 237 | 238 | # Visual Studio 6 build log 239 | *.plg 240 | 241 | # Visual Studio 6 workspace options file 242 | *.opt 243 | 244 | # Visual Studio LightSwitch build output 245 | **/*.HTMLClient/GeneratedArtifacts 246 | **/*.DesktopClient/GeneratedArtifacts 247 | **/*.DesktopClient/ModelManifest.xml 248 | **/*.Server/GeneratedArtifacts 249 | **/*.Server/ModelManifest.xml 250 | _Pvt_Extensions 251 | 252 | # Paket dependency manager 253 | .paket/paket.exe 254 | paket-files/ 255 | 256 | # FAKE - F# Make 257 | .fake/ 258 | 259 | # JetBrains Rider 260 | .idea/ 261 | *.sln.iml 262 | 263 | # CodeRush 264 | .cr/ 265 | 266 | # Python Tools for Visual Studio (PTVS) 267 | __pycache__/ 268 | *.pyc 269 | 270 | # Cake - Uncomment if you are using it 271 | # tools/ 272 | 273 | ### Linux ### 274 | 275 | # temporary files which can be created if a process still has a handle open of a deleted file 276 | .fuse_hidden* 277 | 278 | # KDE directory preferences 279 | .directory 280 | 281 | # Linux trash folder which might appear on any partition or disk 282 | .Trash-* 283 | 284 | # .nfs files are created when an open file is removed but is still being accessed 285 | .nfs* 286 | 287 | ### macOS ### 288 | *.DS_Store 289 | .AppleDouble 290 | .LSOverride 291 | 292 | # Icon must end with two \r 293 | Icon 294 | 295 | # Thumbnails 296 | ._* 297 | 298 | # Files that might appear in the root of a volume 299 | .DocumentRevisions-V100 300 | .fseventsd 301 | .Spotlight-V100 302 | .TemporaryItems 303 | .Trashes 304 | .VolumeIcon.icns 305 | .com.apple.timemachine.donotpresent 306 | 307 | # Directories potentially created on remote AFP share 308 | .AppleDB 309 | .AppleDesktop 310 | Network Trash Folder 311 | Temporary Items 312 | .apdisk 313 | 314 | ### VisualStudioCode ### 315 | .vscode/* 316 | !.vscode/settings.json 317 | !.vscode/tasks.json 318 | !.vscode/launch.json 319 | !.vscode/extensions.json 320 | .history 321 | 322 | ### Windows ### 323 | # Windows thumbnail cache files 324 | Thumbs.db 325 | ehthumbs.db 326 | ehthumbs_vista.db 327 | 328 | # Folder config file 329 | Desktop.ini 330 | 331 | # Recycle Bin used on file shares 332 | $RECYCLE.BIN/ 333 | 334 | # Windows Installer files 335 | *.cab 336 | *.msi 337 | *.msm 338 | *.msp 339 | 340 | # Windows shortcuts 341 | *.lnk 342 | 343 | ### VisualStudio ### 344 | ## Ignore Visual Studio temporary files, build results, and 345 | ## files generated by popular Visual Studio add-ons. 346 | ## 347 | ## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore 348 | 349 | # User-specific files 350 | 351 | # User-specific files (MonoDevelop/Xamarin Studio) 352 | 353 | # Build results 354 | 355 | # Visual Studio 2015 cache/options directory 356 | # Uncomment if you have tasks that create the project's static files in wwwroot 357 | #wwwroot/ 358 | 359 | # MSTest test Results 360 | 361 | # NUNIT 362 | 363 | # Build Results of an ATL Project 364 | 365 | # .NET Core 366 | **/Properties/launchSettings.json 367 | 368 | 369 | # Chutzpah Test files 370 | 371 | # Visual C++ cache files 372 | 373 | # Visual Studio profiler 374 | 375 | # TFS 2012 Local Workspace 376 | 377 | # Guidance Automation Toolkit 378 | 379 | # ReSharper is a .NET coding add-in 380 | 381 | # JustCode is a .NET coding add-in 382 | 383 | # TeamCity is a build add-in 384 | 385 | # DotCover is a Code Coverage Tool 386 | 387 | # Visual Studio code coverage results 388 | 389 | # NCrunch 390 | 391 | # MightyMoose 392 | 393 | # Web workbench (sass) 394 | 395 | # Installshield output folder 396 | 397 | # DocProject is a documentation generator add-in 398 | 399 | # Click-Once directory 400 | 401 | # Publish Web Output 402 | # TODO: Uncomment the next line to ignore your web deploy settings. 403 | # By default, sensitive information, such as encrypted password 404 | # should be stored in the .pubxml.user file. 405 | #*.pubxml 406 | *.pubxml.user 407 | 408 | # Microsoft Azure Web App publish settings. Comment the next line if you want to 409 | # checkin your Azure Web App publish settings, but sensitive information contained 410 | # in these scripts will be unencrypted 411 | 412 | # NuGet Packages 413 | # The packages folder can be ignored because of Package Restore 414 | # except build/, which is used as an MSBuild target. 415 | # Uncomment if necessary however generally it will be regenerated when needed 416 | #!**/packages/repositories.config 417 | # NuGet v3's project.json files produces more ignorable files 418 | 419 | # Microsoft Azure Build Output 420 | 421 | # Microsoft Azure Emulator 422 | 423 | # Windows Store app package directories and files 424 | 425 | # Visual Studio cache files 426 | # files ending in .cache can be ignored 427 | # but keep track of directories ending in .cache 428 | 429 | # Others 430 | 431 | # Since there are multiple workflows, uncomment next line to ignore bower_components 432 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) 433 | #bower_components/ 434 | 435 | # RIA/Silverlight projects 436 | 437 | # Backup & report files from converting an old project file 438 | # to a newer Visual Studio version. Backup files are not needed, 439 | # because we have git ;-) 440 | 441 | # SQL Server files 442 | *.ndf 443 | 444 | # Business Intelligence projects 445 | 446 | # Microsoft Fakes 447 | 448 | # GhostDoc plugin setting file 449 | 450 | # Node.js Tools for Visual Studio 451 | 452 | # Typescript v1 declaration files 453 | typings/ 454 | 455 | # Visual Studio 6 build log 456 | 457 | # Visual Studio 6 workspace options file 458 | 459 | # Visual Studio 6 auto-generated workspace file (contains which files were open etc.) 460 | *.vbw 461 | 462 | # Visual Studio LightSwitch build output 463 | 464 | # Paket dependency manager 465 | 466 | # FAKE - F# Make 467 | 468 | # JetBrains Rider 469 | 470 | # CodeRush 471 | 472 | # Python Tools for Visual Studio (PTVS) 473 | 474 | # Cake - Uncomment if you are using it 475 | # tools/** 476 | # !tools/packages.config 477 | 478 | # Telerik's JustMock configuration file 479 | *.jmconfig 480 | 481 | # BizTalk build output 482 | *.btp.cs 483 | *.btm.cs 484 | *.odx.cs 485 | *.xsd.cs 486 | 487 | ### VisualStudio Patch ### 488 | # By default, sensitive information, such as encrypted password 489 | # should be stored in the .pubxml.user file. 490 | 491 | ### Bower ### 492 | bower_components 493 | .bower-cache 494 | .bower-registry 495 | .bower-tmp 496 | 497 | ### grunt ### 498 | # Grunt usually compiles files inside this directory 499 | dist/ 500 | 501 | # Grunt usually preprocesses files such as coffeescript, compass... inside the .tmp directory 502 | .tmp/ 503 | 504 | ### Node ### 505 | # Logs 506 | logs 507 | *.log 508 | npm-debug.log* 509 | yarn-debug.log* 510 | yarn-error.log* 511 | 512 | # Runtime data 513 | pids 514 | *.pid 515 | *.seed 516 | *.pid.lock 517 | 518 | # Directory for instrumented libs generated by jscoverage/JSCover 519 | lib-cov 520 | 521 | # Coverage directory used by tools like istanbul 522 | coverage 523 | 524 | # nyc test coverage 525 | .nyc_output 526 | 527 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 528 | .grunt 529 | 530 | # Bower dependency directory (https://bower.io/) 531 | 532 | # node-waf configuration 533 | .lock-wscript 534 | 535 | # Compiled binary addons (http://nodejs.org/api/addons.html) 536 | build/Release 537 | 538 | # Dependency directories 539 | node_modules/ 540 | jspm_packages/ 541 | 542 | # Typescript v1 declaration files 543 | typings/ 544 | 545 | # Optional npm cache directory 546 | .npm 547 | 548 | # Optional eslint cache 549 | .eslintcache 550 | 551 | # Optional REPL history 552 | .node_repl_history 553 | 554 | # Output of 'npm pack' 555 | *.tgz 556 | 557 | # Yarn Integrity file 558 | .yarn-integrity 559 | 560 | # dotenv environment variables file 561 | .env 562 | 563 | 564 | ### Vim ### 565 | # swap 566 | [._]*.s[a-v][a-z] 567 | [._]*.sw[a-p] 568 | [._]s[a-v][a-z] 569 | [._]sw[a-p] 570 | # session 571 | Session.vim 572 | # temporary 573 | .netrwhist 574 | *~ 575 | # auto-generated tag files 576 | tags 577 | 578 | ### Autodesk Forge ### 579 | /models/* 580 | !/models/empty 581 | 582 | 583 | # End of https://www.gitignore.io/api/linux,macos,windows,aspnetcore,visualstudio,visualstudiocode -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | "version": "0.2.0", 6 | "configurations": [ 7 | { 8 | "type": "node", 9 | "request": "launch", 10 | "name": "Launch Program", 11 | "program": "${workspaceFolder}/mock-server/index.mjs", 12 | "runtimeArgs": [ 13 | "--experimental-modules" 14 | ] 15 | } 16 | ] 17 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) Autodesk, Inc. All rights reserved 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 | [![Node.js](https://img.shields.io/badge/Node.js-8.9.4-blue.svg)](https://nodejs.org/) 2 | [![npm](https://img.shields.io/badge/npm-5.8.0-blue.svg)](https://www.npmjs.com/) 3 | ![Platforms](https://img.shields.io/badge/platform-windows%20%7C%20osx%20%7C%20linux-lightgray.svg) 4 | [![License](http://img.shields.io/:license-mit-blue.svg)](http://opensource.org/licenses/MIT) 5 | 6 | # Forge Viewer Samples for Autodesk University 7 | 8 | ## Overview 9 | 10 | This sample is for a ADN section "Advanced Forge Viewer integration" in AU China 2018. 11 | 12 | ## Sample Screencasts 13 | 14 | 1. Custom Props Panel ([Source](https://github.com/yiskang/forge-au-sample/tree/master/properties))
15 | [![View on Youtube](http://img.youtube.com/vi/G07zHPx6Mr0/0.jpg)](http://www.youtube.com/watch?v=G07zHPx6Mr0) 16 | 2. Custom Material Structure Panel 17 | ([Source](https://github.com/yiskang/forge-au-sample/tree/master/model-structure))
18 | [![View on Youtube](http://img.youtube.com/vi/-Jy7yUbjP4E/0.jpg)](http://www.youtube.com/watch?v=-Jy7yUbjP4E) 19 | 3. Markup 3d ([Source](https://github.com/yiskang/forge-au-sample/tree/master/markup3d))
20 | [![View on Youtube](http://img.youtube.com/vi/rwxEe1-CUJ4/0.jpg)](http://www.youtube.com/watch?v=rwxEe1-CUJ4) 21 | 4. Sectioning with Revit levels ([Source](https://github.com/yiskang/forge-au-sample/tree/master/level-section))
22 | [![View on Youtube](http://img.youtube.com/vi/Fy_dbD81bN8/0.jpg)](http://www.youtube.com/watch?v=Fy_dbD81bN8) 23 | 24 | ## Requirements 25 | 26 | * node.js v8.9.4 or later (ES6 import/export feature required) 27 | 28 | 29 | ## Setup 30 | 31 | 1. Download and install [Node.js](http://nodejs.org/) (that will install npm as well) 32 | 2. Download this repo anywhere you want (the server will need to write files, so make sure you install in 33 | a location where you have write permission, at least the 'mock-server' folder) 34 | 3. Execute 'npm install', this command will download and install the required node modules automatically for you.
35 | ```bash 36 | npm install 37 | ``` 38 | 39 | 40 | ## Use of the sample 41 | 42 | 1. Run the mock server
43 | ```bash 44 | npm run server 45 | ``` 46 | 47 | 2. Open browser and navigate to http://127.0.0.1:3000
48 | 49 | 50 | ## License 51 | 52 | This sample is licensed under the terms of the [MIT License](http://opensource.org/licenses/MIT). 53 | Please see the [LICENSE](LICENSE) file for full details. 54 | 55 | ## Written by 56 | 57 | Eason Kang
58 | Forge Partner Development
59 | https://developer.autodesk.com/
60 | https://forge.autodesk.com/blog
-------------------------------------------------------------------------------- /grids/3D GRID DEMO.rvt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yiskang/forge-au-sample/1f88ebad2f12739f90f8aa9dd379aaf08209f791/grids/3D GRID DEMO.rvt -------------------------------------------------------------------------------- /grids/3D Grid.dyn: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | Text 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /grids/3D Grid.rfa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yiskang/forge-au-sample/1f88ebad2f12739f90f8aa9dd379aaf08209f791/grids/3D Grid.rfa -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | AU Forge Viewer Sample Index 8 | 20 | 21 | 22 | 23 | 24 | 25 | 28 | 31 | 32 | 33 | 36 | 39 | 40 | 41 |
26 | Model Structure 27 | 29 | Markup3d 30 |
34 | Properties 35 | 37 | Level Sectioning 38 |
42 | 43 | -------------------------------------------------------------------------------- /level-section/docs/Forge Viewer Sectioning.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yiskang/forge-au-sample/1f88ebad2f12739f90f8aa9dd379aaf08209f791/level-section/docs/Forge Viewer Sectioning.pdf -------------------------------------------------------------------------------- /level-section/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | AU Forge Viewer Sample 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /level-section/models: -------------------------------------------------------------------------------- 1 | ../models -------------------------------------------------------------------------------- /level-section/scripts/AdnLevelSectionPanel.js: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) Autodesk, Inc. All rights reserved 3 | // 4 | // Permission to use, copy, modify, and distribute this software in 5 | // object code form for any purpose and without fee is hereby granted, 6 | // provided that the above copyright notice appears in all copies and 7 | // that both that copyright notice and the limited warranty and 8 | // restricted rights notice below appear in all supporting 9 | // documentation. 10 | // 11 | // AUTODESK PROVIDES THIS PROGRAM "AS IS" AND WITH ALL FAULTS. 12 | // AUTODESK SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTY OF 13 | // MERCHANTABILITY OR FITNESS FOR A PARTICULAR USE. AUTODESK, INC. 14 | // DOES NOT WARRANT THAT THE OPERATION OF THE PROGRAM WILL BE 15 | // UNINTERRUPTED OR ERROR FREE. 16 | // 17 | // Forge AU Sample 18 | // by Eason Kang - Autodesk Developer Network (ADN) 19 | // 20 | 21 | 'use strict'; 22 | 23 | (function() { 24 | function getServerUrl() { 25 | return document.location.protocol + '//' + document.location.host; 26 | } 27 | 28 | class AdnLevelSectionPanel extends Autodesk.Viewing.UI.DockingPanel { 29 | constructor( viewer, title, options ) { 30 | options = options || {}; 31 | 32 | // Height adjustment for scroll container, offset to height of the title bar and footer by default. 33 | if( !options.heightAdjustment ) 34 | options.heightAdjustment = 70; 35 | 36 | if( !options.marginTop ) 37 | options.marginTop = 0; 38 | 39 | super( viewer.container, viewer.container.id + 'AdnLevelSectionPanel', title, options ); 40 | 41 | this.container.classList.add( 'adn-docking-panel' ); 42 | this.container.classList.add( 'adn-lvl-section-panel' ); 43 | this.createScrollContainer( options ); 44 | 45 | this.viewer = viewer; 46 | this.options = options; 47 | this.uiCreated = false; 48 | 49 | this.addVisibilityListener(( show ) => { 50 | if( !show ) return; 51 | 52 | if( !this.uiCreated ) 53 | this.createUI(); 54 | }); 55 | 56 | this.onButtonClicked = this.onButtonClicked.bind( this ); 57 | } 58 | 59 | getRemoteLevels() { 60 | return new Promise(( resolve, reject ) => { 61 | const srvUrl = getServerUrl(); 62 | fetch( `${ srvUrl }/api/levels`, { 63 | method: 'get', 64 | headers: new Headers({ 65 | 'Content-Type': 'application/json' 66 | }) 67 | }) 68 | .then( ( response ) => { 69 | if( response.status === 200 ) { 70 | return response.json(); 71 | } else { 72 | return reject( new Error( response.statusText ) ); 73 | } 74 | }) 75 | .then( ( data ) => { 76 | if( !data ) return reject( new Error( 'Failed to fetch levels from the server' ) ); 77 | 78 | return resolve( data ); 79 | }) 80 | .catch( ( error ) => reject( new Error( error ) ) ); 81 | }); 82 | } 83 | 84 | createSelectOptions( data, selector ) { 85 | if( !data || !selector || !(selector instanceof HTMLSelectElement) ) 86 | return; 87 | 88 | for( let i=0; i < data.length; ++i ) { 89 | const level = data[i]; 90 | 91 | const option = document.createElement( 'option' ); 92 | option.value = i; 93 | option.text = level.name; 94 | selector.add( option ); 95 | } 96 | } 97 | 98 | async createUI() { 99 | this.uiCreated = true; 100 | 101 | const table = document.createElement( 'table' ); 102 | table.className = 'adsk-lmv-tftable adn-lvl-section-panel-table'; 103 | 104 | const tbody = document.createElement( 'tbody' ); 105 | table.appendChild( tbody ); 106 | this.scrollContainer.appendChild( table ); 107 | 108 | const upperRow = tbody.insertRow( -1 ); 109 | const upperTextCell = upperRow.insertCell( 0 ); 110 | upperTextCell.innerText = 'Upper:'; 111 | const upperSelectCell = upperRow.insertCell( 1 ); 112 | 113 | const lowerRow = tbody.insertRow( -1 ); 114 | const lowerTextCell = lowerRow.insertCell( 0 ); 115 | lowerTextCell.innerText = 'Lower:'; 116 | const lowerSelectCell = lowerRow.insertCell( 1 ); 117 | 118 | const upperLvlSelector = document.createElement( 'select' ); 119 | upperLvlSelector.id = 'adn-upper-lvl-selector'; 120 | upperLvlSelector.className ='adn-lvl-selector'; 121 | upperSelectCell.appendChild( upperLvlSelector ); 122 | 123 | const lowerLvlSelector = document.createElement( 'select' ); 124 | lowerLvlSelector.id = 'adn-lower-lvl-selector'; 125 | lowerLvlSelector.className = 'adn-lvl-selector'; 126 | lowerSelectCell.appendChild( lowerLvlSelector ); 127 | 128 | const data = await this.getRemoteLevels(); 129 | this.levels = data; 130 | 131 | this.createSelectOptions( data, upperLvlSelector ); 132 | this.createSelectOptions( data, lowerLvlSelector ); 133 | 134 | const buttonRow = tbody.insertRow( -1 ); 135 | const buttonCell = buttonRow.insertCell( 0 ); 136 | buttonCell.colSpan = 2; 137 | 138 | const sectionButton = document.createElement( 'button' ); 139 | sectionButton.type = 'button'; 140 | sectionButton.textContent = 'Apply'; 141 | buttonCell.appendChild( sectionButton ); 142 | 143 | sectionButton.addEventListener( 144 | 'click', 145 | this.onButtonClicked 146 | ); 147 | 148 | this.resizeToContent(); 149 | } 150 | 151 | getCutPlaneParam( idx, n ) { 152 | if( idx < 0 || !n ) return; 153 | 154 | const level = this.levels[idx]; 155 | if( !level ) return; 156 | 157 | //const precision = Autodesk.Viewing.Private.calculatePrecision( level.elevation ); 158 | const model = this.viewer.model; 159 | const globalOffset = model.getData().globalOffset; 160 | const units = model.getUnitString(); 161 | const elevRaw = Autodesk.Viewing.Private.convertUnits( level.units, units, 1, level.elevation ); 162 | 163 | let d = elevRaw - globalOffset.z; 164 | if( n == 1 ) 165 | d = -1 * d; 166 | 167 | return new THREE.Vector4( 0, 0, n, d ); 168 | } 169 | 170 | onButtonClicked() { 171 | const upperSelector = document.getElementById( 'adn-upper-lvl-selector' ); 172 | const lowerSelector = document.getElementById( 'adn-lower-lvl-selector' ); 173 | 174 | if( !upperSelector || !lowerSelector ) 175 | return; 176 | 177 | const upperIdx = upperSelector.selectedIndex; 178 | const upperCutPlaneParam = this.getCutPlaneParam( upperIdx, 1 ); 179 | const lowerIdx = lowerSelector.selectedIndex; 180 | const lowerCutPlaneParam = this.getCutPlaneParam( lowerIdx, -1 ); 181 | 182 | this.viewer.setCutPlanes( [ upperCutPlaneParam, lowerCutPlaneParam ] ); 183 | } 184 | } 185 | 186 | class AdnLevelSectionPanelExtension extends Autodesk.Viewing.Extension { 187 | constructor( viewer, options ) { 188 | super( viewer, options ); 189 | 190 | this.panel = null; 191 | this.createUI = this.createUI.bind( this ); 192 | this.onToolbarCreated = this.onToolbarCreated.bind( this ); 193 | } 194 | 195 | onToolbarCreated() { 196 | this.viewer.removeEventListener( 197 | Autodesk.Viewing.TOOLBAR_CREATED_EVENT, 198 | this.onToolbarCreated 199 | ); 200 | 201 | this.createUI(); 202 | } 203 | 204 | createUI() { 205 | const viewer = this.viewer; 206 | 207 | const lvlSectionPanel = new AdnLevelSectionPanel( viewer, 'Level Section' ); 208 | 209 | viewer.addPanel( lvlSectionPanel ); 210 | this.panel = lvlSectionPanel; 211 | 212 | const lvlSectionButton = new Autodesk.Viewing.UI.Button( 'toolbar-adnLevelSectionsTool' ); 213 | lvlSectionButton.setToolTip( 'Level Sections' ); 214 | lvlSectionButton.setIcon( 'adsk-icon-properties' ); 215 | lvlSectionButton.onClick = function() { 216 | lvlSectionPanel.setVisible( !lvlSectionPanel.isVisible() ); 217 | }; 218 | 219 | const subToolbar = new Autodesk.Viewing.UI.ControlGroup( 'toolbar-adn-tools' ); 220 | subToolbar.addControl( lvlSectionButton ); 221 | subToolbar.adnLvlsectionbutton = lvlSectionButton; 222 | this.subToolbar = subToolbar; 223 | 224 | viewer.toolbar.addControl( this.subToolbar ); 225 | 226 | lvlSectionPanel.addVisibilityListener(function( visible ) { 227 | if( visible ) 228 | viewer.onPanelVisible( lvlSectionPanel, viewer ); 229 | 230 | lvlSectionButton.setState( visible ? Autodesk.Viewing.UI.Button.State.ACTIVE : Autodesk.Viewing.UI.Button.State.INACTIVE ); 231 | }); 232 | } 233 | 234 | load() { 235 | if( this.viewer.toolbar ) { 236 | // Toolbar is already available, create the UI 237 | this.createUI(); 238 | } else { 239 | // Toolbar hasn't been created yet, wait until we get notification of its creation 240 | this.viewer.addEventListener( 241 | Autodesk.Viewing.TOOLBAR_CREATED_EVENT, 242 | this.onToolbarCreated 243 | ); 244 | } 245 | 246 | return true; 247 | } 248 | 249 | unload() { 250 | if( this.panel ) { 251 | this.panel.uninitialize(); 252 | delete this.panel; 253 | this.panel = null; 254 | } 255 | 256 | if( this.subToolbar ) { 257 | this.viewer.toolbar.removeControl( this.subToolbar ); 258 | delete this.subToolbar; 259 | this.subToolbar = null; 260 | } 261 | 262 | return true; 263 | } 264 | } 265 | 266 | Autodesk.Viewing.theExtensionManager.registerExtension( 'Autodesk.ADN.LevelSectionPanel', AdnLevelSectionPanelExtension ); 267 | })(); -------------------------------------------------------------------------------- /level-section/scripts/index.js: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) Autodesk, Inc. All rights reserved 3 | // 4 | // Permission to use, copy, modify, and distribute this software in 5 | // object code form for any purpose and without fee is hereby granted, 6 | // provided that the above copyright notice appears in all copies and 7 | // that both that copyright notice and the limited warranty and 8 | // restricted rights notice below appear in all supporting 9 | // documentation. 10 | // 11 | // AUTODESK PROVIDES THIS PROGRAM "AS IS" AND WITH ALL FAULTS. 12 | // AUTODESK SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTY OF 13 | // MERCHANTABILITY OR FITNESS FOR A PARTICULAR USE. AUTODESK, INC. 14 | // DOES NOT WARRANT THAT THE OPERATION OF THE PROGRAM WILL BE 15 | // UNINTERRUPTED OR ERROR FREE. 16 | // 17 | // Forge AU Sample 18 | // by Eason Kang - Autodesk Developer Network (ADN) 19 | // 20 | 21 | 'use strict'; 22 | 23 | (function() { 24 | const options = { 25 | env: 'Local', 26 | }; 27 | 28 | const doc = { 'rootFolder': 'models/House', 'path': 'Resource/3D_View/_3D_ 960621/_3D_.svf', 'name': '3D view' }; 29 | 30 | const config3d = { 31 | extensions: [ 'Autodesk.ADN.LevelSectionPanel' ] 32 | }; 33 | const viewerDiv = document.getElementById( 'MyViewerDiv' ); 34 | const viewer = new Autodesk.Viewing.Private.GuiViewer3D( viewerDiv, config3d ); 35 | 36 | Autodesk.Viewing.Initializer(options, function() { 37 | if( viewer.start() != 0 ) return console.error( 'Failed to initialize viewer' ); 38 | 39 | const basePath = getCurrentBaseURL(); 40 | const modelFolderPath = basePath + doc.rootFolder + '/'; 41 | const modelFilePath = modelFolderPath + doc.path; 42 | const modelOptions = { 43 | sharedPropertyDbPath: modelFolderPath, 44 | isAEC: true 45 | }; 46 | 47 | viewer.addEventListener( 48 | Autodesk.Viewing.PROGRESS_UPDATE_EVENT, 49 | function( event ) { 50 | if(event.state == Autodesk.Viewing.ProgressState.LOADING) 51 | console.log( '%cPROGRESS_UPDATE_EVENT:', 'color: blue;', event ); 52 | }); 53 | 54 | viewer.addEventListener( 55 | Autodesk.Viewing.OBJECT_TREE_CREATED_EVENT, 56 | function() { 57 | console.log( '%cOBJECT_TREE_CREATED_EVENT: !!!Object tree loaded!!!', 'color: blue;' ); 58 | }); 59 | 60 | viewer.addEventListener( 61 | Autodesk.Viewing.GEOMETRY_LOADED_EVENT, 62 | function( event ) { 63 | console.log( '%cGEOMETRY_LOADED_EVENT: !!!Geometries loaded!!!', 'color: green;' ); 64 | console.log( event ); 65 | }); 66 | 67 | // viewer.prefs.tag( 'ignore-producer' ); 68 | // viewer.prefs.set( 'viewCube', true ); 69 | 70 | viewer.loadModel( modelFilePath, modelOptions, onLoadModelSuccess, onLoadModelError ); 71 | }); 72 | 73 | function getCurrentBaseURL() { 74 | let basePath = ''; 75 | const lastSlash = document.location.href.lastIndexOf( '/' ); 76 | 77 | if( lastSlash != -1 ) 78 | basePath = document.location.href.substr( 0, lastSlash + 1 ); 79 | else 80 | basePath = document.location.href; 81 | 82 | return basePath; 83 | } 84 | 85 | /** 86 | * viewer.loadModel() success callback. 87 | * Invoked after the model's SVF has been initially loaded. 88 | * It may trigger before any geometry has been downloaded and displayed on-screen. 89 | */ 90 | function onLoadModelSuccess(model) { 91 | console.log( 'onLoadModelSuccess()!' ); 92 | console.log( 'Validate model loaded: ' + (viewer.model === model) ); 93 | console.log( model ); 94 | } 95 | 96 | /** 97 | * viewer.loadModel() failure callback. 98 | * Invoked when there's an error fetching the SVF file. 99 | */ 100 | function onLoadModelError(viewerErrorCode) { 101 | console.error( 'onLoadModelError() - errorCode:' + viewerErrorCode ); 102 | } 103 | })(); -------------------------------------------------------------------------------- /level-section/styles/index.css: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 0; 3 | } 4 | 5 | #MyViewerDiv { 6 | width: 100%; 7 | height: 100%; 8 | margin: 0; 9 | background-color: #F0F8FF; 10 | } 11 | 12 | .adn-docking-panel { 13 | top: 10px; 14 | left: 10px; 15 | } 16 | 17 | .adn-lvl-section-panel .docking-panel-scroll { 18 | width: 370px; 19 | height: 112px; 20 | min-width: 370px; 21 | max-height: 112px; 22 | } 23 | 24 | .adn-lvl-section-panel .docking-panel-scroll table { 25 | width: 100%; 26 | height: 100%; 27 | } 28 | 29 | .adn-lvl-section-panel table td:first-child { 30 | width: 30px; 31 | color: #f3f7fb; 32 | } 33 | 34 | .adn-lvl-section-panel table td:last-child { 35 | color: #bec8d2; 36 | } 37 | 38 | .adn-lvl-section-panel table tr:last-child { 39 | text-align: center; 40 | } 41 | 42 | .adn-lvl-section-panel table tr:last-child button { 43 | width: calc(100% - 50px); 44 | height: 30px; 45 | } 46 | 47 | .adn-lvl-selector { 48 | width: 100%; 49 | height: 25px; 50 | } -------------------------------------------------------------------------------- /markup3d/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | AU Forge Viewer Sample 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /markup3d/models: -------------------------------------------------------------------------------- 1 | ../models -------------------------------------------------------------------------------- /markup3d/scripts/AdnMarkup3dTool.js: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) Autodesk, Inc. All rights reserved 3 | // 4 | // Permission to use, copy, modify, and distribute this software in 5 | // object code form for any purpose and without fee is hereby granted, 6 | // provided that the above copyright notice appears in all copies and 7 | // that both that copyright notice and the limited warranty and 8 | // restricted rights notice below appear in all supporting 9 | // documentation. 10 | // 11 | // AUTODESK PROVIDES THIS PROGRAM "AS IS" AND WITH ALL FAULTS. 12 | // AUTODESK SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTY OF 13 | // MERCHANTABILITY OR FITNESS FOR A PARTICULAR USE. AUTODESK, INC. 14 | // DOES NOT WARRANT THAT THE OPERATION OF THE PROGRAM WILL BE 15 | // UNINTERRUPTED OR ERROR FREE. 16 | // 17 | // Forge AU Sample 18 | // by Eason Kang - Autodesk Developer Network (ADN) 19 | // 20 | 21 | 'use strict'; 22 | 23 | (function() { 24 | function getServerUrl() { 25 | return document.location.protocol + '//' + document.location.host; 26 | } 27 | 28 | //ref: https://github.com/Autodesk-Forge/library-javascript-viewer-extensions/blob/0c0db2d6426f4ff4aea1042813ed10da17c63554/src/components/UIComponent/UIComponent.js#L34 29 | function guid( format = 'xxxxxxxxxx' ) { 30 | 31 | let d = new Date().getTime(); 32 | 33 | return format.replace( 34 | /[xy]/g, 35 | function( c ) { 36 | let r = (d + Math.random() * 16) % 16 | 0; 37 | d = Math.floor(d / 16); 38 | return (c == 'x' ? r : (r & 0x7 | 0x8)).toString(16); 39 | }); 40 | } 41 | 42 | class AdnToolInterface { 43 | constructor( viewer ) { 44 | this._viewer = viewer; 45 | this._active = false; 46 | this._names = [ 'unnamed' ]; 47 | } 48 | 49 | get viewer() { 50 | return this._viewer; 51 | } 52 | 53 | getPriority() { 54 | return 0; 55 | } 56 | 57 | isActive() { 58 | return this._active; 59 | } 60 | 61 | getNames() { 62 | return this._names; 63 | } 64 | 65 | getName() { 66 | return this._names[0]; 67 | } 68 | 69 | register() { 70 | } 71 | 72 | deregister() { 73 | } 74 | 75 | activate( name ) { 76 | this._active = true; 77 | } 78 | 79 | deactivate( name ) { 80 | this._active = false; 81 | } 82 | 83 | update( highResTimestamp ) { 84 | return false; 85 | } 86 | 87 | handleSingleClick( event, button ) { 88 | return false; 89 | } 90 | 91 | handleDoubleClick( event, button ) { 92 | return false; 93 | } 94 | 95 | handleSingleTap( event, button ) { 96 | return false; 97 | } 98 | 99 | handleDoubleTap( event, button ) { 100 | return false; 101 | } 102 | 103 | handleKeyDown( event, button ) { 104 | return false; 105 | } 106 | 107 | handleKeyUp( event, button ) { 108 | return false; 109 | } 110 | 111 | handleWheelInput( event, button ) { 112 | return false; 113 | } 114 | 115 | handleButtonDown( event, button ) { 116 | return false; 117 | } 118 | 119 | handleButtonUp( event, button ) { 120 | return false; 121 | } 122 | 123 | handleMouseMove( event, button ) { 124 | return false; 125 | } 126 | 127 | handleGesture( event, button ) { 128 | return false; 129 | } 130 | 131 | handleBlur( event, button ) { 132 | return false; 133 | } 134 | 135 | handleResize( event, button ) { 136 | return false; 137 | } 138 | } 139 | 140 | class AdnMarkup3dTool extends AdnToolInterface { 141 | constructor( viewer ) { 142 | super( viewer ); 143 | 144 | this._names = [ 'adn-markup-3d' ]; 145 | this.markups = []; 146 | this.markupIcons = []; 147 | this.handleCameraUpdate = this.handleCameraUpdate.bind( this ); 148 | this.editMode = false; 149 | } 150 | 151 | getPriority() { 152 | return 10; 153 | } 154 | 155 | isEditMode() { 156 | return this.editMode; 157 | } 158 | 159 | enterEditMode() { 160 | this.editMode = true; 161 | } 162 | 163 | leaveEditMode() { 164 | this.editMode = false; 165 | } 166 | 167 | activate() { 168 | this.viewer.addEventListener( 169 | Autodesk.Viewing.CAMERA_CHANGE_EVENT, 170 | this.handleCameraUpdate 171 | ); 172 | } 173 | 174 | deactivate() { 175 | this.viewer.removeEventListener( 176 | Autodesk.Viewing.CAMERA_CHANGE_EVENT, 177 | this.handleCameraUpdate 178 | ); 179 | } 180 | 181 | toggleVisible() { 182 | const n = this.markups.length; 183 | for( let i=0; i m.id === id ); 240 | 241 | if( id === -1 ) 242 | return console.warn( `No markup with id \`${ id }\`` ); 243 | 244 | this.markups.splice( idx, 1 ); 245 | const markupIcon = this.markupIcons[idx]; 246 | markupIcon.parentNode.removeChild( markupIcon ); 247 | } 248 | 249 | handleCameraUpdate() { 250 | const viewer = this.viewer; 251 | 252 | const n = this.markups.length; 253 | for( let i=0; i { 294 | if( response.status === 200 || response.status === 201 ) { 295 | return response.json(); 296 | } else { 297 | return console.error( new Error( response.statusText ) ); 298 | } 299 | }) 300 | .then( ( data ) => { 301 | if( !data ) return console.error( new Error( 'Failed to push the new markup to the server' ) ); 302 | 303 | console.log( data ); 304 | }) 305 | .catch( ( error ) => console.error( new Error( error ) ) ); 306 | } 307 | 308 | return true; 309 | } 310 | 311 | getState( viewerState ) { 312 | const markups = []; 313 | 314 | for( let id in this.markups ) { 315 | const markup = this.markups[id]; 316 | 317 | markups.push({ 318 | id: markup.id, 319 | pos3d: markup.pos3d.toArray(), 320 | diameter: markup.diameter 321 | }); 322 | } 323 | 324 | viewerState.adnMarkup3d = { 325 | markups 326 | }; 327 | } 328 | 329 | restoreState( viewerState ) { 330 | while( this.markups.length ) { 331 | const markup = this.markups.shift(); 332 | this.removeMarkup( markup.id ); 333 | } 334 | 335 | if( !viewerState.adnMarkup3d ) 336 | return; 337 | 338 | const markups = viewerState.adnMarkup3d.markups; 339 | const n = markups.length; 340 | for( let i=0; i { 381 | if( response.status === 200 ) { 382 | return response.json(); 383 | } else { 384 | return console.error( new Error( response.statusText ) ); 385 | } 386 | }) 387 | .then( ( data ) => { 388 | if( !data ) return console.error( new Error( 'Failed to fetch markups from the server' ) ); 389 | 390 | console.log( 'Load markups', data ); 391 | 392 | const markups = data.map( function( d ) { 393 | return { 394 | id: d.serial, 395 | diameter: d.diameter, 396 | pos3d: d.pos3d 397 | }; 398 | }); 399 | 400 | this.restoreState({ 401 | adnMarkup3d: { 402 | markups 403 | }}); 404 | }) 405 | .catch( ( error ) => console.error( new Error( error ) ) ); 406 | } 407 | 408 | createUI() { 409 | const viewer = this.viewer; 410 | const tool = this.tool; 411 | const avu = Autodesk.Viewing.UI; 412 | 413 | viewer.addEventListener( 414 | Autodesk.Viewing.GEOMETRY_LOADED_EVENT, 415 | this.onModelLoaded 416 | ); 417 | 418 | const markupVisibilityButton = new avu.Button( 'toolbar-adnMarkupVisibilityTool' ); 419 | markupVisibilityButton.setState( avu.Button.State.ACTIVE ); 420 | markupVisibilityButton.setToolTip( 'Show Markups' ); 421 | markupVisibilityButton.addClass( 'far' ); 422 | markupVisibilityButton.setIcon( 'fa-eye' ); 423 | markupVisibilityButton.onClick = function() { 424 | const state = markupVisibilityButton.getState(); 425 | 426 | if( state === avu.Button.State.INACTIVE ) { 427 | markupVisibilityButton.setState( avu.Button.State.ACTIVE ); 428 | } else if( state === avu.Button.State.ACTIVE ) { 429 | markupVisibilityButton.setState( avu.Button.State.INACTIVE ); 430 | 431 | if( tool.isEditMode() ) { 432 | markupAddButton.setState( avu.Button.State.INACTIVE ); 433 | tool.leaveEditMode(); 434 | } 435 | } 436 | 437 | tool.toggleVisible(); 438 | }; 439 | 440 | const markupAddButton = new avu.Button( 'toolbar-adnMarkupAddTool' ); 441 | markupAddButton.setToolTip( 'Add Markups' ); 442 | markupAddButton.addClass( 'fas' ); 443 | markupAddButton.setIcon( 'fa-plus' ); 444 | markupAddButton.onClick = function() { 445 | const state = markupAddButton.getState(); 446 | 447 | if( state === avu.Button.State.INACTIVE ) { 448 | markupAddButton.setState( avu.Button.State.ACTIVE ); 449 | markupVisibilityButton.setState( avu.Button.State.ACTIVE ); 450 | 451 | tool.enterEditMode(); 452 | } else if( state === avu.Button.State.ACTIVE ) { 453 | markupAddButton.setState( avu.Button.State.INACTIVE ); 454 | 455 | tool.leaveEditMode(); 456 | } 457 | }; 458 | 459 | const subToolbar = new Autodesk.Viewing.UI.ControlGroup( 'toolbar-adn-tools' ); 460 | subToolbar.addControl( markupVisibilityButton ); 461 | subToolbar.addControl( markupAddButton ); 462 | subToolbar.adnmarkupvisibilitybutton = markupVisibilityButton; 463 | subToolbar.adnmarkupaddbutton = markupAddButton; 464 | this.subToolbar = subToolbar; 465 | 466 | viewer.toolbar.addControl( this.subToolbar ); 467 | } 468 | 469 | load() { 470 | const viewer = this.viewer; 471 | const tool = new AdnMarkup3dTool( this.viewer ); 472 | viewer.toolController.registerTool( tool ); 473 | viewer.toolController.activateTool( tool.getName() ); 474 | this.tool = tool; 475 | 476 | if( viewer.toolbar ) { 477 | // Toolbar is already available, create the UI 478 | this.createUI(); 479 | } else { 480 | // Toolbar hasn't been created yet, wait until we get notification of its creation 481 | this.viewer.addEventListener( 482 | Autodesk.Viewing.TOOLBAR_CREATED_EVENT, 483 | this.onToolbarCreated 484 | ); 485 | } 486 | 487 | return true; 488 | } 489 | 490 | unload() { 491 | this.viewer.toolController.deactivateTool( this.tool.getName() ); 492 | this.viewer.toolController.deregisterTool( this.tool ); 493 | this.tool = null; 494 | 495 | if( this.subToolbar ) { 496 | this.viewer.toolbar.removeControl( this.subToolbar ); 497 | delete this.subToolbar; 498 | this.subToolbar = null; 499 | } 500 | 501 | return true; 502 | } 503 | 504 | getState( viewerState ) { 505 | this.tool.getState( viewerState ); 506 | } 507 | 508 | restoreState( viewerState, immediate ) { 509 | this.tool.restoreState( viewerState, immediate ); 510 | } 511 | } 512 | 513 | Autodesk.Viewing.theExtensionManager.registerExtension( 'Autodesk.ADN.Markup3dTool', AdnMarkup3dToolExtension ); 514 | })(); -------------------------------------------------------------------------------- /markup3d/scripts/index.js: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) Autodesk, Inc. All rights reserved 3 | // 4 | // Permission to use, copy, modify, and distribute this software in 5 | // object code form for any purpose and without fee is hereby granted, 6 | // provided that the above copyright notice appears in all copies and 7 | // that both that copyright notice and the limited warranty and 8 | // restricted rights notice below appear in all supporting 9 | // documentation. 10 | // 11 | // AUTODESK PROVIDES THIS PROGRAM "AS IS" AND WITH ALL FAULTS. 12 | // AUTODESK SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTY OF 13 | // MERCHANTABILITY OR FITNESS FOR A PARTICULAR USE. AUTODESK, INC. 14 | // DOES NOT WARRANT THAT THE OPERATION OF THE PROGRAM WILL BE 15 | // UNINTERRUPTED OR ERROR FREE. 16 | // 17 | // Forge AU Sample 18 | // by Eason Kang - Autodesk Developer Network (ADN) 19 | // 20 | 21 | 'use strict'; 22 | 23 | (function() { 24 | const options = { 25 | env: 'Local', 26 | }; 27 | 28 | const doc = { 'rootFolder': 'models/House', 'path': 'Resource/3D_View/_3D_ 960621/_3D_.svf', 'name': '3D view' }; 29 | 30 | const config3d = { 31 | extensions: [ 'Autodesk.ADN.Markup3dTool' ] 32 | }; 33 | const viewerDiv = document.getElementById( 'MyViewerDiv' ); 34 | const viewer = new Autodesk.Viewing.Private.GuiViewer3D( viewerDiv, config3d ); 35 | 36 | Autodesk.Viewing.Initializer(options, function() { 37 | if( viewer.start() != 0 ) return console.error( 'Failed to initialize viewer' ); 38 | 39 | const basePath = getCurrentBaseURL(); 40 | const modelFolderPath = basePath + doc.rootFolder + '/'; 41 | const modelFilePath = modelFolderPath + doc.path; 42 | const modelOptions = { 43 | sharedPropertyDbPath: modelFolderPath, 44 | isAEC: true 45 | }; 46 | 47 | viewer.addEventListener( 48 | Autodesk.Viewing.PROGRESS_UPDATE_EVENT, 49 | function( event ) { 50 | if(event.state == Autodesk.Viewing.ProgressState.LOADING) 51 | console.log( '%cPROGRESS_UPDATE_EVENT:', 'color: blue;', event ); 52 | }); 53 | 54 | viewer.addEventListener( 55 | Autodesk.Viewing.OBJECT_TREE_CREATED_EVENT, 56 | function() { 57 | console.log( '%cOBJECT_TREE_CREATED_EVENT: !!!Object tree loaded!!!', 'color: blue;' ); 58 | }); 59 | 60 | viewer.addEventListener( 61 | Autodesk.Viewing.GEOMETRY_LOADED_EVENT, 62 | function( event ) { 63 | console.log( '%cGEOMETRY_LOADED_EVENT: !!!Geometries loaded!!!', 'color: green;' ); 64 | console.log( event ); 65 | }); 66 | 67 | // viewer.prefs.tag( 'ignore-producer' ); 68 | // viewer.prefs.set( 'viewCube', true ); 69 | 70 | viewer.loadModel( modelFilePath, modelOptions, onLoadModelSuccess, onLoadModelError ); 71 | }); 72 | 73 | function getCurrentBaseURL() { 74 | let basePath = ''; 75 | const lastSlash = document.location.href.lastIndexOf( '/' ); 76 | 77 | if( lastSlash != -1 ) 78 | basePath = document.location.href.substr( 0, lastSlash + 1 ); 79 | else 80 | basePath = document.location.href; 81 | 82 | return basePath; 83 | } 84 | 85 | /** 86 | * viewer.loadModel() success callback. 87 | * Invoked after the model's SVF has been initially loaded. 88 | * It may trigger before any geometry has been downloaded and displayed on-screen. 89 | */ 90 | function onLoadModelSuccess(model) { 91 | console.log( 'onLoadModelSuccess()!' ); 92 | console.log( 'Validate model loaded: ' + (viewer.model === model) ); 93 | console.log( model ); 94 | } 95 | 96 | /** 97 | * viewer.loadModel() failure callback. 98 | * Invoked when there's an error fetching the SVF file. 99 | */ 100 | function onLoadModelError(viewerErrorCode) { 101 | console.error( 'onLoadModelError() - errorCode:' + viewerErrorCode ); 102 | } 103 | })(); -------------------------------------------------------------------------------- /markup3d/styles/index.css: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 0; 3 | } 4 | 5 | #MyViewerDiv { 6 | width: 100%; 7 | height: 100%; 8 | margin: 0; 9 | background-color: #F0F8FF; 10 | } -------------------------------------------------------------------------------- /mock-server/db.json: -------------------------------------------------------------------------------- 1 | { 2 | "dataTypes": [ 3 | { 4 | "id": 1, 5 | "name": "Unknown", 6 | "serial": 0 7 | }, 8 | { 9 | "id": 2, 10 | "name": "Boolean", 11 | "serial": 1 12 | }, 13 | { 14 | "id": 3, 15 | "name": "Integer", 16 | "serial": 2 17 | }, 18 | { 19 | "id": 4, 20 | "name": "Double", 21 | "serial": 3 22 | }, 23 | { 24 | "id": 5, 25 | "name": "BLOB", 26 | "serial": 10 27 | }, 28 | { 29 | "id": 6, 30 | "name": "DbKey", 31 | "serial": 11 32 | }, 33 | { 34 | "id": 7, 35 | "name": "String", 36 | "serial": 20 37 | }, 38 | { 39 | "id": 8, 40 | "name": "LocalizableString", 41 | "serial": 21 42 | }, 43 | { 44 | "id": 9, 45 | "name": "DateTime", 46 | "serial": 22 47 | }, 48 | { 49 | "id": 10, 50 | "name": "GeoLocation", 51 | "serial": 23 52 | }, 53 | { 54 | "id": 10, 55 | "name": "Position", 56 | "serial": 24 57 | } 58 | ], 59 | "props": [ 60 | { 61 | "id": 1, 62 | "name": "GUID", 63 | "category": "Identity Data", 64 | "dataType_id": 7, 65 | "dataTypeContext": "", 66 | "description": "", 67 | "displayName": "GUID", 68 | "flags": 0, 69 | "value": "c85e5be0-d8d5-4148-836f-b55e711ef373-00068ac9", 70 | "dbId": 2591 71 | }, 72 | { 73 | "id": 2, 74 | "name": "Type", 75 | "category": "Identity Data", 76 | "dataType_id": 7, 77 | "dataTypeContext": "", 78 | "description": "", 79 | "displayName": "Type", 80 | "flags": 0, 81 | "value": "Walls", 82 | "dbId": 2591 83 | }, 84 | { 85 | "id": 3, 86 | "name": "GUID", 87 | "category": "Identity Data", 88 | "dataType_id": 7, 89 | "dataTypeContext": "", 90 | "description": "", 91 | "displayName": "GUID", 92 | "flags": 0, 93 | "value": "a6aa132d-ccd7-408f-b2f9-ed67350c8c3a-0003b64a", 94 | "dbId": 2214 95 | }, 96 | { 97 | "id": 4, 98 | "name": "Type", 99 | "category": "Identity Data", 100 | "dataType_id": 7, 101 | "dataTypeContext": "", 102 | "description": "", 103 | "displayName": "Type", 104 | "flags": 0, 105 | "value": "Roof", 106 | "dbId": 2214 107 | } 108 | ], 109 | "markups": [ 110 | { 111 | "id": 1, 112 | "serial": "cf7df782c4", 113 | "pos3d": [ 114 | -32.69620893601062, 115 | -23.44848006526348, 116 | -17.61781597137451 117 | ], 118 | "diameter": 16 119 | }, 120 | { 121 | "serial": "09fa229f84", 122 | "pos3d": [ 123 | -3.8634885543221316, 124 | -48.622762592121546, 125 | -20.20061650237392 126 | ], 127 | "diameter": 16, 128 | "id": 2 129 | }, 130 | { 131 | "serial": "8f74a85c2f", 132 | "pos3d": [ 133 | 39.07297716857411, 134 | -41.861361325664745, 135 | -15.823816072143913 136 | ], 137 | "diameter": 16, 138 | "id": 3 139 | }, 140 | { 141 | "serial": "4bcf9b3709", 142 | "pos3d": [ 143 | 6.360643381922031, 144 | 19.20157564737326, 145 | -17.61781597137451 146 | ], 147 | "diameter": 16, 148 | "id": 4 149 | }, 150 | { 151 | "serial": "96b25bb43e", 152 | "pos3d": [ 153 | 75.2598124719954, 154 | 76.41616640710271, 155 | -3.8386013506442964 156 | ], 157 | "diameter": 16, 158 | "id": 5 159 | } 160 | ], 161 | "levels": [ 162 | { 163 | "id": 1, 164 | "name": "Upper Unlimited", 165 | "elevation": 20000, 166 | "units": "mm" 167 | }, 168 | { 169 | "id": 2, 170 | "name": "Roof Line", 171 | "elevation": 6000, 172 | "units": "mm" 173 | }, 174 | { 175 | "id": 3, 176 | "name": "Level 2", 177 | "elevation": 3000, 178 | "units": "mm" 179 | }, 180 | { 181 | "id": 4, 182 | "name": "Celling", 183 | "elevation": 2700, 184 | "units": "mm" 185 | }, 186 | { 187 | "id": 5, 188 | "name": "Level 1", 189 | "elevation": 0, 190 | "units": "mm" 191 | }, 192 | { 193 | "id": 6, 194 | "name": "Level 1 Living Rm.", 195 | "elevation": -550, 196 | "units": "mm" 197 | }, 198 | { 199 | "id": 7, 200 | "name": "Foundation", 201 | "elevation": -800, 202 | "units": "mm" 203 | }, 204 | { 205 | "id": 8, 206 | "name": "Lower Unlimited", 207 | "elevation": -20000, 208 | "units": "mm" 209 | } 210 | ] 211 | } -------------------------------------------------------------------------------- /mock-server/expose.js: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) Autodesk, Inc. All rights reserved 3 | // 4 | // Permission to use, copy, modify, and distribute this software in 5 | // object code form for any purpose and without fee is hereby granted, 6 | // provided that the above copyright notice appears in all copies and 7 | // that both that copyright notice and the limited warranty and 8 | // restricted rights notice below appear in all supporting 9 | // documentation. 10 | // 11 | // AUTODESK PROVIDES THIS PROGRAM "AS IS" AND WITH ALL FAULTS. 12 | // AUTODESK SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTY OF 13 | // MERCHANTABILITY OR FITNESS FOR A PARTICULAR USE. AUTODESK, INC. 14 | // DOES NOT WARRANT THAT THE OPERATION OF THE PROGRAM WILL BE 15 | // UNINTERRUPTED OR ERROR FREE. 16 | // 17 | // Forge AU Sample 18 | // by Eason Kang - Autodesk Developer Network (ADN) 19 | // 20 | 21 | //Fix for __filename & __dirname missing issue in ES6 module. 22 | //Ref: https://github.com/nodejs/node/issues/16844 23 | 24 | const FILENAME = typeof __filename !== 'undefined' ? __filename : (/^ +at (?:file:\/*(?=\/)|)(.*?):\d+:\d+$/m.exec(Error().stack) || '')[1]; 25 | const DIRNAME = typeof __dirname !== 'undefined' ? __dirname : FILENAME.replace(/[\/\\][^\/\\]*?$/, ''); 26 | 27 | module.exports = { 28 | FILENAME, 29 | DIRNAME 30 | }; -------------------------------------------------------------------------------- /mock-server/index.js: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) Autodesk, Inc. All rights reserved 3 | // 4 | // Permission to use, copy, modify, and distribute this software in 5 | // object code form for any purpose and without fee is hereby granted, 6 | // provided that the above copyright notice appears in all copies and 7 | // that both that copyright notice and the limited warranty and 8 | // restricted rights notice below appear in all supporting 9 | // documentation. 10 | // 11 | // AUTODESK PROVIDES THIS PROGRAM "AS IS" AND WITH ALL FAULTS. 12 | // AUTODESK SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTY OF 13 | // MERCHANTABILITY OR FITNESS FOR A PARTICULAR USE. AUTODESK, INC. 14 | // DOES NOT WARRANT THAT THE OPERATION OF THE PROGRAM WILL BE 15 | // UNINTERRUPTED OR ERROR FREE. 16 | // 17 | // Forge AU Sample 18 | // by Eason Kang - Autodesk Developer Network (ADN) 19 | // 20 | 21 | const jsonServer = require('json-server'); 22 | const path = require('path'); 23 | const { DIRNAME } = require('./expose'); 24 | const routes = require('./routes.json'); 25 | 26 | const servePort = 3000; 27 | const dbFile = path.join( DIRNAME, 'db.json' ); 28 | 29 | const server = jsonServer.create(); 30 | const foreignKeySuffix = '_id'; 31 | const router = jsonServer.router( dbFile , { foreignKeySuffix } ); 32 | 33 | const defaultsOpts = { 34 | static: path.join( process.cwd(), './' ), 35 | bodyParser: true 36 | }; 37 | const middlewares = jsonServer.defaults( defaultsOpts ); 38 | const rewriter = jsonServer.rewriter( routes ); 39 | 40 | server.use( middlewares ); 41 | server.use( rewriter ); 42 | server.use( router ); 43 | server.listen( servePort, () => { 44 | console.log( 'JSON server runing on port %d', servePort ); 45 | }); -------------------------------------------------------------------------------- /mock-server/routes.json: -------------------------------------------------------------------------------- 1 | { 2 | "/api/*": "/$1" 3 | } -------------------------------------------------------------------------------- /model-structure/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | AU Forge Viewer Sample 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /model-structure/models: -------------------------------------------------------------------------------- 1 | ../models -------------------------------------------------------------------------------- /model-structure/scripts/AdnStructurePanel.js: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) Autodesk, Inc. All rights reserved 3 | // 4 | // Permission to use, copy, modify, and distribute this software in 5 | // object code form for any purpose and without fee is hereby granted, 6 | // provided that the above copyright notice appears in all copies and 7 | // that both that copyright notice and the limited warranty and 8 | // restricted rights notice below appear in all supporting 9 | // documentation. 10 | // 11 | // AUTODESK PROVIDES THIS PROGRAM "AS IS" AND WITH ALL FAULTS. 12 | // AUTODESK SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTY OF 13 | // MERCHANTABILITY OR FITNESS FOR A PARTICULAR USE. AUTODESK, INC. 14 | // DOES NOT WARRANT THAT THE OPERATION OF THE PROGRAM WILL BE 15 | // UNINTERRUPTED OR ERROR FREE. 16 | // 17 | // Forge AU Sample 18 | // by Eason Kang - Autodesk Developer Network (ADN) 19 | // 20 | 21 | 'use strict'; 22 | 23 | (function() { 24 | ///////////////////////////////////////////////////////////////// 25 | // Generates random guid to use as DOM id 26 | // 27 | ///////////////////////////////////////////////////////////////// 28 | function guid() { 29 | 30 | var d = new Date().getTime(); 31 | 32 | var guid = 'xxxx-xxxx-xxxx-xxxx'.replace( 33 | /[xy]/g, 34 | function (c) { 35 | var r = (d + Math.random() * 16) % 16 | 0; 36 | d = Math.floor(d / 16); 37 | return (c == 'x' ? r : (r & 0x7 | 0x8)).toString(16); 38 | }); 39 | 40 | return guid; 41 | } 42 | 43 | class AdnModelStructurePanel extends Autodesk.Viewing.UI.DockingPanel { 44 | constructor( viewer, title, options ) { 45 | options = options || {}; 46 | 47 | // Height adjustment for scroll container, offset to height of the title bar and footer by default. 48 | if( !options.heightAdjustment ) 49 | options.heightAdjustment = 70; 50 | 51 | if( !options.marginTop ) 52 | options.marginTop = 0; 53 | 54 | super( viewer.container, viewer.container.id + 'AdnModelStructurePanel', title, options ); 55 | 56 | this.container.classList.add( 'adn-docking-panel' ); 57 | this.container.classList.add( 'adn-model-structure-panel' ); 58 | this.createScrollContainer( options ); 59 | 60 | this.viewer = viewer; 61 | this.options = options; 62 | this.uiCreated = false; 63 | 64 | this.addVisibilityListener(( show ) => { 65 | if( !show ) return; 66 | 67 | if( !this.uiCreated ) 68 | this.createUI(); 69 | 70 | this.resizeToContent(); 71 | }); 72 | } 73 | 74 | hasPropertyTask( model, dbId, propName, matches ) { 75 | return new Promise(function( resolve, reject ) { 76 | const instanceTree = model.getData().instanceTree; 77 | 78 | model.getProperties( dbId, function( result ) { 79 | const nodeName = instanceTree.getNodeName( dbId ); 80 | const hasChildren = instanceTree.getChildCount( dbId ) > 0 ; 81 | 82 | if( !result.properties || hasChildren ) 83 | return resolve(); 84 | 85 | for( let i = 0; i < result.properties.length; ++i ) { 86 | const prop = result.properties[i]; 87 | 88 | //check if we have a match 89 | if( !prop.displayName.contains( propName ) || !prop.displayValue ) 90 | continue; 91 | 92 | let match = matches.find( node => node.text == prop.displayValue ); 93 | 94 | if( !match ) { 95 | match = { 96 | id: 'mat-' + guid(), 97 | text: prop.displayValue, 98 | children: [ 99 | { 100 | id: dbId, 101 | text: nodeName 102 | } 103 | ] 104 | }; 105 | 106 | matches.push( match ); 107 | } else { 108 | match.children.push({ 109 | id: dbId, 110 | text: nodeName 111 | }); 112 | } 113 | } 114 | 115 | return resolve(); 116 | }, function() { 117 | return reject(); 118 | }); 119 | }); 120 | } 121 | 122 | executeTaskOnModelTree( model, task ) { 123 | const taskResults = []; 124 | 125 | function _executeTaskOnModelTreeRec( dbId ){ 126 | instanceTree.enumNodeChildren( dbId, 127 | function( childId ) { 128 | taskResults.push( task( model, childId) ); 129 | _executeTaskOnModelTreeRec( childId ); 130 | }); 131 | } 132 | 133 | //get model instance tree and root component 134 | const instanceTree = model.getData().instanceTree; 135 | const rootId = instanceTree.getRootId(); 136 | 137 | _executeTaskOnModelTreeRec( rootId ); 138 | 139 | return taskResults; 140 | } 141 | 142 | buildTree() { 143 | const viewer = this.viewer; 144 | 145 | viewer.getObjectTree( () => { 146 | const matches = []; 147 | 148 | // Creates a thunk for our task 149 | // We look for all components which have a 150 | // property named 'Material' and returns a list 151 | // of matches containing dbId and the prop value 152 | const taskThunk = ( model, dbId ) => { 153 | return this.hasPropertyTask( 154 | model, dbId, 'Material', matches); 155 | }; 156 | 157 | const taskResults = this.executeTaskOnModelTree( 158 | viewer.model, 159 | taskThunk 160 | ); 161 | 162 | Promise.all( taskResults ) 163 | .then(() => { 164 | console.log( 'Found ' + matches.length + ' matches' ); 165 | console.log( matches ); 166 | 167 | $( this.treeContainer ) 168 | .on('select_node.jstree', function( e, data ) { 169 | console.log( e, data ); 170 | if( !data ) return; 171 | 172 | let dbIds = []; 173 | viewer.clearSelection(); 174 | 175 | if( data.node.id.contains( 'mat-' ) ) { 176 | dbIds = data.node.children.map( child => parseInt( child ) ); 177 | 178 | } else { 179 | const dbId = parseInt( data.node.id ); 180 | dbIds = [dbId]; 181 | } 182 | 183 | viewer.select( dbIds ); 184 | viewer.fitToView( dbIds ); 185 | }) 186 | // .on( 'open_node.jstree', ( e, data ) => { 187 | // this.resizeToContent(); 188 | // }) 189 | // .on( 'close_node.jstree', ( e, data ) => { 190 | // this.resizeToContent(); 191 | // }) 192 | .jstree({ 193 | core: { 194 | data: matches, 195 | themes: { 196 | icons: false 197 | } 198 | } 199 | }); 200 | }); 201 | }, 202 | function( code, msg ) { 203 | console.error( code, msg ); 204 | }); 205 | } 206 | 207 | createUI() { 208 | this.uiCreated = true; 209 | 210 | const div = document.createElement( 'div' ); 211 | 212 | const treeDiv = document.createElement( 'div' ); 213 | div.appendChild( treeDiv ); 214 | this.treeContainer = treeDiv; 215 | 216 | this.scrollContainer.appendChild( div ); 217 | 218 | this.buildTree(); 219 | } 220 | } 221 | 222 | class AdnModelStructurePanelExtension extends Autodesk.Viewing.Extension { 223 | constructor( viewer, options ) { 224 | super( viewer, options ); 225 | 226 | this.panel = null; 227 | this.createUI = this.createUI.bind( this ); 228 | this.onToolbarCreated = this.onToolbarCreated.bind( this ); 229 | } 230 | 231 | onToolbarCreated() { 232 | this.viewer.removeEventListener( 233 | Autodesk.Viewing.TOOLBAR_CREATED_EVENT, 234 | this.onToolbarCreated 235 | ); 236 | 237 | this.createUI(); 238 | } 239 | 240 | createUI() { 241 | const viewer = this.viewer; 242 | 243 | const modelStructurePanel = new AdnModelStructurePanel( viewer, 'Material Browser' ); 244 | 245 | viewer.addPanel( modelStructurePanel ); 246 | this.panel = modelStructurePanel; 247 | 248 | const structureButton = new Autodesk.Viewing.UI.Button( 'toolbar-adnModelStructureTool' ); 249 | structureButton.setToolTip( 'ADN Model browser' ); 250 | structureButton.setIcon( 'adsk-icon-structure' ); 251 | structureButton.onClick = function() { 252 | modelStructurePanel.setVisible( !modelStructurePanel.isVisible() ); 253 | }; 254 | 255 | const subToolbar = new Autodesk.Viewing.UI.ControlGroup( 'toolbar-adn-tools' ); 256 | subToolbar.addControl( structureButton ); 257 | subToolbar.adnstructurebutton = structureButton; 258 | this.subToolbar = subToolbar; 259 | 260 | viewer.toolbar.addControl( this.subToolbar ); 261 | 262 | modelStructurePanel.addVisibilityListener(function( visible ) { 263 | if( visible ) 264 | viewer.onPanelVisible( modelStructurePanel, viewer ); 265 | 266 | structureButton.setState( visible ? Autodesk.Viewing.UI.Button.State.ACTIVE : Autodesk.Viewing.UI.Button.State.INACTIVE ); 267 | }); 268 | } 269 | 270 | load() { 271 | if( this.viewer.toolbar ) { 272 | // Toolbar is already available, create the UI 273 | this.createUI(); 274 | } else { 275 | // Toolbar hasn't been created yet, wait until we get notification of its creation 276 | this.viewer.addEventListener( 277 | Autoesek.Viewing.TOOLBAR_CREATED_EVENT, 278 | this.onToolbarCreated 279 | ); 280 | } 281 | 282 | return true; 283 | } 284 | 285 | unload() { 286 | if( this.panel ) { 287 | this.panel.uninitialize(); 288 | delete this.panel; 289 | this.panel = null; 290 | } 291 | 292 | if( this.subToolbar ) { 293 | this.viewer.toolbar.removeControl( this.subToolbar ); 294 | delete this.subToolbar; 295 | this.subToolbar = null; 296 | } 297 | 298 | return true; 299 | } 300 | } 301 | 302 | Autodesk.Viewing.theExtensionManager.registerExtension( 'Autodesk.ADN.ModelStructurePanel', AdnModelStructurePanelExtension ); 303 | })(); -------------------------------------------------------------------------------- /model-structure/scripts/index.js: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) Autodesk, Inc. All rights reserved 3 | // 4 | // Permission to use, copy, modify, and distribute this software in 5 | // object code form for any purpose and without fee is hereby granted, 6 | // provided that the above copyright notice appears in all copies and 7 | // that both that copyright notice and the limited warranty and 8 | // restricted rights notice below appear in all supporting 9 | // documentation. 10 | // 11 | // AUTODESK PROVIDES THIS PROGRAM "AS IS" AND WITH ALL FAULTS. 12 | // AUTODESK SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTY OF 13 | // MERCHANTABILITY OR FITNESS FOR A PARTICULAR USE. AUTODESK, INC. 14 | // DOES NOT WARRANT THAT THE OPERATION OF THE PROGRAM WILL BE 15 | // UNINTERRUPTED OR ERROR FREE. 16 | // 17 | // Forge AU Sample 18 | // by Eason Kang - Autodesk Developer Network (ADN) 19 | // 20 | 21 | 'use strict'; 22 | 23 | (function() { 24 | const options = { 25 | env: 'Local', 26 | }; 27 | 28 | const doc = { 'rootFolder': 'models/House', 'path': 'Resource/3D_View/_3D_ 960621/_3D_.svf', 'name': '3D view' }; 29 | 30 | const config3d = { 31 | extensions: [ 'Autodesk.ADN.ModelStructurePanel' ] 32 | }; 33 | const viewerDiv = document.getElementById( 'MyViewerDiv' ); 34 | const viewer = new Autodesk.Viewing.Private.GuiViewer3D( viewerDiv, config3d ); 35 | 36 | Autodesk.Viewing.Initializer(options, function() { 37 | if( viewer.start() != 0 ) return console.error( 'Failed to initialize viewer' ); 38 | 39 | const basePath = getCurrentBaseURL(); 40 | const modelFolderPath = basePath + doc.rootFolder + '/'; 41 | const modelFilePath = modelFolderPath + doc.path; 42 | const modelOptions = { 43 | sharedPropertyDbPath: modelFolderPath, 44 | isAEC: true 45 | }; 46 | 47 | viewer.addEventListener( 48 | Autodesk.Viewing.PROGRESS_UPDATE_EVENT, 49 | function( event ) { 50 | if(event.state == Autodesk.Viewing.ProgressState.LOADING) 51 | console.log( '%cPROGRESS_UPDATE_EVENT:', 'color: blue;', event ); 52 | }); 53 | 54 | viewer.addEventListener( 55 | Autodesk.Viewing.OBJECT_TREE_CREATED_EVENT, 56 | function() { 57 | console.log( '%cOBJECT_TREE_CREATED_EVENT: !!!Object tree loaded!!!', 'color: blue;' ); 58 | }); 59 | 60 | viewer.addEventListener( 61 | Autodesk.Viewing.GEOMETRY_LOADED_EVENT, 62 | function( event ) { 63 | console.log( '%cGEOMETRY_LOADED_EVENT: !!!Geometries loaded!!!', 'color: green;' ); 64 | console.log( event ); 65 | }); 66 | 67 | // viewer.prefs.tag( 'ignore-producer' ); 68 | // viewer.prefs.set( 'viewCube', true ); 69 | 70 | viewer.loadModel( modelFilePath, modelOptions, onLoadModelSuccess, onLoadModelError ); 71 | }); 72 | 73 | function getCurrentBaseURL() { 74 | let basePath = ''; 75 | const lastSlash = document.location.href.lastIndexOf( '/' ); 76 | 77 | if( lastSlash != -1 ) 78 | basePath = document.location.href.substr( 0, lastSlash + 1 ); 79 | else 80 | basePath = document.location.href; 81 | 82 | return basePath; 83 | } 84 | 85 | /** 86 | * viewer.loadModel() success callback. 87 | * Invoked after the model's SVF has been initially loaded. 88 | * It may trigger before any geometry has been downloaded and displayed on-screen. 89 | */ 90 | function onLoadModelSuccess(model) { 91 | console.log( 'onLoadModelSuccess()!' ); 92 | console.log( 'Validate model loaded: ' + (viewer.model === model) ); 93 | console.log( model ); 94 | } 95 | 96 | /** 97 | * viewer.loadModel() failure callback. 98 | * Invoked when there's an error fetching the SVF file. 99 | */ 100 | function onLoadModelError(viewerErrorCode) { 101 | console.error( 'onLoadModelError() - errorCode:' + viewerErrorCode ); 102 | } 103 | })(); -------------------------------------------------------------------------------- /model-structure/styles/index.css: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 0; 3 | } 4 | 5 | #MyViewerDiv { 6 | width: 100%; 7 | height: 100%; 8 | margin: 0; 9 | background-color: #F0F8FF; 10 | } 11 | 12 | .adn-docking-panel { 13 | top: 10px; 14 | left: 10px; 15 | } 16 | 17 | .adn-model-structure-panel .docking-panel-scroll div:first-child { 18 | width: 370px; 19 | height: 530px; 20 | min-width: 370px; 21 | min-height: 530px; 22 | } -------------------------------------------------------------------------------- /models/empty: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yiskang/forge-au-sample/1f88ebad2f12739f90f8aa9dd379aaf08209f791/models/empty -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "forge-au-sample", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@babel/code-frame": { 8 | "version": "7.0.0-beta.44", 9 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.44.tgz", 10 | "integrity": "sha512-cuAuTTIQ9RqcFRJ/Y8PvTh+paepNcaGxwQwjIDRWPXmzzyAeCO4KqS9ikMvq0MCbRk6GlYKwfzStrcP3/jSL8g==", 11 | "dev": true, 12 | "requires": { 13 | "@babel/highlight": "7.0.0-beta.44" 14 | } 15 | }, 16 | "@babel/generator": { 17 | "version": "7.0.0-beta.44", 18 | "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.0.0-beta.44.tgz", 19 | "integrity": "sha512-5xVb7hlhjGcdkKpMXgicAVgx8syK5VJz193k0i/0sLP6DzE6lRrU1K3B/rFefgdo9LPGMAOOOAWW4jycj07ShQ==", 20 | "dev": true, 21 | "requires": { 22 | "@babel/types": "7.0.0-beta.44", 23 | "jsesc": "^2.5.1", 24 | "lodash": "^4.2.0", 25 | "source-map": "^0.5.0", 26 | "trim-right": "^1.0.1" 27 | } 28 | }, 29 | "@babel/helper-function-name": { 30 | "version": "7.0.0-beta.44", 31 | "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.44.tgz", 32 | "integrity": "sha512-MHRG2qZMKMFaBavX0LWpfZ2e+hLloT++N7rfM3DYOMUOGCD8cVjqZpwiL8a0bOX3IYcQev1ruciT0gdFFRTxzg==", 33 | "dev": true, 34 | "requires": { 35 | "@babel/helper-get-function-arity": "7.0.0-beta.44", 36 | "@babel/template": "7.0.0-beta.44", 37 | "@babel/types": "7.0.0-beta.44" 38 | } 39 | }, 40 | "@babel/helper-get-function-arity": { 41 | "version": "7.0.0-beta.44", 42 | "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.44.tgz", 43 | "integrity": "sha512-w0YjWVwrM2HwP6/H3sEgrSQdkCaxppqFeJtAnB23pRiJB5E/O9Yp7JAAeWBl+gGEgmBFinnTyOv2RN7rcSmMiw==", 44 | "dev": true, 45 | "requires": { 46 | "@babel/types": "7.0.0-beta.44" 47 | } 48 | }, 49 | "@babel/helper-split-export-declaration": { 50 | "version": "7.0.0-beta.44", 51 | "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.44.tgz", 52 | "integrity": "sha512-aQ7QowtkgKKzPGf0j6u77kBMdUFVBKNHw2p/3HX/POt5/oz8ec5cs0GwlgM8Hz7ui5EwJnzyfRmkNF1Nx1N7aA==", 53 | "dev": true, 54 | "requires": { 55 | "@babel/types": "7.0.0-beta.44" 56 | } 57 | }, 58 | "@babel/highlight": { 59 | "version": "7.0.0-beta.44", 60 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0-beta.44.tgz", 61 | "integrity": "sha512-Il19yJvy7vMFm8AVAh6OZzaFoAd0hbkeMZiX3P5HGD+z7dyI7RzndHB0dg6Urh/VAFfHtpOIzDUSxmY6coyZWQ==", 62 | "dev": true, 63 | "requires": { 64 | "chalk": "^2.0.0", 65 | "esutils": "^2.0.2", 66 | "js-tokens": "^3.0.0" 67 | } 68 | }, 69 | "@babel/template": { 70 | "version": "7.0.0-beta.44", 71 | "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.0.0-beta.44.tgz", 72 | "integrity": "sha512-w750Sloq0UNifLx1rUqwfbnC6uSUk0mfwwgGRfdLiaUzfAOiH0tHJE6ILQIUi3KYkjiCDTskoIsnfqZvWLBDng==", 73 | "dev": true, 74 | "requires": { 75 | "@babel/code-frame": "7.0.0-beta.44", 76 | "@babel/types": "7.0.0-beta.44", 77 | "babylon": "7.0.0-beta.44", 78 | "lodash": "^4.2.0" 79 | } 80 | }, 81 | "@babel/traverse": { 82 | "version": "7.0.0-beta.44", 83 | "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.0.0-beta.44.tgz", 84 | "integrity": "sha512-UHuDz8ukQkJCDASKHf+oDt3FVUzFd+QYfuBIsiNu/4+/ix6pP/C+uQZJ6K1oEfbCMv/IKWbgDEh7fcsnIE5AtA==", 85 | "dev": true, 86 | "requires": { 87 | "@babel/code-frame": "7.0.0-beta.44", 88 | "@babel/generator": "7.0.0-beta.44", 89 | "@babel/helper-function-name": "7.0.0-beta.44", 90 | "@babel/helper-split-export-declaration": "7.0.0-beta.44", 91 | "@babel/types": "7.0.0-beta.44", 92 | "babylon": "7.0.0-beta.44", 93 | "debug": "^3.1.0", 94 | "globals": "^11.1.0", 95 | "invariant": "^2.2.0", 96 | "lodash": "^4.2.0" 97 | } 98 | }, 99 | "@babel/types": { 100 | "version": "7.0.0-beta.44", 101 | "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.44.tgz", 102 | "integrity": "sha512-5eTV4WRmqbaFM3v9gHAIljEQJU4Ssc6fxL61JN+Oe2ga/BwyjzjamwkCVVAQjHGuAX8i0BWo42dshL8eO5KfLQ==", 103 | "dev": true, 104 | "requires": { 105 | "esutils": "^2.0.2", 106 | "lodash": "^4.2.0", 107 | "to-fast-properties": "^2.0.0" 108 | } 109 | }, 110 | "@fortawesome/fontawesome-free": { 111 | "version": "5.3.1", 112 | "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-5.3.1.tgz", 113 | "integrity": "sha512-jt6yi7iZVtkY9Jc6zFo+G2vqL4M81pb3IA3WmnnDt9ci7Asz+mPg4gbZL8pjx0nGFBsG0Bmd7BjU9IQkebqxFA==" 114 | }, 115 | "accepts": { 116 | "version": "1.3.5", 117 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", 118 | "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", 119 | "requires": { 120 | "mime-types": "~2.1.18", 121 | "negotiator": "0.6.1" 122 | } 123 | }, 124 | "acorn": { 125 | "version": "5.7.4", 126 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", 127 | "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", 128 | "dev": true 129 | }, 130 | "acorn-jsx": { 131 | "version": "4.1.1", 132 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-4.1.1.tgz", 133 | "integrity": "sha512-JY+iV6r+cO21KtntVvFkD+iqjtdpRUpGqKWgfkCdZq1R+kbreEl8EcdcJR4SmiIgsIQT33s6QzheQ9a275Q8xw==", 134 | "dev": true, 135 | "requires": { 136 | "acorn": "^5.0.3" 137 | } 138 | }, 139 | "ajv": { 140 | "version": "6.5.3", 141 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.3.tgz", 142 | "integrity": "sha512-LqZ9wY+fx3UMiiPd741yB2pj3hhil+hQc8taf4o2QGRFpWgZ2V5C8HA165DY9sS3fJwsk7uT7ZlFEyC3Ig3lLg==", 143 | "dev": true, 144 | "requires": { 145 | "fast-deep-equal": "^2.0.1", 146 | "fast-json-stable-stringify": "^2.0.0", 147 | "json-schema-traverse": "^0.4.1", 148 | "uri-js": "^4.2.2" 149 | } 150 | }, 151 | "ajv-keywords": { 152 | "version": "3.2.0", 153 | "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", 154 | "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=", 155 | "dev": true 156 | }, 157 | "ansi-align": { 158 | "version": "2.0.0", 159 | "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", 160 | "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", 161 | "requires": { 162 | "string-width": "^2.0.0" 163 | } 164 | }, 165 | "ansi-escapes": { 166 | "version": "3.1.0", 167 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", 168 | "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", 169 | "dev": true 170 | }, 171 | "ansi-regex": { 172 | "version": "2.1.1", 173 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 174 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" 175 | }, 176 | "ansi-styles": { 177 | "version": "3.2.1", 178 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 179 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 180 | "requires": { 181 | "color-convert": "^1.9.0" 182 | } 183 | }, 184 | "argparse": { 185 | "version": "1.0.10", 186 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 187 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 188 | "dev": true, 189 | "requires": { 190 | "sprintf-js": "~1.0.2" 191 | } 192 | }, 193 | "array-flatten": { 194 | "version": "1.1.1", 195 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 196 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 197 | }, 198 | "array-union": { 199 | "version": "1.0.2", 200 | "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", 201 | "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", 202 | "dev": true, 203 | "requires": { 204 | "array-uniq": "^1.0.1" 205 | } 206 | }, 207 | "array-uniq": { 208 | "version": "1.0.3", 209 | "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", 210 | "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", 211 | "dev": true 212 | }, 213 | "arrify": { 214 | "version": "1.0.1", 215 | "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", 216 | "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", 217 | "dev": true 218 | }, 219 | "asn1": { 220 | "version": "0.2.4", 221 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", 222 | "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", 223 | "requires": { 224 | "safer-buffer": "~2.1.0" 225 | } 226 | }, 227 | "assert-plus": { 228 | "version": "1.0.0", 229 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 230 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" 231 | }, 232 | "asynckit": { 233 | "version": "0.4.0", 234 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 235 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 236 | }, 237 | "aws-sign2": { 238 | "version": "0.7.0", 239 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", 240 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" 241 | }, 242 | "aws4": { 243 | "version": "1.8.0", 244 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", 245 | "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" 246 | }, 247 | "babel-code-frame": { 248 | "version": "6.26.0", 249 | "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", 250 | "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", 251 | "dev": true, 252 | "requires": { 253 | "chalk": "^1.1.3", 254 | "esutils": "^2.0.2", 255 | "js-tokens": "^3.0.2" 256 | }, 257 | "dependencies": { 258 | "ansi-styles": { 259 | "version": "2.2.1", 260 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 261 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", 262 | "dev": true 263 | }, 264 | "chalk": { 265 | "version": "1.1.3", 266 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 267 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", 268 | "dev": true, 269 | "requires": { 270 | "ansi-styles": "^2.2.1", 271 | "escape-string-regexp": "^1.0.2", 272 | "has-ansi": "^2.0.0", 273 | "strip-ansi": "^3.0.0", 274 | "supports-color": "^2.0.0" 275 | } 276 | }, 277 | "strip-ansi": { 278 | "version": "3.0.1", 279 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 280 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 281 | "dev": true, 282 | "requires": { 283 | "ansi-regex": "^2.0.0" 284 | } 285 | }, 286 | "supports-color": { 287 | "version": "2.0.0", 288 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 289 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", 290 | "dev": true 291 | } 292 | } 293 | }, 294 | "babel-eslint": { 295 | "version": "8.2.6", 296 | "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-8.2.6.tgz", 297 | "integrity": "sha512-aCdHjhzcILdP8c9lej7hvXKvQieyRt20SF102SIGyY4cUIiw6UaAtK4j2o3dXX74jEmy0TJ0CEhv4fTIM3SzcA==", 298 | "dev": true, 299 | "requires": { 300 | "@babel/code-frame": "7.0.0-beta.44", 301 | "@babel/traverse": "7.0.0-beta.44", 302 | "@babel/types": "7.0.0-beta.44", 303 | "babylon": "7.0.0-beta.44", 304 | "eslint-scope": "3.7.1", 305 | "eslint-visitor-keys": "^1.0.0" 306 | } 307 | }, 308 | "babylon": { 309 | "version": "7.0.0-beta.44", 310 | "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz", 311 | "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==", 312 | "dev": true 313 | }, 314 | "balanced-match": { 315 | "version": "1.0.0", 316 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 317 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 318 | "dev": true 319 | }, 320 | "basic-auth": { 321 | "version": "2.0.1", 322 | "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", 323 | "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", 324 | "requires": { 325 | "safe-buffer": "5.1.2" 326 | } 327 | }, 328 | "bcrypt-pbkdf": { 329 | "version": "1.0.2", 330 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", 331 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", 332 | "optional": true, 333 | "requires": { 334 | "tweetnacl": "^0.14.3" 335 | } 336 | }, 337 | "body-parser": { 338 | "version": "1.18.3", 339 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", 340 | "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", 341 | "requires": { 342 | "bytes": "3.0.0", 343 | "content-type": "~1.0.4", 344 | "debug": "2.6.9", 345 | "depd": "~1.1.2", 346 | "http-errors": "~1.6.3", 347 | "iconv-lite": "0.4.23", 348 | "on-finished": "~2.3.0", 349 | "qs": "6.5.2", 350 | "raw-body": "2.3.3", 351 | "type-is": "~1.6.16" 352 | }, 353 | "dependencies": { 354 | "debug": { 355 | "version": "2.6.9", 356 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 357 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 358 | "requires": { 359 | "ms": "2.0.0" 360 | } 361 | }, 362 | "iconv-lite": { 363 | "version": "0.4.23", 364 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", 365 | "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", 366 | "requires": { 367 | "safer-buffer": ">= 2.1.2 < 3" 368 | } 369 | } 370 | } 371 | }, 372 | "boxen": { 373 | "version": "1.3.0", 374 | "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", 375 | "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", 376 | "requires": { 377 | "ansi-align": "^2.0.0", 378 | "camelcase": "^4.0.0", 379 | "chalk": "^2.0.1", 380 | "cli-boxes": "^1.0.0", 381 | "string-width": "^2.0.0", 382 | "term-size": "^1.2.0", 383 | "widest-line": "^2.0.0" 384 | } 385 | }, 386 | "brace-expansion": { 387 | "version": "1.1.11", 388 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 389 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 390 | "dev": true, 391 | "requires": { 392 | "balanced-match": "^1.0.0", 393 | "concat-map": "0.0.1" 394 | } 395 | }, 396 | "bytes": { 397 | "version": "3.0.0", 398 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", 399 | "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" 400 | }, 401 | "caller-path": { 402 | "version": "0.1.0", 403 | "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", 404 | "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", 405 | "dev": true, 406 | "requires": { 407 | "callsites": "^0.2.0" 408 | } 409 | }, 410 | "callsites": { 411 | "version": "0.2.0", 412 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", 413 | "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", 414 | "dev": true 415 | }, 416 | "camelcase": { 417 | "version": "4.1.0", 418 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", 419 | "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" 420 | }, 421 | "capture-stack-trace": { 422 | "version": "1.0.0", 423 | "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", 424 | "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=" 425 | }, 426 | "caseless": { 427 | "version": "0.12.0", 428 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 429 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" 430 | }, 431 | "chalk": { 432 | "version": "2.4.1", 433 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", 434 | "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", 435 | "requires": { 436 | "ansi-styles": "^3.2.1", 437 | "escape-string-regexp": "^1.0.5", 438 | "supports-color": "^5.3.0" 439 | } 440 | }, 441 | "chardet": { 442 | "version": "0.4.2", 443 | "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", 444 | "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", 445 | "dev": true 446 | }, 447 | "ci-info": { 448 | "version": "1.4.0", 449 | "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.4.0.tgz", 450 | "integrity": "sha512-Oqmw2pVfCl8sCL+1QgMywPfdxPJPkC51y4usw0iiE2S9qnEOAqXy8bwl1CpMpnoU39g4iKJTz6QZj+28FvOnjQ==" 451 | }, 452 | "circular-json": { 453 | "version": "0.3.3", 454 | "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", 455 | "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", 456 | "dev": true 457 | }, 458 | "cli-boxes": { 459 | "version": "1.0.0", 460 | "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", 461 | "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=" 462 | }, 463 | "cli-cursor": { 464 | "version": "2.1.0", 465 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", 466 | "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", 467 | "dev": true, 468 | "requires": { 469 | "restore-cursor": "^2.0.0" 470 | } 471 | }, 472 | "cli-width": { 473 | "version": "2.2.0", 474 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", 475 | "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", 476 | "dev": true 477 | }, 478 | "cliui": { 479 | "version": "4.1.0", 480 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", 481 | "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", 482 | "requires": { 483 | "string-width": "^2.1.1", 484 | "strip-ansi": "^4.0.0", 485 | "wrap-ansi": "^2.0.0" 486 | } 487 | }, 488 | "co": { 489 | "version": "4.6.0", 490 | "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", 491 | "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" 492 | }, 493 | "code-point-at": { 494 | "version": "1.1.0", 495 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", 496 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" 497 | }, 498 | "color-convert": { 499 | "version": "1.9.2", 500 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.2.tgz", 501 | "integrity": "sha512-3NUJZdhMhcdPn8vJ9v2UQJoH0qqoGUkYTgFEPZaPjEtwmmKUfNV46zZmgB2M5M4DCEQHMaCfWHCxiBflLm04Tg==", 502 | "requires": { 503 | "color-name": "1.1.1" 504 | } 505 | }, 506 | "color-name": { 507 | "version": "1.1.1", 508 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.1.tgz", 509 | "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=" 510 | }, 511 | "combined-stream": { 512 | "version": "1.0.6", 513 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", 514 | "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", 515 | "requires": { 516 | "delayed-stream": "~1.0.0" 517 | } 518 | }, 519 | "compressible": { 520 | "version": "2.0.14", 521 | "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.14.tgz", 522 | "integrity": "sha1-MmxfUH+7BV9UEWeCuWmoG2einac=", 523 | "requires": { 524 | "mime-db": ">= 1.34.0 < 2" 525 | } 526 | }, 527 | "compression": { 528 | "version": "1.7.3", 529 | "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.3.tgz", 530 | "integrity": "sha512-HSjyBG5N1Nnz7tF2+O7A9XUhyjru71/fwgNb7oIsEVHR0WShfs2tIS/EySLgiTe98aOK18YDlMXpzjCXY/n9mg==", 531 | "requires": { 532 | "accepts": "~1.3.5", 533 | "bytes": "3.0.0", 534 | "compressible": "~2.0.14", 535 | "debug": "2.6.9", 536 | "on-headers": "~1.0.1", 537 | "safe-buffer": "5.1.2", 538 | "vary": "~1.1.2" 539 | }, 540 | "dependencies": { 541 | "debug": { 542 | "version": "2.6.9", 543 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 544 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 545 | "requires": { 546 | "ms": "2.0.0" 547 | } 548 | } 549 | } 550 | }, 551 | "concat-map": { 552 | "version": "0.0.1", 553 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 554 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 555 | "dev": true 556 | }, 557 | "configstore": { 558 | "version": "3.1.2", 559 | "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", 560 | "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", 561 | "requires": { 562 | "dot-prop": "^4.1.0", 563 | "graceful-fs": "^4.1.2", 564 | "make-dir": "^1.0.0", 565 | "unique-string": "^1.0.0", 566 | "write-file-atomic": "^2.0.0", 567 | "xdg-basedir": "^3.0.0" 568 | } 569 | }, 570 | "connect-pause": { 571 | "version": "0.1.1", 572 | "resolved": "https://registry.npmjs.org/connect-pause/-/connect-pause-0.1.1.tgz", 573 | "integrity": "sha1-smmyu4Ldsaw9tQmcD7WCq6mfs3o=" 574 | }, 575 | "content-disposition": { 576 | "version": "0.5.2", 577 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", 578 | "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" 579 | }, 580 | "content-type": { 581 | "version": "1.0.4", 582 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 583 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 584 | }, 585 | "cookie": { 586 | "version": "0.3.1", 587 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", 588 | "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" 589 | }, 590 | "cookie-signature": { 591 | "version": "1.0.6", 592 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 593 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 594 | }, 595 | "core-util-is": { 596 | "version": "1.0.2", 597 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 598 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 599 | }, 600 | "cors": { 601 | "version": "2.8.4", 602 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.4.tgz", 603 | "integrity": "sha1-K9OB8usgECAQXNUOpZ2mMJBpRoY=", 604 | "requires": { 605 | "object-assign": "^4", 606 | "vary": "^1" 607 | } 608 | }, 609 | "create-error-class": { 610 | "version": "3.0.2", 611 | "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", 612 | "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", 613 | "requires": { 614 | "capture-stack-trace": "^1.0.0" 615 | } 616 | }, 617 | "cross-spawn": { 618 | "version": "6.0.5", 619 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", 620 | "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", 621 | "dev": true, 622 | "requires": { 623 | "nice-try": "^1.0.4", 624 | "path-key": "^2.0.1", 625 | "semver": "^5.5.0", 626 | "shebang-command": "^1.2.0", 627 | "which": "^1.2.9" 628 | } 629 | }, 630 | "crypto-random-string": { 631 | "version": "1.0.0", 632 | "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", 633 | "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=" 634 | }, 635 | "dashdash": { 636 | "version": "1.14.1", 637 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 638 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", 639 | "requires": { 640 | "assert-plus": "^1.0.0" 641 | } 642 | }, 643 | "debug": { 644 | "version": "3.1.0", 645 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 646 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 647 | "requires": { 648 | "ms": "2.0.0" 649 | } 650 | }, 651 | "decamelize": { 652 | "version": "1.2.0", 653 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 654 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" 655 | }, 656 | "deep-extend": { 657 | "version": "0.6.0", 658 | "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", 659 | "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" 660 | }, 661 | "deep-is": { 662 | "version": "0.1.3", 663 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", 664 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", 665 | "dev": true 666 | }, 667 | "del": { 668 | "version": "2.2.2", 669 | "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", 670 | "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", 671 | "dev": true, 672 | "requires": { 673 | "globby": "^5.0.0", 674 | "is-path-cwd": "^1.0.0", 675 | "is-path-in-cwd": "^1.0.0", 676 | "object-assign": "^4.0.1", 677 | "pify": "^2.0.0", 678 | "pinkie-promise": "^2.0.0", 679 | "rimraf": "^2.2.8" 680 | } 681 | }, 682 | "delayed-stream": { 683 | "version": "1.0.0", 684 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 685 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" 686 | }, 687 | "depd": { 688 | "version": "1.1.2", 689 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 690 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 691 | }, 692 | "destroy": { 693 | "version": "1.0.4", 694 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 695 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 696 | }, 697 | "doctrine": { 698 | "version": "2.1.0", 699 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", 700 | "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", 701 | "dev": true, 702 | "requires": { 703 | "esutils": "^2.0.2" 704 | } 705 | }, 706 | "dot-prop": { 707 | "version": "4.2.0", 708 | "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", 709 | "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", 710 | "requires": { 711 | "is-obj": "^1.0.0" 712 | } 713 | }, 714 | "duplexer3": { 715 | "version": "0.1.4", 716 | "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", 717 | "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" 718 | }, 719 | "ecc-jsbn": { 720 | "version": "0.1.2", 721 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", 722 | "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", 723 | "optional": true, 724 | "requires": { 725 | "jsbn": "~0.1.0", 726 | "safer-buffer": "^2.1.0" 727 | } 728 | }, 729 | "ee-first": { 730 | "version": "1.1.1", 731 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 732 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 733 | }, 734 | "encodeurl": { 735 | "version": "1.0.2", 736 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 737 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 738 | }, 739 | "errorhandler": { 740 | "version": "1.5.0", 741 | "resolved": "https://registry.npmjs.org/errorhandler/-/errorhandler-1.5.0.tgz", 742 | "integrity": "sha1-6rpkyl1UKjEayUX1gt78M2Fl2fQ=", 743 | "requires": { 744 | "accepts": "~1.3.3", 745 | "escape-html": "~1.0.3" 746 | } 747 | }, 748 | "escape-html": { 749 | "version": "1.0.3", 750 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 751 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 752 | }, 753 | "escape-string-regexp": { 754 | "version": "1.0.5", 755 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 756 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" 757 | }, 758 | "eslint": { 759 | "version": "5.4.0", 760 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.4.0.tgz", 761 | "integrity": "sha512-UIpL91XGex3qtL6qwyCQJar2j3osKxK9e3ano3OcGEIRM4oWIpCkDg9x95AXEC2wMs7PnxzOkPZ2gq+tsMS9yg==", 762 | "dev": true, 763 | "requires": { 764 | "ajv": "^6.5.0", 765 | "babel-code-frame": "^6.26.0", 766 | "chalk": "^2.1.0", 767 | "cross-spawn": "^6.0.5", 768 | "debug": "^3.1.0", 769 | "doctrine": "^2.1.0", 770 | "eslint-scope": "^4.0.0", 771 | "eslint-utils": "^1.3.1", 772 | "eslint-visitor-keys": "^1.0.0", 773 | "espree": "^4.0.0", 774 | "esquery": "^1.0.1", 775 | "esutils": "^2.0.2", 776 | "file-entry-cache": "^2.0.0", 777 | "functional-red-black-tree": "^1.0.1", 778 | "glob": "^7.1.2", 779 | "globals": "^11.7.0", 780 | "ignore": "^4.0.2", 781 | "imurmurhash": "^0.1.4", 782 | "inquirer": "^5.2.0", 783 | "is-resolvable": "^1.1.0", 784 | "js-yaml": "^3.11.0", 785 | "json-stable-stringify-without-jsonify": "^1.0.1", 786 | "levn": "^0.3.0", 787 | "lodash": "^4.17.5", 788 | "minimatch": "^3.0.4", 789 | "mkdirp": "^0.5.1", 790 | "natural-compare": "^1.4.0", 791 | "optionator": "^0.8.2", 792 | "path-is-inside": "^1.0.2", 793 | "pluralize": "^7.0.0", 794 | "progress": "^2.0.0", 795 | "regexpp": "^2.0.0", 796 | "require-uncached": "^1.0.3", 797 | "semver": "^5.5.0", 798 | "strip-ansi": "^4.0.0", 799 | "strip-json-comments": "^2.0.1", 800 | "table": "^4.0.3", 801 | "text-table": "^0.2.0" 802 | }, 803 | "dependencies": { 804 | "eslint-scope": { 805 | "version": "4.0.0", 806 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz", 807 | "integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==", 808 | "dev": true, 809 | "requires": { 810 | "esrecurse": "^4.1.0", 811 | "estraverse": "^4.1.1" 812 | } 813 | } 814 | } 815 | }, 816 | "eslint-scope": { 817 | "version": "3.7.1", 818 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", 819 | "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", 820 | "dev": true, 821 | "requires": { 822 | "esrecurse": "^4.1.0", 823 | "estraverse": "^4.1.1" 824 | } 825 | }, 826 | "eslint-utils": { 827 | "version": "1.4.2", 828 | "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.2.tgz", 829 | "integrity": "sha512-eAZS2sEUMlIeCjBeubdj45dmBHQwPHWyBcT1VSYB7o9x9WRRqKxyUoiXlRjyAwzN7YEzHJlYg0NmzDRWx6GP4Q==", 830 | "dev": true, 831 | "requires": { 832 | "eslint-visitor-keys": "^1.0.0" 833 | } 834 | }, 835 | "eslint-visitor-keys": { 836 | "version": "1.0.0", 837 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", 838 | "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", 839 | "dev": true 840 | }, 841 | "espree": { 842 | "version": "4.0.0", 843 | "resolved": "https://registry.npmjs.org/espree/-/espree-4.0.0.tgz", 844 | "integrity": "sha512-kapdTCt1bjmspxStVKX6huolXVV5ZfyZguY1lcfhVVZstce3bqxH9mcLzNn3/mlgW6wQ732+0fuG9v7h0ZQoKg==", 845 | "dev": true, 846 | "requires": { 847 | "acorn": "^5.6.0", 848 | "acorn-jsx": "^4.1.1" 849 | } 850 | }, 851 | "esprima": { 852 | "version": "4.0.1", 853 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 854 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 855 | "dev": true 856 | }, 857 | "esquery": { 858 | "version": "1.0.1", 859 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", 860 | "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", 861 | "dev": true, 862 | "requires": { 863 | "estraverse": "^4.0.0" 864 | } 865 | }, 866 | "esrecurse": { 867 | "version": "4.2.1", 868 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", 869 | "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", 870 | "dev": true, 871 | "requires": { 872 | "estraverse": "^4.1.0" 873 | } 874 | }, 875 | "estraverse": { 876 | "version": "4.2.0", 877 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", 878 | "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", 879 | "dev": true 880 | }, 881 | "esutils": { 882 | "version": "2.0.2", 883 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", 884 | "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", 885 | "dev": true 886 | }, 887 | "etag": { 888 | "version": "1.8.1", 889 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 890 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 891 | }, 892 | "execa": { 893 | "version": "0.7.0", 894 | "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", 895 | "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", 896 | "requires": { 897 | "cross-spawn": "^5.0.1", 898 | "get-stream": "^3.0.0", 899 | "is-stream": "^1.1.0", 900 | "npm-run-path": "^2.0.0", 901 | "p-finally": "^1.0.0", 902 | "signal-exit": "^3.0.0", 903 | "strip-eof": "^1.0.0" 904 | }, 905 | "dependencies": { 906 | "cross-spawn": { 907 | "version": "5.1.0", 908 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", 909 | "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", 910 | "requires": { 911 | "lru-cache": "^4.0.1", 912 | "shebang-command": "^1.2.0", 913 | "which": "^1.2.9" 914 | } 915 | } 916 | } 917 | }, 918 | "express": { 919 | "version": "4.16.3", 920 | "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz", 921 | "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=", 922 | "requires": { 923 | "accepts": "~1.3.5", 924 | "array-flatten": "1.1.1", 925 | "body-parser": "1.18.2", 926 | "content-disposition": "0.5.2", 927 | "content-type": "~1.0.4", 928 | "cookie": "0.3.1", 929 | "cookie-signature": "1.0.6", 930 | "debug": "2.6.9", 931 | "depd": "~1.1.2", 932 | "encodeurl": "~1.0.2", 933 | "escape-html": "~1.0.3", 934 | "etag": "~1.8.1", 935 | "finalhandler": "1.1.1", 936 | "fresh": "0.5.2", 937 | "merge-descriptors": "1.0.1", 938 | "methods": "~1.1.2", 939 | "on-finished": "~2.3.0", 940 | "parseurl": "~1.3.2", 941 | "path-to-regexp": "0.1.7", 942 | "proxy-addr": "~2.0.3", 943 | "qs": "6.5.1", 944 | "range-parser": "~1.2.0", 945 | "safe-buffer": "5.1.1", 946 | "send": "0.16.2", 947 | "serve-static": "1.13.2", 948 | "setprototypeof": "1.1.0", 949 | "statuses": "~1.4.0", 950 | "type-is": "~1.6.16", 951 | "utils-merge": "1.0.1", 952 | "vary": "~1.1.2" 953 | }, 954 | "dependencies": { 955 | "body-parser": { 956 | "version": "1.18.2", 957 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", 958 | "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", 959 | "requires": { 960 | "bytes": "3.0.0", 961 | "content-type": "~1.0.4", 962 | "debug": "2.6.9", 963 | "depd": "~1.1.1", 964 | "http-errors": "~1.6.2", 965 | "iconv-lite": "0.4.19", 966 | "on-finished": "~2.3.0", 967 | "qs": "6.5.1", 968 | "raw-body": "2.3.2", 969 | "type-is": "~1.6.15" 970 | } 971 | }, 972 | "debug": { 973 | "version": "2.6.9", 974 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 975 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 976 | "requires": { 977 | "ms": "2.0.0" 978 | } 979 | }, 980 | "iconv-lite": { 981 | "version": "0.4.19", 982 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", 983 | "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" 984 | }, 985 | "qs": { 986 | "version": "6.5.1", 987 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", 988 | "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" 989 | }, 990 | "raw-body": { 991 | "version": "2.3.2", 992 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", 993 | "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", 994 | "requires": { 995 | "bytes": "3.0.0", 996 | "http-errors": "1.6.2", 997 | "iconv-lite": "0.4.19", 998 | "unpipe": "1.0.0" 999 | }, 1000 | "dependencies": { 1001 | "depd": { 1002 | "version": "1.1.1", 1003 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", 1004 | "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" 1005 | }, 1006 | "http-errors": { 1007 | "version": "1.6.2", 1008 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", 1009 | "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", 1010 | "requires": { 1011 | "depd": "1.1.1", 1012 | "inherits": "2.0.3", 1013 | "setprototypeof": "1.0.3", 1014 | "statuses": ">= 1.3.1 < 2" 1015 | } 1016 | }, 1017 | "setprototypeof": { 1018 | "version": "1.0.3", 1019 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", 1020 | "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" 1021 | } 1022 | } 1023 | }, 1024 | "safe-buffer": { 1025 | "version": "5.1.1", 1026 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", 1027 | "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" 1028 | }, 1029 | "statuses": { 1030 | "version": "1.4.0", 1031 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", 1032 | "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" 1033 | } 1034 | } 1035 | }, 1036 | "express-urlrewrite": { 1037 | "version": "1.2.0", 1038 | "resolved": "https://registry.npmjs.org/express-urlrewrite/-/express-urlrewrite-1.2.0.tgz", 1039 | "integrity": "sha1-jmZ7d2H/HH/9sO+gXWQDU4fII+s=", 1040 | "requires": { 1041 | "debug": "*", 1042 | "path-to-regexp": "^1.0.3" 1043 | }, 1044 | "dependencies": { 1045 | "path-to-regexp": { 1046 | "version": "1.7.0", 1047 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", 1048 | "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", 1049 | "requires": { 1050 | "isarray": "0.0.1" 1051 | } 1052 | } 1053 | } 1054 | }, 1055 | "extend": { 1056 | "version": "3.0.2", 1057 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 1058 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" 1059 | }, 1060 | "external-editor": { 1061 | "version": "2.2.0", 1062 | "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", 1063 | "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", 1064 | "dev": true, 1065 | "requires": { 1066 | "chardet": "^0.4.0", 1067 | "iconv-lite": "^0.4.17", 1068 | "tmp": "^0.0.33" 1069 | } 1070 | }, 1071 | "extsprintf": { 1072 | "version": "1.3.0", 1073 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", 1074 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" 1075 | }, 1076 | "fast-deep-equal": { 1077 | "version": "2.0.1", 1078 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", 1079 | "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", 1080 | "dev": true 1081 | }, 1082 | "fast-json-stable-stringify": { 1083 | "version": "2.0.0", 1084 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", 1085 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" 1086 | }, 1087 | "fast-levenshtein": { 1088 | "version": "2.0.6", 1089 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 1090 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", 1091 | "dev": true 1092 | }, 1093 | "figures": { 1094 | "version": "2.0.0", 1095 | "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", 1096 | "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", 1097 | "dev": true, 1098 | "requires": { 1099 | "escape-string-regexp": "^1.0.5" 1100 | } 1101 | }, 1102 | "file-entry-cache": { 1103 | "version": "2.0.0", 1104 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", 1105 | "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", 1106 | "dev": true, 1107 | "requires": { 1108 | "flat-cache": "^1.2.1", 1109 | "object-assign": "^4.0.1" 1110 | } 1111 | }, 1112 | "finalhandler": { 1113 | "version": "1.1.1", 1114 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", 1115 | "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", 1116 | "requires": { 1117 | "debug": "2.6.9", 1118 | "encodeurl": "~1.0.2", 1119 | "escape-html": "~1.0.3", 1120 | "on-finished": "~2.3.0", 1121 | "parseurl": "~1.3.2", 1122 | "statuses": "~1.4.0", 1123 | "unpipe": "~1.0.0" 1124 | }, 1125 | "dependencies": { 1126 | "debug": { 1127 | "version": "2.6.9", 1128 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 1129 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 1130 | "requires": { 1131 | "ms": "2.0.0" 1132 | } 1133 | }, 1134 | "statuses": { 1135 | "version": "1.4.0", 1136 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", 1137 | "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" 1138 | } 1139 | } 1140 | }, 1141 | "find-up": { 1142 | "version": "2.1.0", 1143 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", 1144 | "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", 1145 | "requires": { 1146 | "locate-path": "^2.0.0" 1147 | } 1148 | }, 1149 | "flat-cache": { 1150 | "version": "1.3.0", 1151 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", 1152 | "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", 1153 | "dev": true, 1154 | "requires": { 1155 | "circular-json": "^0.3.1", 1156 | "del": "^2.0.2", 1157 | "graceful-fs": "^4.1.2", 1158 | "write": "^0.2.1" 1159 | } 1160 | }, 1161 | "forever-agent": { 1162 | "version": "0.6.1", 1163 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 1164 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" 1165 | }, 1166 | "form-data": { 1167 | "version": "2.3.2", 1168 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", 1169 | "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", 1170 | "requires": { 1171 | "asynckit": "^0.4.0", 1172 | "combined-stream": "1.0.6", 1173 | "mime-types": "^2.1.12" 1174 | } 1175 | }, 1176 | "forwarded": { 1177 | "version": "0.1.2", 1178 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", 1179 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" 1180 | }, 1181 | "fresh": { 1182 | "version": "0.5.2", 1183 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 1184 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 1185 | }, 1186 | "fs.realpath": { 1187 | "version": "1.0.0", 1188 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 1189 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 1190 | "dev": true 1191 | }, 1192 | "functional-red-black-tree": { 1193 | "version": "1.0.1", 1194 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", 1195 | "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", 1196 | "dev": true 1197 | }, 1198 | "get-caller-file": { 1199 | "version": "1.0.3", 1200 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", 1201 | "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" 1202 | }, 1203 | "get-stream": { 1204 | "version": "3.0.0", 1205 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", 1206 | "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" 1207 | }, 1208 | "getpass": { 1209 | "version": "0.1.7", 1210 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 1211 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", 1212 | "requires": { 1213 | "assert-plus": "^1.0.0" 1214 | } 1215 | }, 1216 | "glob": { 1217 | "version": "7.1.2", 1218 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", 1219 | "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", 1220 | "dev": true, 1221 | "requires": { 1222 | "fs.realpath": "^1.0.0", 1223 | "inflight": "^1.0.4", 1224 | "inherits": "2", 1225 | "minimatch": "^3.0.4", 1226 | "once": "^1.3.0", 1227 | "path-is-absolute": "^1.0.0" 1228 | } 1229 | }, 1230 | "global-dirs": { 1231 | "version": "0.1.1", 1232 | "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", 1233 | "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", 1234 | "requires": { 1235 | "ini": "^1.3.4" 1236 | } 1237 | }, 1238 | "globals": { 1239 | "version": "11.7.0", 1240 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.7.0.tgz", 1241 | "integrity": "sha512-K8BNSPySfeShBQXsahYB/AbbWruVOTyVpgoIDnl8odPpeSfP2J5QO2oLFFdl2j7GfDCtZj2bMKar2T49itTPCg==", 1242 | "dev": true 1243 | }, 1244 | "globby": { 1245 | "version": "5.0.0", 1246 | "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", 1247 | "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", 1248 | "dev": true, 1249 | "requires": { 1250 | "array-union": "^1.0.1", 1251 | "arrify": "^1.0.0", 1252 | "glob": "^7.0.3", 1253 | "object-assign": "^4.0.1", 1254 | "pify": "^2.0.0", 1255 | "pinkie-promise": "^2.0.0" 1256 | } 1257 | }, 1258 | "got": { 1259 | "version": "6.7.1", 1260 | "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", 1261 | "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", 1262 | "requires": { 1263 | "create-error-class": "^3.0.0", 1264 | "duplexer3": "^0.1.4", 1265 | "get-stream": "^3.0.0", 1266 | "is-redirect": "^1.0.0", 1267 | "is-retry-allowed": "^1.0.0", 1268 | "is-stream": "^1.0.0", 1269 | "lowercase-keys": "^1.0.0", 1270 | "safe-buffer": "^5.0.1", 1271 | "timed-out": "^4.0.0", 1272 | "unzip-response": "^2.0.1", 1273 | "url-parse-lax": "^1.0.0" 1274 | } 1275 | }, 1276 | "graceful-fs": { 1277 | "version": "4.1.11", 1278 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", 1279 | "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" 1280 | }, 1281 | "har-schema": { 1282 | "version": "2.0.0", 1283 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", 1284 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" 1285 | }, 1286 | "har-validator": { 1287 | "version": "5.1.0", 1288 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz", 1289 | "integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==", 1290 | "requires": { 1291 | "ajv": "^5.3.0", 1292 | "har-schema": "^2.0.0" 1293 | }, 1294 | "dependencies": { 1295 | "ajv": { 1296 | "version": "5.5.2", 1297 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", 1298 | "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", 1299 | "requires": { 1300 | "co": "^4.6.0", 1301 | "fast-deep-equal": "^1.0.0", 1302 | "fast-json-stable-stringify": "^2.0.0", 1303 | "json-schema-traverse": "^0.3.0" 1304 | } 1305 | }, 1306 | "fast-deep-equal": { 1307 | "version": "1.1.0", 1308 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", 1309 | "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=" 1310 | }, 1311 | "json-schema-traverse": { 1312 | "version": "0.3.1", 1313 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", 1314 | "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" 1315 | } 1316 | } 1317 | }, 1318 | "has-ansi": { 1319 | "version": "2.0.0", 1320 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", 1321 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", 1322 | "dev": true, 1323 | "requires": { 1324 | "ansi-regex": "^2.0.0" 1325 | } 1326 | }, 1327 | "has-flag": { 1328 | "version": "3.0.0", 1329 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 1330 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" 1331 | }, 1332 | "http-errors": { 1333 | "version": "1.6.3", 1334 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", 1335 | "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", 1336 | "requires": { 1337 | "depd": "~1.1.2", 1338 | "inherits": "2.0.3", 1339 | "setprototypeof": "1.1.0", 1340 | "statuses": ">= 1.4.0 < 2" 1341 | } 1342 | }, 1343 | "http-signature": { 1344 | "version": "1.2.0", 1345 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", 1346 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", 1347 | "requires": { 1348 | "assert-plus": "^1.0.0", 1349 | "jsprim": "^1.2.2", 1350 | "sshpk": "^1.7.0" 1351 | } 1352 | }, 1353 | "iconv-lite": { 1354 | "version": "0.4.24", 1355 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 1356 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 1357 | "dev": true, 1358 | "requires": { 1359 | "safer-buffer": ">= 2.1.2 < 3" 1360 | } 1361 | }, 1362 | "ignore": { 1363 | "version": "4.0.6", 1364 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", 1365 | "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", 1366 | "dev": true 1367 | }, 1368 | "import-lazy": { 1369 | "version": "2.1.0", 1370 | "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", 1371 | "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=" 1372 | }, 1373 | "imurmurhash": { 1374 | "version": "0.1.4", 1375 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 1376 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" 1377 | }, 1378 | "inflight": { 1379 | "version": "1.0.6", 1380 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1381 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 1382 | "dev": true, 1383 | "requires": { 1384 | "once": "^1.3.0", 1385 | "wrappy": "1" 1386 | } 1387 | }, 1388 | "inherits": { 1389 | "version": "2.0.3", 1390 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 1391 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 1392 | }, 1393 | "ini": { 1394 | "version": "1.3.5", 1395 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", 1396 | "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" 1397 | }, 1398 | "inquirer": { 1399 | "version": "5.2.0", 1400 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-5.2.0.tgz", 1401 | "integrity": "sha512-E9BmnJbAKLPGonz0HeWHtbKf+EeSP93paWO3ZYoUpq/aowXvYGjjCSuashhXPpzbArIjBbji39THkxTz9ZeEUQ==", 1402 | "dev": true, 1403 | "requires": { 1404 | "ansi-escapes": "^3.0.0", 1405 | "chalk": "^2.0.0", 1406 | "cli-cursor": "^2.1.0", 1407 | "cli-width": "^2.0.0", 1408 | "external-editor": "^2.1.0", 1409 | "figures": "^2.0.0", 1410 | "lodash": "^4.3.0", 1411 | "mute-stream": "0.0.7", 1412 | "run-async": "^2.2.0", 1413 | "rxjs": "^5.5.2", 1414 | "string-width": "^2.1.0", 1415 | "strip-ansi": "^4.0.0", 1416 | "through": "^2.3.6" 1417 | } 1418 | }, 1419 | "invariant": { 1420 | "version": "2.2.4", 1421 | "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", 1422 | "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", 1423 | "dev": true, 1424 | "requires": { 1425 | "loose-envify": "^1.0.0" 1426 | } 1427 | }, 1428 | "invert-kv": { 1429 | "version": "1.0.0", 1430 | "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", 1431 | "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" 1432 | }, 1433 | "ipaddr.js": { 1434 | "version": "1.8.0", 1435 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", 1436 | "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=" 1437 | }, 1438 | "is-ci": { 1439 | "version": "1.2.0", 1440 | "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.0.tgz", 1441 | "integrity": "sha512-plgvKjQtalH2P3Gytb7L61Lmz95g2DlpzFiQyRSFew8WoJKxtKRzrZMeyRN2supblm3Psc8OQGy7Xjb6XG11jw==", 1442 | "requires": { 1443 | "ci-info": "^1.3.0" 1444 | } 1445 | }, 1446 | "is-fullwidth-code-point": { 1447 | "version": "2.0.0", 1448 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 1449 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" 1450 | }, 1451 | "is-installed-globally": { 1452 | "version": "0.1.0", 1453 | "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", 1454 | "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", 1455 | "requires": { 1456 | "global-dirs": "^0.1.0", 1457 | "is-path-inside": "^1.0.0" 1458 | } 1459 | }, 1460 | "is-npm": { 1461 | "version": "1.0.0", 1462 | "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", 1463 | "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=" 1464 | }, 1465 | "is-obj": { 1466 | "version": "1.0.1", 1467 | "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", 1468 | "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" 1469 | }, 1470 | "is-path-cwd": { 1471 | "version": "1.0.0", 1472 | "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", 1473 | "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", 1474 | "dev": true 1475 | }, 1476 | "is-path-in-cwd": { 1477 | "version": "1.0.1", 1478 | "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", 1479 | "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", 1480 | "dev": true, 1481 | "requires": { 1482 | "is-path-inside": "^1.0.0" 1483 | } 1484 | }, 1485 | "is-path-inside": { 1486 | "version": "1.0.1", 1487 | "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", 1488 | "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", 1489 | "requires": { 1490 | "path-is-inside": "^1.0.1" 1491 | } 1492 | }, 1493 | "is-promise": { 1494 | "version": "2.1.0", 1495 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", 1496 | "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" 1497 | }, 1498 | "is-redirect": { 1499 | "version": "1.0.0", 1500 | "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", 1501 | "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=" 1502 | }, 1503 | "is-resolvable": { 1504 | "version": "1.1.0", 1505 | "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", 1506 | "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", 1507 | "dev": true 1508 | }, 1509 | "is-retry-allowed": { 1510 | "version": "1.1.0", 1511 | "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", 1512 | "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=" 1513 | }, 1514 | "is-stream": { 1515 | "version": "1.1.0", 1516 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", 1517 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" 1518 | }, 1519 | "is-typedarray": { 1520 | "version": "1.0.0", 1521 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 1522 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" 1523 | }, 1524 | "isarray": { 1525 | "version": "0.0.1", 1526 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 1527 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" 1528 | }, 1529 | "isexe": { 1530 | "version": "2.0.0", 1531 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1532 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" 1533 | }, 1534 | "isstream": { 1535 | "version": "0.1.2", 1536 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 1537 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" 1538 | }, 1539 | "jju": { 1540 | "version": "1.4.0", 1541 | "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", 1542 | "integrity": "sha1-o6vicYryQaKykE+EpiWXDzia4yo=" 1543 | }, 1544 | "jquery": { 1545 | "version": "3.5.0", 1546 | "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.5.0.tgz", 1547 | "integrity": "sha512-Xb7SVYMvygPxbFMpTFQiHh1J7HClEaThguL15N/Gg37Lri/qKyhRGZYzHRyLH8Stq3Aow0LsHO2O2ci86fCrNQ==" 1548 | }, 1549 | "js-tokens": { 1550 | "version": "3.0.2", 1551 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", 1552 | "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", 1553 | "dev": true 1554 | }, 1555 | "js-yaml": { 1556 | "version": "3.13.1", 1557 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", 1558 | "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", 1559 | "dev": true, 1560 | "requires": { 1561 | "argparse": "^1.0.7", 1562 | "esprima": "^4.0.0" 1563 | } 1564 | }, 1565 | "jsbn": { 1566 | "version": "0.1.1", 1567 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 1568 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", 1569 | "optional": true 1570 | }, 1571 | "jsesc": { 1572 | "version": "2.5.1", 1573 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.1.tgz", 1574 | "integrity": "sha1-5CGiqOINawgZ3yiQj3glJrlt0f4=", 1575 | "dev": true 1576 | }, 1577 | "json-parse-helpfulerror": { 1578 | "version": "1.0.3", 1579 | "resolved": "https://registry.npmjs.org/json-parse-helpfulerror/-/json-parse-helpfulerror-1.0.3.tgz", 1580 | "integrity": "sha1-E/FM4C7tTpgSl7ZOueO5MuLdE9w=", 1581 | "requires": { 1582 | "jju": "^1.1.0" 1583 | } 1584 | }, 1585 | "json-schema": { 1586 | "version": "0.2.3", 1587 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", 1588 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" 1589 | }, 1590 | "json-schema-traverse": { 1591 | "version": "0.4.1", 1592 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 1593 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 1594 | "dev": true 1595 | }, 1596 | "json-server": { 1597 | "version": "0.14.0", 1598 | "resolved": "https://registry.npmjs.org/json-server/-/json-server-0.14.0.tgz", 1599 | "integrity": "sha512-8RVRAb1TO6LlCny6+8GC+sXDsESYv7gv7fSLdVANklVt866I416/7Z5fdqrtzSru92nyreddgavbEk8pjqcWoA==", 1600 | "requires": { 1601 | "body-parser": "^1.18.3", 1602 | "chalk": "^2.4.1", 1603 | "compression": "^1.7.2", 1604 | "connect-pause": "^0.1.1", 1605 | "cors": "^2.8.4", 1606 | "errorhandler": "^1.2.0", 1607 | "express": "^4.16.3", 1608 | "express-urlrewrite": "^1.2.0", 1609 | "json-parse-helpfulerror": "^1.0.3", 1610 | "lodash": "^4.17.10", 1611 | "lodash-id": "^0.14.0", 1612 | "lowdb": "^0.15.0", 1613 | "method-override": "^2.3.10", 1614 | "morgan": "^1.9.0", 1615 | "nanoid": "^1.0.2", 1616 | "object-assign": "^4.0.1", 1617 | "please-upgrade-node": "^3.0.2", 1618 | "pluralize": "^7.0.0", 1619 | "request": "^2.87.0", 1620 | "server-destroy": "^1.0.1", 1621 | "update-notifier": "^2.5.0", 1622 | "yargs": "^10.1.2" 1623 | } 1624 | }, 1625 | "json-stable-stringify-without-jsonify": { 1626 | "version": "1.0.1", 1627 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 1628 | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", 1629 | "dev": true 1630 | }, 1631 | "json-stringify-safe": { 1632 | "version": "5.0.1", 1633 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 1634 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" 1635 | }, 1636 | "jsprim": { 1637 | "version": "1.4.1", 1638 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", 1639 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", 1640 | "requires": { 1641 | "assert-plus": "1.0.0", 1642 | "extsprintf": "1.3.0", 1643 | "json-schema": "0.2.3", 1644 | "verror": "1.10.0" 1645 | } 1646 | }, 1647 | "jstree": { 1648 | "version": "3.3.5", 1649 | "resolved": "https://registry.npmjs.org/jstree/-/jstree-3.3.5.tgz", 1650 | "integrity": "sha1-nFeNsy0KZDd1zd2AIK1ZkvQRnBM=", 1651 | "requires": { 1652 | "jquery": ">=1.9.1" 1653 | } 1654 | }, 1655 | "latest-version": { 1656 | "version": "3.1.0", 1657 | "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", 1658 | "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", 1659 | "requires": { 1660 | "package-json": "^4.0.0" 1661 | } 1662 | }, 1663 | "lcid": { 1664 | "version": "1.0.0", 1665 | "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", 1666 | "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", 1667 | "requires": { 1668 | "invert-kv": "^1.0.0" 1669 | } 1670 | }, 1671 | "levn": { 1672 | "version": "0.3.0", 1673 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", 1674 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", 1675 | "dev": true, 1676 | "requires": { 1677 | "prelude-ls": "~1.1.2", 1678 | "type-check": "~0.3.2" 1679 | } 1680 | }, 1681 | "locate-path": { 1682 | "version": "2.0.0", 1683 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", 1684 | "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", 1685 | "requires": { 1686 | "p-locate": "^2.0.0", 1687 | "path-exists": "^3.0.0" 1688 | } 1689 | }, 1690 | "lodash": { 1691 | "version": "4.17.19", 1692 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", 1693 | "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" 1694 | }, 1695 | "lodash-id": { 1696 | "version": "0.14.0", 1697 | "resolved": "https://registry.npmjs.org/lodash-id/-/lodash-id-0.14.0.tgz", 1698 | "integrity": "sha1-uvSJNOVDobXWNG+MhGmLGoyAOJY=" 1699 | }, 1700 | "loose-envify": { 1701 | "version": "1.4.0", 1702 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", 1703 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", 1704 | "dev": true, 1705 | "requires": { 1706 | "js-tokens": "^3.0.0 || ^4.0.0" 1707 | } 1708 | }, 1709 | "lowdb": { 1710 | "version": "0.15.5", 1711 | "resolved": "https://registry.npmjs.org/lowdb/-/lowdb-0.15.5.tgz", 1712 | "integrity": "sha1-mt4QXfiqVzaS0SIWIrhUFPv0+pY=", 1713 | "requires": { 1714 | "graceful-fs": "^4.1.3", 1715 | "is-promise": "^2.1.0", 1716 | "json-parse-helpfulerror": "^1.0.3", 1717 | "lodash": "4", 1718 | "steno": "^0.4.1" 1719 | } 1720 | }, 1721 | "lowercase-keys": { 1722 | "version": "1.0.1", 1723 | "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", 1724 | "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" 1725 | }, 1726 | "lru-cache": { 1727 | "version": "4.1.3", 1728 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", 1729 | "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", 1730 | "requires": { 1731 | "pseudomap": "^1.0.2", 1732 | "yallist": "^2.1.2" 1733 | } 1734 | }, 1735 | "make-dir": { 1736 | "version": "1.3.0", 1737 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", 1738 | "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", 1739 | "requires": { 1740 | "pify": "^3.0.0" 1741 | }, 1742 | "dependencies": { 1743 | "pify": { 1744 | "version": "3.0.0", 1745 | "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", 1746 | "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" 1747 | } 1748 | } 1749 | }, 1750 | "media-typer": { 1751 | "version": "0.3.0", 1752 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 1753 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 1754 | }, 1755 | "mem": { 1756 | "version": "1.1.0", 1757 | "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", 1758 | "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", 1759 | "requires": { 1760 | "mimic-fn": "^1.0.0" 1761 | } 1762 | }, 1763 | "merge-descriptors": { 1764 | "version": "1.0.1", 1765 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 1766 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 1767 | }, 1768 | "method-override": { 1769 | "version": "2.3.10", 1770 | "resolved": "https://registry.npmjs.org/method-override/-/method-override-2.3.10.tgz", 1771 | "integrity": "sha1-49r41d7hDdLc59SuiNYrvud0drQ=", 1772 | "requires": { 1773 | "debug": "2.6.9", 1774 | "methods": "~1.1.2", 1775 | "parseurl": "~1.3.2", 1776 | "vary": "~1.1.2" 1777 | }, 1778 | "dependencies": { 1779 | "debug": { 1780 | "version": "2.6.9", 1781 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 1782 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 1783 | "requires": { 1784 | "ms": "2.0.0" 1785 | } 1786 | } 1787 | } 1788 | }, 1789 | "methods": { 1790 | "version": "1.1.2", 1791 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 1792 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 1793 | }, 1794 | "mime": { 1795 | "version": "1.4.1", 1796 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", 1797 | "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" 1798 | }, 1799 | "mime-db": { 1800 | "version": "1.36.0", 1801 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.36.0.tgz", 1802 | "integrity": "sha512-L+xvyD9MkoYMXb1jAmzI/lWYAxAMCPvIBSWur0PZ5nOf5euahRLVqH//FKW9mWp2lkqUgYiXPgkzfMUFi4zVDw==" 1803 | }, 1804 | "mime-types": { 1805 | "version": "2.1.20", 1806 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.20.tgz", 1807 | "integrity": "sha512-HrkrPaP9vGuWbLK1B1FfgAkbqNjIuy4eHlIYnFi7kamZyLLrGlo2mpcx0bBmNpKqBtYtAfGbodDddIgddSJC2A==", 1808 | "requires": { 1809 | "mime-db": "~1.36.0" 1810 | } 1811 | }, 1812 | "mimic-fn": { 1813 | "version": "1.2.0", 1814 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", 1815 | "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" 1816 | }, 1817 | "minimatch": { 1818 | "version": "3.0.4", 1819 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 1820 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 1821 | "dev": true, 1822 | "requires": { 1823 | "brace-expansion": "^1.1.7" 1824 | } 1825 | }, 1826 | "minimist": { 1827 | "version": "0.0.8", 1828 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 1829 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 1830 | "dev": true 1831 | }, 1832 | "mkdirp": { 1833 | "version": "0.5.1", 1834 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 1835 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 1836 | "dev": true, 1837 | "requires": { 1838 | "minimist": "0.0.8" 1839 | } 1840 | }, 1841 | "morgan": { 1842 | "version": "1.9.1", 1843 | "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.1.tgz", 1844 | "integrity": "sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA==", 1845 | "requires": { 1846 | "basic-auth": "~2.0.0", 1847 | "debug": "2.6.9", 1848 | "depd": "~1.1.2", 1849 | "on-finished": "~2.3.0", 1850 | "on-headers": "~1.0.1" 1851 | }, 1852 | "dependencies": { 1853 | "debug": { 1854 | "version": "2.6.9", 1855 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 1856 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 1857 | "requires": { 1858 | "ms": "2.0.0" 1859 | } 1860 | } 1861 | } 1862 | }, 1863 | "ms": { 1864 | "version": "2.0.0", 1865 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1866 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 1867 | }, 1868 | "mute-stream": { 1869 | "version": "0.0.7", 1870 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", 1871 | "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", 1872 | "dev": true 1873 | }, 1874 | "nanoid": { 1875 | "version": "1.2.1", 1876 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-1.2.1.tgz", 1877 | "integrity": "sha512-S1QSG+TQtsqr2/ujHZcNT0OxygffUaUT755qTc/SPKfQ0VJBlOO6qb1425UYoHXPvCZ3pWgMVCuy1t7+AoCxnQ==" 1878 | }, 1879 | "natural-compare": { 1880 | "version": "1.4.0", 1881 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 1882 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", 1883 | "dev": true 1884 | }, 1885 | "negotiator": { 1886 | "version": "0.6.1", 1887 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", 1888 | "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" 1889 | }, 1890 | "nice-try": { 1891 | "version": "1.0.4", 1892 | "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.4.tgz", 1893 | "integrity": "sha512-2NpiFHqC87y/zFke0fC0spBXL3bBsoh/p5H1EFhshxjCR5+0g2d6BiXbUFz9v1sAcxsk2htp2eQnNIci2dIYcA==", 1894 | "dev": true 1895 | }, 1896 | "npm-run-path": { 1897 | "version": "2.0.2", 1898 | "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", 1899 | "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", 1900 | "requires": { 1901 | "path-key": "^2.0.0" 1902 | } 1903 | }, 1904 | "number-is-nan": { 1905 | "version": "1.0.1", 1906 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 1907 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" 1908 | }, 1909 | "oauth-sign": { 1910 | "version": "0.9.0", 1911 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", 1912 | "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" 1913 | }, 1914 | "object-assign": { 1915 | "version": "4.1.1", 1916 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1917 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 1918 | }, 1919 | "on-finished": { 1920 | "version": "2.3.0", 1921 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 1922 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 1923 | "requires": { 1924 | "ee-first": "1.1.1" 1925 | } 1926 | }, 1927 | "on-headers": { 1928 | "version": "1.0.1", 1929 | "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", 1930 | "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=" 1931 | }, 1932 | "once": { 1933 | "version": "1.4.0", 1934 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1935 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1936 | "dev": true, 1937 | "requires": { 1938 | "wrappy": "1" 1939 | } 1940 | }, 1941 | "onetime": { 1942 | "version": "2.0.1", 1943 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", 1944 | "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", 1945 | "dev": true, 1946 | "requires": { 1947 | "mimic-fn": "^1.0.0" 1948 | } 1949 | }, 1950 | "optionator": { 1951 | "version": "0.8.2", 1952 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", 1953 | "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", 1954 | "dev": true, 1955 | "requires": { 1956 | "deep-is": "~0.1.3", 1957 | "fast-levenshtein": "~2.0.4", 1958 | "levn": "~0.3.0", 1959 | "prelude-ls": "~1.1.2", 1960 | "type-check": "~0.3.2", 1961 | "wordwrap": "~1.0.0" 1962 | } 1963 | }, 1964 | "os-locale": { 1965 | "version": "2.1.0", 1966 | "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", 1967 | "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", 1968 | "requires": { 1969 | "execa": "^0.7.0", 1970 | "lcid": "^1.0.0", 1971 | "mem": "^1.1.0" 1972 | } 1973 | }, 1974 | "os-tmpdir": { 1975 | "version": "1.0.2", 1976 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 1977 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", 1978 | "dev": true 1979 | }, 1980 | "p-finally": { 1981 | "version": "1.0.0", 1982 | "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", 1983 | "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" 1984 | }, 1985 | "p-limit": { 1986 | "version": "1.3.0", 1987 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", 1988 | "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", 1989 | "requires": { 1990 | "p-try": "^1.0.0" 1991 | } 1992 | }, 1993 | "p-locate": { 1994 | "version": "2.0.0", 1995 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", 1996 | "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", 1997 | "requires": { 1998 | "p-limit": "^1.1.0" 1999 | } 2000 | }, 2001 | "p-try": { 2002 | "version": "1.0.0", 2003 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", 2004 | "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" 2005 | }, 2006 | "package-json": { 2007 | "version": "4.0.1", 2008 | "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", 2009 | "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", 2010 | "requires": { 2011 | "got": "^6.7.1", 2012 | "registry-auth-token": "^3.0.1", 2013 | "registry-url": "^3.0.3", 2014 | "semver": "^5.1.0" 2015 | } 2016 | }, 2017 | "parseurl": { 2018 | "version": "1.3.2", 2019 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", 2020 | "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" 2021 | }, 2022 | "path-exists": { 2023 | "version": "3.0.0", 2024 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", 2025 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" 2026 | }, 2027 | "path-is-absolute": { 2028 | "version": "1.0.1", 2029 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 2030 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 2031 | "dev": true 2032 | }, 2033 | "path-is-inside": { 2034 | "version": "1.0.2", 2035 | "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", 2036 | "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" 2037 | }, 2038 | "path-key": { 2039 | "version": "2.0.1", 2040 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", 2041 | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" 2042 | }, 2043 | "path-to-regexp": { 2044 | "version": "0.1.7", 2045 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 2046 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 2047 | }, 2048 | "performance-now": { 2049 | "version": "2.1.0", 2050 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", 2051 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" 2052 | }, 2053 | "pify": { 2054 | "version": "2.3.0", 2055 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 2056 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", 2057 | "dev": true 2058 | }, 2059 | "pinkie": { 2060 | "version": "2.0.4", 2061 | "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", 2062 | "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", 2063 | "dev": true 2064 | }, 2065 | "pinkie-promise": { 2066 | "version": "2.0.1", 2067 | "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", 2068 | "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", 2069 | "dev": true, 2070 | "requires": { 2071 | "pinkie": "^2.0.0" 2072 | } 2073 | }, 2074 | "please-upgrade-node": { 2075 | "version": "3.1.1", 2076 | "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.1.1.tgz", 2077 | "integrity": "sha512-KY1uHnQ2NlQHqIJQpnh/i54rKkuxCEBx+voJIS/Mvb+L2iYd2NMotwduhKTMjfC1uKoX3VXOxLjIYG66dfJTVQ==", 2078 | "requires": { 2079 | "semver-compare": "^1.0.0" 2080 | } 2081 | }, 2082 | "pluralize": { 2083 | "version": "7.0.0", 2084 | "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", 2085 | "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==" 2086 | }, 2087 | "prelude-ls": { 2088 | "version": "1.1.2", 2089 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", 2090 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", 2091 | "dev": true 2092 | }, 2093 | "prepend-http": { 2094 | "version": "1.0.4", 2095 | "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", 2096 | "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" 2097 | }, 2098 | "progress": { 2099 | "version": "2.0.0", 2100 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", 2101 | "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=", 2102 | "dev": true 2103 | }, 2104 | "proxy-addr": { 2105 | "version": "2.0.4", 2106 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", 2107 | "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==", 2108 | "requires": { 2109 | "forwarded": "~0.1.2", 2110 | "ipaddr.js": "1.8.0" 2111 | } 2112 | }, 2113 | "pseudomap": { 2114 | "version": "1.0.2", 2115 | "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", 2116 | "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" 2117 | }, 2118 | "psl": { 2119 | "version": "1.1.29", 2120 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz", 2121 | "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==" 2122 | }, 2123 | "punycode": { 2124 | "version": "2.1.1", 2125 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 2126 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", 2127 | "dev": true 2128 | }, 2129 | "qs": { 2130 | "version": "6.5.2", 2131 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 2132 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" 2133 | }, 2134 | "range-parser": { 2135 | "version": "1.2.0", 2136 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", 2137 | "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" 2138 | }, 2139 | "raw-body": { 2140 | "version": "2.3.3", 2141 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", 2142 | "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", 2143 | "requires": { 2144 | "bytes": "3.0.0", 2145 | "http-errors": "1.6.3", 2146 | "iconv-lite": "0.4.23", 2147 | "unpipe": "1.0.0" 2148 | }, 2149 | "dependencies": { 2150 | "iconv-lite": { 2151 | "version": "0.4.23", 2152 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", 2153 | "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", 2154 | "requires": { 2155 | "safer-buffer": ">= 2.1.2 < 3" 2156 | } 2157 | } 2158 | } 2159 | }, 2160 | "rc": { 2161 | "version": "1.2.8", 2162 | "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", 2163 | "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", 2164 | "requires": { 2165 | "deep-extend": "^0.6.0", 2166 | "ini": "~1.3.0", 2167 | "minimist": "^1.2.0", 2168 | "strip-json-comments": "~2.0.1" 2169 | }, 2170 | "dependencies": { 2171 | "minimist": { 2172 | "version": "1.2.0", 2173 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", 2174 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" 2175 | } 2176 | } 2177 | }, 2178 | "regexpp": { 2179 | "version": "2.0.0", 2180 | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.0.tgz", 2181 | "integrity": "sha512-g2FAVtR8Uh8GO1Nv5wpxW7VFVwHcCEr4wyA8/MHiRkO8uHoR5ntAA8Uq3P1vvMTX/BeQiRVSpDGLd+Wn5HNOTA==", 2182 | "dev": true 2183 | }, 2184 | "registry-auth-token": { 2185 | "version": "3.3.2", 2186 | "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", 2187 | "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", 2188 | "requires": { 2189 | "rc": "^1.1.6", 2190 | "safe-buffer": "^5.0.1" 2191 | } 2192 | }, 2193 | "registry-url": { 2194 | "version": "3.1.0", 2195 | "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", 2196 | "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", 2197 | "requires": { 2198 | "rc": "^1.0.1" 2199 | } 2200 | }, 2201 | "request": { 2202 | "version": "2.88.0", 2203 | "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", 2204 | "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", 2205 | "requires": { 2206 | "aws-sign2": "~0.7.0", 2207 | "aws4": "^1.8.0", 2208 | "caseless": "~0.12.0", 2209 | "combined-stream": "~1.0.6", 2210 | "extend": "~3.0.2", 2211 | "forever-agent": "~0.6.1", 2212 | "form-data": "~2.3.2", 2213 | "har-validator": "~5.1.0", 2214 | "http-signature": "~1.2.0", 2215 | "is-typedarray": "~1.0.0", 2216 | "isstream": "~0.1.2", 2217 | "json-stringify-safe": "~5.0.1", 2218 | "mime-types": "~2.1.19", 2219 | "oauth-sign": "~0.9.0", 2220 | "performance-now": "^2.1.0", 2221 | "qs": "~6.5.2", 2222 | "safe-buffer": "^5.1.2", 2223 | "tough-cookie": "~2.4.3", 2224 | "tunnel-agent": "^0.6.0", 2225 | "uuid": "^3.3.2" 2226 | } 2227 | }, 2228 | "require-directory": { 2229 | "version": "2.1.1", 2230 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 2231 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" 2232 | }, 2233 | "require-main-filename": { 2234 | "version": "1.0.1", 2235 | "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", 2236 | "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" 2237 | }, 2238 | "require-uncached": { 2239 | "version": "1.0.3", 2240 | "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", 2241 | "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", 2242 | "dev": true, 2243 | "requires": { 2244 | "caller-path": "^0.1.0", 2245 | "resolve-from": "^1.0.0" 2246 | } 2247 | }, 2248 | "resolve-from": { 2249 | "version": "1.0.1", 2250 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", 2251 | "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", 2252 | "dev": true 2253 | }, 2254 | "restore-cursor": { 2255 | "version": "2.0.0", 2256 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", 2257 | "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", 2258 | "dev": true, 2259 | "requires": { 2260 | "onetime": "^2.0.0", 2261 | "signal-exit": "^3.0.2" 2262 | } 2263 | }, 2264 | "rimraf": { 2265 | "version": "2.6.2", 2266 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", 2267 | "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", 2268 | "dev": true, 2269 | "requires": { 2270 | "glob": "^7.0.5" 2271 | } 2272 | }, 2273 | "run-async": { 2274 | "version": "2.3.0", 2275 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", 2276 | "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", 2277 | "dev": true, 2278 | "requires": { 2279 | "is-promise": "^2.1.0" 2280 | } 2281 | }, 2282 | "rxjs": { 2283 | "version": "5.5.11", 2284 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.11.tgz", 2285 | "integrity": "sha512-3bjO7UwWfA2CV7lmwYMBzj4fQ6Cq+ftHc2MvUe+WMS7wcdJ1LosDWmdjPQanYp2dBRj572p7PeU81JUxHKOcBA==", 2286 | "dev": true, 2287 | "requires": { 2288 | "symbol-observable": "1.0.1" 2289 | } 2290 | }, 2291 | "safe-buffer": { 2292 | "version": "5.1.2", 2293 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 2294 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 2295 | }, 2296 | "safer-buffer": { 2297 | "version": "2.1.2", 2298 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 2299 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 2300 | }, 2301 | "semver": { 2302 | "version": "5.5.1", 2303 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz", 2304 | "integrity": "sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==" 2305 | }, 2306 | "semver-compare": { 2307 | "version": "1.0.0", 2308 | "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", 2309 | "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=" 2310 | }, 2311 | "semver-diff": { 2312 | "version": "2.1.0", 2313 | "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", 2314 | "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", 2315 | "requires": { 2316 | "semver": "^5.0.3" 2317 | } 2318 | }, 2319 | "send": { 2320 | "version": "0.16.2", 2321 | "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", 2322 | "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", 2323 | "requires": { 2324 | "debug": "2.6.9", 2325 | "depd": "~1.1.2", 2326 | "destroy": "~1.0.4", 2327 | "encodeurl": "~1.0.2", 2328 | "escape-html": "~1.0.3", 2329 | "etag": "~1.8.1", 2330 | "fresh": "0.5.2", 2331 | "http-errors": "~1.6.2", 2332 | "mime": "1.4.1", 2333 | "ms": "2.0.0", 2334 | "on-finished": "~2.3.0", 2335 | "range-parser": "~1.2.0", 2336 | "statuses": "~1.4.0" 2337 | }, 2338 | "dependencies": { 2339 | "debug": { 2340 | "version": "2.6.9", 2341 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 2342 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 2343 | "requires": { 2344 | "ms": "2.0.0" 2345 | } 2346 | }, 2347 | "statuses": { 2348 | "version": "1.4.0", 2349 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", 2350 | "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" 2351 | } 2352 | } 2353 | }, 2354 | "serve-static": { 2355 | "version": "1.13.2", 2356 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", 2357 | "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", 2358 | "requires": { 2359 | "encodeurl": "~1.0.2", 2360 | "escape-html": "~1.0.3", 2361 | "parseurl": "~1.3.2", 2362 | "send": "0.16.2" 2363 | } 2364 | }, 2365 | "server-destroy": { 2366 | "version": "1.0.1", 2367 | "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz", 2368 | "integrity": "sha1-8Tv5KOQrnD55OD5hzDmYtdFObN0=" 2369 | }, 2370 | "set-blocking": { 2371 | "version": "2.0.0", 2372 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 2373 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" 2374 | }, 2375 | "setprototypeof": { 2376 | "version": "1.1.0", 2377 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", 2378 | "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" 2379 | }, 2380 | "shebang-command": { 2381 | "version": "1.2.0", 2382 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", 2383 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", 2384 | "requires": { 2385 | "shebang-regex": "^1.0.0" 2386 | } 2387 | }, 2388 | "shebang-regex": { 2389 | "version": "1.0.0", 2390 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 2391 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" 2392 | }, 2393 | "signal-exit": { 2394 | "version": "3.0.2", 2395 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", 2396 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" 2397 | }, 2398 | "slice-ansi": { 2399 | "version": "1.0.0", 2400 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", 2401 | "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", 2402 | "dev": true, 2403 | "requires": { 2404 | "is-fullwidth-code-point": "^2.0.0" 2405 | } 2406 | }, 2407 | "source-map": { 2408 | "version": "0.5.7", 2409 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 2410 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", 2411 | "dev": true 2412 | }, 2413 | "sprintf-js": { 2414 | "version": "1.0.3", 2415 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 2416 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 2417 | "dev": true 2418 | }, 2419 | "sshpk": { 2420 | "version": "1.14.2", 2421 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz", 2422 | "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", 2423 | "requires": { 2424 | "asn1": "~0.2.3", 2425 | "assert-plus": "^1.0.0", 2426 | "bcrypt-pbkdf": "^1.0.0", 2427 | "dashdash": "^1.12.0", 2428 | "ecc-jsbn": "~0.1.1", 2429 | "getpass": "^0.1.1", 2430 | "jsbn": "~0.1.0", 2431 | "safer-buffer": "^2.0.2", 2432 | "tweetnacl": "~0.14.0" 2433 | } 2434 | }, 2435 | "statuses": { 2436 | "version": "1.5.0", 2437 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 2438 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" 2439 | }, 2440 | "steno": { 2441 | "version": "0.4.4", 2442 | "resolved": "https://registry.npmjs.org/steno/-/steno-0.4.4.tgz", 2443 | "integrity": "sha1-BxEFvfwobmYVwEA8J+nXtdy4Vcs=", 2444 | "requires": { 2445 | "graceful-fs": "^4.1.3" 2446 | } 2447 | }, 2448 | "string-width": { 2449 | "version": "2.1.1", 2450 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 2451 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 2452 | "requires": { 2453 | "is-fullwidth-code-point": "^2.0.0", 2454 | "strip-ansi": "^4.0.0" 2455 | } 2456 | }, 2457 | "strip-ansi": { 2458 | "version": "4.0.0", 2459 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 2460 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 2461 | "requires": { 2462 | "ansi-regex": "^3.0.0" 2463 | }, 2464 | "dependencies": { 2465 | "ansi-regex": { 2466 | "version": "3.0.0", 2467 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 2468 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" 2469 | } 2470 | } 2471 | }, 2472 | "strip-eof": { 2473 | "version": "1.0.0", 2474 | "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", 2475 | "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" 2476 | }, 2477 | "strip-json-comments": { 2478 | "version": "2.0.1", 2479 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 2480 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" 2481 | }, 2482 | "supports-color": { 2483 | "version": "5.5.0", 2484 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 2485 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 2486 | "requires": { 2487 | "has-flag": "^3.0.0" 2488 | } 2489 | }, 2490 | "svg.js": { 2491 | "version": "2.6.6", 2492 | "resolved": "https://registry.npmjs.org/svg.js/-/svg.js-2.6.6.tgz", 2493 | "integrity": "sha512-YdraDjga3Chc5Mxl9H8OhHdTBGyC/Sf2Bqv3ywpCQpHngfA2yq3vqf0SAdN+bAs1Iia6h9bi68dHNsqe8H/Apw==" 2494 | }, 2495 | "symbol-observable": { 2496 | "version": "1.0.1", 2497 | "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", 2498 | "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", 2499 | "dev": true 2500 | }, 2501 | "table": { 2502 | "version": "4.0.3", 2503 | "resolved": "https://registry.npmjs.org/table/-/table-4.0.3.tgz", 2504 | "integrity": "sha512-S7rnFITmBH1EnyKcvxBh1LjYeQMmnZtCXSEbHcH6S0NoKit24ZuFO/T1vDcLdYsLQkM188PVVhQmzKIuThNkKg==", 2505 | "dev": true, 2506 | "requires": { 2507 | "ajv": "^6.0.1", 2508 | "ajv-keywords": "^3.0.0", 2509 | "chalk": "^2.1.0", 2510 | "lodash": "^4.17.4", 2511 | "slice-ansi": "1.0.0", 2512 | "string-width": "^2.1.1" 2513 | } 2514 | }, 2515 | "term-size": { 2516 | "version": "1.2.0", 2517 | "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", 2518 | "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", 2519 | "requires": { 2520 | "execa": "^0.7.0" 2521 | } 2522 | }, 2523 | "text-table": { 2524 | "version": "0.2.0", 2525 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 2526 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", 2527 | "dev": true 2528 | }, 2529 | "through": { 2530 | "version": "2.3.8", 2531 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 2532 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", 2533 | "dev": true 2534 | }, 2535 | "timed-out": { 2536 | "version": "4.0.1", 2537 | "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", 2538 | "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" 2539 | }, 2540 | "tmp": { 2541 | "version": "0.0.33", 2542 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", 2543 | "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", 2544 | "dev": true, 2545 | "requires": { 2546 | "os-tmpdir": "~1.0.2" 2547 | } 2548 | }, 2549 | "to-fast-properties": { 2550 | "version": "2.0.0", 2551 | "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", 2552 | "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", 2553 | "dev": true 2554 | }, 2555 | "tough-cookie": { 2556 | "version": "2.4.3", 2557 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", 2558 | "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", 2559 | "requires": { 2560 | "psl": "^1.1.24", 2561 | "punycode": "^1.4.1" 2562 | }, 2563 | "dependencies": { 2564 | "punycode": { 2565 | "version": "1.4.1", 2566 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", 2567 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" 2568 | } 2569 | } 2570 | }, 2571 | "trim-right": { 2572 | "version": "1.0.1", 2573 | "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", 2574 | "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", 2575 | "dev": true 2576 | }, 2577 | "tunnel-agent": { 2578 | "version": "0.6.0", 2579 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 2580 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 2581 | "requires": { 2582 | "safe-buffer": "^5.0.1" 2583 | } 2584 | }, 2585 | "tweetnacl": { 2586 | "version": "0.14.5", 2587 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 2588 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", 2589 | "optional": true 2590 | }, 2591 | "type-check": { 2592 | "version": "0.3.2", 2593 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", 2594 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", 2595 | "dev": true, 2596 | "requires": { 2597 | "prelude-ls": "~1.1.2" 2598 | } 2599 | }, 2600 | "type-is": { 2601 | "version": "1.6.16", 2602 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", 2603 | "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", 2604 | "requires": { 2605 | "media-typer": "0.3.0", 2606 | "mime-types": "~2.1.18" 2607 | } 2608 | }, 2609 | "unique-string": { 2610 | "version": "1.0.0", 2611 | "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", 2612 | "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", 2613 | "requires": { 2614 | "crypto-random-string": "^1.0.0" 2615 | } 2616 | }, 2617 | "unpipe": { 2618 | "version": "1.0.0", 2619 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 2620 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 2621 | }, 2622 | "unzip-response": { 2623 | "version": "2.0.1", 2624 | "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", 2625 | "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=" 2626 | }, 2627 | "update-notifier": { 2628 | "version": "2.5.0", 2629 | "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", 2630 | "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", 2631 | "requires": { 2632 | "boxen": "^1.2.1", 2633 | "chalk": "^2.0.1", 2634 | "configstore": "^3.0.0", 2635 | "import-lazy": "^2.1.0", 2636 | "is-ci": "^1.0.10", 2637 | "is-installed-globally": "^0.1.0", 2638 | "is-npm": "^1.0.0", 2639 | "latest-version": "^3.0.0", 2640 | "semver-diff": "^2.0.0", 2641 | "xdg-basedir": "^3.0.0" 2642 | } 2643 | }, 2644 | "uri-js": { 2645 | "version": "4.2.2", 2646 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", 2647 | "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", 2648 | "dev": true, 2649 | "requires": { 2650 | "punycode": "^2.1.0" 2651 | } 2652 | }, 2653 | "url-parse-lax": { 2654 | "version": "1.0.0", 2655 | "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", 2656 | "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", 2657 | "requires": { 2658 | "prepend-http": "^1.0.1" 2659 | } 2660 | }, 2661 | "utils-merge": { 2662 | "version": "1.0.1", 2663 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 2664 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 2665 | }, 2666 | "uuid": { 2667 | "version": "3.3.2", 2668 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", 2669 | "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" 2670 | }, 2671 | "vary": { 2672 | "version": "1.1.2", 2673 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 2674 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 2675 | }, 2676 | "verror": { 2677 | "version": "1.10.0", 2678 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", 2679 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", 2680 | "requires": { 2681 | "assert-plus": "^1.0.0", 2682 | "core-util-is": "1.0.2", 2683 | "extsprintf": "^1.2.0" 2684 | } 2685 | }, 2686 | "which": { 2687 | "version": "1.3.1", 2688 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 2689 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 2690 | "requires": { 2691 | "isexe": "^2.0.0" 2692 | } 2693 | }, 2694 | "which-module": { 2695 | "version": "2.0.0", 2696 | "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", 2697 | "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" 2698 | }, 2699 | "widest-line": { 2700 | "version": "2.0.0", 2701 | "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.0.tgz", 2702 | "integrity": "sha1-AUKk6KJD+IgsAjOqDgKBqnYVInM=", 2703 | "requires": { 2704 | "string-width": "^2.1.1" 2705 | } 2706 | }, 2707 | "wordwrap": { 2708 | "version": "1.0.0", 2709 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", 2710 | "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", 2711 | "dev": true 2712 | }, 2713 | "wrap-ansi": { 2714 | "version": "2.1.0", 2715 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", 2716 | "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", 2717 | "requires": { 2718 | "string-width": "^1.0.1", 2719 | "strip-ansi": "^3.0.1" 2720 | }, 2721 | "dependencies": { 2722 | "is-fullwidth-code-point": { 2723 | "version": "1.0.0", 2724 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", 2725 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", 2726 | "requires": { 2727 | "number-is-nan": "^1.0.0" 2728 | } 2729 | }, 2730 | "string-width": { 2731 | "version": "1.0.2", 2732 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", 2733 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", 2734 | "requires": { 2735 | "code-point-at": "^1.0.0", 2736 | "is-fullwidth-code-point": "^1.0.0", 2737 | "strip-ansi": "^3.0.0" 2738 | } 2739 | }, 2740 | "strip-ansi": { 2741 | "version": "3.0.1", 2742 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 2743 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 2744 | "requires": { 2745 | "ansi-regex": "^2.0.0" 2746 | } 2747 | } 2748 | } 2749 | }, 2750 | "wrappy": { 2751 | "version": "1.0.2", 2752 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2753 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 2754 | "dev": true 2755 | }, 2756 | "write": { 2757 | "version": "0.2.1", 2758 | "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", 2759 | "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", 2760 | "dev": true, 2761 | "requires": { 2762 | "mkdirp": "^0.5.1" 2763 | } 2764 | }, 2765 | "write-file-atomic": { 2766 | "version": "2.3.0", 2767 | "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", 2768 | "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", 2769 | "requires": { 2770 | "graceful-fs": "^4.1.11", 2771 | "imurmurhash": "^0.1.4", 2772 | "signal-exit": "^3.0.2" 2773 | } 2774 | }, 2775 | "xdg-basedir": { 2776 | "version": "3.0.0", 2777 | "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", 2778 | "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=" 2779 | }, 2780 | "y18n": { 2781 | "version": "3.2.1", 2782 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", 2783 | "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" 2784 | }, 2785 | "yallist": { 2786 | "version": "2.1.2", 2787 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", 2788 | "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" 2789 | }, 2790 | "yargs": { 2791 | "version": "10.1.2", 2792 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-10.1.2.tgz", 2793 | "integrity": "sha512-ivSoxqBGYOqQVruxD35+EyCFDYNEFL/Uo6FcOnz+9xZdZzK0Zzw4r4KhbrME1Oo2gOggwJod2MnsdamSG7H9ig==", 2794 | "requires": { 2795 | "cliui": "^4.0.0", 2796 | "decamelize": "^1.1.1", 2797 | "find-up": "^2.1.0", 2798 | "get-caller-file": "^1.0.1", 2799 | "os-locale": "^2.0.0", 2800 | "require-directory": "^2.1.1", 2801 | "require-main-filename": "^1.0.1", 2802 | "set-blocking": "^2.0.0", 2803 | "string-width": "^2.0.0", 2804 | "which-module": "^2.0.0", 2805 | "y18n": "^3.2.1", 2806 | "yargs-parser": "^8.1.0" 2807 | } 2808 | }, 2809 | "yargs-parser": { 2810 | "version": "8.1.0", 2811 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-8.1.0.tgz", 2812 | "integrity": "sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ==", 2813 | "requires": { 2814 | "camelcase": "^4.1.0" 2815 | } 2816 | } 2817 | } 2818 | } 2819 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "forge-au-sample", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "dependencies": { 7 | "@fortawesome/fontawesome-free": "^5.3.1", 8 | "json-server": "^0.14.0", 9 | "jstree": "^3.3.5", 10 | "svg.js": "^2.6.6", 11 | "lodash": ">=4.17.19", 12 | "morgan": ">=1.9.1" 13 | }, 14 | "devDependencies": { 15 | "babel-eslint": "^8.2.6", 16 | "eslint": "^5.4.0" 17 | }, 18 | "scripts": { 19 | "test": "echo \"Error: no test specified\" && exit 1", 20 | "server": "node mock-server/index.js" 21 | }, 22 | "keywords": [], 23 | "author": "yiskang ", 24 | "license": "MIT" 25 | } 26 | -------------------------------------------------------------------------------- /properties/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | AU Forge Viewer Sample 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /properties/models: -------------------------------------------------------------------------------- 1 | ../models -------------------------------------------------------------------------------- /properties/scripts/AdnPropsPanel.js: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) Autodesk, Inc. All rights reserved 3 | // 4 | // Permission to use, copy, modify, and distribute this software in 5 | // object code form for any purpose and without fee is hereby granted, 6 | // provided that the above copyright notice appears in all copies and 7 | // that both that copyright notice and the limited warranty and 8 | // restricted rights notice below appear in all supporting 9 | // documentation. 10 | // 11 | // AUTODESK PROVIDES THIS PROGRAM "AS IS" AND WITH ALL FAULTS. 12 | // AUTODESK SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTY OF 13 | // MERCHANTABILITY OR FITNESS FOR A PARTICULAR USE. AUTODESK, INC. 14 | // DOES NOT WARRANT THAT THE OPERATION OF THE PROGRAM WILL BE 15 | // UNINTERRUPTED OR ERROR FREE. 16 | // 17 | // Forge AU Sample 18 | // by Eason Kang - Autodesk Developer Network (ADN) 19 | // 20 | 21 | 'use strict'; 22 | 23 | (function() { 24 | function getServerUrl() { 25 | return document.location.protocol + '//' + document.location.host; 26 | } 27 | 28 | class AdnPropsPanel extends Autodesk.Viewing.Extensions.ViewerPropertyPanel { 29 | constructor( viewer ) { 30 | super( viewer ); 31 | } 32 | 33 | getRemoteProps( dbId ) { 34 | return new Promise(( resolve, reject ) => { 35 | const srvUrl = getServerUrl(); 36 | fetch( `${ srvUrl }/api/props?_expand=dataType&dbId=${ dbId }`, { 37 | method: 'get', 38 | headers: new Headers({ 39 | 'Content-Type': 'application/json' 40 | }) 41 | }) 42 | .then( ( response ) => { 43 | if( response.status === 200 ) { 44 | return response.json(); 45 | } else { 46 | return reject( new Error( response.statusText ) ); 47 | } 48 | }) 49 | .then( ( data ) => { 50 | if( !data ) return reject( new Error( 'Failed to fetch properties from the server' ) ); 51 | 52 | return resolve( data ); 53 | }) 54 | .catch( ( error ) => reject( new Error( error ) ) ); 55 | }); 56 | } 57 | 58 | getInfo( dbId ) { 59 | return new Promise(( resolve, reject ) => { 60 | this.viewer.getObjectTree(function( tree ) { 61 | const name = tree.getNodeName( dbId ); 62 | return resolve( { dbId, name } ); 63 | }, 64 | function( code, msg ) { 65 | reject( { code, msg } ); 66 | }); 67 | }); 68 | } 69 | 70 | async formatProps( dbId ) { 71 | const result = await this.getRemoteProps( dbId ); 72 | const info = await this.getInfo( dbId ); 73 | 74 | const props = []; 75 | for( let i=0; i < result.length; ++i ) { 76 | const data = result[i]; 77 | props.push({ 78 | attributeName: data.name, 79 | displayCategory: data.category, 80 | displayName: data.displayName, 81 | displayValue: data.value, 82 | hidden: data.flags & 1, 83 | precision: 0, 84 | type: data.dataType.serial, 85 | units: data.dataTypeContext 86 | }); 87 | } 88 | 89 | return { 90 | dbId, 91 | name: info.name, 92 | properties: props 93 | }; 94 | } 95 | 96 | async setNodeProperties( dbId ) { 97 | this.propertyNodeId = dbId; 98 | 99 | if( !this.viewer ) return; 100 | 101 | try { 102 | const result = await this.formatProps( dbId ); 103 | 104 | this.setTitle( result.name, { localizeTitle: true } ); 105 | this.setProperties( result.properties ); 106 | 107 | this.resizeToContent(); 108 | 109 | if( this.isVisible() ) { 110 | const toolController = this.viewer.toolController, 111 | mx = toolController.lastClickX, 112 | my = toolController.lastClickY, 113 | panelRect = this.container.getBoundingClientRect(), 114 | px = panelRect.left, 115 | py = panelRect.top, 116 | pw = panelRect.width, 117 | ph = panelRect.height, 118 | canvasRect = this.viewer.canvas.getBoundingClientRect(), 119 | cx = canvasRect.left, 120 | cy = canvasRect.top, 121 | cw = canvasRect.width, 122 | ch = canvasRect.height; 123 | 124 | if( (px <= mx && mx < px + pw) && (py <= my && my < py + ph) ) { 125 | if( (mx < px + (pw / 2)) && (mx + pw) < (cx + cw) ) { 126 | this.container.style.left = Math.round( mx - cx ) + 'px'; 127 | this.container.dockRight = false; 128 | } else if( cx <= (mx - pw) ) { 129 | this.container.style.left = Math.round( mx - cx - pw ) + 'px'; 130 | this.container.dockRight = false; 131 | } else if( (mx + pw) < (cx + cw) ) { 132 | this.container.style.left = Math.round( mx - cx ) + 'px'; 133 | this.container.dockRight = false; 134 | } else if( (my + ph) < (cy + ch) ) { 135 | this.container.style.top = Math.round( my - cy ) + 'px'; 136 | this.container.dockBottom = false; 137 | } else if( cy <= (my - ph) ) { 138 | this.container.style.top = Math.round( my - cy - ph ) + 'px'; 139 | this.container.dockBottom = false; 140 | } 141 | } 142 | } 143 | } catch( error ) { 144 | this.showDefaultProperties(); 145 | } 146 | } 147 | } 148 | 149 | class AdnPropsPanelExtension extends Autodesk.Viewing.Extension { 150 | constructor( viewer, options ) { 151 | super( viewer, options ); 152 | 153 | this.panel = null; 154 | this.createUI = this.createUI.bind( this ); 155 | this.onToolbarCreated = this.onToolbarCreated.bind( this ); 156 | } 157 | 158 | onToolbarCreated() { 159 | this.viewer.removeEventListener( 160 | Autodesk.Viewing.TOOLBAR_CREATED_EVENT, 161 | this.onToolbarCreated 162 | ); 163 | 164 | this.createUI(); 165 | } 166 | 167 | createUI() { 168 | const viewer = this.viewer; 169 | 170 | const propsPanel = new AdnPropsPanel( viewer ); 171 | 172 | viewer.addPanel( propsPanel ); 173 | this.panel = propsPanel; 174 | 175 | const propButton = new Autodesk.Viewing.UI.Button( 'toolbar-adnPropsTool' ); 176 | propButton.setToolTip( 'Custom Properties' ); 177 | propButton.setIcon( 'adsk-icon-properties' ); 178 | propButton.onClick = function() { 179 | propsPanel.setVisible( !propsPanel.isVisible() ); 180 | }; 181 | 182 | const subToolbar = new Autodesk.Viewing.UI.ControlGroup( 'toolbar-adn-tools' ); 183 | subToolbar.addControl( propButton ); 184 | subToolbar.adnpropsbutton = propButton; 185 | this.subToolbar = subToolbar; 186 | 187 | viewer.toolbar.addControl( this.subToolbar ); 188 | 189 | propsPanel.addVisibilityListener(function( visible ) { 190 | if( visible ) 191 | viewer.onPanelVisible( propsPanel, viewer ); 192 | 193 | propButton.setState( visible ? Autodesk.Viewing.UI.Button.State.ACTIVE : Autodesk.Viewing.UI.Button.State.INACTIVE ); 194 | }); 195 | } 196 | 197 | load() { 198 | if( this.viewer.toolbar ) { 199 | // Toolbar is already available, create the UI 200 | this.createUI(); 201 | } else { 202 | // Toolbar hasn't been created yet, wait until we get notification of its creation 203 | this.viewer.addEventListener( 204 | Autodesk.Viewing.TOOLBAR_CREATED_EVENT, 205 | this.onToolbarCreated 206 | ); 207 | } 208 | 209 | return true; 210 | } 211 | 212 | unload() { 213 | if( this.panel ) { 214 | this.panel.uninitialize(); 215 | delete this.panel; 216 | this.panel = null; 217 | } 218 | 219 | if( this.subToolbar ) { 220 | this.viewer.toolbar.removeControl( this.subToolbar ); 221 | delete this.subToolbar; 222 | this.subToolbar = null; 223 | } 224 | 225 | return true; 226 | } 227 | } 228 | 229 | Autodesk.Viewing.theExtensionManager.registerExtension( 'Autodesk.ADN.PropsPanel', AdnPropsPanelExtension ); 230 | })(); -------------------------------------------------------------------------------- /properties/scripts/index.js: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) Autodesk, Inc. All rights reserved 3 | // 4 | // Permission to use, copy, modify, and distribute this software in 5 | // object code form for any purpose and without fee is hereby granted, 6 | // provided that the above copyright notice appears in all copies and 7 | // that both that copyright notice and the limited warranty and 8 | // restricted rights notice below appear in all supporting 9 | // documentation. 10 | // 11 | // AUTODESK PROVIDES THIS PROGRAM "AS IS" AND WITH ALL FAULTS. 12 | // AUTODESK SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTY OF 13 | // MERCHANTABILITY OR FITNESS FOR A PARTICULAR USE. AUTODESK, INC. 14 | // DOES NOT WARRANT THAT THE OPERATION OF THE PROGRAM WILL BE 15 | // UNINTERRUPTED OR ERROR FREE. 16 | // 17 | // Forge AU Sample 18 | // by Eason Kang - Autodesk Developer Network (ADN) 19 | // 20 | 21 | 'use strict'; 22 | 23 | (function() { 24 | const options = { 25 | env: 'Local', 26 | }; 27 | 28 | const doc = { 'rootFolder': 'models/House', 'path': 'Resource/3D_View/_3D_ 960621/_3D_.svf', 'name': '3D view' }; 29 | 30 | const config3d = { 31 | extensions: [ 'Autodesk.ADN.PropsPanel' ] 32 | }; 33 | const viewerDiv = document.getElementById( 'MyViewerDiv' ); 34 | const viewer = new Autodesk.Viewing.Private.GuiViewer3D( viewerDiv, config3d ); 35 | 36 | Autodesk.Viewing.Initializer(options, function() { 37 | if( viewer.start() != 0 ) return console.error( 'Failed to initialize viewer' ); 38 | 39 | const basePath = getCurrentBaseURL(); 40 | const modelFolderPath = basePath + doc.rootFolder + '/'; 41 | const modelFilePath = modelFolderPath + doc.path; 42 | const modelOptions = { 43 | sharedPropertyDbPath: modelFolderPath, 44 | isAEC: true 45 | }; 46 | 47 | viewer.addEventListener( 48 | Autodesk.Viewing.PROGRESS_UPDATE_EVENT, 49 | function( event ) { 50 | if(event.state == Autodesk.Viewing.ProgressState.LOADING) 51 | console.log( '%cPROGRESS_UPDATE_EVENT:', 'color: blue;', event ); 52 | }); 53 | 54 | viewer.addEventListener( 55 | Autodesk.Viewing.OBJECT_TREE_CREATED_EVENT, 56 | function() { 57 | console.log( '%cOBJECT_TREE_CREATED_EVENT: !!!Object tree loaded!!!', 'color: blue;' ); 58 | }); 59 | 60 | viewer.addEventListener( 61 | Autodesk.Viewing.GEOMETRY_LOADED_EVENT, 62 | function( event ) { 63 | console.log( '%cGEOMETRY_LOADED_EVENT: !!!Geometries loaded!!!', 'color: green;' ); 64 | console.log( event ); 65 | }); 66 | 67 | // viewer.prefs.tag( 'ignore-producer' ); 68 | // viewer.prefs.set( 'viewCube', true ); 69 | 70 | viewer.loadModel( modelFilePath, modelOptions, onLoadModelSuccess, onLoadModelError ); 71 | }); 72 | 73 | function getCurrentBaseURL() { 74 | let basePath = ''; 75 | const lastSlash = document.location.href.lastIndexOf( '/' ); 76 | 77 | if( lastSlash != -1 ) 78 | basePath = document.location.href.substr( 0, lastSlash + 1 ); 79 | else 80 | basePath = document.location.href; 81 | 82 | return basePath; 83 | } 84 | 85 | /** 86 | * viewer.loadModel() success callback. 87 | * Invoked after the model's SVF has been initially loaded. 88 | * It may trigger before any geometry has been downloaded and displayed on-screen. 89 | */ 90 | function onLoadModelSuccess(model) { 91 | console.log( 'onLoadModelSuccess()!' ); 92 | console.log( 'Validate model loaded: ' + (viewer.model === model) ); 93 | console.log( model ); 94 | } 95 | 96 | /** 97 | * viewer.loadModel() failure callback. 98 | * Invoked when there's an error fetching the SVF file. 99 | */ 100 | function onLoadModelError(viewerErrorCode) { 101 | console.error( 'onLoadModelError() - errorCode:' + viewerErrorCode ); 102 | } 103 | })(); -------------------------------------------------------------------------------- /properties/styles/index.css: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 0; 3 | } 4 | 5 | #MyViewerDiv { 6 | width: 100%; 7 | height: 100%; 8 | margin: 0; 9 | background-color: #F0F8FF; 10 | } 11 | 12 | .adn-docking-panel { 13 | top: 10px; 14 | left: 10px; 15 | } 16 | 17 | .adn-model-structure-panel .docking-panel-scroll div:first-child { 18 | width: 370px; 19 | height: 530px; 20 | min-width: 370px; 21 | min-height: 530px; 22 | } --------------------------------------------------------------------------------