@overcrow/mcp 0.0.0 → 0.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 (489) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +91 -1
  3. package/dist/audit/index.js +103 -0
  4. package/dist/audit/lexer.js +417 -0
  5. package/dist/audit/project.js +200 -0
  6. package/dist/audit/rules.js +661 -0
  7. package/dist/bootstrap/download.js +229 -0
  8. package/dist/bootstrap/install.js +280 -0
  9. package/dist/bootstrap/pin.js +85 -0
  10. package/dist/bootstrap/pin.json +119 -0
  11. package/dist/bootstrap/zip.js +258 -0
  12. package/dist/cli.js +200 -0
  13. package/dist/confine.js +244 -0
  14. package/dist/content/docs/en/cli.md +768 -0
  15. package/dist/content/docs/en/creator-space.md +78 -0
  16. package/dist/content/docs/en/dev-channel.md +130 -0
  17. package/dist/content/docs/en/elements.md +469 -0
  18. package/dist/content/docs/en/forms.md +328 -0
  19. package/dist/content/docs/en/guide.md +252 -0
  20. package/dist/content/docs/en/index.md +85 -0
  21. package/dist/content/docs/en/limits.md +241 -0
  22. package/dist/content/docs/en/logic.md +446 -0
  23. package/dist/content/docs/en/manifest.md +388 -0
  24. package/dist/content/docs/en/mcp.md +165 -0
  25. package/dist/content/docs/en/package.md +131 -0
  26. package/dist/content/docs/en/publish-a-widget.md +94 -0
  27. package/dist/content/docs/en/publish-keys.md +95 -0
  28. package/dist/content/docs/en/publishing.md +167 -0
  29. package/dist/content/docs/en/reference.md +55 -0
  30. package/dist/content/docs/en/result-shapes.md +332 -0
  31. package/dist/content/docs/en/sdk.md +295 -0
  32. package/dist/content/docs/en/security.md +115 -0
  33. package/dist/content/docs/en/service-reference.md +344 -0
  34. package/dist/content/docs/en/services.md +517 -0
  35. package/dist/content/docs/en/style-properties.md +270 -0
  36. package/dist/content/docs/en/style.md +266 -0
  37. package/dist/content/docs/en/testing.md +400 -0
  38. package/dist/content/docs/en/verified-domain.md +46 -0
  39. package/dist/content/docs/en/view.md +338 -0
  40. package/dist/content/docs/en/widget-listing.md +65 -0
  41. package/dist/content/docs/en/widget-review.md +57 -0
  42. package/dist/content/docs/en/widget-statistics.md +134 -0
  43. package/dist/content/docs/en/widgets.md +76 -0
  44. package/dist/content/docs/fr/cli.md +802 -0
  45. package/dist/content/docs/fr/creator-space.md +83 -0
  46. package/dist/content/docs/fr/dev-channel.md +140 -0
  47. package/dist/content/docs/fr/elements.md +475 -0
  48. package/dist/content/docs/fr/forms.md +341 -0
  49. package/dist/content/docs/fr/guide.md +263 -0
  50. package/dist/content/docs/fr/index.md +90 -0
  51. package/dist/content/docs/fr/limits.md +244 -0
  52. package/dist/content/docs/fr/logic.md +461 -0
  53. package/dist/content/docs/fr/manifest.md +401 -0
  54. package/dist/content/docs/fr/mcp.md +173 -0
  55. package/dist/content/docs/fr/package.md +139 -0
  56. package/dist/content/docs/fr/publish-a-widget.md +101 -0
  57. package/dist/content/docs/fr/publish-keys.md +97 -0
  58. package/dist/content/docs/fr/publishing.md +177 -0
  59. package/dist/content/docs/fr/reference.md +59 -0
  60. package/dist/content/docs/fr/result-shapes.md +333 -0
  61. package/dist/content/docs/fr/sdk.md +301 -0
  62. package/dist/content/docs/fr/security.md +129 -0
  63. package/dist/content/docs/fr/service-reference.md +346 -0
  64. package/dist/content/docs/fr/services.md +540 -0
  65. package/dist/content/docs/fr/style-properties.md +272 -0
  66. package/dist/content/docs/fr/style.md +281 -0
  67. package/dist/content/docs/fr/testing.md +417 -0
  68. package/dist/content/docs/fr/verified-domain.md +49 -0
  69. package/dist/content/docs/fr/view.md +352 -0
  70. package/dist/content/docs/fr/widget-listing.md +69 -0
  71. package/dist/content/docs/fr/widget-review.md +59 -0
  72. package/dist/content/docs/fr/widget-statistics.md +141 -0
  73. package/dist/content/docs/fr/widgets.md +81 -0
  74. package/dist/content/examples/clock/LICENSE +21 -0
  75. package/dist/content/examples/clock/README.md +75 -0
  76. package/dist/content/examples/clock/listing.json +19 -0
  77. package/dist/content/examples/clock/locales/en.json +4 -0
  78. package/dist/content/examples/clock/locales/fr.json +4 -0
  79. package/dist/content/examples/clock/logic.ts +85 -0
  80. package/dist/content/examples/clock/manifest.json +44 -0
  81. package/dist/content/examples/clock/package.json +16 -0
  82. package/dist/content/examples/clock/style.ocss +26 -0
  83. package/dist/content/examples/clock/tests/hidden.scenario.json +68 -0
  84. package/dist/content/examples/clock/tests/load-logic.mjs +22 -0
  85. package/dist/content/examples/clock/tests/logic.test.mjs +89 -0
  86. package/dist/content/examples/clock/tests/options.scenario.json +108 -0
  87. package/dist/content/examples/clock/tests/preview.scenario.json +25 -0
  88. package/dist/content/examples/clock/tests/render.scenario.json +94 -0
  89. package/dist/content/examples/clock/tests/summer-time.scenario.json +74 -0
  90. package/dist/content/examples/clock/tests/ticks.scenario.json +120 -0
  91. package/dist/content/examples/clock/tsconfig.json +16 -0
  92. package/dist/content/examples/clock/view.ocml +8 -0
  93. package/dist/content/examples/countdown/LICENSE +20 -0
  94. package/dist/content/examples/countdown/listing.json +10 -0
  95. package/dist/content/examples/countdown/locales/en.json +15 -0
  96. package/dist/content/examples/countdown/locales/fr.json +15 -0
  97. package/dist/content/examples/countdown/logic.ts +179 -0
  98. package/dist/content/examples/countdown/manifest.json +34 -0
  99. package/dist/content/examples/countdown/package.json +15 -0
  100. package/dist/content/examples/countdown/style.ocss +94 -0
  101. package/dist/content/examples/countdown/tsconfig.json +16 -0
  102. package/dist/content/examples/countdown/view.ocml +42 -0
  103. package/dist/content/examples/fps/LICENSE +21 -0
  104. package/dist/content/examples/fps/README.md +64 -0
  105. package/dist/content/examples/fps/listing.json +19 -0
  106. package/dist/content/examples/fps/locales/en.json +11 -0
  107. package/dist/content/examples/fps/locales/fr.json +11 -0
  108. package/dist/content/examples/fps/logic.ts +64 -0
  109. package/dist/content/examples/fps/manifest.json +30 -0
  110. package/dist/content/examples/fps/package.json +16 -0
  111. package/dist/content/examples/fps/style.ocss +31 -0
  112. package/dist/content/examples/fps/submission.json +8 -0
  113. package/dist/content/examples/fps/tests/label.scenario.json +63 -0
  114. package/dist/content/examples/fps/tests/load-logic.mjs +22 -0
  115. package/dist/content/examples/fps/tests/logic.test.mjs +60 -0
  116. package/dist/content/examples/fps/tests/preview.scenario.json +29 -0
  117. package/dist/content/examples/fps/tests/refused.scenario.json +20 -0
  118. package/dist/content/examples/fps/tests/render.scenario.json +96 -0
  119. package/dist/content/examples/fps/tests/stale.scenario.json +91 -0
  120. package/dist/content/examples/fps/tests/unavailable.scenario.json +111 -0
  121. package/dist/content/examples/fps/tsconfig.json +16 -0
  122. package/dist/content/examples/fps/view.ocml +11 -0
  123. package/dist/content/examples/media/LICENSE +21 -0
  124. package/dist/content/examples/media/README.md +147 -0
  125. package/dist/content/examples/media/listing.json +19 -0
  126. package/dist/content/examples/media/locales/en.json +11 -0
  127. package/dist/content/examples/media/locales/fr.json +11 -0
  128. package/dist/content/examples/media/logic.ts +191 -0
  129. package/dist/content/examples/media/manifest.json +35 -0
  130. package/dist/content/examples/media/package.json +16 -0
  131. package/dist/content/examples/media/style.ocss +148 -0
  132. package/dist/content/examples/media/submission.json +12 -0
  133. package/dist/content/examples/media/tests/covers.scenario.json +144 -0
  134. package/dist/content/examples/media/tests/gesture.scenario.json +173 -0
  135. package/dist/content/examples/media/tests/load-logic.mjs +22 -0
  136. package/dist/content/examples/media/tests/logic.test.mjs +176 -0
  137. package/dist/content/examples/media/tests/marquee.scenario.json +127 -0
  138. package/dist/content/examples/media/tests/preview.scenario.json +52 -0
  139. package/dist/content/examples/media/tests/read-only.scenario.json +53 -0
  140. package/dist/content/examples/media/tests/refused.scenario.json +22 -0
  141. package/dist/content/examples/media/tests/refused.test.mjs +31 -0
  142. package/dist/content/examples/media/tests/render.scenario.json +136 -0
  143. package/dist/content/examples/media/tests/states.scenario.json +257 -0
  144. package/dist/content/examples/media/tests/unavailable.scenario.json +120 -0
  145. package/dist/content/examples/media/tsconfig.json +16 -0
  146. package/dist/content/examples/media/view.ocml +41 -0
  147. package/dist/content/examples/notes/LICENSE +21 -0
  148. package/dist/content/examples/notes/README.md +219 -0
  149. package/dist/content/examples/notes/listing.json +19 -0
  150. package/dist/content/examples/notes/locales/en.json +25 -0
  151. package/dist/content/examples/notes/locales/fr.json +25 -0
  152. package/dist/content/examples/notes/logic.ts +799 -0
  153. package/dist/content/examples/notes/manifest.json +40 -0
  154. package/dist/content/examples/notes/package.json +16 -0
  155. package/dist/content/examples/notes/style.ocss +469 -0
  156. package/dist/content/examples/notes/submission.json +12 -0
  157. package/dist/content/examples/notes/tests/checks.scenario.json +237 -0
  158. package/dist/content/examples/notes/tests/create.scenario.json +260 -0
  159. package/dist/content/examples/notes/tests/delete.scenario.json +342 -0
  160. package/dist/content/examples/notes/tests/drafts.scenario.json +714 -0
  161. package/dist/content/examples/notes/tests/editor.scenario.json +232 -0
  162. package/dist/content/examples/notes/tests/frame.scenario.json +93 -0
  163. package/dist/content/examples/notes/tests/interactive.scenario.json +344 -0
  164. package/dist/content/examples/notes/tests/limits.scenario.json +1351 -0
  165. package/dist/content/examples/notes/tests/load-logic.mjs +22 -0
  166. package/dist/content/examples/notes/tests/logic.test.mjs +514 -0
  167. package/dist/content/examples/notes/tests/preview.scenario.json +99 -0
  168. package/dist/content/examples/notes/tests/read-only.scenario.json +105 -0
  169. package/dist/content/examples/notes/tests/refused.scenario.json +33 -0
  170. package/dist/content/examples/notes/tests/save.scenario.json +378 -0
  171. package/dist/content/examples/notes/tests/states.scenario.json +640 -0
  172. package/dist/content/examples/notes/tests/typing.scenario.json +562 -0
  173. package/dist/content/examples/notes/tests/unavailable.scenario.json +246 -0
  174. package/dist/content/examples/notes/tsconfig.json +16 -0
  175. package/dist/content/examples/notes/view.ocml +154 -0
  176. package/dist/content/examples/performance/LICENSE +21 -0
  177. package/dist/content/examples/performance/README.md +134 -0
  178. package/dist/content/examples/performance/listing.json +19 -0
  179. package/dist/content/examples/performance/locales/en.json +20 -0
  180. package/dist/content/examples/performance/locales/fr.json +20 -0
  181. package/dist/content/examples/performance/logic.ts +210 -0
  182. package/dist/content/examples/performance/manifest.json +83 -0
  183. package/dist/content/examples/performance/package.json +16 -0
  184. package/dist/content/examples/performance/style.ocss +75 -0
  185. package/dist/content/examples/performance/submission.json +12 -0
  186. package/dist/content/examples/performance/tests/fahrenheit.scenario.json +110 -0
  187. package/dist/content/examples/performance/tests/horizontal.scenario.json +96 -0
  188. package/dist/content/examples/performance/tests/load-logic.mjs +22 -0
  189. package/dist/content/examples/performance/tests/logic.test.mjs +226 -0
  190. package/dist/content/examples/performance/tests/menu.scenario.json +170 -0
  191. package/dist/content/examples/performance/tests/no-fps-source.scenario.json +47 -0
  192. package/dist/content/examples/performance/tests/preview.scenario.json +45 -0
  193. package/dist/content/examples/performance/tests/refused.scenario.json +20 -0
  194. package/dist/content/examples/performance/tests/refused.test.mjs +19 -0
  195. package/dist/content/examples/performance/tests/region.scenario.json +89 -0
  196. package/dist/content/examples/performance/tests/render.scenario.json +112 -0
  197. package/dist/content/examples/performance/tests/sources.scenario.json +151 -0
  198. package/dist/content/examples/performance/tests/stale.scenario.json +111 -0
  199. package/dist/content/examples/performance/tests/telemetry-only.scenario.json +44 -0
  200. package/dist/content/examples/performance/tests/thresholds.scenario.json +147 -0
  201. package/dist/content/examples/performance/tests/waiting.scenario.json +105 -0
  202. package/dist/content/examples/performance/tsconfig.json +16 -0
  203. package/dist/content/examples/performance/view.ocml +18 -0
  204. package/dist/content/examples/playervox-journal/LICENSE +21 -0
  205. package/dist/content/examples/playervox-journal/README.md +150 -0
  206. package/dist/content/examples/playervox-journal/listing.json +19 -0
  207. package/dist/content/examples/playervox-journal/locales/en.json +25 -0
  208. package/dist/content/examples/playervox-journal/locales/fr.json +25 -0
  209. package/dist/content/examples/playervox-journal/logic.ts +556 -0
  210. package/dist/content/examples/playervox-journal/manifest.json +19 -0
  211. package/dist/content/examples/playervox-journal/package.json +16 -0
  212. package/dist/content/examples/playervox-journal/style.ocss +142 -0
  213. package/dist/content/examples/playervox-journal/submission.json +12 -0
  214. package/dist/content/examples/playervox-journal/tests/changes.scenario.json +482 -0
  215. package/dist/content/examples/playervox-journal/tests/delete.scenario.json +432 -0
  216. package/dist/content/examples/playervox-journal/tests/frame.scenario.json +169 -0
  217. package/dist/content/examples/playervox-journal/tests/load-logic.mjs +22 -0
  218. package/dist/content/examples/playervox-journal/tests/logic.test.mjs +349 -0
  219. package/dist/content/examples/playervox-journal/tests/paging.scenario.json +428 -0
  220. package/dist/content/examples/playervox-journal/tests/preview.scenario.json +184 -0
  221. package/dist/content/examples/playervox-journal/tests/read-only.scenario.json +157 -0
  222. package/dist/content/examples/playervox-journal/tests/refused.scenario.json +39 -0
  223. package/dist/content/examples/playervox-journal/tests/scale.scenario.json +286 -0
  224. package/dist/content/examples/playervox-journal/tests/signed-out.scenario.json +134 -0
  225. package/dist/content/examples/playervox-journal/tests/states.scenario.json +741 -0
  226. package/dist/content/examples/playervox-journal/tests/unavailable.scenario.json +183 -0
  227. package/dist/content/examples/playervox-journal/tsconfig.json +16 -0
  228. package/dist/content/examples/playervox-journal/view.ocml +52 -0
  229. package/dist/content/examples/playervox-rating/LICENSE +21 -0
  230. package/dist/content/examples/playervox-rating/README.md +166 -0
  231. package/dist/content/examples/playervox-rating/listing.json +19 -0
  232. package/dist/content/examples/playervox-rating/locales/en.json +35 -0
  233. package/dist/content/examples/playervox-rating/locales/fr.json +35 -0
  234. package/dist/content/examples/playervox-rating/logic.ts +581 -0
  235. package/dist/content/examples/playervox-rating/manifest.json +19 -0
  236. package/dist/content/examples/playervox-rating/package.json +16 -0
  237. package/dist/content/examples/playervox-rating/style.ocss +333 -0
  238. package/dist/content/examples/playervox-rating/submission.json +12 -0
  239. package/dist/content/examples/playervox-rating/tests/account.scenario.json +125 -0
  240. package/dist/content/examples/playervox-rating/tests/bounds.scenario.json +73 -0
  241. package/dist/content/examples/playervox-rating/tests/draft.scenario.json +199 -0
  242. package/dist/content/examples/playervox-rating/tests/form.scenario.json +142 -0
  243. package/dist/content/examples/playervox-rating/tests/load-logic.mjs +22 -0
  244. package/dist/content/examples/playervox-rating/tests/logic.test.mjs +346 -0
  245. package/dist/content/examples/playervox-rating/tests/offline.scenario.json +142 -0
  246. package/dist/content/examples/playervox-rating/tests/preview.scenario.json +44 -0
  247. package/dist/content/examples/playervox-rating/tests/publish-keyboard.scenario.json +221 -0
  248. package/dist/content/examples/playervox-rating/tests/publish-pointer.scenario.json +314 -0
  249. package/dist/content/examples/playervox-rating/tests/read-only.scenario.json +70 -0
  250. package/dist/content/examples/playervox-rating/tests/refused.scenario.json +45 -0
  251. package/dist/content/examples/playervox-rating/tests/states.scenario.json +362 -0
  252. package/dist/content/examples/playervox-rating/tsconfig.json +16 -0
  253. package/dist/content/examples/playervox-rating/view.ocml +62 -0
  254. package/dist/content/examples/playervox-reviews/LICENSE +21 -0
  255. package/dist/content/examples/playervox-reviews/README.md +194 -0
  256. package/dist/content/examples/playervox-reviews/listing.json +19 -0
  257. package/dist/content/examples/playervox-reviews/locales/en.json +32 -0
  258. package/dist/content/examples/playervox-reviews/locales/fr.json +32 -0
  259. package/dist/content/examples/playervox-reviews/logic.ts +822 -0
  260. package/dist/content/examples/playervox-reviews/manifest.json +30 -0
  261. package/dist/content/examples/playervox-reviews/package.json +16 -0
  262. package/dist/content/examples/playervox-reviews/style.ocss +260 -0
  263. package/dist/content/examples/playervox-reviews/submission.json +8 -0
  264. package/dist/content/examples/playervox-reviews/tests/account.scenario.json +249 -0
  265. package/dist/content/examples/playervox-reviews/tests/bounds.scenario.json +336 -0
  266. package/dist/content/examples/playervox-reviews/tests/changes.scenario.json +515 -0
  267. package/dist/content/examples/playervox-reviews/tests/filter.scenario.json +400 -0
  268. package/dist/content/examples/playervox-reviews/tests/frame.scenario.json +185 -0
  269. package/dist/content/examples/playervox-reviews/tests/keyboard.scenario.json +188 -0
  270. package/dist/content/examples/playervox-reviews/tests/load-logic.mjs +22 -0
  271. package/dist/content/examples/playervox-reviews/tests/logic.test.mjs +559 -0
  272. package/dist/content/examples/playervox-reviews/tests/offline-start.scenario.json +152 -0
  273. package/dist/content/examples/playervox-reviews/tests/offline.scenario.json +311 -0
  274. package/dist/content/examples/playervox-reviews/tests/paging.scenario.json +497 -0
  275. package/dist/content/examples/playervox-reviews/tests/preview.scenario.json +286 -0
  276. package/dist/content/examples/playervox-reviews/tests/reading.scenario.json +591 -0
  277. package/dist/content/examples/playervox-reviews/tests/refused.scenario.json +54 -0
  278. package/dist/content/examples/playervox-reviews/tests/scale.scenario.json +303 -0
  279. package/dist/content/examples/playervox-reviews/tests/states.scenario.json +700 -0
  280. package/dist/content/examples/playervox-reviews/tests/unavailable.scenario.json +192 -0
  281. package/dist/content/examples/playervox-reviews/tsconfig.json +16 -0
  282. package/dist/content/examples/playervox-reviews/view.ocml +110 -0
  283. package/dist/content/examples/playervox-score/LICENSE +21 -0
  284. package/dist/content/examples/playervox-score/README.md +131 -0
  285. package/dist/content/examples/playervox-score/listing.json +19 -0
  286. package/dist/content/examples/playervox-score/locales/en.json +23 -0
  287. package/dist/content/examples/playervox-score/locales/fr.json +23 -0
  288. package/dist/content/examples/playervox-score/logic.ts +430 -0
  289. package/dist/content/examples/playervox-score/manifest.json +47 -0
  290. package/dist/content/examples/playervox-score/package.json +16 -0
  291. package/dist/content/examples/playervox-score/style.ocss +247 -0
  292. package/dist/content/examples/playervox-score/submission.json +8 -0
  293. package/dist/content/examples/playervox-score/tests/grades.scenario.json +279 -0
  294. package/dist/content/examples/playervox-score/tests/load-logic.mjs +22 -0
  295. package/dist/content/examples/playervox-score/tests/logic.test.mjs +229 -0
  296. package/dist/content/examples/playervox-score/tests/options.scenario.json +302 -0
  297. package/dist/content/examples/playervox-score/tests/preview.scenario.json +68 -0
  298. package/dist/content/examples/playervox-score/tests/pulse.scenario.json +157 -0
  299. package/dist/content/examples/playervox-score/tests/refused.scenario.json +21 -0
  300. package/dist/content/examples/playervox-score/tests/signed-out.scenario.json +46 -0
  301. package/dist/content/examples/playervox-score/tests/states.scenario.json +450 -0
  302. package/dist/content/examples/playervox-score/tests/unavailable.scenario.json +84 -0
  303. package/dist/content/examples/playervox-score/tsconfig.json +16 -0
  304. package/dist/content/examples/playervox-score/view.ocml +51 -0
  305. package/dist/content/examples/session/LICENSE +21 -0
  306. package/dist/content/examples/session/README.md +57 -0
  307. package/dist/content/examples/session/listing.json +19 -0
  308. package/dist/content/examples/session/locales/en.json +3 -0
  309. package/dist/content/examples/session/locales/fr.json +3 -0
  310. package/dist/content/examples/session/logic.ts +26 -0
  311. package/dist/content/examples/session/manifest.json +19 -0
  312. package/dist/content/examples/session/package.json +16 -0
  313. package/dist/content/examples/session/style.ocss +16 -0
  314. package/dist/content/examples/session/submission.json +8 -0
  315. package/dist/content/examples/session/tests/hidden.scenario.json +45 -0
  316. package/dist/content/examples/session/tests/load-logic.mjs +22 -0
  317. package/dist/content/examples/session/tests/logic.test.mjs +37 -0
  318. package/dist/content/examples/session/tests/preview.scenario.json +28 -0
  319. package/dist/content/examples/session/tests/refused.scenario.json +20 -0
  320. package/dist/content/examples/session/tests/refused.test.mjs +16 -0
  321. package/dist/content/examples/session/tests/render.scenario.json +95 -0
  322. package/dist/content/examples/session/tests/ticks.scenario.json +139 -0
  323. package/dist/content/examples/session/tests/unknown.scenario.json +37 -0
  324. package/dist/content/examples/session/tsconfig.json +16 -0
  325. package/dist/content/examples/session/view.ocml +11 -0
  326. package/dist/content/examples/stopwatch/LICENSE +21 -0
  327. package/dist/content/examples/stopwatch/README.md +99 -0
  328. package/dist/content/examples/stopwatch/listing.json +19 -0
  329. package/dist/content/examples/stopwatch/locales/en.json +8 -0
  330. package/dist/content/examples/stopwatch/locales/fr.json +8 -0
  331. package/dist/content/examples/stopwatch/logic.ts +93 -0
  332. package/dist/content/examples/stopwatch/manifest.json +19 -0
  333. package/dist/content/examples/stopwatch/package.json +16 -0
  334. package/dist/content/examples/stopwatch/style.ocss +54 -0
  335. package/dist/content/examples/stopwatch/submission.json +12 -0
  336. package/dist/content/examples/stopwatch/tests/errors.scenario.json +121 -0
  337. package/dist/content/examples/stopwatch/tests/gesture.scenario.json +154 -0
  338. package/dist/content/examples/stopwatch/tests/hidden.scenario.json +57 -0
  339. package/dist/content/examples/stopwatch/tests/hundredths.scenario.json +173 -0
  340. package/dist/content/examples/stopwatch/tests/load-logic.mjs +22 -0
  341. package/dist/content/examples/stopwatch/tests/logic.test.mjs +99 -0
  342. package/dist/content/examples/stopwatch/tests/preview.scenario.json +36 -0
  343. package/dist/content/examples/stopwatch/tests/read-only.scenario.json +42 -0
  344. package/dist/content/examples/stopwatch/tests/read-only.test.mjs +18 -0
  345. package/dist/content/examples/stopwatch/tests/refused.scenario.json +22 -0
  346. package/dist/content/examples/stopwatch/tests/refused.test.mjs +18 -0
  347. package/dist/content/examples/stopwatch/tests/render.scenario.json +105 -0
  348. package/dist/content/examples/stopwatch/tests/states.scenario.json +246 -0
  349. package/dist/content/examples/stopwatch/tests/unknown.scenario.json +40 -0
  350. package/dist/content/examples/stopwatch/tsconfig.json +16 -0
  351. package/dist/content/examples/stopwatch/view.ocml +29 -0
  352. package/dist/content/examples/twitch-chat/LICENSE +21 -0
  353. package/dist/content/examples/twitch-chat/README.md +283 -0
  354. package/dist/content/examples/twitch-chat/listing.json +19 -0
  355. package/dist/content/examples/twitch-chat/locales/en.json +52 -0
  356. package/dist/content/examples/twitch-chat/locales/fr.json +52 -0
  357. package/dist/content/examples/twitch-chat/logic.ts +887 -0
  358. package/dist/content/examples/twitch-chat/manifest.json +33 -0
  359. package/dist/content/examples/twitch-chat/package.json +16 -0
  360. package/dist/content/examples/twitch-chat/style.ocss +544 -0
  361. package/dist/content/examples/twitch-chat/submission.json +12 -0
  362. package/dist/content/examples/twitch-chat/tests/account.scenario.json +325 -0
  363. package/dist/content/examples/twitch-chat/tests/burst.scenario.json +1866 -0
  364. package/dist/content/examples/twitch-chat/tests/channel-refused.scenario.json +372 -0
  365. package/dist/content/examples/twitch-chat/tests/channel.scenario.json +480 -0
  366. package/dist/content/examples/twitch-chat/tests/draft.scenario.json +279 -0
  367. package/dist/content/examples/twitch-chat/tests/fade.scenario.json +269 -0
  368. package/dist/content/examples/twitch-chat/tests/failures.scenario.json +420 -0
  369. package/dist/content/examples/twitch-chat/tests/favorites.scenario.json +376 -0
  370. package/dist/content/examples/twitch-chat/tests/frame.scenario.json +152 -0
  371. package/dist/content/examples/twitch-chat/tests/lifetime.scenario.json +186 -0
  372. package/dist/content/examples/twitch-chat/tests/load-logic.mjs +22 -0
  373. package/dist/content/examples/twitch-chat/tests/logic.test.mjs +1053 -0
  374. package/dist/content/examples/twitch-chat/tests/passive.scenario.json +536 -0
  375. package/dist/content/examples/twitch-chat/tests/preview.scenario.json +147 -0
  376. package/dist/content/examples/twitch-chat/tests/read-only.scenario.json +202 -0
  377. package/dist/content/examples/twitch-chat/tests/read-only.test.mjs +63 -0
  378. package/dist/content/examples/twitch-chat/tests/refused.scenario.json +65 -0
  379. package/dist/content/examples/twitch-chat/tests/refused.test.mjs +43 -0
  380. package/dist/content/examples/twitch-chat/tests/render.scenario.json +347 -0
  381. package/dist/content/examples/twitch-chat/tests/reply.scenario.json +384 -0
  382. package/dist/content/examples/twitch-chat/tests/send-refused.scenario.json +383 -0
  383. package/dist/content/examples/twitch-chat/tests/send.scenario.json +300 -0
  384. package/dist/content/examples/twitch-chat/tests/states.scenario.json +455 -0
  385. package/dist/content/examples/twitch-chat/tests/unavailable.scenario.json +256 -0
  386. package/dist/content/examples/twitch-chat/tests/unread.scenario.json +997 -0
  387. package/dist/content/examples/twitch-chat/tsconfig.json +16 -0
  388. package/dist/content/examples/twitch-chat/view.ocml +141 -0
  389. package/dist/content/examples/warframe-market/LICENSE +21 -0
  390. package/dist/content/examples/warframe-market/README.md +176 -0
  391. package/dist/content/examples/warframe-market/listing.json +19 -0
  392. package/dist/content/examples/warframe-market/locales/en.json +44 -0
  393. package/dist/content/examples/warframe-market/locales/fr.json +44 -0
  394. package/dist/content/examples/warframe-market/logic.ts +1265 -0
  395. package/dist/content/examples/warframe-market/manifest.json +92 -0
  396. package/dist/content/examples/warframe-market/package.json +16 -0
  397. package/dist/content/examples/warframe-market/style.ocss +422 -0
  398. package/dist/content/examples/warframe-market/submission.json +24 -0
  399. package/dist/content/examples/warframe-market/tests/bounds.scenario.json +60 -0
  400. package/dist/content/examples/warframe-market/tests/cached.scenario.json +70 -0
  401. package/dist/content/examples/warframe-market/tests/detail.scenario.json +251 -0
  402. package/dist/content/examples/warframe-market/tests/errors.scenario.json +105 -0
  403. package/dist/content/examples/warframe-market/tests/fixtures.json +295 -0
  404. package/dist/content/examples/warframe-market/tests/load-logic.mjs +22 -0
  405. package/dist/content/examples/warframe-market/tests/logic.test.mjs +505 -0
  406. package/dist/content/examples/warframe-market/tests/no-clipboard.scenario.json +104 -0
  407. package/dist/content/examples/warframe-market/tests/passive.scenario.json +87 -0
  408. package/dist/content/examples/warframe-market/tests/preview.scenario.json +146 -0
  409. package/dist/content/examples/warframe-market/tests/refresh.scenario.json +56 -0
  410. package/dist/content/examples/warframe-market/tests/refused.scenario.json +74 -0
  411. package/dist/content/examples/warframe-market/tests/render.scenario.json +210 -0
  412. package/dist/content/examples/warframe-market/tests/search.scenario.json +189 -0
  413. package/dist/content/examples/warframe-market/tests/unavailable.scenario.json +54 -0
  414. package/dist/content/examples/warframe-market/tsconfig.json +16 -0
  415. package/dist/content/examples/warframe-market/view.ocml +116 -0
  416. package/dist/content/examples/weather/LICENSE +20 -0
  417. package/dist/content/examples/weather/listing.json +10 -0
  418. package/dist/content/examples/weather/locales/en.json +9 -0
  419. package/dist/content/examples/weather/locales/fr.json +9 -0
  420. package/dist/content/examples/weather/logic.ts +62 -0
  421. package/dist/content/examples/weather/manifest.json +51 -0
  422. package/dist/content/examples/weather/package.json +15 -0
  423. package/dist/content/examples/weather/style.ocss +29 -0
  424. package/dist/content/examples/weather/submission.json +17 -0
  425. package/dist/content/examples/weather/tsconfig.json +16 -0
  426. package/dist/content/examples/weather/view.ocml +12 -0
  427. package/dist/content/index.json +3705 -0
  428. package/dist/content/reference/errors.json +1924 -0
  429. package/dist/content/reference/limits.json +1154 -0
  430. package/dist/content/reference/manifest.md +223 -0
  431. package/dist/content/reference/permissions.json +413 -0
  432. package/dist/content/templates/blank/locales/en.json +3 -0
  433. package/dist/content/templates/blank/locales/fr.json +3 -0
  434. package/dist/content/templates/blank/logic.ts +7 -0
  435. package/dist/content/templates/blank/manifest.json +16 -0
  436. package/dist/content/templates/blank/style.ocss +10 -0
  437. package/dist/content/templates/blank/tests/example.scenario.json +10 -0
  438. package/dist/content/templates/blank/view.ocml +6 -0
  439. package/dist/content/templates/chart/locales/en.json +3 -0
  440. package/dist/content/templates/chart/locales/fr.json +3 -0
  441. package/dist/content/templates/chart/logic.ts +27 -0
  442. package/dist/content/templates/chart/manifest.json +16 -0
  443. package/dist/content/templates/chart/style.ocss +27 -0
  444. package/dist/content/templates/chart/tests/example.scenario.json +10 -0
  445. package/dist/content/templates/chart/view.ocml +10 -0
  446. package/dist/content/templates/counter/locales/en.json +4 -0
  447. package/dist/content/templates/counter/locales/fr.json +4 -0
  448. package/dist/content/templates/counter/logic.ts +20 -0
  449. package/dist/content/templates/counter/manifest.json +16 -0
  450. package/dist/content/templates/counter/style.ocss +26 -0
  451. package/dist/content/templates/counter/tests/example.scenario.json +11 -0
  452. package/dist/content/templates/counter/view.ocml +13 -0
  453. package/dist/content/templates/list/locales/en.json +8 -0
  454. package/dist/content/templates/list/locales/fr.json +8 -0
  455. package/dist/content/templates/list/logic.ts +35 -0
  456. package/dist/content/templates/list/manifest.json +16 -0
  457. package/dist/content/templates/list/style.ocss +42 -0
  458. package/dist/content/templates/list/tests/example.scenario.json +10 -0
  459. package/dist/content/templates/list/view.ocml +17 -0
  460. package/dist/content/templates/shared/LICENSE +20 -0
  461. package/dist/content/templates/shared/package.json +14 -0
  462. package/dist/content/templates/shared/tsconfig.json +16 -0
  463. package/dist/content.js +68 -0
  464. package/dist/env.js +156 -0
  465. package/dist/fingerprint.js +32 -0
  466. package/dist/hidden.js +47 -0
  467. package/dist/ids.js +27 -0
  468. package/dist/index.js +82 -0
  469. package/dist/knowledge.js +222 -0
  470. package/dist/npm.js +149 -0
  471. package/dist/prompts.js +47 -0
  472. package/dist/resources.js +82 -0
  473. package/dist/run.js +120 -0
  474. package/dist/server.js +43 -0
  475. package/dist/session.js +205 -0
  476. package/dist/sources.js +218 -0
  477. package/dist/text.js +80 -0
  478. package/dist/texts.js +44 -0
  479. package/dist/tools/audit.js +105 -0
  480. package/dist/tools/build.js +453 -0
  481. package/dist/tools/common.js +122 -0
  482. package/dist/tools/docs.js +196 -0
  483. package/dist/tools/preview.js +87 -0
  484. package/dist/tools/project.js +183 -0
  485. package/dist/tools/setup.js +146 -0
  486. package/dist/tools/submission.js +369 -0
  487. package/dist/version.js +3 -0
  488. package/npm-shrinkwrap.json +402 -0
  489. package/package.json +50 -4
