node-poweredup 6.10.0 → 8.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (314) hide show
  1. package/.drone.yml +1 -0
  2. package/.gitmodules +3 -0
  3. package/{jsdoc.conf.json → .jsdoc.json} +14 -1
  4. package/README.md +47 -42
  5. package/dist/browser/poweredup.js +1 -1
  6. package/dist/browser/poweredup.js.map +1 -1
  7. package/dist/node/color.d.ts +6 -0
  8. package/dist/node/color.js +38 -0
  9. package/dist/node/color.js.map +1 -0
  10. package/dist/node/consts.d.ts +48 -27
  11. package/dist/node/consts.js +53 -31
  12. package/dist/node/consts.js.map +1 -1
  13. package/dist/node/devices/absolutemotor.js +8 -9
  14. package/dist/node/devices/absolutemotor.js.map +1 -1
  15. package/dist/node/devices/basicmotor.js +2 -2
  16. package/dist/node/devices/basicmotor.js.map +1 -1
  17. package/dist/node/devices/colordistancesensor.d.ts +11 -0
  18. package/dist/node/devices/colordistancesensor.js +95 -2
  19. package/dist/node/devices/colordistancesensor.js.map +1 -1
  20. package/dist/node/devices/device.d.ts +2 -2
  21. package/dist/node/devices/device.js +10 -5
  22. package/dist/node/devices/device.js.map +1 -1
  23. package/dist/node/devices/duplotrainbasecolorsensor.d.ts +2 -1
  24. package/dist/node/devices/duplotrainbasecolorsensor.js +15 -2
  25. package/dist/node/devices/duplotrainbasecolorsensor.js.map +1 -1
  26. package/dist/node/devices/light.js +1 -1
  27. package/dist/node/devices/light.js.map +1 -1
  28. package/dist/node/devices/tachomotor.js +10 -12
  29. package/dist/node/devices/tachomotor.js.map +1 -1
  30. package/dist/node/devices/technic3x3colorlightmatrix.d.ts +22 -0
  31. package/dist/node/devices/technic3x3colorlightmatrix.js +77 -0
  32. package/dist/node/devices/technic3x3colorlightmatrix.js.map +1 -0
  33. package/dist/node/devices/techniccolorsensor.js +2 -1
  34. package/dist/node/devices/techniccolorsensor.js.map +1 -1
  35. package/dist/node/devices/technicmediumhubtiltsensor.d.ts +25 -1
  36. package/dist/node/devices/technicmediumhubtiltsensor.js +70 -2
  37. package/dist/node/devices/technicmediumhubtiltsensor.js.map +1 -1
  38. package/dist/node/devices/technicsmallangularmotor.d.ts +12 -0
  39. package/dist/node/devices/technicsmallangularmotor.js +35 -0
  40. package/dist/node/devices/technicsmallangularmotor.js.map +1 -0
  41. package/dist/node/hubs/basehub.js +4 -0
  42. package/dist/node/hubs/basehub.js.map +1 -1
  43. package/dist/node/hubs/hub.js +1 -1
  44. package/dist/node/hubs/hub.js.map +1 -1
  45. package/dist/node/hubs/lpf2hub.js +19 -21
  46. package/dist/node/hubs/lpf2hub.js.map +1 -1
  47. package/dist/node/hubs/movehub.js +1 -1
  48. package/dist/node/hubs/movehub.js.map +1 -1
  49. package/dist/node/hubs/technicmediumhub.js +1 -1
  50. package/dist/node/hubs/technicmediumhub.js.map +1 -1
  51. package/dist/node/hubs/technicsmallhub.d.ts +18 -0
  52. package/dist/node/hubs/technicsmallhub.js +64 -0
  53. package/dist/node/hubs/technicsmallhub.js.map +1 -0
  54. package/dist/node/index-browser.js +6 -0
  55. package/dist/node/index-browser.js.map +1 -1
  56. package/dist/node/index-node.d.ts +4 -1
  57. package/dist/node/index-node.js +7 -1
  58. package/dist/node/index-node.js.map +1 -1
  59. package/dist/node/poweredup-browser.js +8 -1
  60. package/dist/node/poweredup-browser.js.map +1 -1
  61. package/dist/node/poweredup-node.js +28 -1
  62. package/dist/node/poweredup-node.js.map +1 -1
  63. package/dist/node/utils.d.ts +1 -1
  64. package/dist/node/utils.js +10 -3
  65. package/dist/node/utils.js.map +1 -1
  66. package/docs/AbsoluteMotor.html +1220 -1405
  67. package/docs/BaseHub.html +787 -872
  68. package/docs/BasicMotor.html +923 -1078
  69. package/docs/ColorDistanceSensor.html +2188 -1540
  70. package/docs/CurrentSensor.html +711 -800
  71. package/docs/Device.html +574 -665
  72. package/docs/DuploTrainBase.html +1255 -1375
  73. package/docs/DuploTrainBaseColorSensor.html +1049 -978
  74. package/docs/DuploTrainBaseMotor.html +958 -1113
  75. package/docs/DuploTrainBaseSpeaker.html +793 -916
  76. package/docs/DuploTraniBaseSpeedometer.html +628 -719
  77. package/docs/Hub.html +5621 -2397
  78. package/docs/HubLED.html +831 -944
  79. package/docs/LPF2Hub.html +1215 -1335
  80. package/docs/Light.html +831 -944
  81. package/docs/Mario.html +1255 -1420
  82. package/docs/MarioAccelerometer.html +834 -911
  83. package/docs/MarioBarcodeSensor.html +834 -911
  84. package/docs/MarioPantsSensor.html +711 -800
  85. package/docs/MediumLinearMotor.html +861 -1000
  86. package/docs/MotionSensor.html +711 -800
  87. package/docs/MoveHub.html +1255 -1420
  88. package/docs/MoveHubMediumLinearMotor.html +861 -1000
  89. package/docs/MoveHubTiltSensor.html +730 -814
  90. package/docs/PiezoBuzzer.html +732 -834
  91. package/docs/PoweredUP.html +4322 -0
  92. package/docs/RemoteControl.html +1255 -1420
  93. package/docs/RemoteControlButton.html +711 -800
  94. package/docs/SimpleMediumLinearMotor.html +628 -719
  95. package/docs/TachoMotor.html +1644 -1835
  96. package/docs/Technic3x3ColorLightMatrix.html +1181 -0
  97. package/docs/TechnicColorSensor.html +1008 -1099
  98. package/docs/TechnicDistanceSensor.html +939 -1027
  99. package/docs/TechnicForceSensor.html +883 -968
  100. package/docs/TechnicLargeAngularMotor.html +1254 -1439
  101. package/docs/TechnicLargeLinearMotor.html +1254 -1439
  102. package/docs/TechnicMediumAngularMotor.html +1254 -1439
  103. package/docs/TechnicMediumHub.html +1255 -1420
  104. package/docs/TechnicMediumHubAccelerometerSensor.html +749 -828
  105. package/docs/TechnicMediumHubGyroSensor.html +749 -828
  106. package/docs/TechnicMediumHubTiltSensor.html +1340 -831
  107. package/docs/TechnicSmallAngularMotor.html +2073 -0
  108. package/docs/TechnicXLargeLinearMotor.html +1254 -1439
  109. package/docs/TiltSensor.html +730 -814
  110. package/docs/TrainMotor.html +958 -1113
  111. package/docs/VoltageSensor.html +711 -800
  112. package/docs/WeDo2SmartHub.html +1112 -1221
  113. package/docs/consts.js.html +791 -0
  114. package/docs/devices_absolutemotor.js.html +97 -200
  115. package/docs/devices_basicmotor.js.html +91 -193
  116. package/docs/devices_colordistancesensor.js.html +184 -193
  117. package/docs/devices_currentsensor.js.html +89 -191
  118. package/docs/devices_device.js.html +99 -196
  119. package/docs/devices_duplotrainbasecolorsensor.js.html +104 -193
  120. package/docs/devices_duplotrainbasemotor.js.html +92 -194
  121. package/docs/devices_duplotrainbasespeaker.js.html +89 -191
  122. package/docs/devices_duplotrainbasespeedometer.js.html +89 -191
  123. package/docs/devices_hubled.js.html +89 -191
  124. package/docs/devices_light.js.html +90 -192
  125. package/docs/devices_marioaccelerometer.js.html +89 -191
  126. package/docs/devices_mariobarcodesensor.js.html +89 -191
  127. package/docs/devices_mariopantssensor.js.html +89 -191
  128. package/docs/devices_mediumlinearmotor.js.html +92 -194
  129. package/docs/devices_motionsensor.js.html +89 -191
  130. package/docs/devices_movehubmediumlinearmotor.js.html +92 -194
  131. package/docs/devices_movehubtiltsensor.js.html +89 -191
  132. package/docs/devices_piezobuzzer.js.html +89 -191
  133. package/docs/devices_remotecontrolbutton.js.html +89 -191
  134. package/docs/devices_simplemediumlinearmotor.js.html +92 -194
  135. package/docs/devices_tachomotor.js.html +99 -203
  136. package/docs/devices_technic3x3colorlightmatrix.js.html +190 -0
  137. package/docs/devices_techniccolorsensor.js.html +91 -192
  138. package/docs/devices_technicdistancesensor.js.html +89 -191
  139. package/docs/devices_technicforcesensor.js.html +89 -191
  140. package/docs/devices_techniclargeangularmotor.js.html +92 -194
  141. package/docs/devices_techniclargelinearmotor.js.html +92 -194
  142. package/docs/devices_technicmediumangularmotor.js.html +92 -194
  143. package/docs/devices_technicmediumhubaccelerometersensor.js.html +89 -191
  144. package/docs/devices_technicmediumhubgyrosensor.js.html +89 -191
  145. package/docs/devices_technicmediumhubtiltsensor.js.html +159 -193
  146. package/docs/devices_technicsmallangularmotor.js.html +148 -0
  147. package/docs/devices_technicxlargelinearmotor.js.html +92 -194
  148. package/docs/devices_tiltsensor.js.html +89 -191
  149. package/docs/devices_trainmotor.js.html +92 -194
  150. package/docs/devices_voltagesensor.js.html +89 -191
  151. package/docs/fonts/OpenSans-Bold-webfont.eot +0 -0
  152. package/docs/fonts/OpenSans-Bold-webfont.svg +1830 -0
  153. package/docs/fonts/OpenSans-Bold-webfont.woff +0 -0
  154. package/docs/fonts/OpenSans-BoldItalic-webfont.eot +0 -0
  155. package/docs/fonts/OpenSans-BoldItalic-webfont.svg +1830 -0
  156. package/docs/fonts/OpenSans-BoldItalic-webfont.woff +0 -0
  157. package/docs/fonts/OpenSans-Italic-webfont.eot +0 -0
  158. package/docs/fonts/OpenSans-Italic-webfont.svg +1830 -0
  159. package/docs/fonts/OpenSans-Italic-webfont.woff +0 -0
  160. package/docs/fonts/OpenSans-Light-webfont.eot +0 -0
  161. package/docs/fonts/OpenSans-Light-webfont.svg +1831 -0
  162. package/docs/fonts/OpenSans-Light-webfont.woff +0 -0
  163. package/docs/fonts/OpenSans-LightItalic-webfont.eot +0 -0
  164. package/docs/fonts/OpenSans-LightItalic-webfont.svg +1835 -0
  165. package/docs/fonts/OpenSans-LightItalic-webfont.woff +0 -0
  166. package/docs/fonts/OpenSans-Regular-webfont.eot +0 -0
  167. package/docs/fonts/OpenSans-Regular-webfont.svg +1831 -0
  168. package/docs/fonts/OpenSans-Regular-webfont.woff +0 -0
  169. package/docs/fonts/OpenSans-Semibold-webfont.eot +0 -0
  170. package/docs/fonts/OpenSans-Semibold-webfont.svg +1830 -0
  171. package/docs/fonts/OpenSans-Semibold-webfont.ttf +0 -0
  172. package/docs/fonts/OpenSans-Semibold-webfont.woff +0 -0
  173. package/docs/fonts/OpenSans-SemiboldItalic-webfont.eot +0 -0
  174. package/docs/fonts/OpenSans-SemiboldItalic-webfont.svg +1830 -0
  175. package/docs/fonts/OpenSans-SemiboldItalic-webfont.ttf +0 -0
  176. package/docs/fonts/OpenSans-SemiboldItalic-webfont.woff +0 -0
  177. package/docs/global.html +9829 -0
  178. package/docs/hubs_basehub.js.html +93 -191
  179. package/docs/hubs_duplotrainbase.js.html +89 -191
  180. package/docs/hubs_hub.js.html +90 -192
  181. package/docs/hubs_lpf2hub.js.html +108 -212
  182. package/docs/hubs_mario.js.html +89 -191
  183. package/docs/hubs_movehub.js.html +90 -192
  184. package/docs/hubs_remotecontrol.js.html +89 -191
  185. package/docs/hubs_technicmediumhub.js.html +90 -192
  186. package/docs/hubs_technicsmallhub.js.html +177 -0
  187. package/docs/hubs_wedo2smarthub.js.html +89 -191
  188. package/docs/icons/home.svg +4 -0
  189. package/docs/icons/search.svg +4 -0
  190. package/docs/index.html +143 -236
  191. package/docs/poweredup-browser.js.html +348 -0
  192. package/docs/poweredup-node.js.html +312 -0
  193. package/docs/scripts/linenumber.js +23 -0
  194. package/docs/scripts/pagelocation.js +89 -0
  195. package/docs/styles/collapse.css +27 -0
  196. package/docs/styles/jsdoc-default.css +953 -0
  197. package/docs/styles/prettify-jsdoc.css +111 -0
  198. package/docs/styles/prettify-tomorrow.css +15 -9
  199. package/jsdoc-template/braintree/CHANGELOG.md +31 -0
  200. package/jsdoc-template/braintree/LICENSE +27 -0
  201. package/jsdoc-template/braintree/README.md +90 -0
  202. package/jsdoc-template/braintree/package.json +39 -0
  203. package/jsdoc-template/braintree/publish.js +675 -0
  204. package/jsdoc-template/braintree/static/fonts/OpenSans-Bold-webfont.eot +0 -0
  205. package/jsdoc-template/braintree/static/fonts/OpenSans-Bold-webfont.svg +1830 -0
  206. package/jsdoc-template/braintree/static/fonts/OpenSans-Bold-webfont.woff +0 -0
  207. package/jsdoc-template/braintree/static/fonts/OpenSans-BoldItalic-webfont.eot +0 -0
  208. package/jsdoc-template/braintree/static/fonts/OpenSans-BoldItalic-webfont.svg +1830 -0
  209. package/jsdoc-template/braintree/static/fonts/OpenSans-BoldItalic-webfont.woff +0 -0
  210. package/jsdoc-template/braintree/static/fonts/OpenSans-Italic-webfont.eot +0 -0
  211. package/jsdoc-template/braintree/static/fonts/OpenSans-Italic-webfont.svg +1830 -0
  212. package/jsdoc-template/braintree/static/fonts/OpenSans-Italic-webfont.woff +0 -0
  213. package/jsdoc-template/braintree/static/fonts/OpenSans-Light-webfont.eot +0 -0
  214. package/jsdoc-template/braintree/static/fonts/OpenSans-Light-webfont.svg +1831 -0
  215. package/jsdoc-template/braintree/static/fonts/OpenSans-Light-webfont.woff +0 -0
  216. package/jsdoc-template/braintree/static/fonts/OpenSans-LightItalic-webfont.eot +0 -0
  217. package/jsdoc-template/braintree/static/fonts/OpenSans-LightItalic-webfont.svg +1835 -0
  218. package/jsdoc-template/braintree/static/fonts/OpenSans-LightItalic-webfont.woff +0 -0
  219. package/jsdoc-template/braintree/static/fonts/OpenSans-Regular-webfont.eot +0 -0
  220. package/jsdoc-template/braintree/static/fonts/OpenSans-Regular-webfont.svg +1831 -0
  221. package/jsdoc-template/braintree/static/fonts/OpenSans-Regular-webfont.woff +0 -0
  222. package/jsdoc-template/braintree/static/fonts/OpenSans-Semibold-webfont.eot +0 -0
  223. package/jsdoc-template/braintree/static/fonts/OpenSans-Semibold-webfont.svg +1830 -0
  224. package/jsdoc-template/braintree/static/fonts/OpenSans-Semibold-webfont.ttf +0 -0
  225. package/jsdoc-template/braintree/static/fonts/OpenSans-Semibold-webfont.woff +0 -0
  226. package/jsdoc-template/braintree/static/fonts/OpenSans-SemiboldItalic-webfont.eot +0 -0
  227. package/jsdoc-template/braintree/static/fonts/OpenSans-SemiboldItalic-webfont.svg +1830 -0
  228. package/jsdoc-template/braintree/static/fonts/OpenSans-SemiboldItalic-webfont.ttf +0 -0
  229. package/jsdoc-template/braintree/static/fonts/OpenSans-SemiboldItalic-webfont.woff +0 -0
  230. package/jsdoc-template/braintree/static/icons/home.svg +4 -0
  231. package/jsdoc-template/braintree/static/icons/search.svg +4 -0
  232. package/jsdoc-template/braintree/static/scripts/linenumber.js +23 -0
  233. package/jsdoc-template/braintree/static/scripts/pagelocation.js +89 -0
  234. package/jsdoc-template/braintree/static/styles/collapse.css +27 -0
  235. package/jsdoc-template/braintree/static/styles/jsdoc-default.css +953 -0
  236. package/jsdoc-template/braintree/static/styles/prettify-jsdoc.css +111 -0
  237. package/jsdoc-template/braintree/static/styles/prettify-tomorrow.css +138 -0
  238. package/jsdoc-template/braintree/tmpl/augments.tmpl +10 -0
  239. package/jsdoc-template/braintree/tmpl/container.tmpl +213 -0
  240. package/jsdoc-template/braintree/tmpl/details.tmpl +223 -0
  241. package/jsdoc-template/braintree/tmpl/example.tmpl +2 -0
  242. package/jsdoc-template/braintree/tmpl/examples.tmpl +14 -0
  243. package/jsdoc-template/braintree/tmpl/exceptions.tmpl +28 -0
  244. package/jsdoc-template/braintree/tmpl/layout.tmpl +150 -0
  245. package/jsdoc-template/braintree/tmpl/mainpage.tmpl +9 -0
  246. package/jsdoc-template/braintree/tmpl/members.tmpl +38 -0
  247. package/jsdoc-template/braintree/tmpl/method.tmpl +128 -0
  248. package/jsdoc-template/braintree/tmpl/params.tmpl +125 -0
  249. package/jsdoc-template/braintree/tmpl/properties.tmpl +111 -0
  250. package/jsdoc-template/braintree/tmpl/returns.tmpl +17 -0
  251. package/jsdoc-template/braintree/tmpl/source.tmpl +9 -0
  252. package/jsdoc-template/braintree/tmpl/tutorial.tmpl +23 -0
  253. package/jsdoc-template/braintree/tmpl/type.tmpl +11 -0
  254. package/package.json +14 -15
  255. package/src/color.ts +20 -0
  256. package/src/consts.ts +47 -26
  257. package/src/devices/absolutemotor.ts +2 -3
  258. package/src/devices/colordistancesensor.ts +98 -3
  259. package/src/devices/device.ts +9 -6
  260. package/src/devices/duplotrainbasecolorsensor.ts +17 -2
  261. package/src/devices/tachomotor.ts +4 -6
  262. package/src/devices/technic3x3colorlightmatrix.ts +64 -0
  263. package/src/devices/techniccolorsensor.ts +2 -1
  264. package/src/devices/technicmediumhubtiltsensor.ts +75 -3
  265. package/src/devices/technicsmallangularmotor.ts +17 -0
  266. package/src/hubs/basehub.ts +4 -0
  267. package/src/hubs/lpf2hub.ts +7 -11
  268. package/src/hubs/technicmediumhub.ts +1 -1
  269. package/src/hubs/technicsmallhub.ts +60 -0
  270. package/src/index-browser.ts +6 -0
  271. package/src/index-node.ts +6 -0
  272. package/src/poweredup-browser.ts +8 -1
  273. package/src/poweredup-node.ts +7 -1
  274. package/src/utils.ts +7 -0
  275. package/docs/classes.list.html +0 -8654
  276. package/docs/fonts/glyphicons-halflings-regular.eot +0 -0
  277. package/docs/fonts/glyphicons-halflings-regular.svg +0 -288
  278. package/docs/fonts/glyphicons-halflings-regular.ttf +0 -0
  279. package/docs/fonts/glyphicons-halflings-regular.woff +0 -0
  280. package/docs/fonts/glyphicons-halflings-regular.woff2 +0 -0
  281. package/docs/img/glyphicons-halflings-white.png +0 -0
  282. package/docs/img/glyphicons-halflings.png +0 -0
  283. package/docs/quicksearch.html +0 -31
  284. package/docs/scripts/docstrap.lib.js +0 -11
  285. package/docs/scripts/fulltext-search-ui.js +0 -89
  286. package/docs/scripts/fulltext-search.js +0 -36
  287. package/docs/scripts/lunr.min.js +0 -6
  288. package/docs/scripts/prettify/Apache-License-2.0.txt +0 -202
  289. package/docs/scripts/prettify/jquery.min.js +0 -6
  290. package/docs/scripts/prettify/lang-css.js +0 -21
  291. package/docs/scripts/prettify/prettify.js +0 -496
  292. package/docs/scripts/sunlight.js +0 -1157
  293. package/docs/scripts/toc.js +0 -203
  294. package/docs/styles/darkstrap.css +0 -960
  295. package/docs/styles/site.cerulean.css +0 -7008
  296. package/docs/styles/site.cosmo.css +0 -7061
  297. package/docs/styles/site.cyborg.css +0 -7048
  298. package/docs/styles/site.darkly.css +0 -7171
  299. package/docs/styles/site.darkstrap.css +0 -5638
  300. package/docs/styles/site.dibs-bootstrap.css +0 -5899
  301. package/docs/styles/site.flatly.css +0 -7147
  302. package/docs/styles/site.journal.css +0 -6973
  303. package/docs/styles/site.lumen.css +0 -7298
  304. package/docs/styles/site.paper.css +0 -7623
  305. package/docs/styles/site.readable.css +0 -6997
  306. package/docs/styles/site.sandstone.css +0 -7035
  307. package/docs/styles/site.simplex.css +0 -7023
  308. package/docs/styles/site.slate.css +0 -7343
  309. package/docs/styles/site.spacelab.css +0 -7055
  310. package/docs/styles/site.superhero.css +0 -7131
  311. package/docs/styles/site.united.css +0 -6895
  312. package/docs/styles/site.yeti.css +0 -7195
  313. package/docs/styles/sunlight.dark.css +0 -345
  314. package/docs/styles/sunlight.default.css +0 -344
