fomantic-ui 2.9.1-beta.4 → 2.9.1-beta.40

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 (552) hide show
  1. package/.eslint/eqeqeq-rule.js +18 -0
  2. package/.eslint/index.js +29 -0
  3. package/.eslint/no-extra-parens-rule.js +17 -0
  4. package/.eslint/package.json +11 -0
  5. package/.eslintrc.js +123 -0
  6. package/.github/auto_assign.yml +0 -1
  7. package/.github/workflows/ci.yml +37 -4
  8. package/.github/workflows/nightly.yml +1 -1
  9. package/.github/workflows/release.yml +1 -1
  10. package/.prettierrc.js +12 -0
  11. package/.stylelintrc.js +48 -0
  12. package/README.md +1 -1
  13. package/dist/components/accordion.css +35 -53
  14. package/dist/components/accordion.js +568 -595
  15. package/dist/components/accordion.min.css +2 -2
  16. package/dist/components/accordion.min.js +3 -3
  17. package/dist/components/ad.css +34 -45
  18. package/dist/components/ad.min.css +2 -2
  19. package/dist/components/api.js +1157 -1179
  20. package/dist/components/api.min.js +3 -3
  21. package/dist/components/breadcrumb.css +5 -5
  22. package/dist/components/breadcrumb.min.css +2 -2
  23. package/dist/components/button.css +709 -1121
  24. package/dist/components/button.min.css +2 -2
  25. package/dist/components/calendar.css +24 -27
  26. package/dist/components/calendar.js +1934 -1809
  27. package/dist/components/calendar.min.css +2 -2
  28. package/dist/components/calendar.min.js +3 -3
  29. package/dist/components/card.css +219 -365
  30. package/dist/components/card.min.css +2 -2
  31. package/dist/components/checkbox.css +120 -191
  32. package/dist/components/checkbox.js +842 -841
  33. package/dist/components/checkbox.min.css +2 -2
  34. package/dist/components/checkbox.min.js +3 -3
  35. package/dist/components/comment.css +41 -59
  36. package/dist/components/comment.min.css +2 -2
  37. package/dist/components/container.css +7 -6
  38. package/dist/components/container.min.css +2 -2
  39. package/dist/components/dimmer.css +53 -172
  40. package/dist/components/dimmer.js +706 -737
  41. package/dist/components/dimmer.min.css +2 -2
  42. package/dist/components/dimmer.min.js +3 -3
  43. package/dist/components/divider.css +43 -61
  44. package/dist/components/divider.min.css +2 -2
  45. package/dist/components/dropdown.css +252 -386
  46. package/dist/components/dropdown.js +4179 -4236
  47. package/dist/components/dropdown.min.css +2 -2
  48. package/dist/components/dropdown.min.js +3 -3
  49. package/dist/components/embed.css +18 -29
  50. package/dist/components/embed.js +645 -675
  51. package/dist/components/embed.min.css +2 -2
  52. package/dist/components/embed.min.js +3 -3
  53. package/dist/components/emoji.css +3556 -3556
  54. package/dist/components/emoji.min.css +1 -1
  55. package/dist/components/feed.css +35 -57
  56. package/dist/components/feed.min.css +2 -2
  57. package/dist/components/flag.css +270 -268
  58. package/dist/components/flag.min.css +2 -2
  59. package/dist/components/flyout.css +94 -141
  60. package/dist/components/flyout.js +1460 -1465
  61. package/dist/components/flyout.min.css +2 -2
  62. package/dist/components/flyout.min.js +3 -3
  63. package/dist/components/form.css +244 -339
  64. package/dist/components/form.js +2020 -2004
  65. package/dist/components/form.min.css +2 -2
  66. package/dist/components/form.min.js +3 -3
  67. package/dist/components/grid.css +183 -329
  68. package/dist/components/grid.min.css +2 -2
  69. package/dist/components/header.css +118 -142
  70. package/dist/components/header.min.css +2 -2
  71. package/dist/components/icon.css +665 -745
  72. package/dist/components/icon.min.css +2 -2
  73. package/dist/components/image.css +39 -63
  74. package/dist/components/image.min.css +2 -2
  75. package/dist/components/input.css +356 -274
  76. package/dist/components/input.min.css +2 -2
  77. package/dist/components/item.css +84 -131
  78. package/dist/components/item.min.css +2 -2
  79. package/dist/components/label.css +359 -410
  80. package/dist/components/label.min.css +2 -2
  81. package/dist/components/list.css +49 -70
  82. package/dist/components/list.min.css +2 -2
  83. package/dist/components/loader.css +67 -155
  84. package/dist/components/loader.min.css +2 -2
  85. package/dist/components/menu.css +269 -431
  86. package/dist/components/menu.min.css +1 -1
  87. package/dist/components/message.css +125 -197
  88. package/dist/components/message.min.css +2 -2
  89. package/dist/components/modal.css +119 -154
  90. package/dist/components/modal.js +1488 -1486
  91. package/dist/components/modal.min.css +2 -2
  92. package/dist/components/modal.min.js +3 -3
  93. package/dist/components/nag.css +53 -63
  94. package/dist/components/nag.js +520 -526
  95. package/dist/components/nag.min.css +2 -2
  96. package/dist/components/nag.min.js +3 -3
  97. package/dist/components/placeholder.css +22 -42
  98. package/dist/components/placeholder.min.css +2 -2
  99. package/dist/components/popup.css +424 -202
  100. package/dist/components/popup.js +1454 -1456
  101. package/dist/components/popup.min.css +2 -2
  102. package/dist/components/popup.min.js +3 -3
  103. package/dist/components/progress.css +106 -211
  104. package/dist/components/progress.js +969 -997
  105. package/dist/components/progress.min.css +2 -2
  106. package/dist/components/progress.min.js +3 -3
  107. package/dist/components/rail.css +15 -20
  108. package/dist/components/rail.min.css +1 -1
  109. package/dist/components/rating.css +80 -121
  110. package/dist/components/rating.js +505 -523
  111. package/dist/components/rating.min.css +2 -2
  112. package/dist/components/rating.min.js +3 -3
  113. package/dist/components/reset.css +8 -13
  114. package/dist/components/reset.min.css +2 -2
  115. package/dist/components/reveal.css +44 -83
  116. package/dist/components/reveal.min.css +2 -2
  117. package/dist/components/search.css +69 -98
  118. package/dist/components/search.js +1520 -1534
  119. package/dist/components/search.min.css +2 -2
  120. package/dist/components/search.min.js +3 -3
  121. package/dist/components/segment.css +148 -224
  122. package/dist/components/segment.min.css +2 -2
  123. package/dist/components/shape.css +14 -30
  124. package/dist/components/shape.js +781 -810
  125. package/dist/components/shape.min.css +2 -2
  126. package/dist/components/shape.min.js +3 -3
  127. package/dist/components/sidebar.css +103 -206
  128. package/dist/components/sidebar.js +1061 -1099
  129. package/dist/components/sidebar.min.css +2 -2
  130. package/dist/components/sidebar.min.js +3 -3
  131. package/dist/components/site.css +28 -41
  132. package/dist/components/site.js +436 -476
  133. package/dist/components/site.min.css +2 -2
  134. package/dist/components/site.min.js +3 -3
  135. package/dist/components/slider.css +93 -121
  136. package/dist/components/slider.js +1310 -1311
  137. package/dist/components/slider.min.css +1 -1
  138. package/dist/components/slider.min.js +3 -3
  139. package/dist/components/state.js +639 -657
  140. package/dist/components/state.min.js +3 -3
  141. package/dist/components/statistic.css +75 -116
  142. package/dist/components/statistic.min.css +2 -2
  143. package/dist/components/step.css +77 -150
  144. package/dist/components/step.min.css +2 -2
  145. package/dist/components/sticky.css +1 -5
  146. package/dist/components/sticky.js +848 -901
  147. package/dist/components/sticky.min.css +2 -2
  148. package/dist/components/sticky.min.js +3 -3
  149. package/dist/components/tab.css +10 -14
  150. package/dist/components/tab.js +902 -966
  151. package/dist/components/tab.min.css +2 -2
  152. package/dist/components/tab.min.js +3 -3
  153. package/dist/components/table.css +547 -774
  154. package/dist/components/table.min.css +2 -2
  155. package/dist/components/text.css +32 -32
  156. package/dist/components/text.min.css +1 -1
  157. package/dist/components/toast.css +69 -147
  158. package/dist/components/toast.js +910 -884
  159. package/dist/components/toast.min.css +2 -2
  160. package/dist/components/toast.min.js +3 -3
  161. package/dist/components/transition.css +369 -1280
  162. package/dist/components/transition.js +1047 -1077
  163. package/dist/components/transition.min.css +2 -2
  164. package/dist/components/transition.min.js +3 -3
  165. package/dist/components/visibility.js +1213 -1245
  166. package/dist/components/visibility.min.js +3 -3
  167. package/dist/semantic.css +9482 -12264
  168. package/dist/semantic.js +29051 -29426
  169. package/dist/semantic.min.css +3 -3
  170. package/dist/semantic.min.js +3 -3
  171. package/dist/themes/basic/assets/fonts/icons.woff2 +0 -0
  172. package/dist/themes/default/assets/fonts/Lato-Bold.woff +0 -0
  173. package/dist/themes/default/assets/fonts/Lato-Bold.woff2 +0 -0
  174. package/dist/themes/default/assets/fonts/Lato-BoldItalic.woff +0 -0
  175. package/dist/themes/default/assets/fonts/Lato-BoldItalic.woff2 +0 -0
  176. package/dist/themes/default/assets/fonts/Lato-Italic.woff +0 -0
  177. package/dist/themes/default/assets/fonts/Lato-Italic.woff2 +0 -0
  178. package/dist/themes/default/assets/fonts/Lato-Regular.woff +0 -0
  179. package/dist/themes/default/assets/fonts/Lato-Regular.woff2 +0 -0
  180. package/dist/themes/default/assets/fonts/LatoLatin-Bold.woff +0 -0
  181. package/dist/themes/default/assets/fonts/LatoLatin-Bold.woff2 +0 -0
  182. package/dist/themes/default/assets/fonts/LatoLatin-BoldItalic.woff +0 -0
  183. package/dist/themes/default/assets/fonts/LatoLatin-BoldItalic.woff2 +0 -0
  184. package/dist/themes/default/assets/fonts/LatoLatin-Italic.woff +0 -0
  185. package/dist/themes/default/assets/fonts/LatoLatin-Italic.woff2 +0 -0
  186. package/dist/themes/default/assets/fonts/LatoLatin-Regular.woff +0 -0
  187. package/dist/themes/default/assets/fonts/LatoLatin-Regular.woff2 +0 -0
  188. package/dist/themes/github/assets/fonts/octicons.woff2 +0 -0
  189. package/examples/.eslintrc.js +6 -0
  190. package/examples/assets/library/jquery.min.js +2 -4
  191. package/examples/assets/show-examples.js +13 -13
  192. package/examples/attached.html +1 -1
  193. package/examples/bootstrap.html +1 -1
  194. package/examples/components/button.html +1 -1
  195. package/examples/components/card.html +6 -6
  196. package/examples/components/input.html +1 -1
  197. package/examples/components/menu.html +1 -1
  198. package/examples/components/site.html +1 -1
  199. package/examples/components/sticky-context.html +2 -2
  200. package/examples/components/table.html +1 -1
  201. package/examples/fixed.html +3 -3
  202. package/examples/grid.html +5 -5
  203. package/examples/homepage.html +1 -1
  204. package/examples/login.html +2 -2
  205. package/examples/responsive.html +2 -2
  206. package/examples/sticky.html +4 -4
  207. package/examples/theming.html +1 -1
  208. package/gulpfile.js +13 -11
  209. package/package.json +17 -10
  210. package/scripts/nightly-version.js +83 -75
  211. package/src/_site/collections/menu.overrides +1 -1
  212. package/src/_site/elements/flag.variables +2 -2
  213. package/src/_site/globals/site.variables +1 -1
  214. package/src/_site/modules/embed.variables +3 -0
  215. package/src/definitions/behaviors/api.js +1158 -1180
  216. package/src/definitions/behaviors/form.js +2019 -2003
  217. package/src/definitions/behaviors/state.js +645 -663
  218. package/src/definitions/behaviors/visibility.js +1212 -1244
  219. package/src/definitions/collections/breadcrumb.less +43 -47
  220. package/src/definitions/collections/form.less +866 -884
  221. package/src/definitions/collections/grid.less +1681 -1699
  222. package/src/definitions/collections/menu.less +1521 -1544
  223. package/src/definitions/collections/message.less +294 -298
  224. package/src/definitions/collections/table.less +1657 -1661
  225. package/src/definitions/elements/button.less +1714 -1756
  226. package/src/definitions/elements/container.less +211 -211
  227. package/src/definitions/elements/divider.less +198 -211
  228. package/src/definitions/elements/emoji.less +41 -48
  229. package/src/definitions/elements/flag.less +46 -48
  230. package/src/definitions/elements/header.less +351 -359
  231. package/src/definitions/elements/icon.less +541 -484
  232. package/src/definitions/elements/image.less +216 -227
  233. package/src/definitions/elements/input.less +692 -698
  234. package/src/definitions/elements/label.less +784 -806
  235. package/src/definitions/elements/list.less +810 -814
  236. package/src/definitions/elements/loader.less +273 -268
  237. package/src/definitions/elements/placeholder.less +173 -170
  238. package/src/definitions/elements/rail.less +93 -93
  239. package/src/definitions/elements/reveal.less +192 -198
  240. package/src/definitions/elements/segment.less +742 -749
  241. package/src/definitions/elements/step.less +423 -437
  242. package/src/definitions/elements/text.less +34 -36
  243. package/src/definitions/globals/reset.less +11 -8
  244. package/src/definitions/globals/site.js +435 -475
  245. package/src/definitions/globals/site.less +108 -110
  246. package/src/definitions/modules/accordion.js +567 -594
  247. package/src/definitions/modules/accordion.less +244 -248
  248. package/src/definitions/modules/calendar.js +1933 -1808
  249. package/src/definitions/modules/calendar.less +100 -97
  250. package/src/definitions/modules/checkbox.js +841 -840
  251. package/src/definitions/modules/checkbox.less +531 -552
  252. package/src/definitions/modules/dimmer.js +705 -736
  253. package/src/definitions/modules/dimmer.less +294 -305
  254. package/src/definitions/modules/dropdown.js +4178 -4235
  255. package/src/definitions/modules/dropdown.less +1568 -1598
  256. package/src/definitions/modules/embed.js +644 -674
  257. package/src/definitions/modules/embed.less +82 -84
  258. package/src/definitions/modules/flyout.js +1459 -1464
  259. package/src/definitions/modules/flyout.less +452 -455
  260. package/src/definitions/modules/modal.js +1487 -1485
  261. package/src/definitions/modules/modal.less +458 -467
  262. package/src/definitions/modules/nag.js +519 -525
  263. package/src/definitions/modules/nag.less +136 -149
  264. package/src/definitions/modules/popup.js +1453 -1455
  265. package/src/definitions/modules/popup.less +738 -693
  266. package/src/definitions/modules/progress.js +968 -996
  267. package/src/definitions/modules/progress.less +523 -499
  268. package/src/definitions/modules/rating.js +504 -522
  269. package/src/definitions/modules/rating.less +98 -103
  270. package/src/definitions/modules/search.js +1519 -1533
  271. package/src/definitions/modules/search.less +374 -394
  272. package/src/definitions/modules/shape.js +780 -809
  273. package/src/definitions/modules/shape.less +70 -79
  274. package/src/definitions/modules/sidebar.js +1060 -1098
  275. package/src/definitions/modules/sidebar.less +463 -476
  276. package/src/definitions/modules/slider.js +1309 -1310
  277. package/src/definitions/modules/slider.less +309 -310
  278. package/src/definitions/modules/sticky.js +864 -917
  279. package/src/definitions/modules/sticky.less +17 -25
  280. package/src/definitions/modules/tab.js +901 -965
  281. package/src/definitions/modules/tab.less +48 -54
  282. package/src/definitions/modules/toast.js +909 -883
  283. package/src/definitions/modules/toast.less +589 -589
  284. package/src/definitions/modules/transition.js +1046 -1076
  285. package/src/definitions/modules/transition.less +65 -31
  286. package/src/definitions/views/ad.less +207 -208
  287. package/src/definitions/views/card.less +955 -973
  288. package/src/definitions/views/comment.less +192 -200
  289. package/src/definitions/views/feed.less +222 -226
  290. package/src/definitions/views/item.less +437 -448
  291. package/src/definitions/views/statistic.less +273 -279
  292. package/src/semantic.less +8 -6
  293. package/src/theme.config.example +53 -53
  294. package/src/theme.less +44 -35
  295. package/src/themes/amazon/elements/button.overrides +23 -24
  296. package/src/themes/amazon/elements/button.variables +18 -23
  297. package/src/themes/amazon/globals/site.variables +16 -17
  298. package/src/themes/basic/assets/fonts/icons.woff2 +0 -0
  299. package/src/themes/basic/collections/table.overrides +0 -1
  300. package/src/themes/basic/collections/table.variables +3 -3
  301. package/src/themes/basic/elements/button.overrides +0 -1
  302. package/src/themes/basic/elements/button.variables +9 -9
  303. package/src/themes/basic/elements/icon.overrides +9 -169
  304. package/src/themes/basic/elements/icon.variables +161 -18
  305. package/src/themes/basic/elements/step.overrides +2 -2
  306. package/src/themes/basic/elements/step.variables +2 -2
  307. package/src/themes/basic/globals/reset.overrides +1 -1
  308. package/src/themes/basic/globals/reset.variables +1 -1
  309. package/src/themes/basic/modules/progress.variables +2 -2
  310. package/src/themes/basic/views/card.overrides +0 -1
  311. package/src/themes/basic/views/card.variables +6 -6
  312. package/src/themes/bookish/elements/header.overrides +4 -4
  313. package/src/themes/bookish/elements/header.variables +5 -5
  314. package/src/themes/bootstrap3/elements/button.overrides +3 -0
  315. package/src/themes/bootstrap3/elements/button.variables +20 -25
  316. package/src/themes/chubby/collections/form.overrides +9 -9
  317. package/src/themes/chubby/collections/form.variables +3 -3
  318. package/src/themes/chubby/collections/menu.overrides +3 -0
  319. package/src/themes/chubby/collections/menu.variables +3 -3
  320. package/src/themes/chubby/elements/button.overrides +8 -10
  321. package/src/themes/chubby/elements/button.variables +10 -10
  322. package/src/themes/chubby/elements/header.overrides +1 -1
  323. package/src/themes/chubby/elements/header.variables +4 -4
  324. package/src/themes/chubby/modules/accordion.overrides +2 -2
  325. package/src/themes/chubby/modules/accordion.variables +4 -4
  326. package/src/themes/chubby/views/comment.overrides +5 -5
  327. package/src/themes/chubby/views/comment.variables +11 -11
  328. package/src/themes/classic/collections/table.variables +3 -3
  329. package/src/themes/classic/elements/button.variables +36 -43
  330. package/src/themes/classic/elements/header.variables +4 -4
  331. package/src/themes/classic/modules/progress.variables +3 -3
  332. package/src/themes/classic/views/card.overrides +25 -27
  333. package/src/themes/classic/views/card.variables +7 -7
  334. package/src/themes/colored/modules/checkbox.overrides +3 -0
  335. package/src/themes/colored/modules/checkbox.variables +1 -3
  336. package/src/themes/default/assets/fonts/Lato-Bold.woff +0 -0
  337. package/src/themes/default/assets/fonts/Lato-Bold.woff2 +0 -0
  338. package/src/themes/default/assets/fonts/Lato-BoldItalic.woff +0 -0
  339. package/src/themes/default/assets/fonts/Lato-BoldItalic.woff2 +0 -0
  340. package/src/themes/default/assets/fonts/Lato-Italic.woff +0 -0
  341. package/src/themes/default/assets/fonts/Lato-Italic.woff2 +0 -0
  342. package/src/themes/default/assets/fonts/Lato-Regular.woff +0 -0
  343. package/src/themes/default/assets/fonts/Lato-Regular.woff2 +0 -0
  344. package/src/themes/default/assets/fonts/LatoLatin-Bold.woff +0 -0
  345. package/src/themes/default/assets/fonts/LatoLatin-Bold.woff2 +0 -0
  346. package/src/themes/default/assets/fonts/LatoLatin-BoldItalic.woff +0 -0
  347. package/src/themes/default/assets/fonts/LatoLatin-BoldItalic.woff2 +0 -0
  348. package/src/themes/default/assets/fonts/LatoLatin-Italic.woff +0 -0
  349. package/src/themes/default/assets/fonts/LatoLatin-Italic.woff2 +0 -0
  350. package/src/themes/default/assets/fonts/LatoLatin-Regular.woff +0 -0
  351. package/src/themes/default/assets/fonts/LatoLatin-Regular.woff2 +0 -0
  352. package/src/themes/default/collections/breadcrumb.variables +4 -4
  353. package/src/themes/default/collections/form.variables +15 -16
  354. package/src/themes/default/collections/grid.overrides +0 -1
  355. package/src/themes/default/collections/grid.variables +15 -16
  356. package/src/themes/default/collections/menu.variables +31 -45
  357. package/src/themes/default/collections/message.variables +84 -123
  358. package/src/themes/default/collections/table.overrides +3 -0
  359. package/src/themes/default/collections/table.variables +30 -34
  360. package/src/themes/default/elements/button.variables +44 -53
  361. package/src/themes/default/elements/container.variables +8 -16
  362. package/src/themes/default/elements/divider.overrides +8 -9
  363. package/src/themes/default/elements/divider.variables +5 -6
  364. package/src/themes/default/elements/emoji.overrides +0 -1
  365. package/src/themes/default/elements/emoji.variables +3556 -3556
  366. package/src/themes/default/elements/flag.variables +1595 -1595
  367. package/src/themes/default/elements/header.overrides +0 -1
  368. package/src/themes/default/elements/header.variables +21 -21
  369. package/src/themes/default/elements/icon.variables +2016 -2009
  370. package/src/themes/default/elements/image.variables +6 -7
  371. package/src/themes/default/elements/input.variables +11 -12
  372. package/src/themes/default/elements/label.variables +25 -26
  373. package/src/themes/default/elements/list.variables +17 -21
  374. package/src/themes/default/elements/loader.variables +16 -17
  375. package/src/themes/default/elements/placeholder.variables +12 -9
  376. package/src/themes/default/elements/rail.variables +4 -5
  377. package/src/themes/default/elements/reveal.variables +1 -1
  378. package/src/themes/default/elements/segment.variables +24 -36
  379. package/src/themes/default/elements/step.overrides +4 -4
  380. package/src/themes/default/elements/step.variables +19 -22
  381. package/src/themes/default/elements/text.variables +2 -3
  382. package/src/themes/default/globals/colors.less +588 -588
  383. package/src/themes/default/globals/reset.overrides +63 -59
  384. package/src/themes/default/globals/reset.variables +1 -1
  385. package/src/themes/default/globals/site.variables +1075 -1123
  386. package/src/themes/default/globals/variation.variables +13 -4
  387. package/src/themes/default/modules/accordion.overrides +11 -11
  388. package/src/themes/default/modules/accordion.variables +15 -20
  389. package/src/themes/default/modules/calendar.variables +2 -0
  390. package/src/themes/default/modules/chatroom.variables +1 -1
  391. package/src/themes/default/modules/checkbox.overrides +9 -13
  392. package/src/themes/default/modules/checkbox.variables +24 -33
  393. package/src/themes/default/modules/dimmer.variables +14 -17
  394. package/src/themes/default/modules/dropdown.overrides +17 -17
  395. package/src/themes/default/modules/dropdown.variables +29 -31
  396. package/src/themes/default/modules/embed.variables +9 -13
  397. package/src/themes/default/modules/flyout.variables +10 -8
  398. package/src/themes/default/modules/modal.variables +64 -67
  399. package/src/themes/default/modules/nag.variables +11 -14
  400. package/src/themes/default/modules/popup.variables +14 -13
  401. package/src/themes/default/modules/progress.variables +17 -19
  402. package/src/themes/default/modules/rating.variables +10 -12
  403. package/src/themes/default/modules/search.variables +12 -17
  404. package/src/themes/default/modules/shape.variables +7 -8
  405. package/src/themes/default/modules/sidebar.variables +4 -4
  406. package/src/themes/default/modules/slider.variables +55 -54
  407. package/src/themes/default/modules/sticky.variables +1 -1
  408. package/src/themes/default/modules/toast.variables +8 -8
  409. package/src/themes/default/modules/transition.overrides +936 -915
  410. package/src/themes/default/modules/transition.variables +8 -1
  411. package/src/themes/default/views/ad.variables +1 -1
  412. package/src/themes/default/views/card.variables +33 -45
  413. package/src/themes/default/views/comment.variables +7 -9
  414. package/src/themes/default/views/feed.variables +10 -10
  415. package/src/themes/default/views/item.variables +20 -23
  416. package/src/themes/default/views/statistic.variables +8 -8
  417. package/src/themes/duo/elements/loader.variables +1 -1
  418. package/src/themes/famfamfam/elements/flag.overrides +263 -268
  419. package/src/themes/famfamfam/elements/flag.variables +4 -4
  420. package/src/themes/fixed-width/collections/grid.variables +4 -4
  421. package/src/themes/fixed-width/modules/modal.variables +11 -13
  422. package/src/themes/flat/collections/form.overrides +9 -9
  423. package/src/themes/flat/collections/form.variables +16 -17
  424. package/src/themes/flat/globals/site.variables +69 -74
  425. package/src/themes/github/assets/fonts/octicons.woff2 +0 -0
  426. package/src/themes/github/collections/breadcrumb.variables +0 -1
  427. package/src/themes/github/collections/form.overrides +7 -8
  428. package/src/themes/github/collections/form.variables +16 -18
  429. package/src/themes/github/collections/grid.variables +1 -2
  430. package/src/themes/github/collections/menu.overrides +2 -2
  431. package/src/themes/github/collections/menu.variables +24 -26
  432. package/src/themes/github/collections/message.overrides +3 -3
  433. package/src/themes/github/collections/message.variables +12 -14
  434. package/src/themes/github/collections/table.variables +2 -2
  435. package/src/themes/github/elements/button.overrides +0 -1
  436. package/src/themes/github/elements/button.variables +26 -30
  437. package/src/themes/github/elements/header.variables +2 -2
  438. package/src/themes/github/elements/icon.overrides +3 -208
  439. package/src/themes/github/elements/icon.variables +234 -19
  440. package/src/themes/github/elements/image.variables +1 -1
  441. package/src/themes/github/elements/input.overrides +16 -16
  442. package/src/themes/github/elements/input.variables +4 -5
  443. package/src/themes/github/elements/label.overrides +3 -3
  444. package/src/themes/github/elements/label.variables +0 -1
  445. package/src/themes/github/elements/segment.variables +9 -10
  446. package/src/themes/github/elements/step.overrides +13 -13
  447. package/src/themes/github/elements/step.variables +6 -6
  448. package/src/themes/github/globals/site.variables +16 -16
  449. package/src/themes/github/modules/dropdown.overrides +18 -19
  450. package/src/themes/github/modules/dropdown.variables +8 -10
  451. package/src/themes/github/modules/popup.variables +0 -2
  452. package/src/themes/gmail/collections/message.overrides +3 -0
  453. package/src/themes/gmail/collections/message.variables +4 -4
  454. package/src/themes/instagram/views/card.overrides +4 -5
  455. package/src/themes/instagram/views/card.variables +7 -8
  456. package/src/themes/joypixels/elements/emoji.overrides +0 -2
  457. package/src/themes/joypixels/elements/emoji.variables +3554 -3554
  458. package/src/themes/material/collections/menu.overrides +1 -1
  459. package/src/themes/material/collections/menu.variables +4 -4
  460. package/src/themes/material/elements/button.overrides +7 -9
  461. package/src/themes/material/elements/button.variables +44 -46
  462. package/src/themes/material/elements/header.overrides +3 -3
  463. package/src/themes/material/elements/header.variables +8 -10
  464. package/src/themes/material/elements/icon.overrides +3 -934
  465. package/src/themes/material/elements/icon.variables +958 -18
  466. package/src/themes/material/globals/site.overrides +3 -0
  467. package/src/themes/material/globals/site.variables +83 -84
  468. package/src/themes/material/modules/dropdown.overrides +2 -2
  469. package/src/themes/material/modules/dropdown.variables +5 -5
  470. package/src/themes/material/modules/modal.overrides +3 -3
  471. package/src/themes/material/modules/modal.variables +4 -5
  472. package/src/themes/pulsar/elements/loader.overrides +23 -61
  473. package/src/themes/raised/elements/button.variables +8 -9
  474. package/src/themes/resetcss/globals/reset.overrides +115 -33
  475. package/src/themes/resetcss/globals/reset.variables +1 -1
  476. package/src/themes/round/elements/button.overrides +3 -0
  477. package/src/themes/round/elements/button.variables +33 -38
  478. package/src/themes/rtl/globals/site.overrides +1 -1
  479. package/src/themes/rtl/globals/site.variables +5 -6
  480. package/src/themes/striped/modules/progress.overrides +20 -16
  481. package/src/themes/systemfont/globals/reset.overrides +1 -1
  482. package/src/themes/systemfont/globals/site.variables +6 -6
  483. package/src/themes/timeline/views/feed.overrides +12 -12
  484. package/src/themes/timeline/views/feed.variables +8 -8
  485. package/src/themes/twitter/elements/button.overrides +4 -5
  486. package/src/themes/twitter/elements/button.variables +17 -18
  487. package/src/themes/twitter/elements/emoji.variables +3556 -3556
  488. package/tasks/.eslintrc.js +9 -0
  489. package/tasks/README.md +2 -4
  490. package/tasks/admin/components/create.js +268 -277
  491. package/tasks/admin/components/init.js +123 -129
  492. package/tasks/admin/components/update.js +151 -158
  493. package/tasks/admin/distributions/create.js +183 -189
  494. package/tasks/admin/distributions/init.js +125 -131
  495. package/tasks/admin/distributions/update.js +147 -153
  496. package/tasks/admin/publish.js +5 -9
  497. package/tasks/admin/register.js +37 -39
  498. package/tasks/admin/release.js +8 -12
  499. package/tasks/build/assets.js +43 -40
  500. package/tasks/build/css.js +230 -217
  501. package/tasks/build/javascript.js +120 -114
  502. package/tasks/build.js +11 -11
  503. package/tasks/check-install.js +15 -17
  504. package/tasks/clean.js +6 -6
  505. package/tasks/collections/README.md +3 -5
  506. package/tasks/collections/admin.js +34 -36
  507. package/tasks/collections/build.js +19 -21
  508. package/tasks/collections/docs.js +11 -13
  509. package/tasks/collections/install.js +11 -13
  510. package/tasks/collections/rtl.js +9 -12
  511. package/tasks/collections/various.js +10 -12
  512. package/tasks/config/admin/github.js +17 -19
  513. package/tasks/config/admin/oauth.example.js +4 -4
  514. package/tasks/config/admin/release.js +98 -98
  515. package/tasks/config/admin/templates/README.md +8 -8
  516. package/tasks/config/admin/templates/bower.json +3 -2
  517. package/tasks/config/admin/templates/component-package.js +9 -10
  518. package/tasks/config/admin/templates/css-package.js +19 -21
  519. package/tasks/config/admin/templates/less-package.js +12 -14
  520. package/tasks/config/admin/templates/package.json +6 -6
  521. package/tasks/config/defaults.js +116 -116
  522. package/tasks/config/docs.js +23 -23
  523. package/tasks/config/npm/gulpfile.js +15 -14
  524. package/tasks/config/project/config.js +124 -136
  525. package/tasks/config/project/install.js +722 -719
  526. package/tasks/config/project/release.js +34 -41
  527. package/tasks/config/tasks.js +168 -167
  528. package/tasks/config/user.js +28 -29
  529. package/tasks/docs/build.js +100 -96
  530. package/tasks/docs/metadata.js +91 -98
  531. package/tasks/docs/serve.js +84 -82
  532. package/tasks/install.js +373 -382
  533. package/tasks/rtl/build.js +4 -3
  534. package/tasks/rtl/watch.js +4 -3
  535. package/tasks/version.js +4 -6
  536. package/tasks/watch.js +29 -31
  537. package/test/.eslintrc.js +23 -0
  538. package/test/meteor/assets.js +11 -14
  539. package/test/meteor/fonts.js +12 -13
  540. package/test/modules/accordion.spec.js +6 -8
  541. package/test/modules/checkbox.spec.js +5 -7
  542. package/test/modules/dropdown.spec.js +5 -7
  543. package/test/modules/modal.spec.js +6 -8
  544. package/test/modules/module.spec.js +158 -178
  545. package/test/modules/popup.spec.js +5 -7
  546. package/test/modules/search.spec.js +5 -7
  547. package/test/modules/shape.spec.js +5 -7
  548. package/test/modules/sidebar.spec.js +5 -7
  549. package/test/modules/tab.spec.js +6 -8
  550. package/test/modules/transition.spec.js +5 -7
  551. package/test/modules/video.spec.js +5 -7
  552. package/.github/workflows/codeql.yml +0 -68
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * # Fomantic-UI 2.9.1-beta.4+9773a1d - API
2
+ * # Fomantic-UI 2.9.1-beta.40+0bffb4a - API
3
3
  * https://github.com/fomantic/Fomantic-UI/
