ravnur-player-public 3.4.2 → 3.4.4

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 (262) hide show
  1. package/.eslintignore +7 -0
  2. package/.eslintrc.js +206 -0
  3. package/.flowconfig +3 -0
  4. package/.vscode/extensions.json +7 -0
  5. package/.vscode/launch.json +37 -0
  6. package/.vscode/settings.json +4 -0
  7. package/README-Private.md +54 -0
  8. package/babel.config.js +28 -0
  9. package/bitbucket-pipelines.yml +61 -0
  10. package/cert.pem +23 -0
  11. package/demo/BaseM.mp4 +0 -0
  12. package/demo/HD.mp4 +0 -0
  13. package/demo/annotations.json +50 -0
  14. package/demo/annotations_ge.json +50 -0
  15. package/demo/base.mp3 +0 -0
  16. package/demo/cc_2125en.vtt +4958 -0
  17. package/demo/cc_en.vtt +171 -0
  18. package/demo/cc_ge.vtt +178 -0
  19. package/demo/chapters_en.vtt +38 -0
  20. package/demo/chapters_ge.vtt +5 -0
  21. package/demo/chapters_ge1.json +23 -0
  22. package/demo/hls/audio/stereo/en/128kbit.m3u8 +912 -0
  23. package/demo/hls/audio/stereo/none/128kbit.m3u8 +912 -0
  24. package/demo/hls/audio/surround/en/320kbit.m3u8 +912 -0
  25. package/demo/hls/playlist.m3u8 +31 -0
  26. package/demo/hls/video/10000kbit.m3u8 +894 -0
  27. package/demo/hls/video/1100kbit.m3u8 +894 -0
  28. package/demo/hls/video/1500kbit.m3u8 +894 -0
  29. package/demo/hls/video/250kbit.m3u8 +894 -0
  30. package/demo/hls/video/4000kbit.m3u8 +894 -0
  31. package/demo/hls/video/500kbit.m3u8 +894 -0
  32. package/demo/hls/video/6000kbit.m3u8 +894 -0
  33. package/demo/hls/video/800kbit.m3u8 +894 -0
  34. package/demo/hls.js +5 -0
  35. package/demo/hls.js.map +1 -0
  36. package/demo/hls.min.js +2 -0
  37. package/demo/hls.min.js.map +1 -0
  38. package/demo/playlist.m3u8 +31 -0
  39. package/demo/ravnur-flash-audio.swf +0 -0
  40. package/demo/ravnur-flash-video-hls.swf +0 -0
  41. package/demo/ravnur-flash-video.swf +0 -0
  42. package/demo/shaka/shaka-player.foo.debug.d.ts +4532 -0
  43. package/demo/shaka/shaka-player.foo.debug.externs.js +3886 -0
  44. package/demo/shaka/shaka-player.foo.debug.js +1746 -0
  45. package/demo/shaka/shaka-player.foo.debug.map +8 -0
  46. package/demo/shaka/wrapper.js +7 -0
  47. package/demo/test.html +458 -0
  48. package/dist/RavnurMediaPlayer.min.js +1 -1
  49. package/dist/cdn/RavnurMediaPlayer.min.js +1 -1
  50. package/jest.config.js +4 -0
  51. package/key.pem +27 -0
  52. package/lib/es5.js +344 -0
  53. package/lib/images/Spinner-small.gif +0 -0
  54. package/lib/images/close.png +0 -0
  55. package/lib/images/ic_check_box_black_24dp_1x.png +0 -0
  56. package/lib/images/ic_check_box_outline_blank_black_24dp_1x.png +0 -0
  57. package/lib/images/ic_chevron_left_white_24dp_1x.png +0 -0
  58. package/lib/images/ic_chevron_right_white_24dp_1x.png +0 -0
  59. package/lib/images/ic_closed_caption_white_24dp_1x.png +0 -0
  60. package/lib/images/ic_fast_forward_white_24dp_1x.png +0 -0
  61. package/lib/images/ic_fast_rewind_white_24dp_1x.png +0 -0
  62. package/lib/images/ic_fullscreen_exit_white_24dp_1x.png +0 -0
  63. package/lib/images/ic_fullscreen_white_24dp_1x.png +0 -0
  64. package/lib/images/ic_hd_white_24dp_1x.png +0 -0
  65. package/lib/images/ic_keyboard_arrow_left_black_24dp_1x.png +0 -0
  66. package/lib/images/ic_keyboard_arrow_right_black_24dp_1x.png +0 -0
  67. package/lib/images/ic_pause_white_24dp_1x.png +0 -0
  68. package/lib/images/ic_photo_white_24dp_1x.png +0 -0
  69. package/lib/images/ic_play_arrow_white_24dp_1x.png +0 -0
  70. package/lib/images/ic_refresh_white_24dp_1x.png +0 -0
  71. package/lib/images/ic_settings_white_24dp_1x.png +0 -0
  72. package/lib/images/ic_skip_next_white_24dp_1x.png +0 -0
  73. package/lib/images/ic_skip_previous_white_24dp_1x.png +0 -0
  74. package/lib/images/ic_toc_white_24dp_1x.png +0 -0
  75. package/lib/images/ic_volume_off_white_24dp_1x.png +0 -0
  76. package/lib/images/ic_volume_up_white_24dp_1x.png +0 -0
  77. package/lib/player4ie8.css +225 -0
  78. package/package.json +1 -5
  79. package/server.js +29 -0
  80. package/src/config/cc.js +56 -0
  81. package/src/config/i18n.js +101 -0
  82. package/src/config/options.js +123 -0
  83. package/src/config/playlist.js +9 -0
  84. package/src/config/source.js +23 -0
  85. package/src/config/statuses.js +8 -0
  86. package/src/config/styles.js +16 -0
  87. package/src/entity.js +27 -0
  88. package/src/events.js +5 -0
  89. package/src/extensions/annotations.js +142 -0
  90. package/src/extensions/audio-tarcks.js +115 -0
  91. package/src/extensions/backward.js +45 -0
  92. package/src/extensions/base.js +73 -0
  93. package/src/extensions/bottom-next.js +50 -0
  94. package/src/extensions/bottom-prev.js +50 -0
  95. package/src/extensions/buffering.js +78 -0
  96. package/src/extensions/c2pa.js +350 -0
  97. package/src/extensions/caption-search.js +230 -0
  98. package/src/extensions/cc.js +874 -0
  99. package/src/extensions/crawl.js +118 -0
  100. package/src/extensions/download.js +411 -0
  101. package/src/extensions/error.js +47 -0
  102. package/src/extensions/forward.js +44 -0
  103. package/src/extensions/fullscreen.js +84 -0
  104. package/src/extensions/help.js +201 -0
  105. package/src/extensions/helpers/FileSaver.js +157 -0
  106. package/src/extensions/helpers/clickOpener.js +180 -0
  107. package/src/extensions/helpers/opener.js +30 -0
  108. package/src/extensions/helpers/openerHeightChecker.js +13 -0
  109. package/src/extensions/helpers/popover.js +33 -0
  110. package/src/extensions/helpers/popoverPosition.js +30 -0
  111. package/src/extensions/helpers/scrollIntoView.js +9 -0
  112. package/src/extensions/helpers/storage.js +20 -0
  113. package/src/extensions/helpers/textContent.js +6 -0
  114. package/src/extensions/helpers/timeCodeToSeconds.js +44 -0
  115. package/src/extensions/helpers/transport.js +43 -0
  116. package/src/extensions/helpers/vtt-loader.js +42 -0
  117. package/src/extensions/index.js +87 -0
  118. package/src/extensions/live.js +76 -0
  119. package/src/extensions/mux.js +57 -0
  120. package/src/extensions/next-frame.js +44 -0
  121. package/src/extensions/next.js +48 -0
  122. package/src/extensions/placeholder.js +241 -0
  123. package/src/extensions/play.js +102 -0
  124. package/src/extensions/poster.js +47 -0
  125. package/src/extensions/prev-frame.js +44 -0
  126. package/src/extensions/prev.js +48 -0
  127. package/src/extensions/progress.js +465 -0
  128. package/src/extensions/resizer.js +37 -0
  129. package/src/extensions/settings.js +367 -0
  130. package/src/extensions/theater.js +56 -0
  131. package/src/extensions/title.js +38 -0
  132. package/src/extensions/toc.js +334 -0
  133. package/src/extensions/volume.js +196 -0
  134. package/src/flash/FlashPlugin.js +301 -0
  135. package/src/flash/MediaElement.js +361 -0
  136. package/src/flash/plugins.js +32 -0
  137. package/src/flash-detector.js +66 -0
  138. package/src/helpers/$t.js +10 -0
  139. package/src/helpers/binder.js +11 -0
  140. package/src/helpers/isAndroid.js +5 -0
  141. package/src/helpers/isBlackBerry.js +5 -0
  142. package/src/helpers/isCanvasSupported.js +6 -0
  143. package/src/helpers/isIE.js +21 -0
  144. package/src/helpers/isMobile.js +10 -0
  145. package/src/helpers/isWindows.js +5 -0
  146. package/src/helpers/isWindowsPhone.js +5 -0
  147. package/src/helpers/isiOS.js +5 -0
  148. package/src/html5media.js +19 -0
  149. package/src/index.js +2 -0
  150. package/src/logger.js +31 -0
  151. package/src/microevent.js +65 -0
  152. package/src/normalize-options.js +139 -0
  153. package/src/player.js +864 -0
  154. package/src/players/base.js +209 -0
  155. package/src/players/flash.js +172 -0
  156. package/src/players/hls.js +278 -0
  157. package/src/players/html.js +205 -0
  158. package/src/players/index.js +59 -0
  159. package/src/players/shaka.js +219 -0
  160. package/src/playlist.js +362 -0
  161. package/src/screenfull.js +121 -0
  162. package/src/state.js +474 -0
  163. package/src/static/es5.js +344 -0
  164. package/src/static/images/Spinner-small.gif +0 -0
  165. package/src/static/images/close.png +0 -0
  166. package/src/static/images/ic_check_box_black_24dp_1x.png +0 -0
  167. package/src/static/images/ic_check_box_outline_blank_black_24dp_1x.png +0 -0
  168. package/src/static/images/ic_chevron_left_white_24dp_1x.png +0 -0
  169. package/src/static/images/ic_chevron_right_white_24dp_1x.png +0 -0
  170. package/src/static/images/ic_closed_caption_white_24dp_1x.png +0 -0
  171. package/src/static/images/ic_fast_forward_white_24dp_1x.png +0 -0
  172. package/src/static/images/ic_fast_rewind_white_24dp_1x.png +0 -0
  173. package/src/static/images/ic_fullscreen_exit_white_24dp_1x.png +0 -0
  174. package/src/static/images/ic_fullscreen_white_24dp_1x.png +0 -0
  175. package/src/static/images/ic_hd_white_24dp_1x.png +0 -0
  176. package/src/static/images/ic_keyboard_arrow_left_black_24dp_1x.png +0 -0
  177. package/src/static/images/ic_keyboard_arrow_right_black_24dp_1x.png +0 -0
  178. package/src/static/images/ic_pause_white_24dp_1x.png +0 -0
  179. package/src/static/images/ic_play_arrow_white_24dp_1x.png +0 -0
  180. package/src/static/images/ic_refresh_white_24dp_1x.png +0 -0
  181. package/src/static/images/ic_settings_white_24dp_1x.png +0 -0
  182. package/src/static/images/ic_skip_next_white_24dp_1x.png +0 -0
  183. package/src/static/images/ic_skip_previous_white_24dp_1x.png +0 -0
  184. package/src/static/images/ic_toc_white_24dp_1x.png +0 -0
  185. package/src/static/images/ic_volume_off_white_24dp_1x.png +0 -0
  186. package/src/static/images/ic_volume_up_white_24dp_1x.png +0 -0
  187. package/src/static/player4ie8.css +225 -0
  188. package/src/styles/bplaylist.css.js +124 -0
  189. package/src/styles/index.js +1966 -0
  190. package/src/styles/playlist.css.js +84 -0
  191. package/src/styles/rplaylist.css.js +98 -0
  192. package/src/svgs.js +111 -0
  193. package/src/types/Logger.js +10 -0
  194. package/src/types/Options.js +179 -0
  195. package/src/types/Playlist.js +3 -0
  196. package/src/types/Source.js +28 -0
  197. package/src/types/State.js +46 -0
  198. package/src/types/Styles.js +11 -0
  199. package/src/types/TimeData.js +8 -0
  200. package/src/types/Translation.js +69 -0
  201. package/src/utils/absolutizeUrl.js +9 -0
  202. package/src/utils/addClass.js +9 -0
  203. package/src/utils/addEvent.js +31 -0
  204. package/src/utils/addProperty.js +65 -0
  205. package/src/utils/appendChild.js +14 -0
  206. package/src/utils/buff2hex.js +5 -0
  207. package/src/utils/contains.js +33 -0
  208. package/src/utils/createElement.js +24 -0
  209. package/src/utils/each.js +34 -0
  210. package/src/utils/escapeHTML.js +8 -0
  211. package/src/utils/existy.js +4 -0
  212. package/src/utils/extend.js +17 -0
  213. package/src/utils/filter.js +16 -0
  214. package/src/utils/find.js +11 -0
  215. package/src/utils/findIndex.js +20 -0
  216. package/src/utils/first.js +5 -0
  217. package/src/utils/get.js +19 -0
  218. package/src/utils/has.js +5 -0
  219. package/src/utils/hasClass.js +6 -0
  220. package/src/utils/head.js +11 -0
  221. package/src/utils/inRange.js +16 -0
  222. package/src/utils/index.js +73 -0
  223. package/src/utils/isArray.js +4 -0
  224. package/src/utils/isBoolean.js +3 -0
  225. package/src/utils/isElement.js +7 -0
  226. package/src/utils/isEmpty.js +6 -0
  227. package/src/utils/isEqual.js +33 -0
  228. package/src/utils/isEqualBuffer.js +13 -0
  229. package/src/utils/isFunction.js +3 -0
  230. package/src/utils/isNotEmpty.js +5 -0
  231. package/src/utils/isObject.js +5 -0
  232. package/src/utils/isString.js +9 -0
  233. package/src/utils/last.js +4 -0
  234. package/src/utils/map.js +11 -0
  235. package/src/utils/negate.js +8 -0
  236. package/src/utils/noop.js +1 -0
  237. package/src/utils/notExisty.js +5 -0
  238. package/src/utils/reduce.js +8 -0
  239. package/src/utils/remove.js +7 -0
  240. package/src/utils/removeClass.js +8 -0
  241. package/src/utils/removeEvent.js +7 -0
  242. package/src/utils/toArray.js +7 -0
  243. package/src/utils/toggleClass.js +16 -0
  244. package/src/utils/uidGenerator.js +8 -0
  245. package/src/utils/upperFirst.js +4 -0
  246. package/tests/extensions/__snapshots__/download.spec.js.snap +226 -0
  247. package/tests/extensions/__snapshots__/fullscreen.spec.js.snap +30 -0
  248. package/tests/extensions/__snapshots__/title.spec.js.snap +16 -0
  249. package/tests/extensions/download.spec.js +111 -0
  250. package/tests/extensions/fullscreen.spec.js +56 -0
  251. package/tests/extensions/title.spec.js +35 -0
  252. package/tests/mocks/assets/BaseM.mp4 +0 -0
  253. package/tests/mocks/assets/hls.min.js +5 -0
  254. package/tests/mocks/assets/styleMock.js +1 -0
  255. package/tests/mocks/base-player-options.js +47 -0
  256. package/tests/mocks/sources.js +58 -0
  257. package/tests/mocks/timedata/cc_en.vtt +171 -0
  258. package/tests/mocks/timedata/cc_ge.vtt +178 -0
  259. package/tests/utils/wait.js +1 -0
  260. package/webpack.config.js +78 -0
  261. package/dist/.DS_Store +0 -0
  262. package/dist/cdn/.DS_Store +0 -0