@@ -0,0 +1,675 @@
1
+ /* global env: true */
2
+ /* eslint-disable vars-on-top, valid-jsdoc */
3
+ 'use strict';
4
+
5
+ var doop = require('jsdoc/util/doop');
6
+ var fs = require('jsdoc/fs');
7
+ var helper = require('jsdoc/util/templateHelper');
8
+ var logger = require('jsdoc/util/logger');
9
+ var path = require('jsdoc/path');
10
+ var taffy = require('taffydb').taffy;
11
+ var template = require('jsdoc/template');
12
+ var util = require('util');
13
+
14
+ var htmlsafe = helper.htmlsafe;
15
+ var linkto = helper.linkto;
16
+ var resolveAuthorLinks = helper.resolveAuthorLinks;
17
+ var hasOwnProp = Object.prototype.hasOwnProperty;
18
+
19
+ var data, view;
20
+
21
+ var outdir = path.normalize(env.opts.destination);
22
+
23
+ function find(spec) {
24
+ return helper.find(data, spec);
25
+ }
26
+
27
+ function tutoriallink(tutorial) {
28
+ return helper.toTutorial(tutorial, null, {tag: 'em', classname: 'disabled', prefix: 'Tutorial: '});
29
+ }
30
+
31
+ function getAncestorLinks(doclet) {
32
+ return helper.getAncestorLinks(data, doclet);
33
+ }
34
+
35
+ function hashToLink(doclet, hash) {
36
+ if (!/^(#.+)/.test(hash)) { return hash; }
37
+
38
+ var url = helper.createLink(doclet);
39
+
40
+ url = url.replace(/(#.+|$)/, hash);
41
+
42
+ return '<a href="' + url + '">' + hash + '</a>';
43
+ }
44
+
45
+ function needsSignature(doclet) {
46
+ var i, l;
47
+ var needsSig = false;
48
+
49
+ // function and class definitions always get a signature
50
+ if (doclet.kind === 'function' || doclet.kind === 'class') {
51
+ needsSig = true;
52
+ } else if (doclet.kind === 'typedef' && doclet.type && doclet.type.names &&
53
+ doclet.type.names.length) { // typedefs that contain functions get a signature, too
54
+ for (i = 0, l = doclet.type.names.length; i < l; i++) {
55
+ if (doclet.type.names[i].toLowerCase() === 'function') {
56
+ needsSig = true;
57
+ break;
58
+ }
59
+ }
60
+ }
61
+
62
+ return needsSig;
63
+ }
64
+
65
+ function getSignatureAttributes(item) {
66
+ var attributes = [];
67
+
68
+ if (item.optional) {
69
+ attributes.push('opt');
70
+ }
71
+
72
+ if (item.nullable === true) {
73
+ attributes.push('nullable');
74
+ } else if (item.nullable === false) {
75
+ attributes.push('non-null');
76
+ }
77
+
78
+ return attributes;
79
+ }
80
+
81
+ function updateItemName(item) {
82
+ var attributes = getSignatureAttributes(item);
83
+ var itemName = item.name || '';
84
+
85
+ if (item.variable) {
86
+ itemName = '&hellip;' + itemName;
87
+ }
88
+
89
+ if (attributes && attributes.length) {
90
+ itemName = util.format('%s<span class="signature-attributes">%s</span>', itemName,
91
+ attributes.join(', '));
92
+ }
93
+
94
+ return itemName;
95
+ }
96
+
97
+ function addParamAttributes(params) {
98
+ return params.filter(function (param) {
99
+ return param.name && param.name.indexOf('.') === -1;
100
+ }).map(updateItemName);
101
+ }
102
+
103
+ function buildItemTypeStrings(item) {
104
+ var types = [];
105
+
106
+ if (item && item.type && item.type.names) {
107
+ item.type.names.forEach(function (name) {
108
+ types.push(linkto(name, htmlsafe(name)));
109
+ });
110
+ }
111
+
112
+ return types;
113
+ }
114
+
115
+ function buildAttribsString(attribs) {
116
+ var attribsString = '';
117
+
118
+ if (attribs && attribs.length) {
119
+ attribsString = htmlsafe(util.format('(%s) ', attribs.join(', ')));
120
+ }
121
+
122
+ return attribsString;
123
+ }
124
+
125
+ function addNonParamAttributes(items) {
126
+ var types = [];
127
+
128
+ items.forEach(function (item) {
129
+ types = types.concat(buildItemTypeStrings(item));
130
+ });
131
+
132
+ return types;
133
+ }
134
+
135
+ function addSignatureParams(f) {
136
+ var params = f.params ? addParamAttributes(f.params) : [];
137
+
138
+ f.signature = util.format('%s(%s)', f.signature || '', params.join(', '));
139
+ }
140
+
141
+ function addSignatureReturns(f) {
142
+ var attribs = [];
143
+ var attribsString = '';
144
+ var returnTypes = [];
145
+ var returnTypesString = '';
146
+
147
+ // jam all the return-type attributes into an array. this could create odd results (for example,
148
+ // if there are both nullable and non-nullable return types), but let's assume that most people
149
+ // who use multiple @return tags aren't using Closure Compiler type annotations, and vice-versa.
150
+ if (f.returns) {
151
+ f.returns.forEach(function (item) {
152
+ helper.getAttribs(item).forEach(function (attrib) {
153
+ if (attribs.indexOf(attrib) === -1) {
154
+ attribs.push(attrib);
155
+ }
156
+ });
157
+ });
158
+
159
+ attribsString = buildAttribsString(attribs);
160
+ }
161
+
162
+ if (f.returns) {
163
+ returnTypes = addNonParamAttributes(f.returns);
164
+ }
165
+ if (returnTypes.length) {
166
+ returnTypesString = util.format(' &rarr; %s{%s}', attribsString, returnTypes.join('|'));
167
+ }
168
+
169
+ f.signature = '<span class="signature">' + (f.signature || '') + '</span>' +
170
+ '<span class="type-signature">' + returnTypesString + '</span>';
171
+ }
172
+
173
+ function addSignatureTypes(f) {
174
+ var types = f.type ? buildItemTypeStrings(f) : [];
175
+
176
+ f.signature = (f.signature || '') + '<span class="type-signature">' +
177
+ (types.length ? ' :' + types.join('|') : '') + '</span>';
178
+ }
179
+
180
+ function addAttribs(f) {
181
+ var attribs = helper.getAttribs(f);
182
+ var attribsString = buildAttribsString(attribs);
183
+
184
+ f.attribs = util.format('<span class="type-signature">%s</span>', attribsString);
185
+ }
186
+
187
+ function shortenPaths(files, commonPrefix) {
188
+ Object.keys(files).forEach(function (file) {
189
+ files[file].shortened = files[file].resolved.replace(commonPrefix, '')
190
+ // always use forward slashes
191
+ .replace(/\\/g, '/');
192
+ });
193
+
194
+ return files;
195
+ }
196
+
197
+ function getPathFromDoclet(doclet) {
198
+ if (!doclet.meta) {
199
+ return null;
200
+ }
201
+
202
+ return doclet.meta.path && doclet.meta.path !== 'null' ?
203
+ path.join(doclet.meta.path, doclet.meta.filename) :
204
+ doclet.meta.filename;
205
+ }
206
+
207
+ function generate(type, title, docs, filename, resolveLinks) {
208
+ resolveLinks = resolveLinks !== false;
209
+
210
+ var docData = {
211
+ type: type,
212
+ title: title,
213
+ docs: docs
214
+ };
215
+
216
+ var outpath = path.join(outdir, filename);
217
+ var html = view.render('container.tmpl', docData);
218
+
219
+ if (resolveLinks) {
220
+ html = helper.resolveLinks(html); // turn {@link foo} into <a href="foodoc.html">foo</a>
221
+ }
222
+
223
+ if (typeof env.conf.templates.postProcess === 'function') {
224
+ html = env.conf.templates.postProcess(html);
225
+ }
226
+
227
+ fs.writeFileSync(outpath, html, 'utf8');
228
+ }
229
+
230
+ function generateSourceFiles(sourceFiles, encoding) {
231
+ encoding = encoding || 'utf8';
232
+ Object.keys(sourceFiles).forEach(function (file) {
233
+ var source;
234
+ // links are keyed to the shortened path in each doclet's `meta.shortpath` property
235
+ var sourceOutfile = helper.getUniqueFilename(sourceFiles[file].shortened);
236
+
237
+ helper.registerLink(sourceFiles[file].shortened, sourceOutfile);
238
+
239
+ try {
240
+ source = {
241
+ kind: 'source',
242
+ code: helper.htmlsafe(fs.readFileSync(sourceFiles[file].resolved, encoding))
243
+ };
244
+ } catch (e) {
245
+ logger.error('Error while generating source file %s: %s', file, e.message);
246
+ }
247
+
248
+ generate('Source', sourceFiles[file].shortened, [source], sourceOutfile, false);
249
+ });
250
+ }
251
+
252
+ /**
253
+ * Look for classes or functions with the same name as modules (which indicates that the module
254
+ * exports only that class or function), then attach the classes or functions to the `module`
255
+ * property of the appropriate module doclets. The name of each class or function is also updated
256
+ * for display purposes. This function mutates the original arrays.
257
+ *
258
+ * @private
259
+ * @param {Array.<module:jsdoc/doclet.Doclet>} doclets - The array of classes and functions to
260
+ * check.
261
+ * @param {Array.<module:jsdoc/doclet.Doclet>} modules - The array of module doclets to search.
262
+ */
263
+ function attachModuleSymbols(doclets, modules) {
264
+ var symbols = {};
265
+
266
+ // build a lookup table
267
+ doclets.forEach(function (symbol) {
268
+ symbols[symbol.longname] = symbols[symbol.longname] || [];
269
+ symbols[symbol.longname].push(symbol);
270
+ });
271
+
272
+ return modules.map(function (module) {
273
+ if (symbols[module.longname]) {
274
+ module.modules = symbols[module.longname]
275
+ // Only show symbols that have a description. Make an exception for classes, because
276
+ // we want to show the constructor-signature heading no matter what.
277
+ .filter(function (symbol) {
278
+ return symbol.description || symbol.kind === 'class';
279
+ })
280
+ .map(function (symbol) {
281
+ symbol = doop(symbol);
282
+
283
+ if (symbol.kind === 'class' || symbol.kind === 'function') {
284
+ symbol.name = symbol.name.replace('module:', '(require("') + '"))';
285
+ }
286
+
287
+ return symbol;
288
+ });
289
+ }
290
+ });
291
+ }
292
+
293
+ function buildMemberNav(items, itemHeading, itemsSeen, linktoFn) {
294
+ var nav = '';
295
+ var itemsNav = '';
296
+
297
+ if (items && items.length) {
298
+ items.forEach(function (item) {
299
+ var methods = find({kind: 'function', memberof: item.longname});
300
+
301
+ if (!hasOwnProp.call(item, 'longname')) {
302
+ itemsNav += '<li id="' + item.name.replace('/', '_') + '-nav">' + linktoFn('', item.name);
303
+ itemsNav += '</li>';
304
+ } else if (!hasOwnProp.call(itemsSeen, item.longname)) {
305
+ // replace '/' in url to match ID in some section
306
+ itemsNav += '<li id="' + item.name.replace('/', '_') + '-nav">' + linktoFn(item.longname, item.name.replace(/^module:/, ''));
307
+ if (methods.length) {
308
+ itemsNav += "<ul class='methods'>";
309
+
310
+ methods.forEach(function (method) {
311
+ itemsNav += '<li data-type="method" id="' + item.name.replace('/', '_') + '-' + method.name + '-nav">';
312
+ itemsNav += linkto(method.longname, method.name);
313
+ itemsNav += '</li>';
314
+ });
315
+
316
+ itemsNav += '</ul>';
317
+ }
318
+ itemsNav += '</li>';
319
+ itemsSeen[item.longname] = true;
320
+ }
321
+ });
322
+
323
+ if (itemsNav !== '') {
324
+ nav += '<h3>' + itemHeading + '</h3><ul>' + itemsNav + '</ul>';
325
+ }
326
+ }
327
+
328
+ return nav;
329
+ }
330
+
331
+ // TODO: as needed, comment back in later
332
+ // function linktoTutorial(longName, name) {
333
+ // return tutoriallink(name);
334
+ // }
335
+
336
+ // function linktoExternal(longName, name) {
337
+ // return linkto(longName, name.replace(/(^"|"$)/g, ''));
338
+ // }
339
+
340
+ /**
341
+ * Create the navigation sidebar.
342
+ * @param {object} members The members that will be used to create the sidebar.
343
+ * @param {array<object>} members.classes
344
+ * @param {array<object>} members.externals
345
+ * @param {array<object>} members.globals
346
+ * @param {array<object>} members.mixins
347
+ * @param {array<object>} members.modules
348
+ * @param {array<object>} members.namespaces
349
+ * @param {array<object>} members.tutorials
350
+ * @param {array<object>} members.events
351
+ * @param {array<object>} members.interfaces
352
+ * @return {string} The HTML for the navigation sidebar.
353
+ */
354
+ function buildNav(members) {
355
+ var nav = '';
356
+ var globalNav = '';
357
+ var seen = {};
358
+ // var seenTutorials = {};
359
+
360
+ nav += buildMemberNav(members.classes, 'Classes', seen, linkto);
361
+ nav += buildMemberNav(members.modules, 'Modules', {}, linkto);
362
+ // TODO: as needed, comment back in later
363
+ // nav += buildMemberNav(members.externals, 'Externals', seen, linktoExternal);
364
+ // nav += buildMemberNav(members.events, 'Events', seen, linkto);
365
+ // nav += buildMemberNav(members.namespaces, 'Namespaces', seen, linkto);
366
+ // nav += buildMemberNav(members.mixins, 'Mixins', seen, linkto);
367
+ // nav += buildMemberNav(members.tutorials, 'Tutorials', seenTutorials, linktoTutorial);
368
+ // nav += buildMemberNav(members.interfaces, 'Interfaces', seen, linkto);
369
+
370
+ if (members.globals.length) {
371
+ members.globals.forEach(function (g) {
372
+ if (g.kind !== 'typedef' && !hasOwnProp.call(seen, g.longname)) {
373
+ globalNav += '<li>' + linkto(g.longname, g.name) + '</li>';
374
+ }
375
+ seen[g.longname] = true;
376
+ });
377
+
378
+ if (!globalNav) {
379
+ // turn the heading into a link so you can actually get to the global page
380
+ nav += '<h3 id="global-nav">' + linkto('global', 'Global') + '</h3>';
381
+ } else {
382
+ nav += '<h3 id="global-nav">Global</h3><ul>' + globalNav + '</ul>';
383
+ }
384
+ }
385
+
386
+ return nav;
387
+ }
388
+
389
+ /**
390
+ @param {TAFFY} taffyData See <http://taffydb.com/>.
391
+ @param {object} opts
392
+ @param {Tutorial} tutorials
393
+ */
394
+ exports.publish = function (taffyData, opts, tutorials) {
395
+ var conf, templatePath, indexUrl, globalUrl, sourceFiles, sourceFilePaths, staticFilePaths, staticFileFilter, staticFileScanner;
396
+
397
+ data = taffyData;
398
+
399
+ conf = env.conf.templates || {};
400
+ conf.default = conf.default || {};
401
+
402
+ templatePath = path.normalize(opts.template);
403
+
404
+ view = new template.Template(path.join(templatePath, 'tmpl'));
405
+
406
+ // claim some special filenames in advance, so the All-Powerful Overseer of Filename Uniqueness
407
+ // doesn't try to hand them out later
408
+ indexUrl = helper.getUniqueFilename('index');
409
+
410
+ // don't call registerLink() on this one! 'index' is also a valid longname
411
+ globalUrl = helper.getUniqueFilename('global');
412
+
413
+ helper.registerLink('global', globalUrl);
414
+
415
+ // set up templating
416
+ view.layout = conf.default.layoutFile ?
417
+ path.getResourcePath(path.dirname(conf.default.layoutFile),
418
+ path.basename(conf.default.layoutFile)) :
419
+ 'layout.tmpl';
420
+
421
+ // set up tutorials for helper
422
+ helper.setTutorials(tutorials);
423
+
424
+ data = helper.prune(data);
425
+ if (!conf.disableSort) {
426
+ data.sort('longname, version, since');
427
+ }
428
+ helper.addEventListeners(data);
429
+
430
+ sourceFiles = {};
431
+ sourceFilePaths = [];
432
+
433
+ data().each(function (doclet) {
434
+ doclet.attribs = '';
435
+
436
+ if (doclet.examples) {
437
+ doclet.examples = doclet.examples.map(function (example) {
438
+ var caption, code;
439
+
440
+ if (example.match(/^\s*<caption>([\s\S]+?)<\/caption>(\s*[\n\r])([\s\S]+)$/i)) {
441
+ caption = RegExp.$1;
442
+ code = RegExp.$3;
443
+ }
444
+
445
+ return {
446
+ caption: caption || '',
447
+ code: code || example
448
+ };
449
+ });
450
+ }
451
+ if (doclet.see) {
452
+ doclet.see.forEach(function (seeItem, i) {
453
+ doclet.see[i] = hashToLink(doclet, seeItem);
454
+ });
455
+ }
456
+
457
+ // build a list of source files
458
+ var sourcePath;
459
+
460
+ if (doclet.meta) {
461
+ sourcePath = getPathFromDoclet(doclet);
462
+ sourceFiles[sourcePath] = {
463
+ resolved: sourcePath,
464
+ shortened: null
465
+ };
466
+ if (sourceFilePaths.indexOf(sourcePath) === -1) {
467
+ sourceFilePaths.push(sourcePath);
468
+ }
469
+ }
470
+ });
471
+
472
+ // update outdir if necessary, then create outdir
473
+ var packageInfo = (find({kind: 'package'}) || [])[0];
474
+
475
+ if (packageInfo && packageInfo.name) {
476
+ outdir = path.join(outdir, packageInfo.name, packageInfo.version || '');
477
+ }
478
+ fs.mkPath(outdir);
479
+
480
+ // copy the template's static files to outdir
481
+ var fromDir = path.join(templatePath, 'static');
482
+ var staticFiles = fs.ls(fromDir, 3);
483
+
484
+ staticFiles.forEach(function (fileName) {
485
+ var toDir = fs.toDir(fileName.replace(fromDir, outdir));
486
+
487
+ fs.mkPath(toDir);
488
+ fs.copyFileSync(fileName, toDir);
489
+ });
490
+
491
+ // copy user-specified static files to outdir
492
+ if (conf.default.staticFiles) {
493
+ // The canonical property name is `include`. We accept `paths` for backwards compatibility
494
+ // with a bug in JSDoc 3.2.x.
495
+ staticFilePaths = conf.default.staticFiles.include ||
496
+ conf.default.staticFiles.paths ||
497
+ [];
498
+ staticFileFilter = new (require('jsdoc/src/filter')).Filter(conf.default.staticFiles);
499
+ staticFileScanner = new (require('jsdoc/src/scanner')).Scanner();
500
+
501
+ staticFilePaths.forEach(function (filePath) {
502
+ var extraStaticFiles = staticFileScanner.scan([filePath], 10, staticFileFilter);
503
+
504
+ extraStaticFiles.forEach(function (fileName) {
505
+ var sourcePath = fs.toDir(filePath);
506
+ var toDir = fs.toDir(fileName.replace(sourcePath, outdir));
507
+
508
+ fs.mkPath(toDir);
509
+ fs.copyFileSync(fileName, toDir);
510
+ });
511
+ });
512
+ }
513
+
514
+ if (sourceFilePaths.length) {
515
+ sourceFiles = shortenPaths(sourceFiles, path.commonPrefix(sourceFilePaths));
516
+ }
517
+ data().each(function (doclet) {
518
+ var docletPath;
519
+ var url = helper.createLink(doclet);
520
+
521
+ helper.registerLink(doclet.longname, url);
522
+
523
+ // add a shortened version of the full path
524
+ if (doclet.meta) {
525
+ docletPath = getPathFromDoclet(doclet);
526
+ docletPath = sourceFiles[docletPath].shortened;
527
+ if (docletPath) {
528
+ doclet.meta.shortpath = docletPath;
529
+ }
530
+ }
531
+ });
532
+
533
+ data().each(function (doclet) {
534
+ var url = helper.longnameToUrl[doclet.longname];
535
+
536
+ if (url.indexOf('#') > -1) {
537
+ doclet.id = helper.longnameToUrl[doclet.longname].split(/#/).pop();
538
+ } else {
539
+ doclet.id = doclet.name;
540
+ }
541
+
542
+ if (needsSignature(doclet)) {
543
+ addSignatureParams(doclet);
544
+ addSignatureReturns(doclet);
545
+ addAttribs(doclet);
546
+ }
547
+ });
548
+
549
+ // do this after the urls have all been generated
550
+ data().each(function (doclet) {
551
+ doclet.ancestors = getAncestorLinks(doclet);
552
+
553
+ if ((doclet.kind === 'member' || doclet.kind === 'event' || doclet.kind === 'typedef') && doclet.signature == null) {
554
+ addSignatureTypes(doclet);
555
+ addAttribs(doclet);
556
+ }
557
+
558
+ if (doclet.kind === 'constant') {
559
+ addSignatureTypes(doclet);
560
+ addAttribs(doclet);
561
+ doclet.kind = 'member';
562
+ }
563
+ });
564
+
565
+ var members = helper.getMembers(data);
566
+
567
+ members.tutorials = tutorials.children;
568
+
569
+ // output pretty-printed source files by default
570
+ var outputSourceFiles = conf.default && conf.default.outputSourceFiles !== false;
571
+
572
+ // add template helpers
573
+ view.find = find;
574
+ view.linkto = linkto;
575
+ view.resolveAuthorLinks = resolveAuthorLinks;
576
+ view.tutoriallink = tutoriallink;
577
+ view.htmlsafe = htmlsafe;
578
+ view.outputSourceFiles = outputSourceFiles;
579
+
580
+ // once for all
581
+ view.nav = buildNav(members);
582
+ attachModuleSymbols(find({longname: {left: 'module:'}}), members.modules);
583
+
584
+ // generate the pretty-printed source files first so other pages can link to them
585
+ if (outputSourceFiles) {
586
+ generateSourceFiles(sourceFiles, opts.encoding);
587
+ }
588
+
589
+ if (members.globals.length) {
590
+ generate('', 'Global', [{kind: 'globalobj'}], globalUrl);
591
+ }
592
+
593
+ // index page displays information from package.json and lists files
594
+ var files = find({kind: 'file'});
595
+ var packages = find({kind: 'package'});
596
+
597
+ generate('', 'Home',
598
+ packages.concat(
599
+ [{kind: 'mainpage', readme: opts.readme, longname: opts.mainpagetitle ? opts.mainpagetitle : 'Main Page'}]
600
+ ).concat(files),
601
+ indexUrl);
602
+
603
+ // set up the lists that we'll use to generate pages
604
+ var classes = taffy(members.classes);
605
+ var modules = taffy(members.modules);
606
+ var namespaces = taffy(members.namespaces);
607
+ var mixins = taffy(members.mixins);
608
+ var externals = taffy(members.externals);
609
+ var interfaces = taffy(members.interfaces);
610
+
611
+ Object.keys(helper.longnameToUrl).forEach(function (longname) {
612
+ var myModules = helper.find(modules, {longname: longname});
613
+
614
+ if (myModules.length) {
615
+ generate('Module', myModules[0].name, myModules, helper.longnameToUrl[longname]);
616
+ }
617
+
618
+ var myClasses = helper.find(classes, {longname: longname});
619
+
620
+ if (myClasses.length) {
621
+ generate('Class', myClasses[0].name, myClasses, helper.longnameToUrl[longname]);
622
+ }
623
+
624
+ var myNamespaces = helper.find(namespaces, {longname: longname});
625
+
626
+ if (myNamespaces.length) {
627
+ generate('Namespace', myNamespaces[0].name, myNamespaces, helper.longnameToUrl[longname]);
628
+ }
629
+
630
+ var myMixins = helper.find(mixins, {longname: longname});
631
+
632
+ if (myMixins.length) {
633
+ generate('Mixin', myMixins[0].name, myMixins, helper.longnameToUrl[longname]);
634
+ }
635
+
636
+ var myExternals = helper.find(externals, {longname: longname});
637
+
638
+ if (myExternals.length) {
639
+ generate('External', myExternals[0].name, myExternals, helper.longnameToUrl[longname]);
640
+ }
641
+
642
+ var myInterfaces = helper.find(interfaces, {longname: longname});
643
+
644
+ if (myInterfaces.length) {
645
+ generate('Interface', myInterfaces[0].name, myInterfaces, helper.longnameToUrl[longname]);
646
+ }
647
+ });
648
+
649
+ // TODO: move the tutorial functions to templateHelper.js
650
+ function generateTutorial(title, tutorial, filename) {
651
+ var tutorialData = {
652
+ title: title,
653
+ header: tutorial.title,
654
+ content: tutorial.parse(),
655
+ children: tutorial.children
656
+ };
657
+
658
+ var tutorialPath = path.join(outdir, filename);
659
+ var html = view.render('tutorial.tmpl', tutorialData);
660
+
661
+ // yes, you can use {@link} in tutorials too!
662
+ html = helper.resolveLinks(html); // turn {@link foo} into <a href="foodoc.html">foo</a>
663
+ fs.writeFileSync(tutorialPath, html, 'utf8');
664
+ }
665
+
666
+ // tutorials can have only one parent so there is no risk for loops
667
+ function saveChildren(node) {
668
+ node.children.forEach(function (child) {
669
+ generateTutorial('Tutorial: ' + child.title, child, helper.tutorialToUrl(child.name));
670
+ saveChildren(child);
671
+ });
672
+ }
673
+
674
+ saveChildren(tutorials);
675
+ };