@@ -0,0 +1,333 @@
1
+ # Formes de résultat
2
+
3
+ Ce que répondent les services de PlayerVox OverCrow : la forme de chaque
4
+ résultat et de chaque mise à jour d’abonnement. Le SDK exporte pour chaque
5
+ forme un type TypeScript du même nom : la logique n’a donc jamais à les
6
+ décrire à la main.
7
+
8
+ <!-- source: widgets/stopwatch/logic.ts -->
9
+ ```ts
10
+ declare module "@overcrow/sdk" {
11
+ interface WidgetState {
12
+ /** The latest state, or `null` while it is unknown. */
13
+ stopwatch: Stopwatch | null;
14
+ /** The buttons take input only in Interactive mode. */
15
+ interactive: boolean;
16
+ }
17
+ }
18
+ ```
19
+
20
+ Le widget Chronomètre garde dans son état la dernière valeur `Stopwatch`, et
21
+ la vue en lit les membres :
22
+
23
+ <!-- source: widgets/stopwatch/view.ocml -->
24
+ ```xml
25
+ <elapsed class="value" base={state.stopwatch.elapsedMs} at={state.stopwatch.at} running={state.stopwatch.running} format="hh:mm:ss.cc"/>
26
+ ```
27
+
28
+ ## Lire une forme
29
+
30
+ - Une forme est un enregistrement exact : chaque membre est présent, et un
31
+ membre sans valeur vaut `null` ; il n’est jamais absent.
32
+ - « texte ou `null` » signifie que le membre peut valoir `null` : testez-le
33
+ avant de l’afficher.
34
+ - Un entier est inférieur à 2^53 : il est donc exact en JavaScript. Les
35
+ temps sont en millisecondes : « Millisecondes Unix » compte depuis 1970 en
36
+ UTC, comme `Date.now()`.
37
+ - Un membre accompagné de `offsetMinutes` est un horodatage à mettre en
38
+ forme avec ce décalage UTC ; voir
39
+ [heure, dates et nombres](logic.md#heure-dates-et-nombres).
40
+ - Un identifiant `asset:` est une image qu’OverCrow détient pour le widget :
41
+ liez-le au `src` d’une `image` ou d’un `avatar`, ou dessinez-le sur un
42
+ canvas. Ce n’est pas une URL, et ses octets ne peuvent pas être lus.
43
+ - Un abonnement dont la forme est « … ou `null` » livre `null` quand il n’y
44
+ a rien à afficher : pas de jeu actif, pas de lecteur multimédia.
45
+
46
+ La [référence des services](service-reference.md) indique quel service donne
47
+ quelle forme.
48
+
49
+ ## Formes
50
+
51
+ <!-- generated:result-shapes -->
52
+ ### `HttpResponse`
53
+
54
+ Réponse de `http.fetch`. `{ status, contentType }` ou `{ status, asset }`
55
+
56
+ | Membre | Forme | Signification |
57
+ | --- | --- | --- |
58
+ | `status` | entier | Code d’état HTTP. |
59
+ | `contentType` | texte ou `null` | Type de média de la réponse ; le SDK y ajoute le corps décodé, `body`. |
60
+
61
+ | Membre | Forme | Signification |
62
+ | --- | --- | --- |
63
+ | `status` | entier | Code d’état HTTP. |
64
+ | `asset` | identifiant `asset:` | L’image décodée (`as: "image"`). |
65
+
66
+ ### `GameEvent`
67
+
68
+ Un événement de jeu. `{ event, at }`
69
+
70
+ | Membre | Forme | Signification |
71
+ | --- | --- | --- |
72
+ | `event` | texte | Un événement de jeu déclaré. |
73
+ | `at` | entier | Horloge monotone de l’hôte, en ms. |
74
+
75
+ ### `Session`
76
+
77
+ Durée de la session du jeu actif. `{ elapsedMs, at }`
78
+
79
+ | Membre | Forme | Signification |
80
+ | --- | --- | --- |
81
+ | `elapsedMs` | entier | Temps écoulé depuis le démarrage du processus du jeu. |
82
+ | `at` | entier | Instant de l’horloge monotone de l’hôte, en ms, auquel `elapsedMs` a été mesuré. |
83
+
84
+ ### `Telemetry`
85
+
86
+ Ressources utilisées par le jeu actif. `{ cpu, ram, cpuTemperature, gpuTemperature, sources }`
87
+
88
+ | Membre | Forme | Signification |
89
+ | --- | --- | --- |
90
+ | `cpu` | nombre ou `null` | Part du jeu dans toute la machine, en %, de 0 à 100. |
91
+ | `ram` | entier ou `null` | Mémoire résidente du jeu, en octets. |
92
+ | `cpuTemperature` | nombre ou `null` | °C. |
93
+ | `gpuTemperature` | nombre ou `null` | °C. |
94
+ | `sources` | `{ cpuTemperature, gpuTemperature }` | Capteurs dont l’hôte dispose. |
95
+ | `sources.cpuTemperature` | booléen | L’hôte dispose d’un capteur pour le CPU. |
96
+ | `sources.gpuTemperature` | booléen | L’hôte dispose d’un capteur pour le GPU. |
97
+
98
+ ### `Fps`
99
+
100
+ Fréquence d’images du jeu actif. `{ fps, stale, status }`
101
+
102
+ | Membre | Forme | Signification |
103
+ | --- | --- | --- |
104
+ | `fps` | entier ou `null` | Images par seconde. |
105
+ | `stale` | booléen | Aucune mesure depuis 3 s. |
106
+ | `status` | `ready` \| `waiting` \| `unsupported` \| `permission_denied` \| `ambiguous` \| `events_lost` \| `unavailable` | État de la mesure. |
107
+
108
+ ### `Stopwatch`
109
+
110
+ Le chronomètre manuel. `{ running, elapsedMs, at, shortcuts }`
111
+
112
+ | Membre | Forme | Signification |
113
+ | --- | --- | --- |
114
+ | `running` | booléen | Il tourne. |
115
+ | `elapsedMs` | entier | Temps écoulé à l’instant `at`. |
116
+ | `at` | entier | Instant de l’horloge monotone de l’hôte, en ms, auquel `elapsedMs` a été mesuré. |
117
+ | `shortcuts` | `{ toggle, reset, bound }` | Raccourcis du chronomètre. |
118
+ | `shortcuts.toggle` | texte | Raccourci clavier, mis en forme par l’hôte. |
119
+ | `shortcuts.reset` | texte | Raccourci clavier, mis en forme par l’hôte. |
120
+ | `shortcuts.bound` | booléen | Les raccourcis sont actifs. |
121
+
122
+ ### `Media`
123
+
124
+ Le lecteur multimédia courant. `{ player, title, artists, playing, canPrevious, canPlayPause, canNext, cover }`
125
+
126
+ | Membre | Forme | Signification |
127
+ | --- | --- | --- |
128
+ | `player` | texte | ID opaque du lecteur courant. |
129
+ | `title` | texte ou `null` | Titre du morceau. |
130
+ | `artists` | liste de textes | Artistes. |
131
+ | `playing` | booléen | En cours de lecture. |
132
+ | `canPrevious` | booléen | Le lecteur sait passer au morceau précédent. |
133
+ | `canPlayPause` | booléen | Le lecteur sait lire et mettre en pause. |
134
+ | `canNext` | booléen | Le lecteur sait passer au morceau suivant. |
135
+ | `cover` | identifiant `asset:` ou `null` | Pochette, de 512 px au plus. |
136
+
137
+ ### `NoteItem`
138
+
139
+ Une entrée de liste de tâches. `{ id, text, checked }`
140
+
141
+ | Membre | Forme | Signification |
142
+ | --- | --- | --- |
143
+ | `id` | texte ou `null` | ID de l’entrée. |
144
+ | `text` | texte | Texte. |
145
+ | `checked` | booléen | Cochée. |
146
+
147
+ ### `Note`
148
+
149
+ Une note. `{ id, title, body, items }`
150
+
151
+ | Membre | Forme | Signification |
152
+ | --- | --- | --- |
153
+ | `id` | texte ou `null` | ID de la note. |
154
+ | `title` | texte | Titre. |
155
+ | `body` | texte | Texte courant. |
156
+ | `items` | liste de [`NoteItem`](#noteitem) | Liste de tâches. |
157
+
158
+ ### `Notes`
159
+
160
+ Le document de notes de l’utilisateur. `{ active, notes }`
161
+
162
+ | Membre | Forme | Signification |
163
+ | --- | --- | --- |
164
+ | `active` | texte ou `null` | ID de la note active. |
165
+ | `notes` | liste de [`Note`](#note) | Notes. |
166
+
167
+ ### `CreatedNote`
168
+
169
+ Réponse de `notes.create`. `{ note }`
170
+
171
+ | Membre | Forme | Signification |
172
+ | --- | --- | --- |
173
+ | `note` | [`Note`](#note) | La nouvelle note. |
174
+
175
+ ### `Score`
176
+
177
+ Note PlayerVox du jeu actif. `{ state, name, score, grade, ratingsCount, criteria }`
178
+
179
+ | Membre | Forme | Signification |
180
+ | --- | --- | --- |
181
+ | `state` | `idle` \| `unsupported` \| `loading` \| `ready` \| `no_ratings` \| `not_found` \| `unavailable` | État de la note : `idle` sans jeu actif, `unsupported` pour un jeu sans ID d’application Steam, `loading` jusqu’à la première réponse pour ce jeu (jamais le score du jeu précédent), `ready` et `no_ratings` avec le score, `not_found` pour un jeu que PlayerVox ne reconnaît pas, `unavailable` pendant que l’hôte réessaie. Tout état autre que `ready` et `no_ratings` a un nom et un score `null`, le grade `--`, aucun vote et des critères `null`. |
182
+ | `name` | texte ou `null` | Nom du jeu. |
183
+ | `score` | nombre ou `null` | 0–100. |
184
+ | `grade` | `S+` \| `S` \| `A` \| `B` \| `C` \| `D` \| `F` \| `--` | Grade correspondant au score. |
185
+ | `ratingsCount` | entier | Nombre de votes. |
186
+ | `criteria` | `{ gameplay, art, tech }` | Scores des critères. |
187
+ | `criteria.gameplay` | nombre ou `null` | 0–100. |
188
+ | `criteria.art` | nombre ou `null` | 0–100. |
189
+ | `criteria.tech` | nombre ou `null` | 0–100. |
190
+
191
+ ### `Rating`
192
+
193
+ La note PlayerVox que l’utilisateur a donnée au jeu actif. `{ gameplay, art, tech, review, publishedAt, offsetMinutes }`
194
+
195
+ | Membre | Forme | Signification |
196
+ | --- | --- | --- |
197
+ | `gameplay` | entier | 0–100. |
198
+ | `art` | entier | 0–100. |
199
+ | `tech` | entier | 0–100. |
200
+ | `review` | texte ou `null` | Texte de l’avis. |
201
+ | `publishedAt` | entier ou `null` | Millisecondes Unix. |
202
+ | `offsetMinutes` | entier ou `null` | Décalage UTC, en minutes, avec lequel afficher l’horodatage. |
203
+
204
+ ### `RatingState`
205
+
206
+ La note que l’utilisateur a lui-même donnée au jeu actif, avec son état. `{ state, name, offline, rating }`
207
+
208
+ | Membre | Forme | Signification |
209
+ | --- | --- | --- |
210
+ | `state` | `idle` \| `unsupported` \| `loading` \| `ready` \| `unavailable` | État de la note : `idle` sans jeu actif, `unsupported` pour un jeu sans ID d’application Steam, `loading` jusqu’à la première réponse pour ce jeu et ce compte (jamais la note du jeu précédent), `ready` avec la note, `unavailable` pendant que l’hôte retente une lecture qui a échoué. Tout état autre que `ready` a un nom et une note `null`. |
211
+ | `name` | texte ou `null` | Nom du jeu sur PlayerVox. |
212
+ | `offline` | booléen | PlayerVox est injoignable : la note est la dernière lue, et `playervox.rating.publish` répond `not_connected`. |
213
+ | `rating` | [`Rating`](#rating) ou `null` | La note de l’utilisateur ; `null` avant la première. |
214
+
215
+ ### `Review`
216
+
217
+ Un avis de joueur. `{ id, author, grade, score, text, original, hidden, publishedAt, offsetMinutes }`
218
+
219
+ | Membre | Forme | Signification |
220
+ | --- | --- | --- |
221
+ | `id` | texte | ID de l’avis. |
222
+ | `author` | texte | Nom de l’auteur. |
223
+ | `grade` | `S+` \| `S` \| `A` \| `B` \| `C` \| `D` \| `F` \| `--` | Grade. |
224
+ | `score` | entier | 0–100. |
225
+ | `text` | texte ou `null` | Texte, traduit quand une traduction existe. |
226
+ | `original` | texte ou `null` | Texte non traduit quand `text` est une traduction ; `null` sinon. |
227
+ | `hidden` | booléen | Masqué par la communauté : n’affichez le texte que lorsque l’utilisateur le demande. |
228
+ | `publishedAt` | entier | Millisecondes Unix. |
229
+ | `offsetMinutes` | entier | Décalage UTC, en minutes, avec lequel afficher l’horodatage. |
230
+
231
+ ### `ReviewsState`
232
+
233
+ Les avis des joueurs sur le jeu actif : ce qu’il faut lire, non les avis eux-mêmes. `{ state, revision, offline }`
234
+
235
+ | Membre | Forme | Signification |
236
+ | --- | --- | --- |
237
+ | `state` | `idle` \| `unsupported` \| `ready` | `idle` sans jeu actif, `unsupported` pour un jeu sans ID d’application Steam, `ready` quand `playervox.reviews.page` lit les avis du jeu. |
238
+ | `revision` | entier | Change chaque fois que les avis à lire changent : autre jeu, autre compte PlayerVox, ou avis modifiés sur PlayerVox. |
239
+ | `offline` | booléen | PlayerVox est injoignable : `playervox.reviews.page` répond `not_connected`. |
240
+
241
+ ### `ReviewsPage`
242
+
243
+ Une page d’avis de joueurs. `{ gameName, items, page, totalPages, count }`
244
+
245
+ | Membre | Forme | Signification |
246
+ | --- | --- | --- |
247
+ | `gameName` | texte | Nom du jeu sur PlayerVox. |
248
+ | `items` | liste de [`Review`](#review) | Avis. |
249
+ | `page` | entier | Numéro de la page. |
250
+ | `totalPages` | entier | Nombre de pages. |
251
+ | `count` | entier | Nombre d’avis. |
252
+
253
+ ### `JournalSession`
254
+
255
+ Une session du journal. `{ id, startedAt, offsetMinutes, durationMs, source }`
256
+
257
+ | Membre | Forme | Signification |
258
+ | --- | --- | --- |
259
+ | `id` | texte | ID de la session. |
260
+ | `startedAt` | entier | Millisecondes Unix. |
261
+ | `offsetMinutes` | entier | Décalage UTC, en minutes, avec lequel afficher l’horodatage. |
262
+ | `durationMs` | entier | Durée. |
263
+ | `source` | `local` \| `cloud` | Où la session est enregistrée. |
264
+
265
+ ### `JournalState`
266
+
267
+ Le journal du jeu actif. `{ revision, notice }`
268
+
269
+ | Membre | Forme | Signification |
270
+ | --- | --- | --- |
271
+ | `revision` | entier | Change chaque fois que le journal fusionné du jeu actif change. |
272
+ | `notice` | `offline` \| `storage_unavailable` \| `full` \| `expired` \| `busy` \| `unavailable` ou `null` | État du journal à afficher au-dessus des sessions : `offline` la synchronisation est hors ligne (les sessions locales restent), `storage_unavailable` le journal local est illisible, `full` le journal local est plein, `expired` la connexion à PlayerVox a expiré, `busy` PlayerVox demande de réessayer plus tard, `unavailable` tout autre échec ; `null` quand il n’y en a pas. |
273
+
274
+ ### `JournalPage`
275
+
276
+ Une page du journal du jeu. `{ gameName, items, page, next, previous }`
277
+
278
+ | Membre | Forme | Signification |
279
+ | --- | --- | --- |
280
+ | `gameName` | texte | Jeu actif ; vide quand l’hôte n’a pas de nom. |
281
+ | `items` | liste de [`JournalSession`](#journalsession) | Sessions, de la plus récente à la plus ancienne. |
282
+ | `page` | entier | Numéro de la page, à partir de 1. |
283
+ | `next` | texte ou `null` | Curseur de la page suivante. |
284
+ | `previous` | texte ou `null` | Curseur de la page précédente. |
285
+
286
+ ### `ChatFragment`
287
+
288
+ Une portion de texte ou une emote d’un message de chat. `{ text }` ou `{ emote, alt }`
289
+
290
+ | Membre | Forme | Signification |
291
+ | --- | --- | --- |
292
+ | `text` | texte | Portion de texte. |
293
+
294
+ | Membre | Forme | Signification |
295
+ | --- | --- | --- |
296
+ | `emote` | identifiant `asset:` | Image de l’emote. |
297
+ | `alt` | texte | Nom de l’emote. |
298
+
299
+ ### `ChatMessage`
300
+
301
+ Un message de chat. `{ id, author, color, badges, fragments, reply, deleted, receivedAt }`
302
+
303
+ | Membre | Forme | Signification |
304
+ | --- | --- | --- |
305
+ | `id` | texte | ID du message. |
306
+ | `author` | texte | Nom de l’auteur. |
307
+ | `color` | texte ou `null` | Couleur de l’auteur, `#rrggbb`. |
308
+ | `badges` | liste d’identifiants `asset:` | Images des badges. |
309
+ | `fragments` | liste de [`ChatFragment`](#chatfragment) | Portions du contenu. |
310
+ | `reply` | `{ author, text }` ou `null` | Le message auquel celui-ci répond. |
311
+ | `reply.author` | texte | Auteur du message auquel celui-ci répond. |
312
+ | `reply.text` | texte | Texte du message auquel celui-ci répond. |
313
+ | `deleted` | booléen | Supprimé par un modérateur. |
314
+ | `receivedAt` | entier | Moment où l’hôte a reçu le message, en millisecondes Unix de l’horloge de l’hôte : comparez-le à `Date.now()` pour connaître l’âge d’un message (l’estompage du mode passif), y compris après un `reset`. |
315
+
316
+ ### `TwitchChat`
317
+
318
+ État du chat Twitch. `{ account, channel, joinState, failure, favorites, canSend, generation, reset, messages, removed, skipped }`
319
+
320
+ | Membre | Forme | Signification |
321
+ | --- | --- | --- |
322
+ | `account` | `signed_out` \| `pending` \| `connected` \| `expired` | État du compte Twitch ; la connexion est affichée par l’hôte. |
323
+ | `channel` | texte ou `null` | Identifiant de la chaîne rejointe. |
324
+ | `joinState` | `idle` \| `connecting` \| `joined` \| `reconnecting` \| `failed` | État de la connexion à la chaîne. |
325
+ | `failure` | `channel_unavailable` \| `connection` \| `provider` \| `limit` ou `null` | Pourquoi `joinState` vaut `failed`, sous la forme d’une catégorie fixe : la chaîne n’existe pas ou refuse le compte, la connexion a échoué, Twitch a répondu quelque chose d’inattendu, ou un autre widget occupe l’unique connexion de l’hôte au chat (`limit`). `null` dans tout autre état. Un échec lié au compte n’y figure pas : c’est l’hôte qui l’affiche. |
326
+ | `favorites` | liste de textes | Chaînes favorites. |
327
+ | `canSend` | booléen | Un message peut être envoyé maintenant. |
328
+ | `generation` | entier | Change avec la chaîne ou le compte. |
329
+ | `reset` | booléen | `messages` remplace toute la liste. |
330
+ | `messages` | liste de [`ChatMessage`](#chatmessage) | Messages, du plus ancien au plus récent : toute la liste avec `reset` ; sinon les nouveaux messages, à ajouter, et les messages modifiés, qui remplacent sur place celui de même `id`. |
331
+ | `removed` | liste de textes | ID des messages retirés. |
332
+ | `skipped` | entier | Nouveaux messages que l’hôte a laissés de côté depuis la mise à jour précédente, parce que le chat va plus vite qu’il ne transmet ; 0 avec `reset`. Un retrait n’est jamais laissé de côté. |
333
+ <!-- /generated:result-shapes -->
@@ -0,0 +1,301 @@
1
+ # Référence du SDK
2
+
3
+ `@overcrow/sdk` 1.0 est l’API de la logique d’un widget PlayerVox OverCrow :
4
+ l’état, les données de l’hôte, les services, les minuteurs, le dessin, le
5
+ menu d’options, les messages, les journaux et le formatage. Cette page liste
6
+ tous les exports du paquet. [La logique](logic.md) et
7
+ [Services et permissions](services.md) expliquent comment s’en servir.
8
+
9
+ Le SDK est sur npm, et la commande ci-dessous l’ajoute à un projet. Un
10
+ projet créé par `overcrow-widget init` le liste déjà : lancez-y
11
+ `npm install`.
12
+
13
+ ```sh
14
+ npm install --save-dev --save-exact @overcrow/sdk@1.0.0
15
+ ```
16
+
17
+ <!-- source: widgets/clock/logic.ts -->
18
+ ```ts
19
+ import {
20
+ formatDate,
21
+ formatTime,
22
+ initState,
23
+ onHost,
24
+ option,
25
+ t,
26
+ timers,
27
+ type DateOrder,
28
+ type Timer,
29
+ } from "@overcrow/sdk";
30
+ ```
31
+
32
+ Le SDK est assemblé dans le `logic.js` du widget à l’empaquetage et
33
+ s’exécute dans la VM du widget ; le charger ailleurs lève une erreur. Les
34
+ parties inutilisées sont retirées du script assemblé. C’est une commodité,
35
+ pas une barrière de sécurité : OverCrow vérifie chaque appel, chaque
36
+ paramètre et chaque valeur qui sort de la VM.
37
+
38
+ | Export | Nature | Résumé |
39
+ | --- | --- | --- |
40
+ | `SDK_VERSION` | constante | `"1.0.0"`. |
41
+ | `RUNTIME_SURFACE` | constante | `"0.1"`, la version de l’interface intégrée de la VM dont ce SDK a besoin. |
42
+
43
+ ## État et vue
44
+
45
+ | Export | Nature | Résumé |
46
+ | --- | --- | --- |
47
+ | `state` | constante | L’objet d’état du widget. Modifiez-le ; après chaque tour, la VM réévalue la vue et n’envoie que les différences. |
48
+ | `WidgetState` | interface | Type de `state` ; déclarez ses membres par augmentation de module. Les membres non déclarés sont `unknown`. |
49
+ | `initState(initial)` | fonction | Copie `initial` dans `state` et renvoie `state` avec le type de `initial`. Appelez-la une seule fois, pendant le chargement du module. |
50
+ | `registerView(table)` | fonction | Enregistre les expressions et les gestionnaires compilés de la vue. L’outil en ligne de commande génère cet appel : un widget ne l’écrit jamais. |
51
+ | `ViewTable` | type | La table que prend `registerView`. |
52
+ | `Expression` | type | `(state, scope) => value` : une expression compilée de la vue. |
53
+ | `Handler` | type | `(state, scope, event) => void` : un gestionnaire compilé de la vue. |
54
+ | `NodeEvent<E>` | interface | `{ type, detail }` d’un événement ; `detail` vaut `EventDetailMap[E]`. |
55
+ | `Scope` | interface | Les noms à la portée d’une expression : entrées d’un `for`, propriétés d’un composant. |
56
+
57
+ <!-- source: templates/chart/logic.ts -->
58
+ ```ts
59
+ declare module "@overcrow/sdk" {
60
+ interface WidgetState {
61
+ values: number[];
62
+ }
63
+ }
64
+
65
+ const state = initState({ values: [50] as number[] });
66
+ ```
67
+
68
+ ## Données de l’hôte
69
+
70
+ | Export | Nature | Résumé |
71
+ | --- | --- | --- |
72
+ | `host` | constante | Objet figé dont les membres donnent toujours les dernières valeurs envoyées par OverCrow. |
73
+ | `HostData` | interface | Type de `host` : `locale`, `messages`, `theme`, `region`, `scale` (en millièmes), `viewport`, `mode`, `visible`, `options`, `grants`. |
74
+ | `onHost(listener)` | fonction | Appelle `listener` avec les noms des membres de `host` qu’OverCrow vient d’envoyer (`options` après un changement dans le menu, `visible` quand le widget est affiché ou masqué, `region`…), avant la réévaluation de la vue. Renvoie `{ cancel() }`. |
75
+ | `HostKey` | type | Le nom d’un membre de `HostData`. |
76
+ | `HostListener` | type | Un écouteur de `onHost`. |
77
+ | `Viewport` | interface | `{ width, height }`, en pixels logiques. |
78
+ | `hasGrant(capability)` | fonction | Indique si l’utilisateur a accordé une capability. |
79
+ | `option(id, fallback)` | fonction | La valeur enregistrée d’une ligne du menu d’options, ou `fallback` quand il n’y en a pas ou qu’elle est d’un autre type. |
80
+ | `MenuValue` | type | `boolean \| number \| string`. |
81
+ | `Widened<T>` | type | Le type du résultat de `option` : une valeur de repli `false` donne `boolean`. |
82
+
83
+ <!-- source: widgets/clock/logic.ts -->
84
+ ```ts
85
+ onHost((changed) => {
86
+ if (changed.includes("options")) {
87
+ const values = menuValues();
88
+ const unitChanged = values.seconds !== state.seconds;
89
+ Object.assign(state, values);
90
+ if (unitChanged) {
91
+ start();
92
+ }
93
+ }
94
+ // A new UTC offset (time zone or summer time) shows at once.
95
+ if (changed.includes("region")) {
96
+ tick();
97
+ }
98
+ });
99
+ ```
100
+
101
+ ## Services
102
+
103
+ Chaque service répond par l’intermédiaire d’OverCrow, qui vérifie à chaque
104
+ appel sa permission ou sa capability, ses paramètres et l’action de
105
+ l’utilisateur.
106
+
107
+ | Export | Nature | Résumé |
108
+ | --- | --- | --- |
109
+ | `storage` | espace de noms | `get({ key })`, `set({ key, value })`, `remove({ key })`, `keys()`. Permission `storage`. |
110
+ | `http` | espace de noms | `fetch(url, { as, method?, body?, contentType? })`. Permission `network`. |
111
+ | `clipboard` | espace de noms | `writeText({ text })`, pendant une action de l’utilisateur. Permission `clipboardWrite`. |
112
+ | `gameEvents` | espace de noms | `subscribe(listener)`. Permission `gameEvents`. |
113
+ | `session` | espace de noms | `subscribe(listener)`. Capability `session.read`. |
114
+ | `telemetry` | espace de noms | `subscribe(listener)`. Capability `telemetry.read`. |
115
+ | `fps` | espace de noms | `subscribe(listener)`. Capability `fps.read`. |
116
+ | `media` | espace de noms | `subscribe({ cover? }, listener)` ; `previous`, `playPause`, `next({ player? })` pendant une action de l’utilisateur. |
117
+ | `stopwatch` | espace de noms | `subscribe(listener)` ; `toggle()`, `reset()` pendant une action de l’utilisateur. |
118
+ | `notes` | espace de noms | `subscribe(listener)` ; `create()`, `select({ note })`, `setItem({ note, item, checked })`, `delete({ note })` pendant une action de l’utilisateur. |
119
+ | `playervox` | espace de noms | `score.subscribe`, `rating.subscribe`, `reviews.subscribe`, `reviews.page({ page?, followedOnly? })`. |
120
+ | `journal` | espace de noms | `subscribe(listener)` ; `page({ cursor? })` ; `delete({ session })` pendant une action de l’utilisateur, après confirmation de celui-ci. |
121
+ | `twitch` | espace de noms | `chat.subscribe(listener)` ; `chat.join({ channel })`, `chat.leave()`, `chat.favorite({ channel, favorite })` pendant une action de l’utilisateur. |
122
+ | `call(service, params?)` | fonction | Appelle par son nom n’importe quel service qui répond une seule fois. |
123
+ | `subscribe(service, params, listener)` | fonction | S’abonne par son nom à n’importe quel service d’abonnement. |
124
+ | `ServiceError` | classe | Le rejet d’un appel en échec : `code` est un `ServiceErrorCode`. |
125
+ | `Listener<T>` | type | `(update: SubscriptionUpdate<T>) => void`. |
126
+ | `SubscriptionUpdate<T>` | type | `{ ok: true, value, final }` ou `{ ok: false, error, final: true }`. |
127
+ | `Subscription` | interface | `cancel()` ; un nouvel appel ne fait rien. |
128
+ | `ServiceParams<N>` | type | Les paramètres du service `N`. |
129
+ | `ServiceResult<N>` | type | Le résultat, ou la mise à jour, du service `N`. |
130
+ | `FetchOptions<A>` | interface | Les options de `http.fetch`. |
131
+ | `FetchResponse<A>` | type | `{ status, contentType, body }`, ou `{ status, asset }` pour `as: "image"`. |
132
+ | `BodyType` | type | `"json" \| "text" \| "bytes" \| "image"`. |
133
+ | `BodyTypes` | interface | Le corps décodé de chaque type de corps. |
134
+ | `HttpMethod` | type | Les méthodes des règles réseau. |
135
+ | `HttpServices` | interface | Type de `http`. |
136
+
137
+ L’écouteur vient toujours en dernier, et un service sans paramètres n’en
138
+ prend aucun :
139
+
140
+ <!-- source: widgets/fps/logic.ts -->
141
+ ```ts
142
+ fps.subscribe((update) => {
143
+ Object.assign(state, reading(update));
144
+ });
145
+ ```
146
+
147
+ <!-- source: widgets/media/logic.ts -->
148
+ ```ts
149
+ const current = media.subscribe({ cover: state.showCover }, (update) => {
150
+ if (update.ok) {
151
+ state.media = update.value;
152
+ state.unavailable = false;
153
+ return;
154
+ }
155
+ // The subscription ended: the host's source failed. Show it and ask
156
+ // again later; hidden, the timer waits until the widget shows.
157
+ if (subscription === current) {
158
+ subscription = null;
159
+ state.media = null;
160
+ state.unavailable = true;
161
+ retry = timers.after(RETRY_MS, subscribe);
162
+ }
163
+ });
164
+ ```
165
+
166
+ `http.fetch` envoie un corps de type chaîne en `text/plain` et tout autre
167
+ corps en JSON, sauf si `contentType` en dit autrement, et décode la réponse
168
+ comme le demande `as`. Une réponse sans corps donne `null`, `""` ou un
169
+ `ArrayBuffer` vide.
170
+
171
+ Les types des autres espaces de noms sont générés à partir du schéma :
172
+ `ClipboardServices`, `FpsServices`, `GameEventsServices`,
173
+ `JournalServices`, `MediaServices`, `NotesServices`, `PlayervoxServices`,
174
+ `SessionServices`, `StopwatchServices`, `StorageServices`,
175
+ `TelemetryServices` et `TwitchServices`. Chaque service est décrit dans la
176
+ [référence des services](service-reference.md).
177
+
178
+ ## Minuteurs
179
+
180
+ | Export | Nature | Résumé |
181
+ | --- | --- | --- |
182
+ | `timers` | espace de noms | `after(ms, callback)`, `every(ms, callback)`, `atEach(unit, callback)`. |
183
+ | `Timer` | interface | `cancel()` ; un nouvel appel ne fait rien. |
184
+
185
+ - 16 minuteurs au plus, jamais plus courts que 100 ms : un intervalle plus
186
+ court est porté à cette valeur.
187
+ - Aucun minuteur ne se déclenche tant que le widget est masqué. Un minuteur
188
+ répétitif saute les déclenchements manqués ; un minuteur à usage unique
189
+ arrivé à échéance pendant ce temps se déclenche une fois quand le widget
190
+ réapparaît.
191
+ - `atEach("second" | "minute" | "hour" | "day", callback)` appelle
192
+ `callback` à chaque changement d’unité de l’heure locale de l’utilisateur,
193
+ et une fois quand le widget réapparaît. Il se réveille aussi quand le
194
+ décalage UTC de l’utilisateur change.
195
+
196
+ <!-- source: widgets/media/logic.ts -->
197
+ ```ts
198
+ retry = timers.after(RETRY_MS, subscribe);
199
+ ```
200
+
201
+ ## Dessin, menu, messages et journal
202
+
203
+ | Export | Nature | Résumé |
204
+ | --- | --- | --- |
205
+ | `draw(ref, commands)` | fonction | Remplace les commandes du `canvas` dont le `ref` est donné. |
206
+ | `onMenu(handler)` | fonction | Reçoit l’identifiant de chaque ligne `action` du menu d’options que l’utilisateur choisit. |
207
+ | `t(key, params?)` | fonction | Le message de la langue active, où chaque `{name}` est remplacé par `params.name` ; la clé elle-même quand il n’y a pas de message. |
208
+ | `MessageParams` | type | `Record<string, string \| number>`. |
209
+ | `log` | espace de noms | `debug`, `info`, `warn`, `error(text)` : affichés par `overcrow-widget dev`, ignorés pour un widget installé. |
210
+
211
+ Les commandes de dessin sont des tuples typés, listés dans
212
+ [Dessin](logic.md#dessin).
213
+
214
+ <!-- source: docs/content/examples/countdown/logic.ts -->
215
+ ```ts
216
+ dots.push(["circle", 6 + index * 14, 6, 4], ["fill", "var(--color-accent)"]);
217
+ ```
218
+
219
+ ## Heure, dates et nombres
220
+
221
+ La VM n’a pas d’`Intl`, et son heure locale est UTC : `Date` ne donne jamais
222
+ l’heure de l’utilisateur. Ces fonctions formatent à partir de `host.region`.
223
+ Les nombres suivent le format de nombre de l’utilisateur (`1,234.5`,
224
+ `1 234,5` ou `1.234,5`), quelle que soit la langue de l’interface ; les
225
+ dates sont numériques, dans l’ordre de date de l’utilisateur ; les heures
226
+ s’affichent sur 24 heures. Chaque fonction accepte aussi ses valeurs
227
+ régionales en options : elle peut ainsi tourner dans un test unitaire, hors
228
+ de la VM.
229
+
230
+ | Export | Nature | Résumé |
231
+ | --- | --- | --- |
232
+ | `localTime(ms, offsetMinutes?)` | fonction | Les champs `LocalTime` d’un instant dans le décalage UTC de l’utilisateur, ou dans l’`offsetMinutes` d’un horodatage de service. |
233
+ | `formatTime(ms, options?)` | fonction | `14:08`, ou `14:08:42` avec `seconds: true`. |
234
+ | `formatDate(ms, options?)` | fonction | `17/07/2026` (`dmy`), `07/17/2026` (`mdy`), `2026-07-17` (`ymd`). |
235
+ | `formatNumber(value, options?)` | fonction | Les séparateurs du format de nombre de l’utilisateur ; `minimumFractionDigits`, `maximumFractionDigits` (3 par défaut), `grouping`. |
236
+ | `formatDuration(ms, options?)` | fonction | `04:05`, `1:02:03`, `04:05.67` avec `hundredths: true` ; tronquée, comme l’affiche un chronomètre. |
237
+ | `delayToNext(unit, nowMs, region?)` | fonction | Les millisecondes jusqu’au prochain changement d’unité de l’heure locale, jamais au-delà du prochain changement de décalage UTC. |
238
+ | `LocalTime` | interface | `year`, `month` (1 à 12), `day`, `weekday` (0 pour dimanche), `hour`, `minute`, `second`, `millisecond`. |
239
+ | `TimeUnit` | type | `"second" \| "minute" \| "hour" \| "day"`. |
240
+ | `TimeOptions` | interface | `offsetMinutes`. |
241
+ | `DateOptions` | interface | `offsetMinutes`, `order`. |
242
+ | `ClockOptions` | interface | `offsetMinutes`, `seconds`. |
243
+ | `NumberOptions` | interface | Les options de `formatNumber`. |
244
+ | `DurationOptions` | interface | `hours`, `hundredths`, `format`. |
245
+
246
+ <!-- source: widgets/clock/logic.ts -->
247
+ ```ts
248
+ export function clockDate(now: number, order: DateOrder): string {
249
+ return formatDate(now, { order });
250
+ }
251
+ ```
252
+
253
+ Les noms de mois et de jours de la semaine, l’affichage sur 12 heures et les
254
+ règles de pluriel ne font pas partie de la version 1.0.
255
+
256
+ ## Types générés
257
+
258
+ Ces types sont générés à partir du schéma des widgets : ils correspondent
259
+ donc toujours à ce qu’OverCrow accepte.
260
+
261
+ | Export | Résumé |
262
+ | --- | --- |
263
+ | `ServiceName`, `CallServiceName`, `SubscribeServiceName`, `GestureServiceName` | Les noms de service : tous, ceux qui répondent une seule fois, les abonnements, et ceux qui demandent une action de l’utilisateur. |
264
+ | `ServiceParamsMap`, `ServiceResultMap` | Les paramètres et le résultat de chaque service. |
265
+ | `ServiceErrorCode`, `ServiceErrorPayload` | Les [codes d’erreur](services.md#erreurs), et la valeur `{ code }` qui en porte un. |
266
+ | `Session`, `Telemetry`, `Fps`, `Stopwatch`, `Media`, `Notes`, `Note`, `NoteItem`, `CreatedNote`, `Score`, `Rating`, `RatingState`, `Review`, `ReviewsState`, `ReviewsPage`, `JournalState`, `JournalPage`, `JournalSession`, `TwitchChat`, `ChatMessage`, `ChatFragment`, `GameEvent`, `HttpResponse` | Les [formes de résultat](result-shapes.md). |
267
+ | `Permission`, `Capability`, `SensitiveCapability`, `CapabilityServices`, `PermissionServices` | Les permissions et les capabilities du manifeste, et les services que chacune autorise. |
268
+ | `Locale`, `Theme`, `Mode`, `Region`, `NumberFormat`, `DateOrder` | Les valeurs de `host`. |
269
+ | `EventName`, `GestureEventName`, `EventDetailMap`, `NamedKey` | Les événements de la vue, ceux qui sont des actions de l’utilisateur, leurs détails, et les touches nommées de `keydown`. |
270
+ | `DrawCommand`, `DrawCommandName`, `Color` | Les commandes et les couleurs du canvas. |
271
+ | `TokenName`, `ColorToken`, `LengthToken`, `FontSizeToken`, `FontFamilyToken`, `TimeToken`, `ShadowToken` | Les [tokens du design system](style-properties.md#tokens-du-design-system). |
272
+ | `IconName` | Les noms des [icônes](style-properties.md#icônes). |
273
+ | `MenuRowType`, `HostFeature` | Les types de ligne du menu d’options, et les sources de données de `requires`. |
274
+ | `JsonValue`, `AssetHandle`, `ImageSource` | Toute valeur JSON ; un identifiant d’image donné par un service ; une image du paquet ou un tel identifiant. |
275
+
276
+ ## Constantes de limites
277
+
278
+ Les [limites](limits.md) que la logique d’un widget doit respecter sont
279
+ exportées sous forme de constantes, pour que le code ne répète jamais un
280
+ nombre : `MAX_TIMERS`, `MIN_TIMER_INTERVAL_MS`, `MAX_SERVICE_CALLS_IN_FLIGHT`,
281
+ `MAX_SUBSCRIPTIONS`, `MAX_STORAGE_KEYS`, `MAX_STORAGE_KEY_BYTES`,
282
+ `MAX_STORAGE_VALUE_BYTES`, `STORAGE_QUOTA_BYTES`, `MAX_REQUEST_URL_BYTES`,
283
+ `MAX_HTTP_REQUEST_BYTES`, `MAX_HTTP_RESPONSE_BYTES`,
284
+ `MAX_HTTP_DECLARED_RESPONSE_BYTES`, `MAX_CLIPBOARD_BYTES`,
285
+ `MAX_OBJECT_ID_BYTES`, `MAX_NOTES`, `MAX_NOTE_ITEMS`,
286
+ `MAX_NOTE_TITLE_BYTES`, `MAX_NOTE_BODY_BYTES`, `MAX_NOTE_ITEM_BYTES`,
287
+ `MAX_REVIEW_CHARS`, `MAX_CHAT_CHANNEL_BYTES`, `MAX_CHAT_MESSAGE_CHARS`,
288
+ `MAX_CHAT_FRAGMENTS`, `MAX_CHAT_FAVORITES`, `MAX_DRAW_COMMANDS`,
289
+ `MAX_DRAW_STATE_DEPTH`, `MAX_PATH_POINTS`, `MAX_PATCH_BYTES`,
290
+ `MAX_SCENE_NODES`, `MAX_CHILDREN`, `MAX_NODE_TEXT_BYTES`,
291
+ `MAX_ATTRIBUTE_TEXT_BYTES`, `MAX_LABEL_BYTES`, `MAX_FIELD_TEXT_BYTES`,
292
+ `MAX_LOCALE_ENTRIES`, `MAX_LOG_BYTES`, `VM_HEAP_BYTES`,
293
+ `VM_MAX_HEAP_BYTES`, `VM_TURN_BUDGET_MS`, `VM_JOBS_PER_TURN` et
294
+ `VM_MESSAGES_PER_TURN`.
295
+
296
+ ## Tests unitaires : `@overcrow/sdk/testing`
297
+
298
+ Un second point d’entrée, jamais assemblé dans un widget, remplace OverCrow
299
+ dans un test unitaire de la logique : `installRuntime()` fournit un temps
300
+ virtuel, fait aboutir les appels de service et pousse les valeurs des
301
+ abonnements. Voir les [tests unitaires](testing.md#tests-unitaires).