jspsych 6.3.0 → 7.1.1

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 (397) hide show
  1. package/README.md +36 -37
  2. package/css/jspsych.css +39 -39
  3. package/dist/JsPsych.d.ts +112 -0
  4. package/dist/TimelineNode.d.ts +34 -0
  5. package/dist/index.browser.js +3164 -0
  6. package/dist/index.browser.js.map +1 -0
  7. package/dist/index.browser.min.js +2 -0
  8. package/dist/index.browser.min.js.map +1 -0
  9. package/dist/index.cjs +3158 -0
  10. package/dist/index.cjs.map +1 -0
  11. package/dist/index.d.ts +11 -0
  12. package/dist/index.js +3152 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/migration.d.ts +3 -0
  15. package/dist/modules/data/DataCollection.d.ts +45 -0
  16. package/dist/modules/data/DataColumn.d.ts +15 -0
  17. package/dist/modules/data/index.d.ts +25 -0
  18. package/dist/modules/data/utils.d.ts +3 -0
  19. package/dist/modules/extensions.d.ts +22 -0
  20. package/dist/modules/plugin-api/HardwareAPI.d.ts +15 -0
  21. package/dist/modules/plugin-api/KeyboardListenerAPI.d.ts +34 -0
  22. package/dist/modules/plugin-api/MediaAPI.d.ts +27 -0
  23. package/dist/modules/plugin-api/SimulationAPI.d.ts +41 -0
  24. package/dist/modules/plugin-api/TimeoutAPI.d.ts +5 -0
  25. package/dist/modules/plugin-api/index.d.ts +8 -0
  26. package/dist/modules/plugins.d.ts +129 -0
  27. package/dist/modules/randomization.d.ts +35 -0
  28. package/dist/modules/turk.d.ts +40 -0
  29. package/dist/modules/utils.d.ts +7 -0
  30. package/package.json +32 -15
  31. package/src/JsPsych.ts +884 -0
  32. package/src/TimelineNode.ts +536 -0
  33. package/src/index.ts +71 -0
  34. package/src/migration.ts +37 -0
  35. package/src/modules/data/DataCollection.ts +198 -0
  36. package/src/modules/data/DataColumn.ts +86 -0
  37. package/src/modules/data/index.ts +174 -0
  38. package/src/modules/data/utils.ts +75 -0
  39. package/src/modules/extensions.ts +23 -0
  40. package/src/modules/plugin-api/HardwareAPI.ts +32 -0
  41. package/src/modules/plugin-api/KeyboardListenerAPI.ts +165 -0
  42. package/src/modules/plugin-api/MediaAPI.ts +337 -0
  43. package/src/modules/plugin-api/SimulationAPI.ts +181 -0
  44. package/src/modules/plugin-api/TimeoutAPI.ts +16 -0
  45. package/src/modules/plugin-api/index.ts +28 -0
  46. package/src/modules/plugins.ts +158 -0
  47. package/src/modules/randomization.ts +327 -0
  48. package/src/modules/turk.ts +99 -0
  49. package/src/modules/utils.ts +30 -0
  50. package/.github/workflows/jest.yml +0 -20
  51. package/code-of-conduct.md +0 -56
  52. package/contributors.md +0 -61
  53. package/docs/CNAME +0 -1
  54. package/docs/about/about.md +0 -18
  55. package/docs/about/contributing.md +0 -43
  56. package/docs/about/license.md +0 -25
  57. package/docs/about/support.md +0 -7
  58. package/docs/core_library/jspsych-core.md +0 -734
  59. package/docs/core_library/jspsych-data.md +0 -589
  60. package/docs/core_library/jspsych-pluginAPI.md +0 -610
  61. package/docs/core_library/jspsych-randomization.md +0 -397
  62. package/docs/core_library/jspsych-turk.md +0 -102
  63. package/docs/extensions/extensions.md +0 -83
  64. package/docs/extensions/jspsych-ext-webgazer.md +0 -106
  65. package/docs/img/blue.png +0 -0
  66. package/docs/img/devtools-change-css.png +0 -0
  67. package/docs/img/devtools-css-errors.png +0 -0
  68. package/docs/img/devtools-inspect-element.png +0 -0
  69. package/docs/img/folder-setup.png +0 -0
  70. package/docs/img/folder-with-html.png +0 -0
  71. package/docs/img/githubreleases.jpg +0 -0
  72. package/docs/img/jspsych-favicon.png +0 -0
  73. package/docs/img/jspsych-logo-no-text-mono.svg +0 -493
  74. package/docs/img/jspsych-logo.jpg +0 -0
  75. package/docs/img/orange.png +0 -0
  76. package/docs/img/palmer_stim.png +0 -0
  77. package/docs/img/progress_bar.png +0 -0
  78. package/docs/img/prolific-study-completion.png +0 -0
  79. package/docs/img/prolific-study-link.png +0 -0
  80. package/docs/img/visual_search_example.jpg +0 -0
  81. package/docs/index.md +0 -9
  82. package/docs/overview/browser-device-support.md +0 -35
  83. package/docs/overview/callbacks.md +0 -184
  84. package/docs/overview/data.md +0 -281
  85. package/docs/overview/dynamic-parameters.md +0 -147
  86. package/docs/overview/exclude-browser.md +0 -32
  87. package/docs/overview/experiment-options.md +0 -149
  88. package/docs/overview/eye-tracking.md +0 -237
  89. package/docs/overview/fullscreen.md +0 -36
  90. package/docs/overview/media-preloading.md +0 -369
  91. package/docs/overview/mturk.md +0 -77
  92. package/docs/overview/plugins.md +0 -320
  93. package/docs/overview/progress-bar.md +0 -110
  94. package/docs/overview/prolific.md +0 -78
  95. package/docs/overview/record-browser-interactions.md +0 -23
  96. package/docs/overview/running-experiments.md +0 -95
  97. package/docs/overview/style.md +0 -293
  98. package/docs/overview/timeline.md +0 -457
  99. package/docs/plugins/jspsych-animation.md +0 -40
  100. package/docs/plugins/jspsych-audio-button-response.md +0 -60
  101. package/docs/plugins/jspsych-audio-keyboard-response.md +0 -58
  102. package/docs/plugins/jspsych-audio-slider-response.md +0 -53
  103. package/docs/plugins/jspsych-call-function.md +0 -81
  104. package/docs/plugins/jspsych-canvas-button-response.md +0 -66
  105. package/docs/plugins/jspsych-canvas-keyboard-response.md +0 -68
  106. package/docs/plugins/jspsych-canvas-slider-response.md +0 -89
  107. package/docs/plugins/jspsych-categorize-animation.md +0 -60
  108. package/docs/plugins/jspsych-categorize-html.md +0 -53
  109. package/docs/plugins/jspsych-categorize-image.md +0 -53
  110. package/docs/plugins/jspsych-cloze.md +0 -45
  111. package/docs/plugins/jspsych-external-html.md +0 -70
  112. package/docs/plugins/jspsych-free-sort.md +0 -56
  113. package/docs/plugins/jspsych-fullscreen.md +0 -57
  114. package/docs/plugins/jspsych-html-button-response.md +0 -42
  115. package/docs/plugins/jspsych-html-keyboard-response.md +0 -51
  116. package/docs/plugins/jspsych-html-slider-response.md +0 -45
  117. package/docs/plugins/jspsych-iat-html.md +0 -64
  118. package/docs/plugins/jspsych-iat-image.md +0 -64
  119. package/docs/plugins/jspsych-image-button-response.md +0 -48
  120. package/docs/plugins/jspsych-image-keyboard-response.md +0 -58
  121. package/docs/plugins/jspsych-image-slider-response.md +0 -54
  122. package/docs/plugins/jspsych-instructions.md +0 -58
  123. package/docs/plugins/jspsych-maxdiff.md +0 -41
  124. package/docs/plugins/jspsych-preload.md +0 -128
  125. package/docs/plugins/jspsych-rdk.md +0 -119
  126. package/docs/plugins/jspsych-reconstruction.md +0 -48
  127. package/docs/plugins/jspsych-resize.md +0 -39
  128. package/docs/plugins/jspsych-same-different-html.md +0 -53
  129. package/docs/plugins/jspsych-same-different-image.md +0 -66
  130. package/docs/plugins/jspsych-serial-reaction-time-mouse.md +0 -52
  131. package/docs/plugins/jspsych-serial-reaction-time.md +0 -57
  132. package/docs/plugins/jspsych-survey-html-form.md +0 -50
  133. package/docs/plugins/jspsych-survey-likert.md +0 -70
  134. package/docs/plugins/jspsych-survey-multi-choice.md +0 -48
  135. package/docs/plugins/jspsych-survey-multi-select.md +0 -53
  136. package/docs/plugins/jspsych-survey-text.md +0 -63
  137. package/docs/plugins/jspsych-video-button-response.md +0 -54
  138. package/docs/plugins/jspsych-video-keyboard-response.md +0 -50
  139. package/docs/plugins/jspsych-video-slider-response.md +0 -60
  140. package/docs/plugins/jspsych-virtual-chinrest.md +0 -105
  141. package/docs/plugins/jspsych-visual-search-circle.md +0 -52
  142. package/docs/plugins/jspsych-vsl-animate-occlusion.md +0 -55
  143. package/docs/plugins/jspsych-vsl-grid-scene.md +0 -62
  144. package/docs/plugins/jspsych-webgazer-calibrate.md +0 -60
  145. package/docs/plugins/jspsych-webgazer-init-camera.md +0 -31
  146. package/docs/plugins/jspsych-webgazer-validate.md +0 -43
  147. package/docs/plugins/list-of-plugins.md +0 -54
  148. package/docs/tutorials/hello-world.md +0 -162
  149. package/docs/tutorials/rt-task.md +0 -1334
  150. package/docs/tutorials/video-tutorials.md +0 -11
  151. package/examples/add-to-end-of-timeline.html +0 -38
  152. package/examples/case-sensitive-responses.html +0 -45
  153. package/examples/conditional-and-loop-functions.html +0 -64
  154. package/examples/css/jquery-ui.css +0 -1225
  155. package/examples/css-classes-parameter.html +0 -145
  156. package/examples/data-add-properties.html +0 -44
  157. package/examples/data-as-function.html +0 -39
  158. package/examples/data-from-timeline.html +0 -52
  159. package/examples/data-from-url.html +0 -21
  160. package/examples/demo-flanker.html +0 -117
  161. package/examples/demo-simple-rt-task.html +0 -120
  162. package/examples/demos/demo_1.html +0 -35
  163. package/examples/demos/demo_2.html +0 -50
  164. package/examples/demos/demo_3.html +0 -63
  165. package/examples/display-element-to-embed-experiment.html +0 -79
  166. package/examples/end-active-node.html +0 -52
  167. package/examples/end-experiment.html +0 -45
  168. package/examples/exclusions.html +0 -32
  169. package/examples/external_html/simple_consent.html +0 -4
  170. package/examples/img/1.gif +0 -0
  171. package/examples/img/10.gif +0 -0
  172. package/examples/img/11.gif +0 -0
  173. package/examples/img/12.gif +0 -0
  174. package/examples/img/2.gif +0 -0
  175. package/examples/img/3.gif +0 -0
  176. package/examples/img/4.gif +0 -0
  177. package/examples/img/5.gif +0 -0
  178. package/examples/img/6.gif +0 -0
  179. package/examples/img/7.gif +0 -0
  180. package/examples/img/8.gif +0 -0
  181. package/examples/img/9.gif +0 -0
  182. package/examples/img/age/of1.jpg +0 -0
  183. package/examples/img/age/of2.jpg +0 -0
  184. package/examples/img/age/of3.jpg +0 -0
  185. package/examples/img/age/om1.jpg +0 -0
  186. package/examples/img/age/om2.jpg +0 -0
  187. package/examples/img/age/om3.jpg +0 -0
  188. package/examples/img/age/yf1.jpg +0 -0
  189. package/examples/img/age/yf4.jpg +0 -0
  190. package/examples/img/age/yf5.jpg +0 -0
  191. package/examples/img/age/ym2.jpg +0 -0
  192. package/examples/img/age/ym3.jpg +0 -0
  193. package/examples/img/age/ym5.jpg +0 -0
  194. package/examples/img/backwardN.gif +0 -0
  195. package/examples/img/blue.png +0 -0
  196. package/examples/img/card.png +0 -0
  197. package/examples/img/con1.png +0 -0
  198. package/examples/img/con2.png +0 -0
  199. package/examples/img/fixation.gif +0 -0
  200. package/examples/img/happy_face_1.jpg +0 -0
  201. package/examples/img/happy_face_2.jpg +0 -0
  202. package/examples/img/happy_face_3.jpg +0 -0
  203. package/examples/img/happy_face_4.jpg +0 -0
  204. package/examples/img/inc1.png +0 -0
  205. package/examples/img/inc2.png +0 -0
  206. package/examples/img/normalN.gif +0 -0
  207. package/examples/img/orange.png +0 -0
  208. package/examples/img/redX.png +0 -0
  209. package/examples/img/ribbon.jpg +0 -0
  210. package/examples/img/sad_face_1.jpg +0 -0
  211. package/examples/img/sad_face_2.jpg +0 -0
  212. package/examples/img/sad_face_3.jpg +0 -0
  213. package/examples/img/sad_face_4.jpg +0 -0
  214. package/examples/js/snap.svg-min.js +0 -21
  215. package/examples/js/webgazer.js +0 -88886
  216. package/examples/jspsych-RDK.html +0 -58
  217. package/examples/jspsych-animation.html +0 -39
  218. package/examples/jspsych-audio-button-response.html +0 -58
  219. package/examples/jspsych-audio-keyboard-response.html +0 -68
  220. package/examples/jspsych-audio-slider-response.html +0 -61
  221. package/examples/jspsych-call-function.html +0 -32
  222. package/examples/jspsych-canvas-button-response.html +0 -95
  223. package/examples/jspsych-canvas-keyboard-response.html +0 -78
  224. package/examples/jspsych-canvas-slider-response.html +0 -67
  225. package/examples/jspsych-categorize-animation.html +0 -49
  226. package/examples/jspsych-categorize-html.html +0 -33
  227. package/examples/jspsych-categorize-image.html +0 -44
  228. package/examples/jspsych-cloze.html +0 -37
  229. package/examples/jspsych-free-sort.html +0 -109
  230. package/examples/jspsych-fullscreen.html +0 -45
  231. package/examples/jspsych-html-button-response.html +0 -43
  232. package/examples/jspsych-html-keyboard-response.html +0 -42
  233. package/examples/jspsych-html-slider-response.html +0 -53
  234. package/examples/jspsych-iat.html +0 -520
  235. package/examples/jspsych-image-button-response.html +0 -91
  236. package/examples/jspsych-image-keyboard-response.html +0 -85
  237. package/examples/jspsych-image-slider-response.html +0 -85
  238. package/examples/jspsych-instructions.html +0 -37
  239. package/examples/jspsych-maxdiff.html +0 -33
  240. package/examples/jspsych-preload.html +0 -140
  241. package/examples/jspsych-reconstruction.html +0 -43
  242. package/examples/jspsych-resize.html +0 -34
  243. package/examples/jspsych-same-different-html.html +0 -28
  244. package/examples/jspsych-same-different-image.html +0 -39
  245. package/examples/jspsych-serial-reaction-time-mouse.html +0 -98
  246. package/examples/jspsych-serial-reaction-time.html +0 -54
  247. package/examples/jspsych-survey-html-form.html +0 -33
  248. package/examples/jspsych-survey-likert.html +0 -42
  249. package/examples/jspsych-survey-multi-choice.html +0 -40
  250. package/examples/jspsych-survey-multi-select.html +0 -42
  251. package/examples/jspsych-survey-text.html +0 -34
  252. package/examples/jspsych-video-button-response.html +0 -65
  253. package/examples/jspsych-video-keyboard-response.html +0 -61
  254. package/examples/jspsych-video-slider-response.html +0 -63
  255. package/examples/jspsych-virtual-chinrest.html +0 -69
  256. package/examples/jspsych-visual-search-circle.html +0 -64
  257. package/examples/jspsych-vsl-animate-occlusion.html +0 -35
  258. package/examples/jspsych-vsl-grid-scene.html +0 -47
  259. package/examples/lexical-decision.html +0 -134
  260. package/examples/manual-preloading.html +0 -59
  261. package/examples/pause-unpause.html +0 -33
  262. package/examples/progress-bar.html +0 -68
  263. package/examples/save-trial-parameters.html +0 -98
  264. package/examples/sound/hammer.mp3 +0 -0
  265. package/examples/sound/sound.mp3 +0 -0
  266. package/examples/sound/speech_blue.mp3 +0 -0
  267. package/examples/sound/speech_green.mp3 +0 -0
  268. package/examples/sound/speech_joke.mp3 +0 -0
  269. package/examples/sound/speech_red.mp3 +0 -0
  270. package/examples/sound/tone.mp3 +0 -0
  271. package/examples/timeline-variables-sampling.html +0 -50
  272. package/examples/timeline-variables.html +0 -64
  273. package/examples/video/sample_video.mp4 +0 -0
  274. package/examples/webgazer.html +0 -162
  275. package/examples/webgazer_image.html +0 -60
  276. package/extensions/jspsych-ext-webgazer.js +0 -185
  277. package/jspsych.js +0 -3015
  278. package/license.txt +0 -21
  279. package/mkdocs.yml +0 -118
  280. package/plugins/jspsych-animation.js +0 -189
  281. package/plugins/jspsych-audio-button-response.js +0 -269
  282. package/plugins/jspsych-audio-keyboard-response.js +0 -212
  283. package/plugins/jspsych-audio-slider-response.js +0 -278
  284. package/plugins/jspsych-call-function.js +0 -58
  285. package/plugins/jspsych-canvas-button-response.js +0 -199
  286. package/plugins/jspsych-canvas-keyboard-response.js +0 -155
  287. package/plugins/jspsych-canvas-slider-response.js +0 -207
  288. package/plugins/jspsych-categorize-animation.js +0 -266
  289. package/plugins/jspsych-categorize-html.js +0 -220
  290. package/plugins/jspsych-categorize-image.js +0 -222
  291. package/plugins/jspsych-cloze.js +0 -112
  292. package/plugins/jspsych-external-html.js +0 -112
  293. package/plugins/jspsych-free-sort.js +0 -478
  294. package/plugins/jspsych-fullscreen.js +0 -106
  295. package/plugins/jspsych-html-button-response.js +0 -188
  296. package/plugins/jspsych-html-keyboard-response.js +0 -149
  297. package/plugins/jspsych-html-slider-response.js +0 -202
  298. package/plugins/jspsych-iat-html.js +0 -284
  299. package/plugins/jspsych-iat-image.js +0 -286
  300. package/plugins/jspsych-image-button-response.js +0 -327
  301. package/plugins/jspsych-image-keyboard-response.js +0 -263
  302. package/plugins/jspsych-image-slider-response.js +0 -369
  303. package/plugins/jspsych-instructions.js +0 -237
  304. package/plugins/jspsych-maxdiff.js +0 -173
  305. package/plugins/jspsych-preload.js +0 -345
  306. package/plugins/jspsych-rdk.js +0 -1373
  307. package/plugins/jspsych-reconstruction.js +0 -134
  308. package/plugins/jspsych-resize.js +0 -166
  309. package/plugins/jspsych-same-different-html.js +0 -168
  310. package/plugins/jspsych-same-different-image.js +0 -169
  311. package/plugins/jspsych-serial-reaction-time-mouse.js +0 -212
  312. package/plugins/jspsych-serial-reaction-time.js +0 -247
  313. package/plugins/jspsych-survey-html-form.js +0 -171
  314. package/plugins/jspsych-survey-likert.js +0 -195
  315. package/plugins/jspsych-survey-multi-choice.js +0 -208
  316. package/plugins/jspsych-survey-multi-select.js +0 -232
  317. package/plugins/jspsych-survey-text.js +0 -185
  318. package/plugins/jspsych-video-button-response.js +0 -335
  319. package/plugins/jspsych-video-keyboard-response.js +0 -279
  320. package/plugins/jspsych-video-slider-response.js +0 -351
  321. package/plugins/jspsych-virtual-chinrest.js +0 -471
  322. package/plugins/jspsych-visual-search-circle.js +0 -259
  323. package/plugins/jspsych-vsl-animate-occlusion.js +0 -196
  324. package/plugins/jspsych-vsl-grid-scene.js +0 -103
  325. package/plugins/jspsych-webgazer-calibrate.js +0 -166
  326. package/plugins/jspsych-webgazer-init-camera.js +0 -95
  327. package/plugins/jspsych-webgazer-validate.js +0 -304
  328. package/plugins/template/jspsych-plugin-template.js +0 -35
  329. package/tests/README.md +0 -7
  330. package/tests/jsPsych/case-sensitive-responses.test.js +0 -53
  331. package/tests/jsPsych/css-classes-parameter.test.js +0 -107
  332. package/tests/jsPsych/default-iti.test.js +0 -51
  333. package/tests/jsPsych/default-parameters.test.js +0 -58
  334. package/tests/jsPsych/endexperiment.test.js +0 -49
  335. package/tests/jsPsych/events.test.js +0 -606
  336. package/tests/jsPsych/functions-as-parameters.test.js +0 -210
  337. package/tests/jsPsych/init.test.js +0 -48
  338. package/tests/jsPsych/loads.test.js +0 -7
  339. package/tests/jsPsych/min-rt.test.js +0 -58
  340. package/tests/jsPsych/progressbar.test.js +0 -202
  341. package/tests/jsPsych/timeline-variables.test.js +0 -531
  342. package/tests/jsPsych/timelines.test.js +0 -569
  343. package/tests/jsPsych.data/data-csv-conversion.test.js +0 -85
  344. package/tests/jsPsych.data/data-json-conversion.test.js +0 -120
  345. package/tests/jsPsych.data/datacollection.test.js +0 -117
  346. package/tests/jsPsych.data/datacolumn.test.js +0 -50
  347. package/tests/jsPsych.data/datamodule.test.js +0 -152
  348. package/tests/jsPsych.data/dataparameter.test.js +0 -251
  349. package/tests/jsPsych.data/interactions.test.js +0 -109
  350. package/tests/jsPsych.data/trialparameters.test.js +0 -175
  351. package/tests/jsPsych.extensions/extensions.test.js +0 -207
  352. package/tests/jsPsych.extensions/test-extension.js +0 -42
  353. package/tests/jsPsych.pluginAPI/pluginapi.test.js +0 -341
  354. package/tests/jsPsych.pluginAPI/preloads.test.js +0 -43
  355. package/tests/jsPsych.randomization/randomziation.test.js +0 -27
  356. package/tests/jsPsych.utils/utils.test.js +0 -58
  357. package/tests/plugins/plugin-animation.test.js +0 -34
  358. package/tests/plugins/plugin-audio-button-response.test.js +0 -15
  359. package/tests/plugins/plugin-audio-keyboard-response.test.js +0 -15
  360. package/tests/plugins/plugin-audio-slider-response.test.js +0 -15
  361. package/tests/plugins/plugin-call-function.test.js +0 -49
  362. package/tests/plugins/plugin-categorize-animation.test.js +0 -263
  363. package/tests/plugins/plugin-categorize-html.test.js +0 -17
  364. package/tests/plugins/plugin-categorize-image.test.js +0 -17
  365. package/tests/plugins/plugin-cloze.test.js +0 -157
  366. package/tests/plugins/plugin-free-sort.test.js +0 -106
  367. package/tests/plugins/plugin-fullscreen.test.js +0 -41
  368. package/tests/plugins/plugin-html-button-response.test.js +0 -161
  369. package/tests/plugins/plugin-html-keyboard-response.test.js +0 -139
  370. package/tests/plugins/plugin-html-slider-response.test.js +0 -155
  371. package/tests/plugins/plugin-iat-html.test.js +0 -299
  372. package/tests/plugins/plugin-iat-image.test.js +0 -298
  373. package/tests/plugins/plugin-image-button-response.test.js +0 -174
  374. package/tests/plugins/plugin-image-keyboard-response.test.js +0 -147
  375. package/tests/plugins/plugin-image-slider-response.test.js +0 -174
  376. package/tests/plugins/plugin-instructions.test.js +0 -85
  377. package/tests/plugins/plugin-maxdiff.test.js +0 -39
  378. package/tests/plugins/plugin-preload.test.js +0 -916
  379. package/tests/plugins/plugin-rdk.test.js +0 -61
  380. package/tests/plugins/plugin-reconstruction.test.js +0 -16
  381. package/tests/plugins/plugin-resize.test.js +0 -16
  382. package/tests/plugins/plugin-same-different-html.test.js +0 -17
  383. package/tests/plugins/plugin-same-different-image.test.js +0 -17
  384. package/tests/plugins/plugin-serial-reaction-time-mouse.test.js +0 -42
  385. package/tests/plugins/plugin-serial-reaction-time.test.js +0 -109
  386. package/tests/plugins/plugin-survey-html-form.test.js +0 -44
  387. package/tests/plugins/plugin-survey-likert.test.js +0 -48
  388. package/tests/plugins/plugin-survey-multi-choice.test.js +0 -47
  389. package/tests/plugins/plugin-survey-multi-select.test.js +0 -71
  390. package/tests/plugins/plugin-survey-text.test.js +0 -115
  391. package/tests/plugins/plugin-video-button-response.test.js +0 -32
  392. package/tests/plugins/plugin-video-keyboard-response.test.js +0 -32
  393. package/tests/plugins/plugin-video-slider-response.test.js +0 -31
  394. package/tests/plugins/plugin-visual-search-circle.test.js +0 -16
  395. package/tests/plugins/plugin-vsl-animate-occlusion.test.js +0 -16
  396. package/tests/plugins/plugin-vsl-grid-scene.test.js +0 -16
  397. package/tests/testing-utils.js +0 -13