@@ -0,0 +1,9 @@
1
+ // @flow
2
+ import hasClass from './hasClass';
3
+
4
+ export default function addClass(element: HTMLElement, cls: string) {
5
+ if (hasClass(element, cls)) {
6
+ return;
7
+ }
8
+ element.className += ' ' + cls;
9
+ }
@@ -0,0 +1,31 @@
1
+ // add event cross browser
2
+ export default function addEvent(elem, event, fn, useCapture = false) {
3
+ if (elem.addEventListener) {
4
+ elem.addEventListener(event, listenHandler, useCapture);
5
+ return { elem, handler: listenHandler, event };
6
+ }
7
+ elem.attachEvent('on' + event, attachHandler);
8
+ return { elem, handler: attachHandler, event };
9
+
10
+ // avoid memory overhead of new anonymous functions for every event handler that's installed
11
+ // by using local functions
12
+ function listenHandler(e) {
13
+ var ret = fn.apply(elem, arguments);
14
+ if (ret === false) {
15
+ e.stopPropagation();
16
+ e.preventDefault();
17
+ }
18
+ return ret;
19
+ }
20
+
21
+ function attachHandler() {
22
+ // set the this pointer same as addEventListener when fn is called
23
+ // and make sure the event is passed to the fn also so that works the same too
24
+ var ret = fn.call(elem, window.event);
25
+ if (ret === false) {
26
+ window.event.returnValue = false;
27
+ window.event.cancelBubble = true;
28
+ }
29
+ return ret;
30
+ }
31
+ }
@@ -0,0 +1,65 @@
1
+ /**
2
+ * add property to object
3
+ *
4
+ * @param {Object} obj object
5
+ * @param {String} name name of property
6
+ * @param {Function} onGet get's function
7
+ * @param {Function} onSet set's function
8
+ * @returns {void}
9
+ */
10
+ export default function addProperty(obj, name, onGet, onSet) {
11
+
12
+ // wrapper functions
13
+ const
14
+ oldValue = obj[name],
15
+ getFn = () => onGet.apply(obj, [oldValue]),
16
+ setFn = newValue => onSet.apply(obj, [newValue]);
17
+
18
+ // Modern browsers, IE9+ (IE8 only works on DOM objects, not normal JS objects)
19
+ if (Object.defineProperty) {
20
+
21
+ Object.defineProperty(obj, name, {
22
+ get: getFn,
23
+ set: setFn
24
+ });
25
+
26
+ // Older Firefox
27
+ } else if (obj.__defineGetter__) {
28
+
29
+ obj.__defineGetter__(name, getFn);
30
+ obj.__defineSetter__(name, setFn);
31
+
32
+ // IE6-7
33
+ // must be a real DOM object (to have attachEvent) and must be attached to document (for onpropertychange to fire)
34
+ } else {
35
+
36
+ const onPropertyChange = (event) => {
37
+
38
+ if (event.propertyName === name) {
39
+
40
+ // temporarily remove the event so it doesn't fire again and create a loop
41
+ obj.detachEvent('onpropertychange', onPropertyChange);
42
+
43
+ // get the changed value, run it through the set function
44
+ setFn(obj[name]);
45
+
46
+ // restore the get function
47
+ obj[name] = getFn;
48
+ obj[name].toString = () => getFn().toString();
49
+
50
+ // restore the event
51
+ obj.attachEvent('onpropertychange', onPropertyChange);
52
+ }
53
+ };
54
+
55
+ try {
56
+ obj[name] = getFn;
57
+ obj[name].toString = () => getFn().toString();
58
+ } catch (ex) {
59
+ //
60
+ }
61
+
62
+ // add the property event change only once
63
+ obj.attachEvent('onpropertychange', onPropertyChange);
64
+ }
65
+ }
@@ -0,0 +1,14 @@
1
+ // @flow
2
+ import existy from './existy';
3
+ import isElement from './isElement';
4
+
5
+ /* Append child node */
6
+ export default function append(parent: Node, child: Node, before: ?Node) {
7
+ if (!parent) return;
8
+
9
+ if (existy(before) && isElement(before)) {
10
+ parent.insertBefore(child, before);
11
+ } else {
12
+ parent.appendChild(child);
13
+ }
14
+ }
@@ -0,0 +1,5 @@
1
+ export default function buf2hex(buffer) {
2
+ return [...new Uint8Array(buffer)]
3
+ .map(x => x.toString(16).padStart(2, '0'))
4
+ .join(' ');
5
+ }
@@ -0,0 +1,33 @@
1
+ import isString from './isString';
2
+ import isFunction from './isFunction';
3
+
4
+ /**
5
+ * check if item contains in some array
6
+ *
7
+ * @export
8
+ * @param {Array|String} etalon array
9
+ * @param {Function|String} cond condition
10
+ * @returns {Boolean} `true` if item contains in array
11
+ */
12
+ export default function contains(etalon, cond) {
13
+ if (isString(etalon) && isString(cond)) {
14
+ return _containsInString(etalon, cond);
15
+ }
16
+ const condFnc = isFunction(cond) ? cond : obj => obj === cond;
17
+ return _containsInArray(etalon, condFnc);
18
+ }
19
+
20
+ function _containsInString(string, substring) {
21
+ // eslint-disable-next-line no-magic-numbers
22
+ return string.indexOf(substring) > -1;
23
+ }
24
+
25
+ function _containsInArray(array, cond) {
26
+ for (let i = 0; i < array.length; i++) {
27
+ if (cond(array[i])) {
28
+ return true;
29
+ }
30
+ }
31
+
32
+ return false;
33
+ }
@@ -0,0 +1,24 @@
1
+ import each from './each';
2
+ import append from './appendChild';
3
+ import isElement from './isElement';
4
+ import existy from './existy';
5
+
6
+ export default function createElement(tagName, props = {}, parent = null, namespace = 'http://www.w3.org/1999/xhtml') {
7
+
8
+ let el;
9
+ if ( existy(document.createElementNS) ) {
10
+ el = document.createElementNS(namespace, tagName);
11
+ } else {
12
+ el = document.createElement(tagName);
13
+ }
14
+
15
+ each(props, (val, key) => {
16
+ el.setAttribute(key, val);
17
+ });
18
+
19
+ if ( existy(parent) && isElement(parent) ) {
20
+ append(parent, el);
21
+ }
22
+
23
+ return el;
24
+ }
@@ -0,0 +1,34 @@
1
+ // @flow
2
+ // import isArray from './isArray';
3
+ // import isObject from './isObject';
4
+ import has from './has';
5
+
6
+ type ObjMap<T> = {
7
+ [key: $Subtype<string>]: T
8
+ }
9
+
10
+ type Iterable<T> = Array<T> | ObjMap<T>
11
+ type Callback<T> = (T, number | string, Iterable<T>) => void
12
+
13
+ export default function each<T>(iterable: Iterable<T>, callback: Callback<T>) {
14
+ if (iterable instanceof Array) {
15
+ eachOfArray(iterable, callback);
16
+ } else {
17
+ eachOfObject(iterable, callback);
18
+ }
19
+ }
20
+
21
+ function eachOfObject<T>(obj: ObjMap<T>, callback: Callback<T>) {
22
+ // eslint-disable-next-line no-unused-vars
23
+ for (const key in obj) {
24
+ if (has(obj, key)) {
25
+ callback(obj[key], key, obj);
26
+ }
27
+ }
28
+ }
29
+
30
+ function eachOfArray<T>(arr: T[], callback: Callback<T>) {
31
+ for (let i = 0; i < arr.length; i++) {
32
+ callback(arr[i], i, arr);
33
+ }
34
+ }
@@ -0,0 +1,8 @@
1
+ /**
2
+ *
3
+ * @param {String} text text for escape
4
+ * @return {String} escaped text
5
+ */
6
+ export default function escapeHTML(text) {
7
+ return text.toString().split('&').join('&amp;').split('<').join('&lt;').split('"').join('&quot;');
8
+ }
@@ -0,0 +1,4 @@
1
+ export default function existy(arg) {
2
+ // eslint-disable-next-line
3
+ return arg != null;
4
+ }
@@ -0,0 +1,17 @@
1
+ import each from './each';
2
+ import notExisty from './notExisty';
3
+
4
+ // Merge the contents of two or more objects together into the first object
5
+ export default function extend(target, ...args) {
6
+ each(args, options => {
7
+ if (notExisty(options)) {
8
+ return;
9
+ }
10
+ each(options, (val, key) => {
11
+ target[key] = val;
12
+ });
13
+ });
14
+
15
+ // Return the modified object
16
+ return target;
17
+ }
@@ -0,0 +1,16 @@
1
+ // @flow
2
+
3
+ import isNotEmpty from './isNotEmpty';
4
+ import each from './each';
5
+
6
+ export default function filter<T>(array: T[], cond?: (T) => boolean = isNotEmpty): T[] {
7
+ const res = [];
8
+
9
+ each(array, o => {
10
+ if (cond(o)) {
11
+ res.push(o);
12
+ }
13
+ });
14
+
15
+ return res;
16
+ }
@@ -0,0 +1,11 @@
1
+ // @flow
2
+ export default function find<T>(array: T[], cond: (T) => boolean ): ?T {
3
+ for (let i = 0; i < array.length; i++) {
4
+ const item = array[i];
5
+ if (cond(item)) {
6
+ return item;
7
+ }
8
+ }
9
+
10
+ return null;
11
+ }
@@ -0,0 +1,20 @@
1
+ import isFunction from './isFunction';
2
+
3
+ const NON_FOUND_IDX = -1;
4
+
5
+ /**
6
+ * Find index of element by condition
7
+ * @export
8
+ * @param {Array} array array
9
+ * @param {Function|Object} condition some condition
10
+ * @returns {Number} index of object, or `-1` if cond not returned true
11
+ */
12
+ export default function findIndex(array, condition) {
13
+ const cond = isFunction(condition) ? condition : (c) => c === condition;
14
+ for (let i = 0; i < array.length; i++) {
15
+ if (cond(array[i])) {
16
+ return i;
17
+ }
18
+ }
19
+ return NON_FOUND_IDX;
20
+ }
@@ -0,0 +1,5 @@
1
+ const FIRST_ID = 0;
2
+
3
+ export default function first(arr) {
4
+ return arr[FIRST_ID];
5
+ }
@@ -0,0 +1,19 @@
1
+ import existy from './existy';
2
+
3
+ /**
4
+ * Get valur fromm object by path
5
+ * @export
6
+ * @param {Object} source object
7
+ * @param {String} path path to props (use `.` as delim)
8
+ * @param {any} defaultValue return this attr if result is not exists
9
+ * @returns {any} value
10
+ */
11
+ export default function get(source, path = '', defaultValue = null) {
12
+ const pathes = path.split('.');
13
+
14
+ while (existy(source) && pathes.length) {
15
+ source = source[pathes.shift()];
16
+ }
17
+
18
+ return existy(source) ? source : defaultValue;
19
+ }
@@ -0,0 +1,5 @@
1
+ const hasOwn = Object.prototype.hasOwnProperty;
2
+
3
+ export default function has(obj, prop) {
4
+ return hasOwn.call(obj, prop);
5
+ }
@@ -0,0 +1,6 @@
1
+ // @flow
2
+ export default function hasClass(element: HTMLElement, cls: string) {
3
+ if (!element) return false;
4
+
5
+ return !!element.className.match(new RegExp('(\\s|^)' + cls + '(\\s|$)'));
6
+ }
@@ -0,0 +1,11 @@
1
+ const HEAD_IDX = 0;
2
+
3
+ /**
4
+ * Get first element from array
5
+ * @export
6
+ * @param {Array} arr array
7
+ * @returns {any} first element
8
+ */
9
+ export default function head(arr) {
10
+ return arr[HEAD_IDX];
11
+ }
@@ -0,0 +1,16 @@
1
+ const DEFAULT_MIN = 0;
2
+ const DEFAULT_MAX = Number.MAX_VALUE;
3
+
4
+ /**
5
+ * Checks if n is between start and up to, but not including, end. If end is not specified,
6
+ * it's set to start with start then set to 0.
7
+ * If start is greater than end the params are swapped to support negative ranges.
8
+ * @export
9
+ * @param {number} number The number to check.
10
+ * @param {number} [from=0] The start of the range.
11
+ * @param {number} [to] The end of the range.
12
+ * @returns {Boolean} Returns true if number is in the range, else false.
13
+ */
14
+ export default function inRange(number, from = DEFAULT_MIN, to = DEFAULT_MAX) {
15
+ return number >= from && number < to;
16
+ }
@@ -0,0 +1,73 @@
1
+ // @flow
2
+ import isElement from './isElement';
3
+ import isArray from './isArray';
4
+ import isObject from './isObject';
5
+ import isString from './isString';
6
+ import isFunction from './isFunction';
7
+ import isBoolean from './isBoolean';
8
+ import isEqual from './isEqual';
9
+ import isEqualBuffer from './isEqualBuffer';
10
+
11
+ // utils
12
+ import noop from './noop';
13
+ import inRange from './inRange';
14
+ import existy from './existy';
15
+ import negate from './negate';
16
+ import notExisty from './notExisty';
17
+ import isEmpty from './isEmpty';
18
+ import isNotEmpty from './isNotEmpty';
19
+ import absolutizeUrl from './absolutizeUrl';
20
+ import escapeHTML from './escapeHTML';
21
+ import uidGenerator from './uidGenerator';
22
+
23
+ // DOM
24
+ import createElement from './createElement';
25
+ import addEvent from './addEvent';
26
+ import removeEvent from './removeEvent';
27
+ import addClass from './addClass';
28
+ import hasClass from './hasClass';
29
+ import removeClass from './removeClass';
30
+ import toggleClass from './toggleClass';
31
+ import append from './appendChild';
32
+
33
+ // collections
34
+ import each from './each';
35
+ import contains from './contains';
36
+ import filter from './filter';
37
+ import find from './find';
38
+ import map from './map';
39
+
40
+ // array
41
+ import head from './head';
42
+ import last from './last';
43
+ import first from './first';
44
+ import findIndex from './findIndex';
45
+ import remove from './remove';
46
+ import toArray from './toArray';
47
+ import reduce from './reduce';
48
+
49
+ // Object
50
+ import has from './has';
51
+ import extend from './extend';
52
+ import get from './get';
53
+ import addProperty from './addProperty';
54
+
55
+ // String
56
+ import upperFirst from './upperFirst';
57
+
58
+ export {
59
+ isArray, isElement, isObject, isString, isFunction, isBoolean, isEqual, isEqualBuffer,
60
+
61
+ noop, existy, negate, notExisty, isEmpty, isNotEmpty, inRange, absolutizeUrl, escapeHTML,
62
+ uidGenerator,
63
+
64
+ createElement, append, addEvent, removeEvent, hasClass, addClass, removeClass, toggleClass,
65
+
66
+ each, contains, filter, find, map, reduce,
67
+
68
+ head, findIndex, first, last, remove, toArray,
69
+
70
+ has, extend, get, addProperty,
71
+
72
+ upperFirst
73
+ };
@@ -0,0 +1,4 @@
1
+ // @flow
2
+ export default function isArray(arr: mixed): boolean {
3
+ return Array.isArray(arr);
4
+ }
@@ -0,0 +1,3 @@
1
+ export default function isBoolean(b) {
2
+ return b === true || b === false;
3
+ }
@@ -0,0 +1,7 @@
1
+ export default function isElement(node) {
2
+ try {
3
+ return node instanceof Element;
4
+ } catch (e) {
5
+ return !!node.nodeName;
6
+ }
7
+ }
@@ -0,0 +1,6 @@
1
+ // @flow
2
+ import notExisty from './notExisty';
3
+
4
+ export default function isEmpty(val: mixed): boolean {
5
+ return notExisty(val) || val instanceof Array && !val.length || typeof val === 'string' && !val.length;
6
+ }
@@ -0,0 +1,33 @@
1
+ import isArray from './isArray';
2
+ import contains from './contains';
3
+ import isObject from './isObject';
4
+ import reduce from './reduce';
5
+
6
+ export default function isEqual(value, other) {
7
+ if (value === other) {
8
+ return true;
9
+ }
10
+
11
+ if ( isArray(value) && isArray(other) ) {
12
+ if ( value.length !== other.length ) {
13
+ return false;
14
+ }
15
+
16
+ return reduce(value, (memo, o) => memo && contains(other, o), true);
17
+ }
18
+
19
+ if ( isObject(value) && isObject(other) ) {
20
+ const valueKeys = Object.keys(value);
21
+ const otherKeys = Object.keys(other);
22
+
23
+ if ( !isEqual(valueKeys, otherKeys) ) {
24
+ return false;
25
+ }
26
+
27
+ return reduce(value, (memo, v, k) => {
28
+ return memo && isEqual(v, other[k]);
29
+ }, true);
30
+ }
31
+
32
+ return false;
33
+ }
@@ -0,0 +1,13 @@
1
+ export default function isEqualBuffer(value, other) {
2
+ if (value.byteLength !== other.byteLength) {
3
+ return false;
4
+ }
5
+
6
+ for (let i = 0; i < value.length; i++) {
7
+ if (value[i] !== other[i]) {
8
+ return false;
9
+ }
10
+ }
11
+
12
+ return true;
13
+ }
@@ -0,0 +1,3 @@
1
+ export default function isFunction(obj) {
2
+ return typeof obj === 'function';
3
+ }
@@ -0,0 +1,5 @@
1
+ // @flow
2
+ import isEmpty from './isEmpty';
3
+ import negate from './negate';
4
+
5
+ export default negate(isEmpty);
@@ -0,0 +1,5 @@
1
+ import isArray from './isArray';
2
+
3
+ export default function isObject(obj) {
4
+ return obj && typeof obj === 'object' && isArray(obj) === false;
5
+ }
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Checks if `value` is classified as a `String` primitive or object.
3
+ *
4
+ * @param {*} value The value to check.
5
+ * @returns {boolean} Returns `true` if `value` is a string, else `false`.
6
+ */
7
+ export default function isString(value) {
8
+ return typeof value === 'string';
9
+ }
@@ -0,0 +1,4 @@
1
+ export default function last(arr) {
2
+ // eslint-disable-next-line no-magic-numbers
3
+ return arr[arr.length - 1];
4
+ }
@@ -0,0 +1,11 @@
1
+ // @flow
2
+ import each from './each';
3
+
4
+ type Callback<T, K> = (T, number, Array<T>) => K
5
+
6
+ export default function map<T, K>(array: Array<T>, callback: Callback<T, K>): Array<K> {
7
+ const memo = [];
8
+ // $FlowFixMe
9
+ each(array, (val, key, arr) => memo.push(callback(val, key, arr)) );
10
+ return memo;
11
+ }
@@ -0,0 +1,8 @@
1
+ // @flow
2
+
3
+ export default function negate(predicate: (any) => boolean): (any) => boolean {
4
+ return (e: any) => {
5
+ return !predicate(e);
6
+ // return !predicate.apply(null, args);
7
+ };
8
+ }
@@ -0,0 +1 @@
1
+ export default function noop() { /* */ }
@@ -0,0 +1,5 @@
1
+ // @flow
2
+ import existy from './existy';
3
+ import negate from './negate';
4
+
5
+ export default negate(existy);
@@ -0,0 +1,8 @@
1
+ import each from './each';
2
+
3
+ export default function reduce(iterable, callback, memo = null) {
4
+ each( iterable, (val, key, it) => {
5
+ memo = callback(memo, val, key, it);
6
+ });
7
+ return memo;
8
+ }
@@ -0,0 +1,7 @@
1
+ /* eslint no-magic-numbers: 0 */
2
+ export default function remove(array, item) {
3
+ const idx = array.indexOf(item);
4
+ if ( idx >= 0 ) {
5
+ array.splice(idx, 1);
6
+ }
7
+ }
@@ -0,0 +1,8 @@
1
+ import hasClass from './hasClass';
2
+
3
+ export default function removeClass(element, cls) {
4
+ if (hasClass(element, cls)) {
5
+ var reg = new RegExp('(\\s|^)' + cls + '(\\s|$)');
6
+ element.className = element.className.replace(reg, ' ').trim();
7
+ }
8
+ }
@@ -0,0 +1,7 @@
1
+ export default function removeEvent(token) {
2
+ if (token.elem.removeEventListener) {
3
+ token.elem.removeEventListener(token.event, token.handler);
4
+ } else {
5
+ token.elem.detachEvent('on' + token.event, token.handler);
6
+ }
7
+ }
@@ -0,0 +1,7 @@
1
+ export default function toArray(arrayLike) {
2
+ const res = [];
3
+ for (let i = 0; i < arrayLike.length; i++) {
4
+ res.push(arrayLike[i]);
5
+ }
6
+ return res;
7
+ }
@@ -0,0 +1,16 @@
1
+ import hasClass from './hasClass';
2
+ import addClass from './addClass';
3
+ import removeClass from './removeClass';
4
+ import notExisty from './notExisty';
5
+
6
+ export default function toggleClass(el, className, state) {
7
+ if ( notExisty(state) ) {
8
+ state = !hasClass(el, className);
9
+ }
10
+
11
+ if (state) {
12
+ addClass(el, className);
13
+ } else {
14
+ removeClass(el, className);
15
+ }
16
+ }