@leed-ai/cli 0.0.0-stage → 6.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (263) hide show
  1. package/LICENSE.md +57 -0
  2. package/README.md +125 -2
  3. package/dist/LICENSE.md +57 -0
  4. package/dist/acorn-DAgDT1om.js +5087 -0
  5. package/dist/angular-l0_4PK8N.js +3598 -0
  6. package/dist/authShared-Dray38Ls.js +1161 -0
  7. package/dist/babel-CJeRQd5u.js +10038 -0
  8. package/dist/buildResults-tiq1nugP.js +21180 -0
  9. package/dist/chunk-1VJ9lAw7.js +42 -0
  10. package/dist/cliAuth-38JjD6hw.js +15 -0
  11. package/dist/env-B0bHiXJJ.js +29 -0
  12. package/dist/errors-CqKamGCu.js +481 -0
  13. package/dist/estree-E8WG8UHj.js +6930 -0
  14. package/dist/flow-6xaRIbPQ.js +52255 -0
  15. package/dist/glimmer-aJPjsfbT.js +7272 -0
  16. package/dist/graphql-mcgtPEiZ.js +1901 -0
  17. package/dist/html--eeea3Kl.js +6553 -0
  18. package/dist/leed.eleventy.mjs +6525 -0
  19. package/dist/leed.mjs +88952 -0
  20. package/dist/leed.sources.json +798 -0
  21. package/dist/leedLogger-Zkada5aO.js +78 -0
  22. package/dist/markdown-D73jNKwx.js +6836 -0
  23. package/dist/meriyah-CMp1nDDW.js +8932 -0
  24. package/dist/package.json +101 -0
  25. package/dist/postcss-h4fBr2Fn.js +6760 -0
  26. package/dist/prettier-CwFSKxfN.js +16821 -0
  27. package/dist/static/customer-site-worker/package.json +9 -0
  28. package/dist/static/customer-site-worker/src/assetsHydration.ts +55 -0
  29. package/dist/static/customer-site-worker/src/constants.ts +20 -0
  30. package/dist/static/customer-site-worker/src/cors.ts +120 -0
  31. package/dist/static/customer-site-worker/src/index.ts +242 -0
  32. package/dist/static/customer-site-worker/src/mcp-proxy.ts +98 -0
  33. package/dist/static/customer-site-worker/src/proxy.ts +92 -0
  34. package/dist/static/customer-site-worker/src/proxyHeaders.ts +47 -0
  35. package/dist/static/customer-site-worker/src/tier.ts +40 -0
  36. package/dist/static/customer-site-worker/src/types.ts +82 -0
  37. package/dist/static/customer-site-worker/test/functions-mock.worker.js +50 -0
  38. package/dist/static/customer-site-worker/tsconfig.json +19 -0
  39. package/dist/static/customer-site-worker/vitest.workers.config.ts +61 -0
  40. package/dist/static/install/husky/colors.mjs +5 -0
  41. package/dist/static/install/husky/hooks/commit-msg +1 -0
  42. package/dist/static/install/husky/hooks/pre-commit +1 -0
  43. package/dist/static/install/husky/hooks/pre-push +1 -0
  44. package/dist/static/install/husky/valid-command.mjs +29 -0
  45. package/dist/static/install/husky/valid-commit-msg.mjs +20 -0
  46. package/dist/static/install/package.json +10 -0
  47. package/dist/static/install/packages.txt +4 -0
  48. package/dist/static/install/tasks.json +111 -0
  49. package/dist/static/javascript/detectIncognito.js +195 -0
  50. package/dist/static/javascript/documentation.js +2781 -0
  51. package/dist/static/javascript/fp/fp.esm.js +2896 -0
  52. package/dist/static/javascript/fp/fp.js +3067 -0
  53. package/dist/static/javascript/live-search.js +986 -0
  54. package/dist/static/javascript/lunr-search.js +843 -0
  55. package/dist/static/javascript/timeme.js +451 -0
  56. package/dist/static/javascript/tracker/webmcp.js +67 -0
  57. package/dist/static/javascript/tracker/whisper.js +1 -0
  58. package/dist/static/javascript/utilities.js +819 -0
  59. package/dist/static/javascript/versions.json +74 -0
  60. package/dist/static/javascript/zoomable.js +488 -0
  61. package/dist/static/site/_data/eleventyComputed.js +228 -0
  62. package/dist/static/site/_data/leed-form-data.json +253 -0
  63. package/dist/static/site/_includes/leed/api/bits/array-type.hbs +24 -0
  64. package/dist/static/site/_includes/leed/api/bits/badges.hbs +9 -0
  65. package/dist/static/site/_includes/leed/api/bits/description.hbs +9 -0
  66. package/dist/static/site/_includes/leed/api/bits/examples.hbs +42 -0
  67. package/dist/static/site/_includes/leed/api/bits/scopes.hbs +28 -0
  68. package/dist/static/site/_includes/leed/api/object.hbs +110 -0
  69. package/dist/static/site/_includes/leed/api/parameters.hbs +11 -0
  70. package/dist/static/site/_includes/leed/api/property.hbs +153 -0
  71. package/dist/static/site/_includes/leed/api/request-body.hbs +51 -0
  72. package/dist/static/site/_includes/leed/api/responses.hbs +89 -0
  73. package/dist/static/site/_includes/leed/api/security-constraints.hbs +59 -0
  74. package/dist/static/site/_includes/leed/api/security.hbs +75 -0
  75. package/dist/static/site/_includes/leed/components/pagination.hbs +45 -0
  76. package/dist/static/site/_includes/leed/components/scroll-status-indicator-horizontal.hbs +22 -0
  77. package/dist/static/site/_includes/leed/docs/alpha/api.hbs +6 -0
  78. package/dist/static/site/_includes/leed/docs/alpha/base.hbs +26 -0
  79. package/dist/static/site/_includes/leed/docs/alpha/documentation.hbs +7 -0
  80. package/dist/static/site/_includes/leed/docs/api-article.hbs +75 -0
  81. package/dist/static/site/_includes/leed/docs/bravo/api.hbs +5 -0
  82. package/dist/static/site/_includes/leed/docs/bravo/base.hbs +31 -0
  83. package/dist/static/site/_includes/leed/docs/bravo/documentation.hbs +7 -0
  84. package/dist/static/site/_includes/leed/docs/charlie/api.hbs +6 -0
  85. package/dist/static/site/_includes/leed/docs/charlie/base.hbs +27 -0
  86. package/dist/static/site/_includes/leed/docs/charlie/documentation.hbs +10 -0
  87. package/dist/static/site/_includes/leed/docs/doc-article.hbs +40 -0
  88. package/dist/static/site/_includes/leed/docs/docs-footer.hbs +35 -0
  89. package/dist/static/site/_includes/leed/docs/docs-header.hbs +59 -0
  90. package/dist/static/site/_includes/leed/docs/document-search-modal.hbs +36 -0
  91. package/dist/static/site/_includes/leed/docs/document-search.hbs +23 -0
  92. package/dist/static/site/_includes/leed/docs/footer.hbs +12 -0
  93. package/dist/static/site/_includes/leed/docs/header/brand.hbs +19 -0
  94. package/dist/static/site/_includes/leed/docs/header/chrome.hbs +33 -0
  95. package/dist/static/site/_includes/leed/docs/header/compact.hbs +19 -0
  96. package/dist/static/site/_includes/leed/docs/header/cta.hbs +15 -0
  97. package/dist/static/site/_includes/leed/docs/header/nav.hbs +18 -0
  98. package/dist/static/site/_includes/leed/docs/header/top-search.hbs +15 -0
  99. package/dist/static/site/_includes/leed/docs/mini-bar.hbs +53 -0
  100. package/dist/static/site/_includes/leed/docs/pagination.hbs +19 -0
  101. package/dist/static/site/_includes/leed/docs/shell.hbs +56 -0
  102. package/dist/static/site/_includes/leed/docs/sidebar.hbs +52 -0
  103. package/dist/static/site/_includes/leed/docs/social-icons.hbs +81 -0
  104. package/dist/static/site/_includes/leed/docs/style.hbs +17 -0
  105. package/dist/static/site/_includes/leed/docs/toc.hbs +7 -0
  106. package/dist/static/site/_includes/leed/form.hbs +266 -0
  107. package/dist/static/site/_includes/leed/head.hbs +67 -0
  108. package/dist/static/site/_includes/leed/menu/builder.hbs +35 -0
  109. package/dist/static/site/_includes/leed/menu/item.hbs +67 -0
  110. package/dist/static/site/_includes/leed/menu/link.hbs +59 -0
  111. package/dist/static/site/_includes/leed/metadata/ogCard.hbs +40 -0
  112. package/dist/static/site/_includes/leed/metadata/siteMetadata.hbs +24 -0
  113. package/dist/static/site/_includes/leed/metadata/twitterCard.hbs +34 -0
  114. package/dist/static/site/_includes/leed/popup-video.hbs +21 -0
  115. package/dist/static/site/_includes/leed/stub-template.hbs +17 -0
  116. package/dist/static/site/_includes/leed/unsubscribe-form.hbs +30 -0
  117. package/dist/static/site/_layouts/leed-documentation.hbs +12 -0
  118. package/dist/static/site/leed-feed-atom.hbs +42 -0
  119. package/dist/static/site/leed-feed-json.hbs +56 -0
  120. package/dist/static/site/leed-feed-rss.hbs +39 -0
  121. package/dist/static/site/leed-headers.hbs +38 -0
  122. package/dist/static/site/leed-redirects.hbs +10 -0
  123. package/dist/static/site/leed-sitemap-pageType.hbs +28 -0
  124. package/dist/static/site/leed-sitemap.hbs +19 -0
  125. package/dist/static/site/leed-unsubscribe.hbs +44 -0
  126. package/dist/static/site/leed-unsubscribed.hbs +40 -0
  127. package/dist/static/tailwind/components/alerts.css +132 -0
  128. package/dist/static/tailwind/components/api-methods.css +39 -0
  129. package/dist/static/tailwind/components/breadcrumbs.css +31 -0
  130. package/dist/static/tailwind/components/code.css +88 -0
  131. package/dist/static/tailwind/components/collapsible.css +38 -0
  132. package/dist/static/tailwind/components/document-search.css +222 -0
  133. package/dist/static/tailwind/components/form.css +185 -0
  134. package/dist/static/tailwind/components/kbd.css +7 -0
  135. package/dist/static/tailwind/components/pagination.css +81 -0
  136. package/dist/static/tailwind/components/scroll-status-indicator.css +5 -0
  137. package/dist/static/tailwind/components/tab-groups.css +117 -0
  138. package/dist/static/tailwind/components/tables.css +0 -0
  139. package/dist/static/tailwind/components/toc.css +60 -0
  140. package/dist/static/tailwind/components.css +248 -0
  141. package/dist/static/tailwind/defaults.css +260 -0
  142. package/dist/static/tailwind/docs/api.css +701 -0
  143. package/dist/static/tailwind/docs/components/blockquote.css +5 -0
  144. package/dist/static/tailwind/docs/components/button.css +11 -0
  145. package/dist/static/tailwind/docs/components/docs-pagination.css +71 -0
  146. package/dist/static/tailwind/docs/components/mobile-bar.css +83 -0
  147. package/dist/static/tailwind/docs/components/navigation.css +279 -0
  148. package/dist/static/tailwind/docs/components/table.css +54 -0
  149. package/dist/static/tailwind/docs/components.css +6 -0
  150. package/dist/static/tailwind/docs/docs.css +427 -0
  151. package/dist/static/tailwind/docs/layouts/alpha.css +108 -0
  152. package/dist/static/tailwind/docs/layouts/bravo.css +218 -0
  153. package/dist/static/tailwind/docs/layouts/charlie.css +105 -0
  154. package/dist/static/tailwind/docs/layouts.css +3 -0
  155. package/dist/static/tailwind/docs/themes/amber.css +113 -0
  156. package/dist/static/tailwind/docs/themes/blue.css +94 -0
  157. package/dist/static/tailwind/docs/themes/cyan.css +111 -0
  158. package/dist/static/tailwind/docs/themes/emerald.css +111 -0
  159. package/dist/static/tailwind/docs/themes/fuchsia.css +111 -0
  160. package/dist/static/tailwind/docs/themes/green.css +95 -0
  161. package/dist/static/tailwind/docs/themes/indigo.css +111 -0
  162. package/dist/static/tailwind/docs/themes/lime.css +111 -0
  163. package/dist/static/tailwind/docs/themes/orange.css +111 -0
  164. package/dist/static/tailwind/docs/themes/pink.css +111 -0
  165. package/dist/static/tailwind/docs/themes/purple.css +111 -0
  166. package/dist/static/tailwind/docs/themes/red.css +111 -0
  167. package/dist/static/tailwind/docs/themes/rose.css +111 -0
  168. package/dist/static/tailwind/docs/themes/sky.css +111 -0
  169. package/dist/static/tailwind/docs/themes/teal.css +111 -0
  170. package/dist/static/tailwind/docs/themes/violet.css +111 -0
  171. package/dist/static/tailwind/docs/themes/yellow.css +111 -0
  172. package/dist/static/tailwind/docs/themes.css +84 -0
  173. package/dist/static/tailwind/font-awesome/free-7.3.1/brands.css +2455 -0
  174. package/dist/static/tailwind/font-awesome/free-7.3.1/fontawesome.css +8997 -0
  175. package/dist/static/tailwind/font-awesome/free-7.3.1/fonts.css +45 -0
  176. package/dist/static/tailwind/font-awesome/free-7.3.1/icons.json +2608 -0
  177. package/dist/static/tailwind/font-awesome/free-7.3.1.css +3 -0
  178. package/dist/static/tailwind/font-awesome/pro-7.0.0/brands.css +2215 -0
  179. package/dist/static/tailwind/font-awesome/pro-7.0.0/fontawesome.css +19281 -0
  180. package/dist/static/tailwind/font-awesome/pro-7.0.0/fonts.css +445 -0
  181. package/dist/static/tailwind/font-awesome/pro-7.0.0.css +3 -0
  182. package/dist/static/tailwind/font-awesome/pro-7.3.1/brands.css +2455 -0
  183. package/dist/static/tailwind/font-awesome/pro-7.3.1/fontawesome.css +20365 -0
  184. package/dist/static/tailwind/font-awesome/pro-7.3.1/fonts.css +589 -0
  185. package/dist/static/tailwind/font-awesome/pro-7.3.1.css +3 -0
  186. package/dist/static/tailwind/fonts/all.css +6 -0
  187. package/dist/static/tailwind/fonts/config.jsonc +31 -0
  188. package/dist/static/tailwind/fonts/geist-mono.css +142 -0
  189. package/dist/static/tailwind/fonts/geist.css +142 -0
  190. package/dist/static/tailwind/fonts/inter.css +215 -0
  191. package/dist/static/tailwind/fonts/jetbrains-mono.css +126 -0
  192. package/dist/static/tailwind/fonts/noto-sans.css +134 -0
  193. package/dist/static/tailwind/fonts/open-sans.css +89 -0
  194. package/dist/static/tailwind/highlighters.css +14 -0
  195. package/dist/static/tailwind/hljs/README.md +53 -0
  196. package/dist/static/tailwind/hljs/a11y.css +96 -0
  197. package/dist/static/tailwind/hljs/atom-fruit.css +90 -0
  198. package/dist/static/tailwind/hljs/atom-one.css +164 -0
  199. package/dist/static/tailwind/hljs/default.css +164 -0
  200. package/dist/static/tailwind/hljs/github.css +101 -0
  201. package/dist/static/tailwind/hljs/google-code.css +112 -0
  202. package/dist/static/tailwind/hljs/grayscale.css +115 -0
  203. package/dist/static/tailwind/hljs/gruvbox-hard.css +115 -0
  204. package/dist/static/tailwind/hljs/gruvbox-medium.css +115 -0
  205. package/dist/static/tailwind/hljs/gruvbox-soft.css +115 -0
  206. package/dist/static/tailwind/hljs/papercolor.css +120 -0
  207. package/dist/static/tailwind/hljs/qt-creator.css +91 -0
  208. package/dist/static/tailwind/hljs/summerfruit.css +115 -0
  209. package/dist/static/tailwind/hljs/tomorrow.css +115 -0
  210. package/dist/static/tailwind/leed.css +170 -0
  211. package/dist/static/tailwind/site-tokens.reference.css +105 -0
  212. package/dist/static/tailwind/utils/icons.css +102 -0
  213. package/dist/static/tailwind/utils/utilities.css +105 -0
  214. package/dist/static/templates/pages/PAGE.hbs +27 -0
  215. package/dist/static/templates/pages/PAGE_LAYOUT.hbs +19 -0
  216. package/dist/static/templates/pages/PAGE_TYPE_INDEX.hbs +89 -0
  217. package/dist/static/templates/pages/PAGINATED_PAGE_TYPE_ITEM.hbs +52 -0
  218. package/dist/static/templates/pages/PAGINATED_PAGE_TYPE_LIST.hbs +39 -0
  219. package/dist/static/templates/pages/PAGINATED_PAGE_TYPE_PAGINATION.hbs +11 -0
  220. package/dist/static/templates/raw-content/.ci/build.sh +58 -0
  221. package/dist/static/templates/raw-content/README.md +179 -0
  222. package/dist/static/templates/raw-content/_gitignore +50 -0
  223. package/dist/static/templates/raw-content/src/404.hbs +21 -0
  224. package/dist/static/templates/raw-content/src/_data/autolink.json +1 -0
  225. package/dist/static/templates/raw-content/src/_data/ctaList.json +1 -0
  226. package/dist/static/templates/raw-content/src/_data/leedForms.json +1 -0
  227. package/dist/static/templates/raw-content/src/_data/menu.json +1 -0
  228. package/dist/static/templates/raw-content/src/_includes/footer.hbs +18 -0
  229. package/dist/static/templates/raw-content/src/_includes/header-includes.hbs +25 -0
  230. package/dist/static/templates/raw-content/src/_includes/header.hbs +5 -0
  231. package/dist/static/templates/raw-content/src/_includes/site-template.hbs +23 -0
  232. package/dist/static/templates/raw-content/src/_includes/unsubscribe-DISABLED.hbs +17 -0
  233. package/dist/static/templates/raw-content/src/_includes/unsubscribed-DISABLED.hbs +13 -0
  234. package/dist/static/templates/raw-content/src/_layouts/empty.hbs +2 -0
  235. package/dist/static/templates/raw-content/src/index.hbs +21 -0
  236. package/dist/static/templates/raw-content/src/robots.hbs +9 -0
  237. package/dist/static/templates/raw-content/tailwind/site/base.css +44 -0
  238. package/dist/static/templates/raw-content/tailwind/site.config.css +3 -0
  239. package/dist/static/templates/sandbox/_gitignore +50 -0
  240. package/dist/static/templates/sandbox/identity.json +1 -0
  241. package/dist/static/templates/sandbox/src/404.hbs +21 -0
  242. package/dist/static/templates/sandbox/src/_data/autolink.json +1 -0
  243. package/dist/static/templates/sandbox/src/_data/ctaList.json +1 -0
  244. package/dist/static/templates/sandbox/src/_data/labelList.json +9 -0
  245. package/dist/static/templates/sandbox/src/_data/leedForms.json +20 -0
  246. package/dist/static/templates/sandbox/src/_data/menu.json +19 -0
  247. package/dist/static/templates/sandbox/src/_data/pageTypeList.json +14 -0
  248. package/dist/static/templates/sandbox/src/_data/searchIndexList.json +1 -0
  249. package/dist/static/templates/sandbox/src/_data/userList.json +11 -0
  250. package/dist/static/templates/sandbox/src/_includes/footer.hbs +18 -0
  251. package/dist/static/templates/sandbox/src/_includes/header-includes.hbs +25 -0
  252. package/dist/static/templates/sandbox/src/_includes/header.hbs +5 -0
  253. package/dist/static/templates/sandbox/src/_includes/site-template.hbs +23 -0
  254. package/dist/static/templates/sandbox/src/_layouts/empty.hbs +2 -0
  255. package/dist/static/templates/sandbox/src/index.hbs +20 -0
  256. package/dist/static/templates/sandbox/src/robots.hbs +9 -0
  257. package/dist/static/templates/sandbox/src/src.11tydata.json +39 -0
  258. package/dist/static/templates/sandbox/tailwind/site/base.css +44 -0
  259. package/dist/static/templates/sandbox/tailwind/site.config.css +3 -0
  260. package/dist/thrown-sukVkp_1.js +113 -0
  261. package/dist/typescript-D4T0V_Hn.js +23004 -0
  262. package/dist/yaml-9wR8GxF_.js +5236 -0
  263. package/package.json +157 -4
