├── .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 | [](https://nodejs.org/)
2 | [](https://www.npmjs.com/)
3 | 
4 | [](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 | [](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 | [](http://www.youtube.com/watch?v=-Jy7yUbjP4E)
19 | 3. Markup 3d ([Source](https://github.com/yiskang/forge-au-sample/tree/master/markup3d))
20 | [](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 | [](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 |
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 | }
--------------------------------------------------------------------------------