4
4
  *
5
5
  *
@@ -8,1229 +8,1207 @@
8
8
  *
9
9
  */
10
10
 
11
- ;(function ($, window, document, undefined) {
12
-
13
- 'use strict';
14
-
15
- $.isWindow = $.isWindow || function(obj) {
16
- return obj != null && obj === obj.window;
17
- };
18
-
19
- window = (typeof window != 'undefined' && window.Math == Math)
20
- ? window
21
- : (typeof self != 'undefined' && self.Math == Math)
22
- ? self
23
- : Function('return this')()
24
- ;
25
-
26
- $.api = $.fn.api = function(parameters) {
27
-
28
- var
29
- // use window context if none specified
30
- $allModules = $.isFunction(this)
31
- ? $(window)
32
- : $(this),
33
- moduleSelector = $allModules.selector || '',
34
- time = new Date().getTime(),
35
- performance = [],
36
-
37
- query = arguments[0],
38
- methodInvoked = (typeof query == 'string'),
39
- queryArguments = [].slice.call(arguments, 1),
40
-
41
- returnedValue
42
- ;
43
-
44
- $allModules
45
- .each(function() {
46
- var
47
- settings = ( $.isPlainObject(parameters) )
48
- ? $.extend(true, {}, $.fn.api.settings, parameters)
49
- : $.extend({}, $.fn.api.settings),
50
-
51
- // internal aliases
52
- namespace = settings.namespace,
53
- metadata = settings.metadata,
54
- selector = settings.selector,
55
- error = settings.error,
56
- className = settings.className,
57
-
58
- // define namespaces for modules
59
- eventNamespace = '.' + namespace,
60
- moduleNamespace = 'module-' + namespace,
61
-
62
- // element that creates request
63
- $module = $(this),
64
- $form = $module.closest(selector.form),
65
-
66
- // context used for state
67
- $context = (settings.stateContext)
68
- ? ([window,document].indexOf(settings.stateContext) < 0 ? $(document).find(settings.stateContext) : $(settings.stateContext))
69
- : $module,
70
-
71
- // request details
72
- ajaxSettings,
73
- requestSettings,
74
- url,
75
- data,
76
- requestStartTime,
77
- originalData,
78
-
79
- // standard module
80
- element = this,
81
- context = $context[0],
82
- instance = $module.data(moduleNamespace),
83
- module
84
- ;
85
-
86
- module = {
87
-
88
- initialize: function() {
89
- if(!methodInvoked) {
90
- originalData = settings.data;
91
- module.bind.events();
92
- }
93
- module.instantiate();
94
- },
11
+ (function ($, window, document) {
12
+ 'use strict';
95
13
 
96
- instantiate: function() {
97
- module.verbose('Storing instance of module', module);
98
- instance = module;
99
- $module
100
- .data(moduleNamespace, instance)
101
- ;
102
- },
14
+ function isWindow(obj) {
15
+ return obj !== null && obj === obj.window;
16
+ }
103
17
 
104
- destroy: function() {
105
- module.verbose('Destroying previous module for', element);
106
- $module
107
- .removeData(moduleNamespace)
108
- .off(eventNamespace)
109
- ;
110
- },
18
+ function isFunction(obj) {
19
+ return typeof obj === 'function' && typeof obj.nodeType !== 'number';
20
+ }
111
21
 
112
- bind: {
113
- events: function() {
114
- var
115
- triggerEvent = module.get.event()
116
- ;
117
- if( triggerEvent ) {
118
- module.verbose('Attaching API events to element', triggerEvent);
119
- $module
120
- .on(triggerEvent + eventNamespace, module.event.trigger)
121
- ;
122
- }
123
- else if(settings.on == 'now') {
124
- module.debug('Querying API endpoint immediately');
125
- module.query();
126
- }
127
- }
128
- },
22
+ window = window !== undefined && window.Math === Math
23
+ ? window
24
+ : globalThis;
129
25
 
130
- decode: {
131
- json: function(response) {
132
- if(response !== undefined && typeof response == 'string') {
133
- try {
134
- response = JSON.parse(response);
135
- }
136
- catch(e) {
137
- // isn't json string
138
- }
139
- }
140
- return response;
141
- }
142
- },
26
+ $.fn.api = function (parameters) {
27
+ var
28
+ // use window context if none specified
29
+ $allModules = isFunction(this)
30
+ ? $(window)
31
+ : $(this),
32
+ moduleSelector = $allModules.selector || '',
33
+ time = Date.now(),
34
+ performance = [],
143
35
 
144
- read: {
145
- cachedResponse: function(url) {
36
+ query = arguments[0],
37
+ methodInvoked = typeof query === 'string',
38
+ queryArguments = [].slice.call(arguments, 1),
39
+
40
+ returnedValue
41
+ ;
42
+
43
+ $allModules.each(function () {
146
44
  var
147
- response
45
+ settings = $.isPlainObject(parameters)
46
+ ? $.extend(true, {}, $.fn.api.settings, parameters)
47
+ : $.extend({}, $.fn.api.settings),
48
+
49
+ // internal aliases
50
+ namespace = settings.namespace,
51
+ metadata = settings.metadata,
52
+ selector = settings.selector,
53
+ error = settings.error,
54
+ className = settings.className,
55
+
56
+ // define namespaces for modules
57
+ eventNamespace = '.' + namespace,
58
+ moduleNamespace = 'module-' + namespace,
59
+
60
+ // element that creates request
61
+ $module = $(this),
62
+ $form = $module.closest(selector.form),
63
+
64
+ // context used for state
65
+ $context = settings.stateContext
66
+ ? ([window, document].indexOf(settings.stateContext) < 0 ? $(document).find(settings.stateContext) : $(settings.stateContext))
67
+ : $module,
68
+
69
+ // request details
70
+ ajaxSettings,
71
+ requestSettings,
72
+ url,
73
+ data,
74
+ requestStartTime,
75
+ originalData,
76
+
77
+ // standard module
78
+ element = this,
79
+ context = $context[0],
80
+ instance = $module.data(moduleNamespace),
81
+ module
148
82
  ;
149
- if(window.Storage === undefined) {
150
- module.error(error.noStorage);
151
- return;
152
- }
153
- response = sessionStorage.getItem(url + module.get.normalizedData());
154
- module.debug('Using cached response', url, settings.data, response);
155
- response = module.decode.json(response);
156
- return response;
157
- }
158
- },
159
- write: {
160
- cachedResponse: function(url, response) {
161
- if(response && response === '') {
162
- module.debug('Response empty, not caching', response);
163
- return;
164
- }
165
- if(window.Storage === undefined) {
166
- module.error(error.noStorage);
167
- return;
168
- }
169
- if( $.isPlainObject(response) ) {
170
- response = JSON.stringify(response);
171
- }
172
- sessionStorage.setItem(url + module.get.normalizedData(), response);
173
- module.verbose('Storing cached response for url', url, settings.data, response);
174
- }
175
- },
176
83
 
177
- query: function() {
84
+ module = {
178
85
 
179
- if(module.is.disabled()) {
180
- module.debug('Element is disabled API request aborted');
181
- return;
182
- }
86
+ initialize: function () {
87
+ if (!methodInvoked) {
88
+ originalData = settings.data;
89
+ module.bind.events();
90
+ }
91
+ module.instantiate();
92
+ },
93
+
94
+ instantiate: function () {
95
+ module.verbose('Storing instance of module', module);
96
+ instance = module;
97
+ $module
98
+ .data(moduleNamespace, instance)
99
+ ;
100
+ },
183
101
 
184
- if(module.is.loading()) {
185
- if(settings.interruptRequests) {
186
- module.debug('Interrupting previous request');
187
- module.abort();
188
- }
189
- else {
190
- module.debug('Cancelling request, previous request is still pending');
191
- return;
192
- }
193
- }
194
-
195
- // pass element metadata to url (value, text)
196
- if(settings.defaultData) {
197
- $.extend(true, settings.urlData, module.get.defaultData());
198
- }
199
-
200
- // Add form content
201
- if(settings.serializeForm) {
202
- settings.data = module.add.formData(originalData || settings.data);
203
- }
204
-
205
- // call beforesend and get any settings changes
206
- requestSettings = module.get.settings();
207
-
208
- // check if before send cancelled request
209
- if(requestSettings === false) {
210
- module.cancelled = true;
211
- module.error(error.beforeSend);
212
- return;
213
- }
214
- else {
215
- module.cancelled = false;
216
- }
217
-
218
- // get url
219
- url = module.get.templatedURL();
220
-
221
- if(!url && !module.is.mocked()) {
222
- module.error(error.missingURL);
223
- return;
224
- }
225
-
226
- // replace variables
227
- url = module.add.urlData( url );
228
- // missing url parameters
229
- if( !url && !module.is.mocked()) {
230
- return;
231
- }
232
-
233
- requestSettings.url = settings.base + url;
234
-
235
- // look for jQuery ajax parameters in settings
236
- ajaxSettings = $.extend(true, {}, settings, {
237
- type : settings.method || settings.type,
238
- data : data,
239
- url : settings.base + url,
240
- beforeSend : settings.beforeXHR,
241
- success : function() {},
242
- failure : function() {},
243
- complete : function() {}
244
- });
245
-
246
- module.debug('Querying URL', ajaxSettings.url);
247
- module.verbose('Using AJAX settings', ajaxSettings);
248
- if(settings.cache === 'local' && module.read.cachedResponse(url)) {
249
- module.debug('Response returned from local cache');
250
- module.request = module.create.request();
251
- module.request.resolveWith(context, [ module.read.cachedResponse(url) ]);
252
- return;
253
- }
254
-
255
- if( !settings.throttle ) {
256
- module.debug('Sending request', data, ajaxSettings.method);
257
- module.send.request();
258
- }
259
- else {
260
- if(!settings.throttleFirstRequest && !module.timer) {
261
- module.debug('Sending request', data, ajaxSettings.method);
262
- module.send.request();
263
- module.timer = setTimeout(function(){}, settings.throttle);
264
- }
265
- else {
266
- module.debug('Throttling request', settings.throttle);
267
- clearTimeout(module.timer);
268
- module.timer = setTimeout(function() {
269
- if(module.timer) {
270
- delete module.timer;
271
- }
272
- module.debug('Sending throttled request', data, ajaxSettings.method);
273
- module.send.request();
274
- }, settings.throttle);
275
- }
276
- }
102
+ destroy: function () {
103
+ module.verbose('Destroying previous module for', element);
104
+ $module
105
+ .removeData(moduleNamespace)
106
+ .off(eventNamespace)
107
+ ;
108
+ },
109
+
110
+ bind: {
111
+ events: function () {
112
+ var
113
+ triggerEvent = module.get.event()
114
+ ;
115
+ if (triggerEvent) {
116
+ module.verbose('Attaching API events to element', triggerEvent);
117
+ $module
118
+ .on(triggerEvent + eventNamespace, module.event.trigger)
119
+ ;
120
+ } else if (settings.on === 'now') {
121
+ module.debug('Querying API endpoint immediately');
122
+ module.query();
123
+ }
124
+ },
125
+ },
126
+
127
+ decode: {
128
+ json: function (response) {
129
+ if (response !== undefined && typeof response === 'string') {
130
+ try {
131
+ response = JSON.parse(response);
132
+ } catch (e) {
133
+ // isn't json string
134
+ }
135
+ }
136
+
137
+ return response;
138
+ },
139
+ },
140
+
141
+ read: {
142
+ cachedResponse: function (url) {
143
+ var
144
+ response
145
+ ;
146
+ if (window.Storage === undefined) {
147
+ module.error(error.noStorage);
148
+
149
+ return;
150
+ }
151
+ response = sessionStorage.getItem(url + module.get.normalizedData());
152
+ module.debug('Using cached response', url, settings.data, response);
153
+ response = module.decode.json(response);
154
+
155
+ return response;
156
+ },
157
+ },
158
+ write: {
159
+ cachedResponse: function (url, response) {
160
+ if (window.Storage === undefined) {
161
+ module.error(error.noStorage);
162
+
163
+ return;
164
+ }
165
+ if ($.isPlainObject(response)) {
166
+ response = JSON.stringify(response);
167
+ }
168
+ sessionStorage.setItem(url + module.get.normalizedData(), response);
169
+ module.verbose('Storing cached response for url', url, settings.data, response);
170
+ },
171
+ },
172
+
173
+ query: function () {
174
+ if (module.is.disabled()) {
175
+ module.debug('Element is disabled API request aborted');
176
+
177
+ return;
178
+ }
277
179
 
278
- },
180
+ if (module.is.loading()) {
181
+ if (settings.interruptRequests) {
182
+ module.debug('Interrupting previous request');
183
+ module.abort();
184
+ } else {
185
+ module.debug('Cancelling request, previous request is still pending');
279
186
 
280
- should: {
281
- removeError: function() {
282
- return ( settings.hideError === true || (settings.hideError === 'auto' && !module.is.form()) );
283
- }
284
- },
187
+ return;
188
+ }
189
+ }
285
190
 
286
- is: {
287
- disabled: function() {
288
- return ($module.filter(selector.disabled).length > 0);
289
- },
290
- expectingJSON: function() {
291
- return settings.dataType === 'json' || settings.dataType === 'jsonp';
292
- },
293
- form: function() {
294
- return $module.is('form') || $context.is('form');
295
- },
296
- mocked: function() {
297
- return (settings.mockResponse || settings.mockResponseAsync || settings.response || settings.responseAsync);
298
- },
299
- input: function() {
300
- return $module.is('input');
301
- },
302
- loading: function() {
303
- return (module.request)
304
- ? (module.request.state() == 'pending')
305
- : false
306
- ;
307
- },
308
- abortedRequest: function(xhr) {
309
- if(xhr && xhr.readyState !== undefined && xhr.readyState === 0) {
310
- module.verbose('XHR request determined to be aborted');
311
- return true;
312
- }
313
- else {
314
- module.verbose('XHR request was not aborted');
315
- return false;
316
- }
317
- },
318
- validResponse: function(response) {
319
- if( (!module.is.expectingJSON()) || !$.isFunction(settings.successTest) ) {
320
- module.verbose('Response is not JSON, skipping validation', settings.successTest, response);
321
- return true;
322
- }
323
- module.debug('Checking JSON returned success', settings.successTest, response);
324
- if( settings.successTest(response) ) {
325
- module.debug('Response passed success test', response);
326
- return true;
327
- }
328
- else {
329
- module.debug('Response failed success test', response);
330
- return false;
331
- }
332
- }
333
- },
191
+ // pass element metadata to url (value, text)
192
+ if (settings.defaultData) {
193
+ $.extend(true, settings.urlData, module.get.defaultData());
194
+ }
334
195
 
335
- was: {
336
- cancelled: function() {
337
- return (module.cancelled || false);
338
- },
339
- successful: function() {
340
- return (module.request && module.request.state() == 'resolved');
341
- },
342
- failure: function() {
343
- return (module.request && module.request.state() == 'rejected');
344
- },
345
- complete: function() {
346
- return (module.request && (module.request.state() == 'resolved' || module.request.state() == 'rejected') );
347
- }
348
- },
196
+ // Add form content
197
+ if (settings.serializeForm) {
198
+ settings.data = module.add.formData(originalData || settings.data);
199
+ }
349
200
 
350
- add: {
351
- urlData: function(url, urlData) {
352
- var
353
- requiredVariables,
354
- optionalVariables
355
- ;
356
- if(url) {
357
- requiredVariables = url.match(settings.regExp.required);
358
- optionalVariables = url.match(settings.regExp.optional);
359
- urlData = urlData || settings.urlData;
360
- if(requiredVariables) {
361
- module.debug('Looking for required URL variables', requiredVariables);
362
- $.each(requiredVariables, function(index, templatedString) {
363
- var
364
- // allow legacy {$var} style
365
- variable = (templatedString.indexOf('$') !== -1)
366
- ? templatedString.slice(2, -1)
367
- : templatedString.slice(1, -1),
368
- value = ($.isPlainObject(urlData) && urlData[variable] !== undefined)
369
- ? urlData[variable]
370
- : ($module.data(variable) !== undefined)
371
- ? $module.data(variable)
372
- : ($context.data(variable) !== undefined)
373
- ? $context.data(variable)
374
- : urlData[variable]
375
- ;
376
- // remove value
377
- if(value === undefined) {
378
- module.error(error.requiredParameter, variable, url);
379
- url = false;
380
- return false;
381
- }
382
- else {
383
- module.verbose('Found required variable', variable, value);
384
- value = (settings.encodeParameters)
385
- ? module.get.urlEncodedValue(value)
386
- : value
201
+ // call beforesend and get any settings changes
202
+ requestSettings = module.get.settings();
203
+
204
+ // check if before send cancelled request
205
+ if (requestSettings === false) {
206
+ module.cancelled = true;
207
+ module.error(error.beforeSend);
208
+
209
+ return;
210
+ }
211
+
212
+ module.cancelled = false;
213
+
214
+ // get url
215
+ url = module.get.templatedURL();
216
+
217
+ if (!url && !module.is.mocked()) {
218
+ module.error(error.missingURL);
219
+
220
+ return;
221
+ }
222
+
223
+ // replace variables
224
+ url = module.add.urlData(url);
225
+ // missing url parameters
226
+ if (!url && !module.is.mocked()) {
227
+ return;
228
+ }
229
+
230
+ requestSettings.url = settings.base + url;
231
+
232
+ // look for jQuery ajax parameters in settings
233
+ ajaxSettings = $.extend(true, {}, settings, {
234
+ type: settings.method || settings.type,
235
+ data: data,
236
+ url: settings.base + url,
237
+ beforeSend: settings.beforeXHR,
238
+ success: function () {},
239
+ failure: function () {},
240
+ complete: function () {},
241
+ });
242
+
243
+ module.debug('Querying URL', ajaxSettings.url);
244
+ module.verbose('Using AJAX settings', ajaxSettings);
245
+ if (settings.cache === 'local' && module.read.cachedResponse(url)) {
246
+ module.debug('Response returned from local cache');
247
+ module.request = module.create.request();
248
+ module.request.resolveWith(context, [module.read.cachedResponse(url)]);
249
+
250
+ return;
251
+ }
252
+
253
+ if (!settings.throttle) {
254
+ module.debug('Sending request', data, ajaxSettings.method);
255
+ module.send.request();
256
+ } else {
257
+ if (!settings.throttleFirstRequest && !module.timer) {
258
+ module.debug('Sending request', data, ajaxSettings.method);
259
+ module.send.request();
260
+ module.timer = setTimeout(function () {}, settings.throttle);
261
+ } else {
262
+ module.debug('Throttling request', settings.throttle);
263
+ clearTimeout(module.timer);
264
+ module.timer = setTimeout(function () {
265
+ if (module.timer) {
266
+ delete module.timer;
267
+ }
268
+ module.debug('Sending throttled request', data, ajaxSettings.method);
269
+ module.send.request();
270
+ }, settings.throttle);
271
+ }
272
+ }
273
+ },
274
+
275
+ should: {
276
+ removeError: function () {
277
+ return settings.hideError === true || (settings.hideError === 'auto' && !module.is.form());
278
+ },
279
+ },
280
+
281
+ is: {
282
+ disabled: function () {
283
+ return $module.filter(selector.disabled).length > 0;
284
+ },
285
+ expectingJSON: function () {
286
+ return settings.dataType === 'json' || settings.dataType === 'jsonp';
287
+ },
288
+ form: function () {
289
+ return $module.is('form') || $context.is('form');
290
+ },
291
+ mocked: function () {
292
+ return settings.mockResponse || settings.mockResponseAsync || settings.response || settings.responseAsync;
293
+ },
294
+ input: function () {
295
+ return $module.is('input');
296
+ },
297
+ loading: function () {
298
+ return module.request
299
+ ? module.request.state() === 'pending'
300
+ : false;
301
+ },
302
+ abortedRequest: function (xhr) {
303
+ if (xhr && xhr.readyState !== undefined && xhr.readyState === 0) {
304
+ module.verbose('XHR request determined to be aborted');
305
+
306
+ return true;
307
+ }
308
+
309
+ module.verbose('XHR request was not aborted');
310
+
311
+ return false;
312
+ },
313
+ validResponse: function (response) {
314
+ if (!module.is.expectingJSON() || !isFunction(settings.successTest)) {
315
+ module.verbose('Response is not JSON, skipping validation', settings.successTest, response);
316
+
317
+ return true;
318
+ }
319
+ module.debug('Checking JSON returned success', settings.successTest, response);
320
+ if (settings.successTest(response)) {
321
+ module.debug('Response passed success test', response);
322
+
323
+ return true;
324
+ }
325
+
326
+ module.debug('Response failed success test', response);
327
+
328
+ return false;
329
+ },
330
+ },
331
+
332
+ was: {
333
+ cancelled: function () {
334
+ return module.cancelled || false;
335
+ },
336
+ successful: function () {
337
+ return module.request && module.request.state() === 'resolved';
338
+ },
339
+ failure: function () {
340
+ return module.request && module.request.state() === 'rejected';
341
+ },
342
+ complete: function () {
343
+ return module.request && (module.request.state() === 'resolved' || module.request.state() === 'rejected');
344
+ },
345
+ },
346
+
347
+ add: {
348
+ urlData: function (url, urlData) {
349
+ var
350
+ requiredVariables,
351
+ optionalVariables
352
+ ;
353
+ if (url) {
354
+ requiredVariables = url.match(settings.regExp.required);
355
+ optionalVariables = url.match(settings.regExp.optional);
356
+ urlData = urlData || settings.urlData;
357
+ if (requiredVariables) {
358
+ module.debug('Looking for required URL variables', requiredVariables);
359
+ $.each(requiredVariables, function (index, templatedString) {
360
+ var
361
+ // allow legacy {$var} style
362
+ variable = templatedString.indexOf('$') !== -1
363
+ ? templatedString.slice(2, -1)
364
+ : templatedString.slice(1, -1),
365
+ value = $.isPlainObject(urlData) && urlData[variable] !== undefined
366
+ ? urlData[variable]
367
+ : ($module.data(variable) !== undefined
368
+ ? $module.data(variable)
369
+ : ($context.data(variable) !== undefined // eslint-disable-line unicorn/no-nested-ternary
370
+ ? $context.data(variable)
371
+ : urlData[variable]))
372
+ ;
373
+ // remove value
374
+ if (value === undefined) {
375
+ module.error(error.requiredParameter, variable, url);
376
+ url = false;
377
+
378
+ return false;
379
+ }
380
+
381
+ module.verbose('Found required variable', variable, value);
382
+ value = settings.encodeParameters
383
+ ? module.get.urlEncodedValue(value)
384
+ : value;
385
+ url = url.replace(templatedString, value);
386
+ });
387
+ }
388
+ if (optionalVariables) {
389
+ module.debug('Looking for optional URL variables', requiredVariables);
390
+ $.each(optionalVariables, function (index, templatedString) {
391
+ var
392
+ // allow legacy {/$var} style
393
+ variable = templatedString.indexOf('$') !== -1
394
+ ? templatedString.slice(3, -1)
395
+ : templatedString.slice(2, -1),
396
+ value = $.isPlainObject(urlData) && urlData[variable] !== undefined
397
+ ? urlData[variable]
398
+ : ($module.data(variable) !== undefined
399
+ ? $module.data(variable)
400
+ : ($context.data(variable) !== undefined // eslint-disable-line unicorn/no-nested-ternary
401
+ ? $context.data(variable)
402
+ : urlData[variable]))
403
+ ;
404
+ // optional replacement
405
+ if (value !== undefined) {
406
+ module.verbose('Optional variable Found', variable, value);
407
+ url = url.replace(templatedString, value);
408
+ } else {
409
+ module.verbose('Optional variable not found', variable);
410
+ // remove preceding slash if set
411
+ url = url.indexOf('/' + templatedString) !== -1
412
+ ? url.replace('/' + templatedString, '')
413
+ : url.replace(templatedString, '');
414
+ }
415
+ });
416
+ }
417
+ }
418
+
419
+ return url;
420
+ },
421
+ formData: function (data) {
422
+ var
423
+ formData = {},
424
+ hasOtherData,
425
+ useFormDataApi = settings.serializeForm === 'formdata'
426
+ ;
427
+ data = data || originalData || settings.data;
428
+ hasOtherData = $.isPlainObject(data);
429
+
430
+ if (useFormDataApi) {
431
+ formData = new FormData($form[0]);
432
+ settings.processData = settings.processData !== undefined ? settings.processData : false;
433
+ settings.contentType = settings.contentType !== undefined ? settings.contentType : false;
434
+ } else {
435
+ var
436
+ formArray = $form.serializeArray(),
437
+ pushes = {},
438
+ pushValues = {},
439
+ build = function (base, key, value) {
440
+ base[key] = value;
441
+
442
+ return base;
443
+ }
444
+ ;
445
+ // add files
446
+ $.each($('input[type="file"]', $form), function (i, tag) {
447
+ $.each($(tag)[0].files, function (j, file) {
448
+ formArray.push({ name: tag.name, value: file });
449
+ });
450
+ });
451
+ $.each(formArray, function (i, el) {
452
+ if (!settings.regExp.validate.test(el.name)) {
453
+ return;
454
+ }
455
+ var
456
+ isCheckbox = $('[name="' + el.name + '"]', $form).attr('type') === 'checkbox',
457
+ floatValue = parseFloat(el.value),
458
+ value = (isCheckbox && el.value === 'on')
459
+ || el.value === 'true'
460
+ || (String(floatValue) === el.value
461
+ ? floatValue
462
+ : (el.value === 'false' ? false : el.value)),
463
+ nameKeys = el.name.match(settings.regExp.key) || [],
464
+ pushKey = el.name.replace(/\[]$/, '')
465
+ ;
466
+ if (!(pushKey in pushes)) {
467
+ pushes[pushKey] = 0;
468
+ pushValues[pushKey] = value;
469
+ } else if (Array.isArray(pushValues[pushKey])) {
470
+ pushValues[pushKey].push(value);
471
+ } else {
472
+ pushValues[pushKey] = [pushValues[pushKey], value];
473
+ }
474
+ if (pushKey.indexOf('[]') === -1) {
475
+ value = pushValues[pushKey];
476
+ }
477
+
478
+ while (nameKeys.length > 0) {
479
+ var k = nameKeys.pop();
480
+
481
+ if (k === '' && !Array.isArray(value)) { // foo[]
482
+ value = build([], pushes[pushKey]++, value);
483
+ } else if (settings.regExp.fixed.test(k)) { // foo[n]
484
+ value = build([], k, value);
485
+ } else if (settings.regExp.named.test(k)) { // foo; foo[bar]
486
+ value = build({}, k, value);
487
+ }
488
+ }
489
+ formData = $.extend(true, formData, value);
490
+ });
491
+ }
492
+
493
+ if (hasOtherData) {
494
+ module.debug('Extending existing data with form data', data, formData);
495
+ if (useFormDataApi) {
496
+ $.each(Object.keys(data), function (i, el) {
497
+ formData.append(el, data[el]);
498
+ });
499
+ data = formData;
500
+ } else {
501
+ data = $.extend(true, {}, data, formData);
502
+ }
503
+ } else {
504
+ module.debug('Adding form data', formData);
505
+ data = formData;
506
+ }
507
+
508
+ return data;
509
+ },
510
+ },
511
+
512
+ send: {
513
+ request: function () {
514
+ module.set.loading();
515
+ module.request = module.create.request();
516
+ if (module.is.mocked()) {
517
+ module.mockedXHR = module.create.mockedXHR();
518
+ } else {
519
+ module.xhr = module.create.xhr();
520
+ }
521
+ settings.onRequest.call(context, module.request, module.xhr);
522
+ },
523
+ },
524
+
525
+ event: {
526
+ trigger: function (event) {
527
+ module.query();
528
+ if (event.type === 'submit' || event.type === 'click') {
529
+ event.preventDefault();
530
+ }
531
+ },
532
+ xhr: {
533
+ always: function () {
534
+ // nothing special
535
+ },
536
+ done: function (response, textStatus, xhr) {
537
+ var
538
+ context = this,
539
+ elapsedTime = Date.now() - requestStartTime,
540
+ timeLeft = settings.loadingDuration - elapsedTime,
541
+ translatedResponse = isFunction(settings.onResponse)
542
+ ? (module.is.expectingJSON() && !settings.rawResponse
543
+ ? settings.onResponse.call(context, $.extend(true, {}, response))
544
+ : settings.onResponse.call(context, response))
545
+ : false
546
+ ;
547
+ timeLeft = timeLeft > 0
548
+ ? timeLeft
549
+ : 0;
550
+ if (translatedResponse) {
551
+ module.debug('Modified API response in onResponse callback', settings.onResponse, translatedResponse, response);
552
+ response = translatedResponse;
553
+ }
554
+ if (timeLeft > 0) {
555
+ module.debug('Response completed early delaying state change by', timeLeft);
556
+ }
557
+ setTimeout(function () {
558
+ if (module.is.validResponse(response)) {
559
+ module.request.resolveWith(context, [response, xhr]);
560
+ } else {
561
+ module.request.rejectWith(context, [xhr, 'invalid']);
562
+ }
563
+ }, timeLeft);
564
+ },
565
+ fail: function (xhr, status, httpMessage) {
566
+ var
567
+ context = this,
568
+ elapsedTime = Date.now() - requestStartTime,
569
+ timeLeft = settings.loadingDuration - elapsedTime
570
+ ;
571
+ timeLeft = timeLeft > 0
572
+ ? timeLeft
573
+ : 0;
574
+ if (timeLeft > 0) {
575
+ module.debug('Response completed early delaying state change by', timeLeft);
576
+ }
577
+ setTimeout(function () {
578
+ if (module.is.abortedRequest(xhr)) {
579
+ module.request.rejectWith(context, [xhr, 'aborted', httpMessage]);
580
+ } else {
581
+ module.request.rejectWith(context, [xhr, 'error', status, httpMessage]);
582
+ }
583
+ }, timeLeft);
584
+ },
585
+ },
586
+ request: {
587
+ done: function (response, xhr) {
588
+ module.debug('Successful API Response', response);
589
+ if (settings.cache === 'local' && url) {
590
+ module.write.cachedResponse(url, response);
591
+ module.debug('Saving server response locally', module.cache);
592
+ }
593
+ settings.onSuccess.call(context, response, $module, xhr);
594
+ },
595
+ complete: function (firstParameter, secondParameter) {
596
+ var
597
+ xhr,
598
+ response
599
+ ;
600
+ // have to guess callback parameters based on request success
601
+ if (module.was.successful()) {
602
+ response = firstParameter;
603
+ xhr = secondParameter;
604
+ } else {
605
+ xhr = firstParameter;
606
+ response = module.get.responseFromXHR(xhr);
607
+ }
608
+ module.remove.loading();
609
+ settings.onComplete.call(context, response, $module, xhr);
610
+ },
611
+ fail: function (xhr, status, httpMessage) {
612
+ var
613
+ // pull response from xhr if available
614
+ response = module.get.responseFromXHR(xhr),
615
+ errorMessage = module.get.errorFromRequest(response, status, httpMessage)
616
+ ;
617
+ if (status === 'aborted') {
618
+ module.debug('XHR Aborted (Most likely caused by page navigation or CORS Policy)', status, httpMessage);
619
+ settings.onAbort.call(context, status, $module, xhr);
620
+
621
+ return true;
622
+ }
623
+ if (status === 'invalid') {
624
+ module.debug('JSON did not pass success test. A server-side error has most likely occurred', response);
625
+ } else if (status === 'error') {
626
+ if (xhr !== undefined) {
627
+ module.debug('XHR produced a server error', status, httpMessage);
628
+ // make sure we have an error to display to console
629
+ if ((xhr.status < 200 || xhr.status >= 300) && httpMessage !== undefined && httpMessage !== '') {
630
+ module.error(error.statusMessage + httpMessage, ajaxSettings.url);
631
+ }
632
+ settings.onError.call(context, errorMessage, $module, xhr);
633
+ }
634
+ }
635
+
636
+ if (settings.errorDuration && status !== 'aborted') {
637
+ module.debug('Adding error state');
638
+ module.set.error();
639
+ if (module.should.removeError()) {
640
+ setTimeout(module.remove.error, settings.errorDuration);
641
+ }
642
+ }
643
+ module.debug('API Request failed', errorMessage, xhr);
644
+ settings.onFailure.call(context, response, $module, xhr);
645
+ },
646
+ },
647
+ },
648
+
649
+ create: {
650
+
651
+ request: function () {
652
+ // api request promise
653
+ return $.Deferred()
654
+ .always(module.event.request.complete)
655
+ .done(module.event.request.done)
656
+ .fail(module.event.request.fail)
657
+ ;
658
+ },
659
+
660
+ mockedXHR: function () {
661
+ var
662
+ // xhr does not simulate these properties of xhr but must return them
663
+ textStatus = false,
664
+ status = false,
665
+ httpMessage = false,
666
+ responder = settings.mockResponse || settings.response,
667
+ asyncResponder = settings.mockResponseAsync || settings.responseAsync,
668
+ asyncCallback,
669
+ response,
670
+ mockedXHR
671
+ ;
672
+
673
+ mockedXHR = $.Deferred()
674
+ .always(module.event.xhr.complete)
675
+ .done(module.event.xhr.done)
676
+ .fail(module.event.xhr.fail)
677
+ ;
678
+
679
+ if (responder) {
680
+ if (isFunction(responder)) {
681
+ module.debug('Using specified synchronous callback', responder);
682
+ response = responder.call(context, requestSettings);
683
+ } else {
684
+ module.debug('Using settings specified response', responder);
685
+ response = responder;
686
+ }
687
+ // simulating response
688
+ mockedXHR.resolveWith(context, [response, textStatus, { responseText: response }]);
689
+ } else if (isFunction(asyncResponder)) {
690
+ asyncCallback = function (response) {
691
+ module.debug('Async callback returned response', response);
692
+
693
+ if (response) {
694
+ mockedXHR.resolveWith(context, [response, textStatus, { responseText: response }]);
695
+ } else {
696
+ mockedXHR.rejectWith(context, [{ responseText: response }, status, httpMessage]);
697
+ }
698
+ };
699
+ module.debug('Using specified async response callback', asyncResponder);
700
+ asyncResponder.call(context, requestSettings, asyncCallback);
701
+ }
702
+
703
+ return mockedXHR;
704
+ },
705
+
706
+ xhr: function () {
707
+ var
708
+ xhr
709
+ ;
710
+ // ajax request promise
711
+ xhr = $.ajax(ajaxSettings)
712
+ .always(module.event.xhr.always)
713
+ .done(module.event.xhr.done)
714
+ .fail(module.event.xhr.fail)
715
+ ;
716
+ module.verbose('Created server request', xhr, ajaxSettings);
717
+
718
+ return xhr;
719
+ },
720
+ },
721
+
722
+ set: {
723
+ error: function () {
724
+ module.verbose('Adding error state to element', $context);
725
+ $context.addClass(className.error);
726
+ },
727
+ loading: function () {
728
+ module.verbose('Adding loading state to element', $context);
729
+ $context.addClass(className.loading);
730
+ requestStartTime = Date.now();
731
+ },
732
+ },
733
+
734
+ remove: {
735
+ error: function () {
736
+ module.verbose('Removing error state from element', $context);
737
+ $context.removeClass(className.error);
738
+ },
739
+ loading: function () {
740
+ module.verbose('Removing loading state from element', $context);
741
+ $context.removeClass(className.loading);
742
+ },
743
+ },
744
+
745
+ get: {
746
+ normalizedData: function () {
747
+ return typeof settings.data === 'string' ? settings.data : JSON.stringify(settings.data, Object.keys(settings.data).sort());
748
+ },
749
+ responseFromXHR: function (xhr) {
750
+ return $.isPlainObject(xhr)
751
+ ? (module.is.expectingJSON()
752
+ ? module.decode.json(xhr.responseText)
753
+ : xhr.responseText)
754
+ : false;
755
+ },
756
+ errorFromRequest: function (response, status, httpMessage) {
757
+ return $.isPlainObject(response) && response.error !== undefined
758
+ ? response.error // use json error message
759
+ : (settings.error[status] !== undefined // use server error message
760
+ ? settings.error[status]
761
+ : httpMessage);
762
+ },
763
+ request: function () {
764
+ return module.request || false;
765
+ },
766
+ xhr: function () {
767
+ return module.xhr || false;
768
+ },
769
+ settings: function () {
770
+ var
771
+ runSettings
772
+ ;
773
+ runSettings = settings.beforeSend.call($module, settings);
774
+ if (runSettings) {
775
+ if (runSettings.success !== undefined) {
776
+ module.debug('Legacy success callback detected', runSettings);
777
+ module.error(error.legacyParameters, runSettings.success);
778
+ runSettings.onSuccess = runSettings.success;
779
+ }
780
+ if (runSettings.failure !== undefined) {
781
+ module.debug('Legacy failure callback detected', runSettings);
782
+ module.error(error.legacyParameters, runSettings.failure);
783
+ runSettings.onFailure = runSettings.failure;
784
+ }
785
+ if (runSettings.complete !== undefined) {
786
+ module.debug('Legacy complete callback detected', runSettings);
787
+ module.error(error.legacyParameters, runSettings.complete);
788
+ runSettings.onComplete = runSettings.complete;
789
+ }
790
+ }
791
+ if (runSettings === undefined) {
792
+ module.error(error.noReturnedValue);
793
+ }
794
+ if (runSettings === false) {
795
+ return runSettings;
796
+ }
797
+
798
+ return runSettings !== undefined
799
+ ? $.extend(true, {}, runSettings)
800
+ : $.extend(true, {}, settings);
801
+ },
802
+ urlEncodedValue: function (value) {
803
+ var
804
+ decodedValue = window.decodeURIComponent(value),
805
+ encodedValue = window.encodeURIComponent(value),
806
+ alreadyEncoded = decodedValue !== value
807
+ ;
808
+ if (alreadyEncoded) {
809
+ module.debug('URL value is already encoded, avoiding double encoding', value);
810
+
811
+ return value;
812
+ }
813
+ module.verbose('Encoding value using encodeURIComponent', value, encodedValue);
814
+
815
+ return encodedValue;
816
+ },
817
+ defaultData: function () {
818
+ var
819
+ data = {}
820
+ ;
821
+ if (!isWindow(element)) {
822
+ if (module.is.input()) {
823
+ data.value = $module.val();
824
+ } else if (!module.is.form()) {
825
+ data.text = $module.text();
826
+ }
827
+ }
828
+
829
+ return data;
830
+ },
831
+ event: function () {
832
+ if (isWindow(element) || settings.on === 'now') {
833
+ module.debug('API called without element, no events attached');
834
+
835
+ return false;
836
+ }
837
+ if (settings.on === 'auto') {
838
+ if ($module.is('input')) {
839
+ return element.oninput !== undefined
840
+ ? 'input'
841
+ : (element.onpropertychange !== undefined
842
+ ? 'propertychange'
843
+ : 'keyup');
844
+ }
845
+ if ($module.is('form')) {
846
+ return 'submit';
847
+ }
848
+
849
+ return 'click';
850
+ }
851
+
852
+ return settings.on;
853
+ },
854
+ templatedURL: function (action) {
855
+ action = action || settings.action || $module.data(metadata.action) || false;
856
+ url = settings.url || $module.data(metadata.url) || false;
857
+ if (url) {
858
+ module.debug('Using specified url', url);
859
+
860
+ return url;
861
+ }
862
+ if (action) {
863
+ module.debug('Looking up url for action', action, settings.api);
864
+ if (settings.api[action] === undefined && !module.is.mocked()) {
865
+ module.error(error.missingAction, settings.action, settings.api);
866
+
867
+ return;
868
+ }
869
+ url = settings.api[action];
870
+ } else if (module.is.form()) {
871
+ url = $module.attr('action') || $context.attr('action') || false;
872
+ module.debug('No url or action specified, defaulting to form action', url);
873
+ }
874
+
875
+ return url;
876
+ },
877
+ },
878
+
879
+ abort: function () {
880
+ var
881
+ xhr = module.get.xhr()
387
882
  ;
388
- url = url.replace(templatedString, value);
389
- }
390
- });
391
- }
392
- if(optionalVariables) {
393
- module.debug('Looking for optional URL variables', requiredVariables);
394
- $.each(optionalVariables, function(index, templatedString) {
395
- var
396
- // allow legacy {/$var} style
397
- variable = (templatedString.indexOf('$') !== -1)
398
- ? templatedString.slice(3, -1)
399
- : templatedString.slice(2, -1),
400
- value = ($.isPlainObject(urlData) && urlData[variable] !== undefined)
401
- ? urlData[variable]
402
- : ($module.data(variable) !== undefined)
403
- ? $module.data(variable)
404
- : ($context.data(variable) !== undefined)
405
- ? $context.data(variable)
406
- : urlData[variable]
407
- ;
408
- // optional replacement
409
- if(value !== undefined) {
410
- module.verbose('Optional variable Found', variable, value);
411
- url = url.replace(templatedString, value);
412
- }
413
- else {
414
- module.verbose('Optional variable not found', variable);
415
- // remove preceding slash if set
416
- if(url.indexOf('/' + templatedString) !== -1) {
417
- url = url.replace('/' + templatedString, '');
883
+ if (xhr && xhr.state() !== 'resolved') {
884
+ module.debug('Cancelling API request');
885
+ xhr.abort();
418
886
  }
419
- else {
420
- url = url.replace(templatedString, '');
887
+ },
888
+
889
+ // reset state
890
+ reset: function () {
891
+ module.remove.error();
892
+ module.remove.loading();
893
+ },
894
+
895
+ setting: function (name, value) {
896
+ module.debug('Changing setting', name, value);
897
+ if ($.isPlainObject(name)) {
898
+ $.extend(true, settings, name);
899
+ } else if (value !== undefined) {
900
+ if ($.isPlainObject(settings[name])) {
901
+ $.extend(true, settings[name], value);
902
+ } else {
903
+ settings[name] = value;
904
+ }
905
+ } else {
906
+ return settings[name];
907
+ }
908
+ },
909
+ internal: function (name, value) {
910
+ if ($.isPlainObject(name)) {
911
+ $.extend(true, module, name);
912
+ } else if (value !== undefined) {
913
+ module[name] = value;
914
+ } else {
915
+ return module[name];
916
+ }
917
+ },
918
+ debug: function () {
919
+ if (!settings.silent && settings.debug) {
920
+ if (settings.performance) {
921
+ module.performance.log(arguments);
922
+ } else {
923
+ module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');
924
+ module.debug.apply(console, arguments);
925
+ }
926
+ }
927
+ },
928
+ verbose: function () {
929
+ if (!settings.silent && settings.verbose && settings.debug) {
930
+ if (settings.performance) {
931
+ module.performance.log(arguments);
932
+ } else {
933
+ module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');
934
+ module.verbose.apply(console, arguments);
935
+ }
936
+ }
937
+ },
938
+ error: function () {
939
+ if (!settings.silent) {
940
+ module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');
941
+ module.error.apply(console, arguments);
942
+ }
943
+ },
944
+ performance: {
945
+ log: function (message) {
946
+ var
947
+ currentTime,
948
+ executionTime,
949
+ previousTime
950
+ ;
951
+ if (settings.performance) {
952
+ currentTime = Date.now();
953
+ previousTime = time || currentTime;
954
+ executionTime = currentTime - previousTime;
955
+ time = currentTime;
956
+ performance.push({
957
+ Name: message[0],
958
+ Arguments: [].slice.call(message, 1) || '',
959
+ // 'Element' : element,
960
+ 'Execution Time': executionTime,
961
+ });
962
+ }
963
+ clearTimeout(module.performance.timer);
964
+ module.performance.timer = setTimeout(module.performance.display, 500);
965
+ },
966
+ display: function () {
967
+ var
968
+ title = settings.name + ':',
969
+ totalTime = 0
970
+ ;
971
+ time = false;
972
+ clearTimeout(module.performance.timer);
973
+ $.each(performance, function (index, data) {
974
+ totalTime += data['Execution Time'];
975
+ });
976
+ title += ' ' + totalTime + 'ms';
977
+ if (moduleSelector) {
978
+ title += ' \'' + moduleSelector + '\'';
979
+ }
980
+ if (performance.length > 0) {
981
+ console.groupCollapsed(title);
982
+ if (console.table) {
983
+ console.table(performance);
984
+ } else {
985
+ $.each(performance, function (index, data) {
986
+ console.log(data.Name + ': ' + data['Execution Time'] + 'ms');
987
+ });
988
+ }
989
+ console.groupEnd();
990
+ }
991
+ performance = [];
992
+ },
993
+ },
994
+ invoke: function (query, passedArguments, context) {
995
+ var
996
+ object = instance,
997
+ maxDepth,
998
+ found,
999
+ response
1000
+ ;
1001
+ passedArguments = passedArguments || queryArguments;
1002
+ context = context || element;
1003
+ if (typeof query === 'string' && object !== undefined) {
1004
+ query = query.split(/[ .]/);
1005
+ maxDepth = query.length - 1;
1006
+ $.each(query, function (depth, value) {
1007
+ var camelCaseValue = depth !== maxDepth
1008
+ ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)
1009
+ : query
1010
+ ;
1011
+ if ($.isPlainObject(object[camelCaseValue]) && (depth !== maxDepth)) {
1012
+ object = object[camelCaseValue];
1013
+ } else if (object[camelCaseValue] !== undefined) {
1014
+ found = object[camelCaseValue];
1015
+
1016
+ return false;
1017
+ } else if ($.isPlainObject(object[value]) && (depth !== maxDepth)) {
1018
+ object = object[value];
1019
+ } else if (object[value] !== undefined) {
1020
+ found = object[value];
1021
+
1022
+ return false;
1023
+ } else {
1024
+ module.error(error.method, query);
1025
+
1026
+ return false;
1027
+ }
1028
+ });
1029
+ }
1030
+ if (isFunction(found)) {
1031
+ response = found.apply(context, passedArguments);
1032
+ } else if (found !== undefined) {
1033
+ response = found;
1034
+ }
1035
+ if (Array.isArray(returnedValue)) {
1036
+ returnedValue.push(response);
1037
+ } else if (returnedValue !== undefined) {
1038
+ returnedValue = [returnedValue, response];
1039
+ } else if (response !== undefined) {
1040
+ returnedValue = response;
421
1041
  }
422
- }
423
- });
424
- }
425
- }
426
- return url;
427
- },
428
- formData: function(data) {
429
- var
430
- formData = {},
431
- hasOtherData,
432
- useFormDataApi = settings.serializeForm === 'formdata'
433
- ;
434
- data = data || originalData || settings.data;
435
- hasOtherData = $.isPlainObject(data);
436
1042
 
437
- if (useFormDataApi) {
438
- formData = new FormData($form[0]);
439
- settings.processData = typeof settings.processData !== 'undefined' ? settings.processData : false;
440
- settings.contentType = typeof settings.contentType !== 'undefined' ? settings.contentType : false;
441
- } else {
442
- var formArray = $form.serializeArray(),
443
- pushes = {},
444
- pushValues= {},
445
- build = function(base, key, value) {
446
- base[key] = value;
447
- return base;
448
- }
449
- ;
450
- // add files
451
- $.each($('input[type="file"]',$form), function(i, tag) {
452
- $.each($(tag)[0].files, function(j, file) {
453
- formArray.push({name:tag.name, value: file});
454
- });
455
- });
456
- $.each(formArray, function(i, el) {
457
- if (!settings.regExp.validate.test(el.name)) return;
458
- var isCheckbox = $('[name="' + el.name + '"]', $form).attr('type') === 'checkbox',
459
- floatValue = parseFloat(el.value),
460
- value = (isCheckbox && el.value === 'on') || el.value === 'true' || (String(floatValue) === el.value ? floatValue : (el.value === 'false' ? false : el.value)),
461
- nameKeys = el.name.match(settings.regExp.key) || [], k, pushKey= el.name.replace(/\[\]$/,'')
462
- ;
463
- if(!(pushKey in pushes)) {
464
- pushes[pushKey] = 0;
465
- pushValues[pushKey] = value;
466
- } else if (Array.isArray(pushValues[pushKey])) {
467
- pushValues[pushKey].push(value);
468
- } else {
469
- pushValues[pushKey] = [pushValues[pushKey] , value];
1043
+ return found;
1044
+ },
1045
+ };
1046
+
1047
+ if (methodInvoked) {
1048
+ if (instance === undefined) {
1049
+ module.initialize();
470
1050
  }
471
- value = pushValues[pushKey];
472
-
473
- while ((k = nameKeys.pop()) !== undefined) {
474
- // foo[]
475
- if (k == '' && !Array.isArray(value)){
476
- value = build([], pushes[pushKey]++, value);
477
- }
478
- // foo[n]
479
- else if (settings.regExp.fixed.test(k)) {
480
- value = build([], k, value);
481
- }
482
- // foo; foo[bar]
483
- else if (settings.regExp.named.test(k)) {
484
- value = build({}, k, value);
485
- }
1051
+ module.invoke(query);
1052
+ } else {
1053
+ if (instance !== undefined) {
1054
+ instance.invoke('destroy');
486
1055
  }
487
- formData = $.extend(true, formData, value);
488
- });
1056
+ module.initialize();
489
1057
  }
1058
+ });
490
1059
 
491
- if(hasOtherData) {
492
- module.debug('Extending existing data with form data', data, formData);
493
- if(useFormDataApi) {
494
- $.each(Object.keys(data),function(i, el){
495
- formData.append(el, data[el]);
496
- });
497
- data = formData;
498
- } else {
499
- data = $.extend(true, {}, data, formData);
500
- }
501
- }
502
- else {
503
- module.debug('Adding form data', formData);
504
- data = formData;
505
- }
506
- return data;
507
- }
508
- },
1060
+ return returnedValue !== undefined
1061
+ ? returnedValue
1062
+ : this;
1063
+ };
1064
+ $.api = $.fn.api;
509
1065
 
510
- send: {
511
- request: function() {
512
- module.set.loading();
513
- module.request = module.create.request();
514
- if( module.is.mocked() ) {
515
- module.mockedXHR = module.create.mockedXHR();
516
- }
517
- else {
518
- module.xhr = module.create.xhr();
519
- }
520
- settings.onRequest.call(context, module.request, module.xhr);
521
- }
522
- },
1066
+ $.api.settings = {
523
1067
 
524
- event: {
525
- trigger: function(event) {
526
- module.query();
527
- if(event.type == 'submit' || event.type == 'click') {
528
- event.preventDefault();
529
- }
530
- },
531
- xhr: {
532
- always: function() {
533
- // nothing special
534
- },
535
- done: function(response, textStatus, xhr) {
536
- var
537
- context = this,
538
- elapsedTime = (new Date().getTime() - requestStartTime),
539
- timeLeft = (settings.loadingDuration - elapsedTime),
540
- translatedResponse = ( $.isFunction(settings.onResponse) )
541
- ? module.is.expectingJSON() && !settings.rawResponse
542
- ? settings.onResponse.call(context, $.extend(true, {}, response))
543
- : settings.onResponse.call(context, response)
544
- : false
545
- ;
546
- timeLeft = (timeLeft > 0)
547
- ? timeLeft
548
- : 0
549
- ;
550
- if(translatedResponse) {
551
- module.debug('Modified API response in onResponse callback', settings.onResponse, translatedResponse, response);
552
- response = translatedResponse;
553
- }
554
- if(timeLeft > 0) {
555
- module.debug('Response completed early delaying state change by', timeLeft);
556
- }
557
- setTimeout(function() {
558
- if( module.is.validResponse(response) ) {
559
- module.request.resolveWith(context, [response, xhr]);
560
- }
561
- else {
562
- module.request.rejectWith(context, [xhr, 'invalid']);
563
- }
564
- }, timeLeft);
565
- },
566
- fail: function(xhr, status, httpMessage) {
567
- var
568
- context = this,
569
- elapsedTime = (new Date().getTime() - requestStartTime),
570
- timeLeft = (settings.loadingDuration - elapsedTime)
571
- ;
572
- timeLeft = (timeLeft > 0)
573
- ? timeLeft
574
- : 0
575
- ;
576
- if(timeLeft > 0) {
577
- module.debug('Response completed early delaying state change by', timeLeft);
578
- }
579
- setTimeout(function() {
580
- if( module.is.abortedRequest(xhr) ) {
581
- module.request.rejectWith(context, [xhr, 'aborted', httpMessage]);
582
- }
583
- else {
584
- module.request.rejectWith(context, [xhr, 'error', status, httpMessage]);
585
- }
586
- }, timeLeft);
587
- }
588
- },
589
- request: {
590
- done: function(response, xhr) {
591
- module.debug('Successful API Response', response);
592
- if(settings.cache === 'local' && url) {
593
- module.write.cachedResponse(url, response);
594
- module.debug('Saving server response locally', module.cache);
595
- }
596
- settings.onSuccess.call(context, response, $module, xhr);
597
- },
598
- complete: function(firstParameter, secondParameter) {
599
- var
600
- xhr,
601
- response
602
- ;
603
- // have to guess callback parameters based on request success
604
- if( module.was.successful() ) {
605
- response = firstParameter;
606
- xhr = secondParameter;
607
- }
608
- else {
609
- xhr = firstParameter;
610
- response = module.get.responseFromXHR(xhr);
611
- }
612
- module.remove.loading();
613
- settings.onComplete.call(context, response, $module, xhr);
614
- },
615
- fail: function(xhr, status, httpMessage) {
616
- var
617
- // pull response from xhr if available
618
- response = module.get.responseFromXHR(xhr),
619
- errorMessage = module.get.errorFromRequest(response, status, httpMessage)
620
- ;
621
- if(status == 'aborted') {
622
- module.debug('XHR Aborted (Most likely caused by page navigation or CORS Policy)', status, httpMessage);
623
- settings.onAbort.call(context, status, $module, xhr);
624
- return true;
625
- }
626
- else if(status == 'invalid') {
627
- module.debug('JSON did not pass success test. A server-side error has most likely occurred', response);
628
- }
629
- else if(status == 'error') {
630
- if(xhr !== undefined) {
631
- module.debug('XHR produced a server error', status, httpMessage);
632
- // make sure we have an error to display to console
633
- if( (xhr.status < 200 || xhr.status >= 300) && httpMessage !== undefined && httpMessage !== '') {
634
- module.error(error.statusMessage + httpMessage, ajaxSettings.url);
635
- }
636
- settings.onError.call(context, errorMessage, $module, xhr);
637
- }
638
- }
1068
+ name: 'API',
1069
+ namespace: 'api',
639
1070
 
640
- if(settings.errorDuration && status !== 'aborted') {
641
- module.debug('Adding error state');
642
- module.set.error();
643
- if( module.should.removeError() ) {
644
- setTimeout(module.remove.error, settings.errorDuration);
645
- }
646
- }
647
- module.debug('API Request failed', errorMessage, xhr);
648
- settings.onFailure.call(context, response, $module, xhr);
649
- }
650
- }
651
- },
1071
+ debug: false,
1072
+ verbose: false,
1073
+ performance: true,
652
1074
 
653
- create: {
1075
+ // object containing all templates endpoints
1076
+ api: {},
654
1077
 
655
- request: function() {
656
- // api request promise
657
- return $.Deferred()
658
- .always(module.event.request.complete)
659
- .done(module.event.request.done)
660
- .fail(module.event.request.fail)
661
- ;
662
- },
1078
+ // whether to cache responses
1079
+ cache: true,
663
1080
 
664
- mockedXHR: function () {
665
- var
666
- // xhr does not simulate these properties of xhr but must return them
667
- textStatus = false,
668
- status = false,
669
- httpMessage = false,
670
- responder = settings.mockResponse || settings.response,
671
- asyncResponder = settings.mockResponseAsync || settings.responseAsync,
672
- asyncCallback,
673
- response,
674
- mockedXHR
675
- ;
1081
+ // whether new requests should abort previous requests
1082
+ interruptRequests: true,
676
1083
 
677
- mockedXHR = $.Deferred()
678
- .always(module.event.xhr.complete)
679
- .done(module.event.xhr.done)
680
- .fail(module.event.xhr.fail)
681
- ;
1084
+ // event binding
1085
+ on: 'auto',
682
1086
 
683
- if(responder) {
684
- if( $.isFunction(responder) ) {
685
- module.debug('Using specified synchronous callback', responder);
686
- response = responder.call(context, requestSettings);
687
- }
688
- else {
689
- module.debug('Using settings specified response', responder);
690
- response = responder;
691
- }
692
- // simulating response
693
- mockedXHR.resolveWith(context, [ response, textStatus, { responseText: response }]);
694
- }
695
- else if( $.isFunction(asyncResponder) ) {
696
- asyncCallback = function(response) {
697
- module.debug('Async callback returned response', response);
1087
+ // context for applying state classes
1088
+ stateContext: false,
698
1089
 
699
- if(response) {
700
- mockedXHR.resolveWith(context, [ response, textStatus, { responseText: response }]);
701
- }
702
- else {
703
- mockedXHR.rejectWith(context, [{ responseText: response }, status, httpMessage]);
704
- }
705
- };
706
- module.debug('Using specified async response callback', asyncResponder);
707
- asyncResponder.call(context, requestSettings, asyncCallback);
708
- }
709
- return mockedXHR;
710
- },
1090
+ // duration for loading state
1091
+ loadingDuration: 0,
711
1092
 
712
- xhr: function() {
713
- var
714
- xhr
715
- ;
716
- // ajax request promise
717
- xhr = $.ajax(ajaxSettings)
718
- .always(module.event.xhr.always)
719
- .done(module.event.xhr.done)
720
- .fail(module.event.xhr.fail)
721
- ;
722
- module.verbose('Created server request', xhr, ajaxSettings);
723
- return xhr;
724
- }
725
- },
1093
+ // whether to hide errors after a period of time
1094
+ hideError: 'auto',
726
1095
 
727
- set: {
728
- error: function() {
729
- module.verbose('Adding error state to element', $context);
730
- $context.addClass(className.error);
731
- },
732
- loading: function() {
733
- module.verbose('Adding loading state to element', $context);
734
- $context.addClass(className.loading);
735
- requestStartTime = new Date().getTime();
736
- }
737
- },
1096
+ // duration for error state
1097
+ errorDuration: 2000,
738
1098
 
739
- remove: {
740
- error: function() {
741
- module.verbose('Removing error state from element', $context);
742
- $context.removeClass(className.error);
743
- },
744
- loading: function() {
745
- module.verbose('Removing loading state from element', $context);
746
- $context.removeClass(className.loading);
747
- }
748
- },
1099
+ // whether parameters should be encoded with encodeURIComponent
1100
+ encodeParameters: true,
749
1101
 
750
- get: {
751
- normalizedData: function(){
752
- return typeof settings.data === "string" ? settings.data : JSON.stringify(settings.data, Object.keys(settings.data).sort());
753
- },
754
- responseFromXHR: function(xhr) {
755
- return $.isPlainObject(xhr)
756
- ? (module.is.expectingJSON())
757
- ? module.decode.json(xhr.responseText)
758
- : xhr.responseText
759
- : false
760
- ;
761
- },
762
- errorFromRequest: function(response, status, httpMessage) {
763
- return ($.isPlainObject(response) && response.error !== undefined)
764
- ? response.error // use json error message
765
- : (settings.error[status] !== undefined) // use server error message
766
- ? settings.error[status]
767
- : httpMessage
768
- ;
769
- },
770
- request: function() {
771
- return module.request || false;
772
- },
773
- xhr: function() {
774
- return module.xhr || false;
775
- },
776
- settings: function() {
777
- var
778
- runSettings
779
- ;
780
- runSettings = settings.beforeSend.call($module, settings);
781
- if(runSettings) {
782
- if(runSettings.success !== undefined) {
783
- module.debug('Legacy success callback detected', runSettings);
784
- module.error(error.legacyParameters, runSettings.success);
785
- runSettings.onSuccess = runSettings.success;
786
- }
787
- if(runSettings.failure !== undefined) {
788
- module.debug('Legacy failure callback detected', runSettings);
789
- module.error(error.legacyParameters, runSettings.failure);
790
- runSettings.onFailure = runSettings.failure;
791
- }
792
- if(runSettings.complete !== undefined) {
793
- module.debug('Legacy complete callback detected', runSettings);
794
- module.error(error.legacyParameters, runSettings.complete);
795
- runSettings.onComplete = runSettings.complete;
796
- }
797
- }
798
- if(runSettings === undefined) {
799
- module.error(error.noReturnedValue);
800
- }
801
- if(runSettings === false) {
802
- return runSettings;
803
- }
804
- return (runSettings !== undefined)
805
- ? $.extend(true, {}, runSettings)
806
- : $.extend(true, {}, settings)
807
- ;
808
- },
809
- urlEncodedValue: function(value) {
810
- var
811
- decodedValue = window.decodeURIComponent(value),
812
- encodedValue = window.encodeURIComponent(value),
813
- alreadyEncoded = (decodedValue !== value)
814
- ;
815
- if(alreadyEncoded) {
816
- module.debug('URL value is already encoded, avoiding double encoding', value);
817
- return value;
818
- }
819
- module.verbose('Encoding value using encodeURIComponent', value, encodedValue);
820
- return encodedValue;
821
- },
822
- defaultData: function() {
823
- var
824
- data = {}
825
- ;
826
- if( !$.isWindow(element) ) {
827
- if( module.is.input() ) {
828
- data.value = $module.val();
829
- }
830
- else if( module.is.form() ) {
831
-
832
- }
833
- else {
834
- data.text = $module.text();
835
- }
836
- }
837
- return data;
838
- },
839
- event: function() {
840
- if( $.isWindow(element) || settings.on == 'now' ) {
841
- module.debug('API called without element, no events attached');
842
- return false;
843
- }
844
- else if(settings.on == 'auto') {
845
- if( $module.is('input') ) {
846
- return (element.oninput !== undefined)
847
- ? 'input'
848
- : (element.onpropertychange !== undefined)
849
- ? 'propertychange'
850
- : 'keyup'
851
- ;
852
- }
853
- else if( $module.is('form') ) {
854
- return 'submit';
855
- }
856
- else {
857
- return 'click';
858
- }
859
- }
860
- else {
861
- return settings.on;
862
- }
863
- },
864
- templatedURL: function(action) {
865
- action = action || $module.data(metadata.action) || settings.action || false;
866
- url = $module.data(metadata.url) || settings.url || false;
867
- if(url) {
868
- module.debug('Using specified url', url);
869
- return url;
870
- }
871
- if(action) {
872
- module.debug('Looking up url for action', action, settings.api);
873
- if(settings.api[action] === undefined && !module.is.mocked()) {
874
- module.error(error.missingAction, settings.action, settings.api);
875
- return;
876
- }
877
- url = settings.api[action];
878
- }
879
- else if( module.is.form() ) {
880
- url = $module.attr('action') || $context.attr('action') || false;
881
- module.debug('No url or action specified, defaulting to form action', url);
882
- }
883
- return url;
884
- }
885
- },
1102
+ // API action to use
1103
+ action: false,
886
1104
 
887
- abort: function() {
888
- var
889
- xhr = module.get.xhr()
890
- ;
891
- if( xhr && xhr.state() !== 'resolved') {
892
- module.debug('Cancelling API request');
893
- xhr.abort();
894
- }
895
- },
1105
+ // templated URL to use
1106
+ url: false,
896
1107
 
897
- // reset state
898
- reset: function() {
899
- module.remove.error();
900
- module.remove.loading();
901
- },
1108
+ // base URL to apply to all endpoints
1109
+ base: '',
902
1110
 
903
- setting: function(name, value) {
904
- module.debug('Changing setting', name, value);
905
- if( $.isPlainObject(name) ) {
906
- $.extend(true, settings, name);
907
- }
908
- else if(value !== undefined) {
909
- if($.isPlainObject(settings[name])) {
910
- $.extend(true, settings[name], value);
911
- }
912
- else {
913
- settings[name] = value;
914
- }
915
- }
916
- else {
917
- return settings[name];
918
- }
919
- },
920
- internal: function(name, value) {
921
- if( $.isPlainObject(name) ) {
922
- $.extend(true, module, name);
923
- }
924
- else if(value !== undefined) {
925
- module[name] = value;
926
- }
927
- else {
928
- return module[name];
929
- }
930
- },
931
- debug: function() {
932
- if(!settings.silent && settings.debug) {
933
- if(settings.performance) {
934
- module.performance.log(arguments);
935
- }
936
- else {
937
- module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');
938
- module.debug.apply(console, arguments);
939
- }
940
- }
941
- },
942
- verbose: function() {
943
- if(!settings.silent && settings.verbose && settings.debug) {
944
- if(settings.performance) {
945
- module.performance.log(arguments);
946
- }
947
- else {
948
- module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');
949
- module.verbose.apply(console, arguments);
950
- }
951
- }
952
- },
953
- error: function() {
954
- if(!settings.silent) {
955
- module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');
956
- module.error.apply(console, arguments);
957
- }
958
- },
959
- performance: {
960
- log: function(message) {
961
- var
962
- currentTime,
963
- executionTime,
964
- previousTime
965
- ;
966
- if(settings.performance) {
967
- currentTime = new Date().getTime();
968
- previousTime = time || currentTime;
969
- executionTime = currentTime - previousTime;
970
- time = currentTime;
971
- performance.push({
972
- 'Name' : message[0],
973
- 'Arguments' : [].slice.call(message, 1) || '',
974
- //'Element' : element,
975
- 'Execution Time' : executionTime
976
- });
977
- }
978
- clearTimeout(module.performance.timer);
979
- module.performance.timer = setTimeout(module.performance.display, 500);
980
- },
981
- display: function() {
982
- var
983
- title = settings.name + ':',
984
- totalTime = 0
985
- ;
986
- time = false;
987
- clearTimeout(module.performance.timer);
988
- $.each(performance, function(index, data) {
989
- totalTime += data['Execution Time'];
990
- });
991
- title += ' ' + totalTime + 'ms';
992
- if(moduleSelector) {
993
- title += ' \'' + moduleSelector + '\'';
994
- }
995
- if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {
996
- console.groupCollapsed(title);
997
- if(console.table) {
998
- console.table(performance);
999
- }
1000
- else {
1001
- $.each(performance, function(index, data) {
1002
- console.log(data['Name'] + ': ' + data['Execution Time']+'ms');
1003
- });
1004
- }
1005
- console.groupEnd();
1006
- }
1007
- performance = [];
1008
- }
1009
- },
1010
- invoke: function(query, passedArguments, context) {
1011
- var
1012
- object = instance,
1013
- maxDepth,
1014
- found,
1015
- response
1016
- ;
1017
- passedArguments = passedArguments || queryArguments;
1018
- context = context || element;
1019
- if(typeof query == 'string' && object !== undefined) {
1020
- query = query.split(/[\. ]/);
1021
- maxDepth = query.length - 1;
1022
- $.each(query, function(depth, value) {
1023
- var camelCaseValue = (depth != maxDepth)
1024
- ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)
1025
- : query
1026
- ;
1027
- if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {
1028
- object = object[camelCaseValue];
1029
- }
1030
- else if( object[camelCaseValue] !== undefined ) {
1031
- found = object[camelCaseValue];
1032
- return false;
1033
- }
1034
- else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {
1035
- object = object[value];
1036
- }
1037
- else if( object[value] !== undefined ) {
1038
- found = object[value];
1039
- return false;
1040
- }
1041
- else {
1042
- module.error(error.method, query);
1043
- return false;
1044
- }
1045
- });
1046
- }
1047
- if ( $.isFunction( found ) ) {
1048
- response = found.apply(context, passedArguments);
1049
- }
1050
- else if(found !== undefined) {
1051
- response = found;
1052
- }
1053
- if(Array.isArray(returnedValue)) {
1054
- returnedValue.push(response);
1055
- }
1056
- else if(returnedValue !== undefined) {
1057
- returnedValue = [returnedValue, response];
1058
- }
1059
- else if(response !== undefined) {
1060
- returnedValue = response;
1061
- }
1062
- return found;
1063
- }
1064
- };
1065
-
1066
- if(methodInvoked) {
1067
- if(instance === undefined) {
1068
- module.initialize();
1069
- }
1070
- module.invoke(query);
1071
- }
1072
- else {
1073
- if(instance !== undefined) {
1074
- instance.invoke('destroy');
1075
- }
1076
- module.initialize();
1077
- }
1078
- })
1079
- ;
1080
-
1081
- return (returnedValue !== undefined)
1082
- ? returnedValue
1083
- : this
1084
- ;
1085
- };
1086
-
1087
- $.api.settings = {
1088
-
1089
- name : 'API',
1090
- namespace : 'api',
1091
-
1092
- debug : false,
1093
- verbose : false,
1094
- performance : true,
1095
-
1096
- // object containing all templates endpoints
1097
- api : {},
1098
-
1099
- // whether to cache responses
1100
- cache : true,
1101
-
1102
- // whether new requests should abort previous requests
1103
- interruptRequests : true,
1104
-
1105
- // event binding
1106
- on : 'auto',
1107
-
1108
- // context for applying state classes
1109
- stateContext : false,
1110
-
1111
- // duration for loading state
1112
- loadingDuration : 0,
1113
-
1114
- // whether to hide errors after a period of time
1115
- hideError : 'auto',
1116
-
1117
- // duration for error state
1118
- errorDuration : 2000,
1119
-
1120
- // whether parameters should be encoded with encodeURIComponent
1121
- encodeParameters : true,
1122
-
1123
- // API action to use
1124
- action : false,
1125
-
1126
- // templated URL to use
1127
- url : false,
1128
-
1129
- // base URL to apply to all endpoints
1130
- base : '',
1131
-
1132
- // data that will
1133
- urlData : {},
1134
-
1135
- // whether to add default data to url data
1136
- defaultData : true,
1137
-
1138
- // whether to serialize closest form
1139
- // use true to convert complex named keys like a[b][1][c][] into a nested object
1140
- // use 'formdata' for formdata web api
1141
- serializeForm : false,
1142
-
1143
- // how long to wait before request should occur
1144
- throttle : 0,
1145
-
1146
- // whether to throttle first request or only repeated
1147
- throttleFirstRequest : true,
1148
-
1149
- // standard ajax settings
1150
- method : 'get',
1151
- data : {},
1152
- dataType : 'json',
1153
-
1154
- // mock response
1155
- mockResponse : false,
1156
- mockResponseAsync : false,
1157
-
1158
- // aliases for mock
1159
- response : false,
1160
- responseAsync : false,
1161
-
1162
- // whether onResponse should work with response value without force converting into an object
1163
- rawResponse : true,
1164
-
1165
- // callbacks before request
1166
- beforeSend : function(settings) { return settings; },
1167
- beforeXHR : function(xhr) {},
1168
- onRequest : function(promise, xhr) {},
1169
-
1170
- // after request
1171
- onResponse : false, // function(response) { },
1111
+ // data that will
1112
+ urlData: {},
1172
1113
 
1173
- // response was successful, if JSON passed validation
1174
- onSuccess : function(response, $module) {},
1114
+ // whether to add default data to url data
1115
+ defaultData: true,
1175
1116
 
1176
- // request finished without aborting
1177
- onComplete : function(response, $module) {},
1117
+ // whether to serialize closest form
1118
+ // use true to convert complex named keys like a[b][1][c][] into a nested object
1119
+ // use 'formdata' for formdata web api
1120
+ serializeForm: false,
1178
1121
 
1179
- // failed JSON success test
1180
- onFailure : function(response, $module) {},
1122
+ // how long to wait before request should occur
1123
+ throttle: 0,
1181
1124
 
1182
- // server error
1183
- onError : function(errorMessage, $module) {},
1125
+ // whether to throttle first request or only repeated
1126
+ throttleFirstRequest: true,
1184
1127
 
1185
- // request aborted
1186
- onAbort : function(errorMessage, $module) {},
1128
+ // standard ajax settings
1129
+ method: 'get',
1130
+ data: {},
1131
+ dataType: 'json',
1187
1132
 
1188
- successTest : false,
1133
+ // mock response
1134
+ mockResponse: false,
1135
+ mockResponseAsync: false,
1189
1136
 
1190
- // errors
1191
- error : {
1192
- beforeSend : 'The before send function has aborted the request',
1193
- error : 'There was an error with your request',
1194
- exitConditions : 'API Request Aborted. Exit conditions met',
1195
- JSONParse : 'JSON could not be parsed during error handling',
1196
- legacyParameters : 'You are using legacy API success callback names',
1197
- method : 'The method you called is not defined',
1198
- missingAction : 'API action used but no url was defined',
1199
- missingURL : 'No URL specified for api event',
1200
- noReturnedValue : 'The beforeSend callback must return a settings object, beforeSend ignored.',
1201
- noStorage : 'Caching responses locally requires session storage',
1202
- parseError : 'There was an error parsing your request',
1203
- requiredParameter : 'Missing a required URL parameter: ',
1204
- statusMessage : 'Server gave an error: ',
1205
- timeout : 'Your request timed out'
1206
- },
1137
+ // aliases for mock
1138
+ response: false,
1139
+ responseAsync: false,
1207
1140
 
1208
- regExp : {
1209
- required : /\{\$*[a-z0-9]+\}/gi,
1210
- optional : /\{\/\$*[a-z0-9]+\}/gi,
1211
- validate: /^[a-z_][a-z0-9_-]*(?:\[[a-z0-9_-]*\])*$/i,
1212
- key: /[a-z0-9_-]+|(?=\[\])/gi,
1213
- push: /^$/,
1214
- fixed: /^\d+$/,
1215
- named: /^[a-z0-9_-]+$/i
1216
- },
1217
-
1218
- className: {
1219
- loading : 'loading',
1220
- error : 'error'
1221
- },
1141
+ // whether onResponse should work with response value without force converting into an object
1142
+ rawResponse: true,
1222
1143
 
1223
- selector: {
1224
- disabled : '.disabled',
1225
- form : 'form'
1226
- },
1227
-
1228
- metadata: {
1229
- action : 'action',
1230
- url : 'url'
1231
- }
1232
- };
1233
-
1234
-
1235
-
1236
- })( jQuery, window, document );
1144
+ // callbacks before request
1145
+ beforeSend: function (settings) {
1146
+ return settings;
1147
+ },
1148
+ beforeXHR: function (xhr) {},
1149
+ onRequest: function (promise, xhr) {},
1150
+
1151
+ // after request
1152
+ onResponse: false, // function(response) { },
1153
+
1154
+ // response was successful, if JSON passed validation
1155
+ onSuccess: function (response, $module) {},
1156
+
1157
+ // request finished without aborting
1158
+ onComplete: function (response, $module) {},
1159
+
1160
+ // failed JSON success test
1161
+ onFailure: function (response, $module) {},
1162
+
1163
+ // server error
1164
+ onError: function (errorMessage, $module) {},
1165
+
1166
+ // request aborted
1167
+ onAbort: function (errorMessage, $module) {},
1168
+
1169
+ successTest: false,
1170
+
1171
+ // errors
1172
+ error: {
1173
+ beforeSend: 'The before send function has aborted the request',
1174
+ error: 'There was an error with your request',
1175
+ exitConditions: 'API Request Aborted. Exit conditions met',
1176
+ JSONParse: 'JSON could not be parsed during error handling',
1177
+ legacyParameters: 'You are using legacy API success callback names',
1178
+ method: 'The method you called is not defined',
1179
+ missingAction: 'API action used but no url was defined',
1180
+ missingURL: 'No URL specified for api event',
1181
+ noReturnedValue: 'The beforeSend callback must return a settings object, beforeSend ignored.',
1182
+ noStorage: 'Caching responses locally requires session storage',
1183
+ parseError: 'There was an error parsing your request',
1184
+ requiredParameter: 'Missing a required URL parameter: ',
1185
+ statusMessage: 'Server gave an error: ',
1186
+ timeout: 'Your request timed out',
1187
+ },
1188
+
1189
+ regExp: {
1190
+ required: /{\$*[\da-z]+}/gi,
1191
+ optional: /{\/\$*[\da-z]+}/gi,
1192
+ validate: /^[_a-z][\w-]*(?:\[[\w-]*])*$/i,
1193
+ key: /[\w-]+|(?=\[])/gi,
1194
+ push: /^$/,
1195
+ fixed: /^\d+$/,
1196
+ named: /^[\w-]+$/i,
1197
+ },
1198
+
1199
+ className: {
1200
+ loading: 'loading',
1201
+ error: 'error',
1202
+ },
1203
+
1204
+ selector: {
1205
+ disabled: '.disabled',
1206
+ form: 'form',
1207
+ },
1208
+
1209
+ metadata: {
1210
+ action: 'action',
1211
+ url: 'url',
1212
+ },
1213
+ };
1214
+ })(jQuery, window, document);