@@ -0,0 +1,451 @@
1
+ /*Copyright (c) 2020 Jason Zissman
2
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
3
+ this software and associated documentation files (the "Software"), to deal in
4
+ the Software without restriction, including without limitation the rights to
5
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
6
+ the Software, and to permit persons to whom the Software is furnished to do so,
7
+ subject to the following conditions:
8
+
9
+ The above copyright notice and this permission notice shall be included in all
10
+ copies or substantial portions of the Software.
11
+
12
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
13
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
14
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
15
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
16
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
17
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
18
+ */
19
+ /** biome-ignore-all lint/suspicious/noAssignInExpressions: not ours */
20
+
21
+ (() => {
22
+ ((root, factory) => {
23
+ if (typeof module !== "undefined" && module.exports) {
24
+ // CommonJS
25
+ return (module.exports = factory());
26
+ } else if (typeof define === "function" && define.amd) {
27
+ // AMD
28
+ define([], () => {
29
+ return (root.TimeMe = factory());
30
+ });
31
+ } else {
32
+ // Global Variables
33
+ return (root.TimeMe = factory());
34
+ }
35
+ })(this, () => {
36
+ const TimeMe = {
37
+ startStopTimes: {},
38
+ idleTimeoutMs: 30 * 1000,
39
+ currentIdleTimeMs: 0,
40
+ checkIdleStateRateMs: 250,
41
+ isUserCurrentlyOnPage: true,
42
+ isUserCurrentlyIdle: false,
43
+ currentPageName: "default-page-name",
44
+ timeElapsedCallbacks: [],
45
+ userLeftCallbacks: [],
46
+ userReturnCallbacks: [],
47
+
48
+ trackTimeOnElement: (elementId) => {
49
+ const element = document.getElementById(elementId);
50
+ if (element) {
51
+ element.addEventListener("mouseover", () => {
52
+ TimeMe.startTimer(elementId);
53
+ });
54
+ element.addEventListener("mousemove", () => {
55
+ TimeMe.startTimer(elementId);
56
+ });
57
+ element.addEventListener("mouseleave", () => {
58
+ TimeMe.stopTimer(elementId);
59
+ });
60
+ element.addEventListener("keypress", () => {
61
+ TimeMe.startTimer(elementId);
62
+ });
63
+ element.addEventListener("focus", () => {
64
+ TimeMe.startTimer(elementId);
65
+ });
66
+ }
67
+ },
68
+
69
+ getTimeOnElementInSeconds: (elementId) => {
70
+ const time = TimeMe.getTimeOnPageInSeconds(elementId);
71
+ if (time) {
72
+ return time;
73
+ } else {
74
+ return 0;
75
+ }
76
+ },
77
+
78
+ // startTime is optional. If provided, must be of type Date(). By providing
79
+ // startTime, you are overriding the internal timing mechanism and manually
80
+ // indicating the start time.
81
+ startTimer: (pageName, startTime) => {
82
+ if (!pageName) {
83
+ pageName = TimeMe.currentPageName;
84
+ }
85
+
86
+ if (TimeMe.startStopTimes[pageName] === undefined) {
87
+ TimeMe.startStopTimes[pageName] = [];
88
+ } else {
89
+ const arrayOfTimes = TimeMe.startStopTimes[pageName];
90
+ const latestStartStopEntry = arrayOfTimes[arrayOfTimes.length - 1];
91
+ if (latestStartStopEntry !== undefined && latestStartStopEntry.stopTime === undefined) {
92
+ // Can't start new timer until previous finishes.
93
+ return;
94
+ }
95
+ }
96
+ TimeMe.startStopTimes[pageName].push({
97
+ startTime: startTime || new Date(),
98
+ stopTime: undefined,
99
+ });
100
+ },
101
+
102
+ stopAllTimers: () => {
103
+ const pageNames = Object.keys(TimeMe.startStopTimes);
104
+ for (let i = 0; i < pageNames.length; i++) {
105
+ TimeMe.stopTimer(pageNames[i]);
106
+ }
107
+ },
108
+
109
+ // stopTime is optional. If provided, must be of type Date(). By providing
110
+ // stopTime, you are overriding the internal timing mechanism and manually
111
+ // indicating the stop time.
112
+ stopTimer: (pageName, stopTime) => {
113
+ if (!pageName) {
114
+ pageName = TimeMe.currentPageName;
115
+ }
116
+ const arrayOfTimes = TimeMe.startStopTimes[pageName];
117
+ if (arrayOfTimes === undefined || arrayOfTimes.length === 0) {
118
+ // Can't stop timer before you've started it.
119
+ return;
120
+ }
121
+ if (arrayOfTimes[arrayOfTimes.length - 1].stopTime === undefined) {
122
+ arrayOfTimes[arrayOfTimes.length - 1].stopTime = stopTime || new Date();
123
+ }
124
+ },
125
+
126
+ getTimeOnCurrentPageInSeconds: () => {
127
+ return TimeMe.getTimeOnPageInSeconds(TimeMe.currentPageName);
128
+ },
129
+
130
+ getTimeOnPageInSeconds: (pageName) => {
131
+ const timeInMs = TimeMe.getTimeOnPageInMilliseconds(pageName);
132
+ if (timeInMs === undefined) {
133
+ return undefined;
134
+ } else {
135
+ return timeInMs / 1000;
136
+ }
137
+ },
138
+
139
+ getTimeOnCurrentPageInMilliseconds: () => {
140
+ return TimeMe.getTimeOnPageInMilliseconds(TimeMe.currentPageName);
141
+ },
142
+
143
+ getTimeOnPageInMilliseconds: (pageName) => {
144
+ let totalTimeOnPage = 0;
145
+
146
+ const arrayOfTimes = TimeMe.startStopTimes[pageName];
147
+ if (arrayOfTimes === undefined) {
148
+ // Can't get time on page before you've started the timer.
149
+ return;
150
+ }
151
+
152
+ let timeSpentOnPageInSeconds = 0;
153
+ for (let i = 0; i < arrayOfTimes.length; i++) {
154
+ const startTime = arrayOfTimes[i].startTime;
155
+ let stopTime = arrayOfTimes[i].stopTime;
156
+ if (stopTime === undefined) {
157
+ stopTime = new Date();
158
+ }
159
+ const difference = stopTime - startTime;
160
+ timeSpentOnPageInSeconds += difference;
161
+ }
162
+
163
+ totalTimeOnPage = Number(timeSpentOnPageInSeconds);
164
+ return totalTimeOnPage;
165
+ },
166
+
167
+ getTimeOnAllPagesInSeconds: () => {
168
+ const allTimes = [];
169
+ const pageNames = Object.keys(TimeMe.startStopTimes);
170
+ for (let i = 0; i < pageNames.length; i++) {
171
+ const pageName = pageNames[i];
172
+ const timeOnPage = TimeMe.getTimeOnPageInSeconds(pageName);
173
+ allTimes.push({
174
+ pageName: pageName,
175
+ timeOnPage: timeOnPage,
176
+ });
177
+ }
178
+ return allTimes;
179
+ },
180
+
181
+ setIdleDurationInSeconds: (duration) => {
182
+ const durationFloat = parseFloat(duration);
183
+ if (Number.isNaN(durationFloat) === false) {
184
+ TimeMe.idleTimeoutMs = duration * 1000;
185
+ } else {
186
+ throw {
187
+ name: "InvalidDurationException",
188
+ message: `An invalid duration time (${duration}) was provided.`,
189
+ };
190
+ }
191
+ },
192
+
193
+ setCurrentPageName: (pageName) => {
194
+ TimeMe.currentPageName = pageName;
195
+ },
196
+
197
+ resetRecordedPageTime: (pageName) => {
198
+ delete TimeMe.startStopTimes[pageName];
199
+ },
200
+
201
+ resetAllRecordedPageTimes: () => {
202
+ const pageNames = Object.keys(TimeMe.startStopTimes);
203
+ for (let i = 0; i < pageNames.length; i++) {
204
+ TimeMe.resetRecordedPageTime(pageNames[i]);
205
+ }
206
+ },
207
+ userActivityDetected: () => {
208
+ if (TimeMe.isUserCurrentlyIdle) {
209
+ TimeMe.triggerUserHasReturned();
210
+ }
211
+ TimeMe.resetIdleCountdown();
212
+ },
213
+ resetIdleCountdown: () => {
214
+ TimeMe.isUserCurrentlyIdle = false;
215
+ TimeMe.currentIdleTimeMs = 0;
216
+ },
217
+
218
+ callWhenUserLeaves: (callback, numberOfTimesToInvoke) => {
219
+ TimeMe.userLeftCallbacks.push({
220
+ callback: callback,
221
+ numberOfTimesToInvoke: numberOfTimesToInvoke,
222
+ });
223
+ },
224
+
225
+ callWhenUserReturns: (callback, numberOfTimesToInvoke) => {
226
+ TimeMe.userReturnCallbacks.push({
227
+ callback: callback,
228
+ numberOfTimesToInvoke: numberOfTimesToInvoke,
229
+ });
230
+ },
231
+
232
+ triggerUserHasReturned: () => {
233
+ if (!TimeMe.isUserCurrentlyOnPage) {
234
+ TimeMe.isUserCurrentlyOnPage = true;
235
+ TimeMe.resetIdleCountdown();
236
+ for (let i = 0; i < TimeMe.userReturnCallbacks.length; i++) {
237
+ const userReturnedCallback = TimeMe.userReturnCallbacks[i];
238
+ const numberTimes = userReturnedCallback.numberOfTimesToInvoke;
239
+ if (Number.isNaN(numberTimes) || numberTimes === undefined || numberTimes > 0) {
240
+ userReturnedCallback.numberOfTimesToInvoke -= 1;
241
+ userReturnedCallback.callback();
242
+ }
243
+ }
244
+ }
245
+ TimeMe.startTimer();
246
+ },
247
+ // TODO - we are muddying the waters in between
248
+ // 'user left page' and 'user gone idle'. Really should be
249
+ // two separate concepts entirely. Need to break this into smaller functions
250
+ // for either scenario.
251
+ triggerUserHasLeftPageOrGoneIdle: () => {
252
+ if (TimeMe.isUserCurrentlyOnPage) {
253
+ TimeMe.isUserCurrentlyOnPage = false;
254
+ for (let i = 0; i < TimeMe.userLeftCallbacks.length; i++) {
255
+ const userHasLeftCallback = TimeMe.userLeftCallbacks[i];
256
+ const numberTimes = userHasLeftCallback.numberOfTimesToInvoke;
257
+ if (Number.isNaN(numberTimes) || numberTimes === undefined || numberTimes > 0) {
258
+ userHasLeftCallback.numberOfTimesToInvoke -= 1;
259
+ userHasLeftCallback.callback();
260
+ }
261
+ }
262
+ }
263
+ TimeMe.stopAllTimers();
264
+ },
265
+
266
+ callAfterTimeElapsedInSeconds: (timeInSeconds, callback) => {
267
+ TimeMe.timeElapsedCallbacks.push({
268
+ timeInSeconds: timeInSeconds,
269
+ callback: callback,
270
+ pending: true,
271
+ });
272
+ },
273
+
274
+ checkIdleState: () => {
275
+ for (let i = 0; i < TimeMe.timeElapsedCallbacks.length; i++) {
276
+ if (
277
+ TimeMe.timeElapsedCallbacks[i].pending &&
278
+ TimeMe.getTimeOnCurrentPageInSeconds() > TimeMe.timeElapsedCallbacks[i].timeInSeconds
279
+ ) {
280
+ TimeMe.timeElapsedCallbacks[i].callback();
281
+ TimeMe.timeElapsedCallbacks[i].pending = false;
282
+ }
283
+ }
284
+ if (TimeMe.isUserCurrentlyIdle === false && TimeMe.currentIdleTimeMs > TimeMe.idleTimeoutMs) {
285
+ TimeMe.isUserCurrentlyIdle = true;
286
+ TimeMe.triggerUserHasLeftPageOrGoneIdle();
287
+ } else {
288
+ TimeMe.currentIdleTimeMs += TimeMe.checkIdleStateRateMs;
289
+ }
290
+ },
291
+
292
+ visibilityChangeEventName: undefined,
293
+ hiddenPropName: undefined,
294
+
295
+ listenForVisibilityEvents: (trackWhenUserLeavesPage, trackWhenUserGoesIdle) => {
296
+ if (trackWhenUserLeavesPage) {
297
+ TimeMe.listenForUserLeavesOrReturnsEvents();
298
+ }
299
+
300
+ if (trackWhenUserGoesIdle) {
301
+ TimeMe.listForIdleEvents();
302
+ }
303
+ },
304
+
305
+ listenForUserLeavesOrReturnsEvents: () => {
306
+ if (typeof document.hidden !== "undefined") {
307
+ TimeMe.hiddenPropName = "hidden";
308
+ TimeMe.visibilityChangeEventName = "visibilitychange";
309
+ } else if (typeof document.mozHidden !== "undefined") {
310
+ TimeMe.hiddenPropName = "mozHidden";
311
+ TimeMe.visibilityChangeEventName = "mozvisibilitychange";
312
+ } else if (typeof document.msHidden !== "undefined") {
313
+ TimeMe.hiddenPropName = "msHidden";
314
+ TimeMe.visibilityChangeEventName = "msvisibilitychange";
315
+ } else if (typeof document.webkitHidden !== "undefined") {
316
+ TimeMe.hiddenPropName = "webkitHidden";
317
+ TimeMe.visibilityChangeEventName = "webkitvisibilitychange";
318
+ }
319
+
320
+ document.addEventListener(
321
+ TimeMe.visibilityChangeEventName,
322
+ () => {
323
+ if (document[TimeMe.hiddenPropName]) {
324
+ TimeMe.triggerUserHasLeftPageOrGoneIdle();
325
+ } else {
326
+ TimeMe.triggerUserHasReturned();
327
+ }
328
+ },
329
+ false,
330
+ );
331
+
332
+ window.addEventListener("blur", () => {
333
+ TimeMe.triggerUserHasLeftPageOrGoneIdle();
334
+ });
335
+
336
+ window.addEventListener("focus", () => {
337
+ TimeMe.triggerUserHasReturned();
338
+ });
339
+ },
340
+
341
+ listForIdleEvents: () => {
342
+ document.addEventListener("mousemove", () => {
343
+ TimeMe.userActivityDetected();
344
+ });
345
+ document.addEventListener("keyup", () => {
346
+ TimeMe.userActivityDetected();
347
+ });
348
+ document.addEventListener("touchstart", () => {
349
+ TimeMe.userActivityDetected();
350
+ });
351
+ window.addEventListener("scroll", () => {
352
+ TimeMe.userActivityDetected();
353
+ });
354
+
355
+ setInterval(() => {
356
+ if (TimeMe.isUserCurrentlyIdle !== true) {
357
+ TimeMe.checkIdleState();
358
+ }
359
+ }, TimeMe.checkIdleStateRateMs);
360
+ },
361
+
362
+ websocket: undefined,
363
+
364
+ websocketHost: undefined,
365
+
366
+ setUpWebsocket: (websocketOptions) => {
367
+ if (window.WebSocket && websocketOptions) {
368
+ const websocketHost = websocketOptions.websocketHost; // "ws://hostname:port"
369
+ try {
370
+ TimeMe.websocket = new WebSocket(websocketHost);
371
+ window.onbeforeunload = () => {
372
+ TimeMe.sendCurrentTime(websocketOptions.appId);
373
+ };
374
+ TimeMe.websocket.onopen = () => {
375
+ TimeMe.sendInitWsRequest(websocketOptions.appId);
376
+ };
377
+ TimeMe.websocket.onerror = (error) => {
378
+ if (console) {
379
+ console.log(`Error occurred in websocket connection: ${error}`);
380
+ }
381
+ };
382
+ TimeMe.websocket.onmessage = (event) => {
383
+ if (console) {
384
+ console.log(event.data);
385
+ }
386
+ };
387
+ } catch (error) {
388
+ if (console) {
389
+ console.error(`Failed to connect to websocket host. Error:${error}`);
390
+ }
391
+ }
392
+ }
393
+ },
394
+
395
+ websocketSend: (data) => {
396
+ TimeMe.websocket.send(JSON.stringify(data));
397
+ },
398
+
399
+ sendCurrentTime: (appId) => {
400
+ const timeSpentOnPage = TimeMe.getTimeOnCurrentPageInMilliseconds();
401
+ const data = {
402
+ type: "INSERT_TIME",
403
+ appId: appId,
404
+ timeOnPageMs: timeSpentOnPage,
405
+ pageName: TimeMe.currentPageName,
406
+ };
407
+ TimeMe.websocketSend(data);
408
+ },
409
+ sendInitWsRequest: (appId) => {
410
+ const data = {
411
+ type: "INIT",
412
+ appId: appId,
413
+ };
414
+ TimeMe.websocketSend(data);
415
+ },
416
+
417
+ initialize: (options) => {
418
+ let idleTimeoutInSeconds = TimeMe.idleTimeoutMs || 30;
419
+ let currentPageName = TimeMe.currentPageName || "default-page-name";
420
+ let websocketOptions;
421
+ let initialStartTime;
422
+ let trackWhenUserLeavesPage = true;
423
+ let trackWhenUserGoesIdle = true;
424
+
425
+ if (options) {
426
+ idleTimeoutInSeconds = options.idleTimeoutInSeconds || idleTimeoutInSeconds;
427
+ currentPageName = options.currentPageName || currentPageName;
428
+ websocketOptions = options.websocketOptions;
429
+ initialStartTime = options.initialStartTime;
430
+
431
+ if (options.trackWhenUserLeavesPage === false) {
432
+ trackWhenUserLeavesPage = false;
433
+ }
434
+ if (options.trackWhenUserGoesIdle === false) {
435
+ trackWhenUserGoesIdle = false;
436
+ }
437
+ }
438
+
439
+ TimeMe.setIdleDurationInSeconds(idleTimeoutInSeconds);
440
+ TimeMe.setCurrentPageName(currentPageName);
441
+ TimeMe.setUpWebsocket(websocketOptions);
442
+ TimeMe.listenForVisibilityEvents(trackWhenUserLeavesPage, trackWhenUserGoesIdle);
443
+
444
+ // TODO - only do this if page currently visible.
445
+
446
+ TimeMe.startTimer(undefined, initialStartTime);
447
+ },
448
+ };
449
+ return TimeMe;
450
+ });
451
+ }).call(this);