@@ -1,173 +0,0 @@
1
- /**
2
- * jspsych-maxdiff
3
- * Angus Hughes
4
- *
5
- * a jspsych plugin for maxdiff/conjoint analysis designs
6
- *
7
- */
8
-
9
- jsPsych.plugins['maxdiff'] = (function () {
10
-
11
- var plugin = {};
12
-
13
- plugin.info = {
14
- name: 'maxdiff',
15
- description: '',
16
- parameters: {
17
- alternatives: {
18
- type: jsPsych.plugins.parameterType.STRING,
19
- pretty_name: 'Alternatives',
20
- array: true,
21
- default: undefined,
22
- description: 'Alternatives presented in the maxdiff table.'
23
- },
24
- labels: {
25
- type: jsPsych.plugins.parameterType.STRING,
26
- array: true,
27
- pretty_name: 'Labels',
28
- default: undefined,
29
- description: 'Labels to display for left and right response columns.'
30
- },
31
- randomize_alternative_order: {
32
- type: jsPsych.plugins.parameterType.BOOL,
33
- pretty_name: 'Randomize Alternative Order',
34
- default: false,
35
- description: 'If true, the order of the alternatives will be randomized'
36
- },
37
- preamble: {
38
- type: jsPsych.plugins.parameterType.STRING,
39
- pretty_name: 'Preamble',
40
- default: '',
41
- description: 'String to display at top of the page.'
42
- },
43
- button_label: {
44
- type: jsPsych.plugins.parameterType.STRING,
45
- pretty_name: 'Button Label',
46
- default: 'Continue',
47
- description: 'Label of the button.'
48
- },
49
- required: {
50
- type: jsPsych.plugins.parameterType.BOOL,
51
- pretty_name: 'Required',
52
- default: false,
53
- description: 'Makes answering the alternative required.'
54
- }
55
- }
56
- }
57
-
58
- plugin.trial = function (display_element, trial) {
59
-
60
- var html = "";
61
- // inject CSS for trial
62
- html += '<style id="jspsych-maxdiff-css">';
63
- html += ".jspsych-maxdiff-statement {display:block; font-size: 16px; padding-top: 40px; margin-bottom:10px;}" +
64
- 'table.jspsych-maxdiff-table {border-collapse: collapse; padding: 15px; margin-left: auto; margin-right: auto;}' +
65
- 'table.jspsych-maxdiff-table td, th {border-bottom: 1px solid #dddddd; text-align: center; padding: 8px;}' +
66
- 'table.jspsych-maxdiff-table tr:nth-child(even) {background-color: #dddddd;}';
67
- html += '</style>';
68
-
69
- // show preamble text
70
- if (trial.preamble !== null) {
71
- html += '<div id="jspsych-maxdiff-preamble" class="jspsych-maxdiff-preamble">' + trial.preamble + '</div>';
72
- }
73
- html += '<form id="jspsych-maxdiff-form">';
74
-
75
- // add maxdiff options ///
76
- // first generate alternative order, randomized here as opposed to randomizing the order of alternatives
77
- // so that the data are always associated with the same alternative regardless of order.
78
- var alternative_order = [];
79
- for (var i = 0; i < trial.alternatives.length; i++) {
80
- alternative_order.push(i);
81
- }
82
- if (trial.randomize_alternative_order) {
83
- alternative_order = jsPsych.randomization.shuffle(alternative_order);
84
- }
85
-
86
- // Start with column headings
87
- var maxdiff_table = '<table class="jspsych-maxdiff-table"><tr><th id="jspsych-maxdiff-left-label">' + trial.labels[0] + '</th><th></th><th id="jspsych-maxdiff-right-label">' + trial.labels[1] + '</th></tr>';
88
-
89
- // construct each row of the maxdiff table
90
- for (var i = 0; i < trial.alternatives.length; i++) {
91
- var alternative = trial.alternatives[alternative_order[i]];
92
- // add alternative
93
- maxdiff_table += '<tr><td><input class= "jspsych-maxdiff-alt-' + i.toString() + '" type="radio" name="left" data-name = ' + alternative_order[i].toString() + ' /><br></td>';
94
- maxdiff_table += '<td id="jspsych-maxdiff-alternative-' + i.toString() + '">' + alternative + '</td>';
95
- maxdiff_table += '<td><input class= "jspsych-maxdiff-alt-' + i.toString() + '" type="radio" name="right" data-name = ' + alternative_order[i].toString() + ' /><br></td></tr>';
96
- }
97
- maxdiff_table += '</table><br><br>';
98
- html += maxdiff_table;
99
-
100
- // add submit button
101
- var enable_submit = trial.required == true ? 'disabled = "disabled"' : '';
102
- html += '<input type="submit" id="jspsych-maxdiff-next" class="jspsych-maxdiff jspsych-btn" ' + enable_submit + ' value="' + trial.button_label + '"></input>';
103
- html += '</form>';
104
-
105
- display_element.innerHTML = html;
106
-
107
- // function to control responses
108
- // first checks that the same alternative cannot be endorsed in the left and right columns simultaneously.
109
- // then enables the submit button if the trial is required.
110
- const left_right = ["left", "right"]
111
- left_right.forEach(function(p) {
112
- // Get all elements either 'left' or 'right'
113
- document.getElementsByName(p).forEach(function(alt) {
114
- alt.addEventListener('click', function() {
115
- // Find the opposite (if left, then right & vice versa) identified by the class (jspsych-maxdiff-alt-1, 2, etc)
116
- var op = alt.name == 'left' ? 'right' : 'left';
117
- var n = document.getElementsByClassName(alt.className).namedItem(op);
118
- // If it's checked, uncheck it.
119
- if (n.checked) {
120
- n.checked = false;
121
- }
122
-
123
- // check response
124
- if (trial.required){
125
- // Now check if one of both left and right have been enabled to allow submission
126
- var left_checked = [...document.getElementsByName('left')].some(c => c.checked);
127
- var right_checked = [...document.getElementsByName('right')].some(c => c.checked);
128
- if (left_checked && right_checked) {
129
- document.getElementById("jspsych-maxdiff-next").disabled = false;
130
- } else {
131
- document.getElementById("jspsych-maxdiff-next").disabled = true;
132
- }
133
- }
134
- });
135
- });
136
- });
137
-
138
- // Get the data once the submit button is clicked
139
- // Get the data once the submit button is clicked
140
- display_element.querySelector('#jspsych-maxdiff-form').addEventListener('submit', function(e){
141
- e.preventDefault();
142
-
143
- // measure response time
144
- var endTime = performance.now();
145
- var response_time = endTime - startTime;
146
-
147
- // get the alternative by the data-name attribute, allowing a null response if unchecked
148
- get_response = function(side){
149
- var col = display_element.querySelectorAll('[name=\"' + side + '\"]:checked')[0];
150
- if (col === undefined){
151
- return null;
152
- } else {
153
- var i = parseInt(col.getAttribute('data-name'));
154
- return trial.alternatives[i];
155
- }
156
- }
157
-
158
- // data saving
159
- var trial_data = {
160
- rt: response_time,
161
- labels: {left: trial.labels[0], right: trial.labels[1]},
162
- response: {left: get_response('left'), right: get_response('right')}
163
- };
164
-
165
- // next trial
166
- jsPsych.finishTrial(trial_data);
167
- });
168
-
169
- var startTime = performance.now();
170
- };
171
-
172
- return plugin;
173
- })();
@@ -1,345 +0,0 @@
1
- /**
2
- * jspsych-preload
3
- * documentation: docs.jspsych.org
4
- **/
5
-
6
- jsPsych.plugins['preload'] = (function() {
7
-
8
- var plugin = {};
9
-
10
- plugin.info = {
11
- name: 'preload',
12
- description: '',
13
- parameters: {
14
- auto_preload: {
15
- type: jsPsych.plugins.parameterType.BOOL,
16
- default: false,
17
- description: 'Whether or not to automatically preload any media files based on the timeline passed to jsPsych.init.'
18
- },
19
- trials: {
20
- type: jsPsych.plugins.parameterType.TIMELINE,
21
- default: [],
22
- description: 'Array with a timeline of trials to automatically preload. If one or more trial objects is provided, '+
23
- 'then the plugin will attempt to preload the media files used in the trial(s).'
24
- },
25
- images: {
26
- type: jsPsych.plugins.parameterType.STRING,
27
- default: [],
28
- description: 'Array with one or more image files to load. This parameter is often used in cases where media files cannot '+
29
- 'be automatically preloaded based on the timeline, e.g. because the media files are passed into an image plugin/parameter with '+
30
- 'timeline variables or dynamic parameters, or because the image is embedded in an HTML string.'
31
- },
32
- audio: {
33
- type: jsPsych.plugins.parameterType.STRING,
34
- default: [],
35
- description: 'Array with one or more audio files to load. This parameter is often used in cases where media files cannot '+
36
- 'be automatically preloaded based on the timeline, e.g. because the media files are passed into an audio plugin/parameter with '+
37
- 'timeline variables or dynamic parameters, or because the audio is embedded in an HTML string.'
38
- },
39
- video: {
40
- type: jsPsych.plugins.parameterType.STRING,
41
- default: [],
42
- description: 'Array with one or more video files to load. This parameter is often used in cases where media files cannot '+
43
- 'be automatically preloaded based on the timeline, e.g. because the media files are passed into a video plugin/parameter with '+
44
- 'timeline variables or dynamic parameters, or because the video is embedded in an HTML string.'
45
- },
46
- message: {
47
- type: jsPsych.plugins.parameterType.HTML_STRING,
48
- default: null,
49
- description: 'HTML-formatted message to be shown above the progress bar while the files are loading.'
50
- },
51
- show_progress_bar: {
52
- type: jsPsych.plugins.parameterType.BOOL,
53
- default: true,
54
- description: 'Whether or not to show the loading progress bar.'
55
- },
56
- continue_after_error: {
57
- type: jsPsych.plugins.parameterType.BOOL,
58
- default: false,
59
- description: 'Whether or not to continue with the experiment if a loading error occurs. If false, then if a loading error occurs, '+
60
- 'the error_message will be shown on the page and the trial will not end. If true, then if if a loading error occurs, the trial will end '+
61
- 'and preloading failure will be logged in the trial data.'
62
- },
63
- error_message: {
64
- type: jsPsych.plugins.parameterType.HTML_STRING,
65
- default: 'The experiment failed to load.',
66
- description: 'Error message to show on the page in case of any loading errors. This parameter is only relevant when continue_after_error is false.'
67
- },
68
- show_detailed_errors: {
69
- type: jsPsych.plugins.parameterType.BOOL,
70
- default: false,
71
- description: 'Whether or not to show a detailed error message on the page. If true, then detailed error messages will be shown on the '+
72
- 'page for all files that failed to load, along with the general error_message. This parameter is only relevant when continue_after_error is false.'
73
- },
74
- max_load_time: {
75
- type: jsPsych.plugins.parameterType.INT,
76
- default: null,
77
- description: 'The maximum amount of time that the plugin should wait before stopping the preload and either ending the trial '+
78
- '(if continue_after_error is true) or stopping the experiment with an error message (if continue_after_error is false). '+
79
- 'If null, the plugin will wait indefintely for the files to load.'
80
- },
81
- on_error: {
82
- type: jsPsych.plugins.parameterType.FUNCTION,
83
- default: null,
84
- description: 'Function to be called after a file fails to load. The function takes the file name as its only argument.'
85
- },
86
- on_success: {
87
- type: jsPsych.plugins.parameterType.FUNCTION,
88
- default: null,
89
- description: 'Function to be called after a file loads successfully. The function takes the file name as its only argument.'
90
- }
91
- }
92
- }
93
-
94
- plugin.trial = function(display_element, trial) {
95
-
96
- var success = null;
97
- var timeout = false;
98
- var failed_images = [];
99
- var failed_audio = [];
100
- var failed_video = [];
101
- var detailed_errors = [];
102
- var in_safe_mode = jsPsych.getSafeModeStatus();
103
-
104
- // create list of media to preload //
105
-
106
- var images = [];
107
- var audio = [];
108
- var video = [];
109
-
110
- if(trial.auto_preload){
111
- var auto_preload = jsPsych.pluginAPI.getAutoPreloadList();
112
- images = images.concat(auto_preload.images);
113
- audio = audio.concat(auto_preload.audio);
114
- video = video.concat(auto_preload.video);
115
- }
116
-
117
- if(trial.trials.length > 0){
118
- var trial_preloads = jsPsych.pluginAPI.getAutoPreloadList(trial.trials);
119
- images = images.concat(trial_preloads.images);
120
- audio = audio.concat(trial_preloads.audio);
121
- video = video.concat(trial_preloads.video);
122
- }
123
-
124
- images = images.concat(trial.images);
125
- audio = audio.concat(trial.audio);
126
- video = video.concat(trial.video);
127
-
128
- images = jsPsych.utils.unique(jsPsych.utils.flatten(images));
129
- audio = jsPsych.utils.unique(jsPsych.utils.flatten(audio));
130
- video = jsPsych.utils.unique(jsPsych.utils.flatten(video));
131
-
132
- if (in_safe_mode) {
133
- // don't preload video if in safe mode (experiment is running via file protocol)
134
- video = [];
135
- }
136
-
137
- // render display of message and progress bar
138
-
139
- var html = '';
140
-
141
- if(trial.message !== null){
142
- html += trial.message;
143
- }
144
-
145
- if(trial.show_progress_bar){
146
- html += `
147
- <div id='jspsych-loading-progress-bar-container' style='height: 10px; width: 300px; background-color: #ddd; margin: auto;'>
148
- <div id='jspsych-loading-progress-bar' style='height: 10px; width: 0%; background-color: #777;'></div>
149
- </div>`;
150
- }
151
-
152
- display_element.innerHTML = html;
153
-
154
- // do preloading
155
-
156
- if(trial.max_load_time !== null){
157
- jsPsych.pluginAPI.setTimeout(on_timeout, trial.max_load_time);
158
- }
159
-
160
- var total_n = images.length + audio.length + video.length;
161
- var loaded = 0; // success or error count
162
- var loaded_success = 0; // success count
163
-
164
- if (total_n == 0) {
165
- on_success();
166
- } else {
167
- function load_video(cb){
168
- jsPsych.pluginAPI.preloadVideo(video, cb, file_loading_success, file_loading_error);
169
- }
170
- function load_audio(cb){
171
- jsPsych.pluginAPI.preloadAudio(audio, cb, file_loading_success, file_loading_error);
172
- }
173
- function load_images(cb){
174
- jsPsych.pluginAPI.preloadImages(images, cb, file_loading_success, file_loading_error);
175
- }
176
- if (video.length > 0) { load_video(function () { }) }
177
- if (audio.length > 0) { load_audio(function () { }) }
178
- if (images.length > 0) { load_images(function () { }) }
179
- }
180
-
181
- // helper functions and callbacks
182
-
183
- function update_loading_progress_bar(){
184
- loaded++;
185
- if(trial.show_progress_bar){
186
- var percent_loaded = (loaded/total_n)*100;
187
- var preload_progress_bar = jsPsych.getDisplayElement().querySelector('#jspsych-loading-progress-bar');
188
- if (preload_progress_bar !== null) {
189
- preload_progress_bar.style.width = percent_loaded+"%";
190
- }
191
- }
192
- }
193
-
194
- // called when a single file loading fails
195
- function file_loading_error(e) {
196
- // update progress bar even if there's an error
197
- update_loading_progress_bar();
198
- // change success flag after first file loading error
199
- if (success == null) {
200
- success = false;
201
- }
202
- // add file to failed media list
203
- var source = "unknown file";
204
- if (e.source) {
205
- source = e.source;
206
- }
207
- if (e.error && e.error.path && e.error.path.length > 0) {
208
- if (e.error.path[0].localName == "img") {
209
- failed_images.push(source);
210
- } else if (e.error.path[0].localName == "audio") {
211
- failed_audio.push(source);
212
- } else if (e.error.path[0].localName == "video") {
213
- failed_video.push(source);
214
- }
215
- }
216
- // construct detailed error message
217
- var err_msg = '<p><strong>Error loading file: '+source+'</strong><br>';
218
- if (e.error.statusText) {
219
- err_msg += 'File request response status: '+e.error.statusText+'<br>';
220
- }
221
- if (e.error == "404") {
222
- err_msg += '404 - file not found.<br>';
223
- }
224
- if (typeof e.error.loaded !== 'undefined' && e.error.loaded !== null && e.error.loaded !== 0) {
225
- err_msg += e.error.loaded+' bytes transferred.';
226
- } else {
227
- err_msg += 'File did not begin loading. Check that file path is correct and reachable by the browser,<br>'+
228
- 'and that loading is not blocked by cross-origin resource sharing (CORS) errors.';
229
- }
230
- err_msg += '</p>';
231
- detailed_errors.push(err_msg);
232
- // call trial's on_error function
233
- after_error(source);
234
- // if this is the last file
235
- if (loaded == total_n) {
236
- if (trial.continue_after_error) {
237
- // if continue_after_error is false, then stop with an error
238
- end_trial();
239
- } else {
240
- // otherwise end the trial and continue
241
- stop_with_error_message();
242
- }
243
- }
244
- }
245
-
246
- // called when a single file loads successfully
247
- function file_loading_success(source) {
248
- update_loading_progress_bar();
249
- // call trial's on_success function
250
- after_success(source);
251
- loaded_success++;
252
- if (loaded_success == total_n) {
253
- // if this is the last file and all loaded successfully, call success function
254
- on_success();
255
- } else if (loaded == total_n) {
256
- // if this is the last file and there was at least one error
257
- if (trial.continue_after_error) {
258
- // end the trial and continue with experiment
259
- end_trial();
260
- } else {
261
- // if continue_after_error is false, then stop with an error
262
- stop_with_error_message();
263
- }
264
- }
265
- }
266
-
267
- // called if all files load successfully
268
- function on_success() {
269
- if (typeof timeout !== 'undefined' && timeout === false) {
270
- // clear timeout immediately after finishing, to handle race condition with max_load_time
271
- jsPsych.pluginAPI.clearAllTimeouts();
272
- // need to call cancel preload function to clear global jsPsych preload_request list, even when they've all succeeded
273
- jsPsych.pluginAPI.cancelPreloads();
274
- success = true;
275
- end_trial();
276
- }
277
- }
278
-
279
- // called if all_files haven't finished loading when max_load_time is reached
280
- function on_timeout() {
281
- //console.log('timeout fired');
282
- jsPsych.pluginAPI.cancelPreloads();
283
- if (typeof success !== 'undefined' && (success === false || success === null)) {
284
- timeout = true;
285
- if (loaded_success < total_n) {
286
- success = false;
287
- }
288
- after_error('timeout'); // call trial's on_error event handler here, in case loading timed out with no file errors
289
- detailed_errors.push('<p><strong>Loading timed out.</strong><br>'+
290
- 'Consider compressing your stimuli files, loading your files in smaller batches,<br>'+
291
- 'and/or increasing the <i>max_load_time</i> parameter.</p>');
292
- if (trial.continue_after_error) {
293
- end_trial();
294
- } else {
295
- stop_with_error_message();
296
- }
297
- }
298
- }
299
-
300
- function stop_with_error_message() {
301
- jsPsych.pluginAPI.clearAllTimeouts();
302
- jsPsych.pluginAPI.cancelPreloads();
303
- // show error message
304
- display_element.innerHTML = trial.error_message;
305
- // show detailed errors, if necessary
306
- if (trial.show_detailed_errors) {
307
- display_element.innerHTML += '<p><strong>Error details:</strong></p>';
308
- detailed_errors.forEach(function(e) {
309
- display_element.innerHTML += e;
310
- });
311
- }
312
- }
313
-
314
- function after_error(source) {
315
- // call on_error function and pass file name
316
- if (trial.on_error !== null) {
317
- trial.on_error(source);
318
- }
319
- }
320
- function after_success(source) {
321
- // call on_success function and pass file name
322
- if (trial.on_success !== null) {
323
- trial.on_success(source);
324
- }
325
- }
326
-
327
- function end_trial(){
328
- // clear timeout again when end_trial is called, to handle race condition with max_load_time
329
- jsPsych.pluginAPI.clearAllTimeouts();
330
- var trial_data = {
331
- success: success,
332
- timeout: timeout,
333
- failed_images: failed_images,
334
- failed_audio: failed_audio,
335
- failed_video: failed_video
336
- };
337
- // clear the display
338
- display_element.innerHTML = '';
339
- jsPsych.finishTrial(trial_data);
340
- }
341
- };
342
-
343
- return plugin;
344
- })();
345
-