@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.
- package/LICENSE +21 -0
- package/README.md +91 -1
- package/dist/audit/index.js +103 -0
- package/dist/audit/lexer.js +417 -0
- package/dist/audit/project.js +200 -0
- package/dist/audit/rules.js +661 -0
- package/dist/bootstrap/download.js +229 -0
- package/dist/bootstrap/install.js +280 -0
- package/dist/bootstrap/pin.js +85 -0
- package/dist/bootstrap/pin.json +119 -0
- package/dist/bootstrap/zip.js +258 -0
- package/dist/cli.js +200 -0
- package/dist/confine.js +244 -0
- package/dist/content/docs/en/cli.md +768 -0
- package/dist/content/docs/en/creator-space.md +78 -0
- package/dist/content/docs/en/dev-channel.md +130 -0
- package/dist/content/docs/en/elements.md +469 -0
- package/dist/content/docs/en/forms.md +328 -0
- package/dist/content/docs/en/guide.md +252 -0
- package/dist/content/docs/en/index.md +85 -0
- package/dist/content/docs/en/limits.md +241 -0
- package/dist/content/docs/en/logic.md +446 -0
- package/dist/content/docs/en/manifest.md +388 -0
- package/dist/content/docs/en/mcp.md +165 -0
- package/dist/content/docs/en/package.md +131 -0
- package/dist/content/docs/en/publish-a-widget.md +94 -0
- package/dist/content/docs/en/publish-keys.md +95 -0
- package/dist/content/docs/en/publishing.md +167 -0
- package/dist/content/docs/en/reference.md +55 -0
- package/dist/content/docs/en/result-shapes.md +332 -0
- package/dist/content/docs/en/sdk.md +295 -0
- package/dist/content/docs/en/security.md +115 -0
- package/dist/content/docs/en/service-reference.md +344 -0
- package/dist/content/docs/en/services.md +517 -0
- package/dist/content/docs/en/style-properties.md +270 -0
- package/dist/content/docs/en/style.md +266 -0
- package/dist/content/docs/en/testing.md +400 -0
- package/dist/content/docs/en/verified-domain.md +46 -0
- package/dist/content/docs/en/view.md +338 -0
- package/dist/content/docs/en/widget-listing.md +65 -0
- package/dist/content/docs/en/widget-review.md +57 -0
- package/dist/content/docs/en/widget-statistics.md +134 -0
- package/dist/content/docs/en/widgets.md +76 -0
- package/dist/content/docs/fr/cli.md +802 -0
- package/dist/content/docs/fr/creator-space.md +83 -0
- package/dist/content/docs/fr/dev-channel.md +140 -0
- package/dist/content/docs/fr/elements.md +475 -0
- package/dist/content/docs/fr/forms.md +341 -0
- package/dist/content/docs/fr/guide.md +263 -0
- package/dist/content/docs/fr/index.md +90 -0
- package/dist/content/docs/fr/limits.md +244 -0
- package/dist/content/docs/fr/logic.md +461 -0
- package/dist/content/docs/fr/manifest.md +401 -0
- package/dist/content/docs/fr/mcp.md +173 -0
- package/dist/content/docs/fr/package.md +139 -0
- package/dist/content/docs/fr/publish-a-widget.md +101 -0
- package/dist/content/docs/fr/publish-keys.md +97 -0
- package/dist/content/docs/fr/publishing.md +177 -0
- package/dist/content/docs/fr/reference.md +59 -0
- package/dist/content/docs/fr/result-shapes.md +333 -0
- package/dist/content/docs/fr/sdk.md +301 -0
- package/dist/content/docs/fr/security.md +129 -0
- package/dist/content/docs/fr/service-reference.md +346 -0
- package/dist/content/docs/fr/services.md +540 -0
- package/dist/content/docs/fr/style-properties.md +272 -0
- package/dist/content/docs/fr/style.md +281 -0
- package/dist/content/docs/fr/testing.md +417 -0
- package/dist/content/docs/fr/verified-domain.md +49 -0
- package/dist/content/docs/fr/view.md +352 -0
- package/dist/content/docs/fr/widget-listing.md +69 -0
- package/dist/content/docs/fr/widget-review.md +59 -0
- package/dist/content/docs/fr/widget-statistics.md +141 -0
- package/dist/content/docs/fr/widgets.md +81 -0
- package/dist/content/examples/clock/LICENSE +21 -0
- package/dist/content/examples/clock/README.md +75 -0
- package/dist/content/examples/clock/listing.json +19 -0
- package/dist/content/examples/clock/locales/en.json +4 -0
- package/dist/content/examples/clock/locales/fr.json +4 -0
- package/dist/content/examples/clock/logic.ts +85 -0
- package/dist/content/examples/clock/manifest.json +44 -0
- package/dist/content/examples/clock/package.json +16 -0
- package/dist/content/examples/clock/style.ocss +26 -0
- package/dist/content/examples/clock/tests/hidden.scenario.json +68 -0
- package/dist/content/examples/clock/tests/load-logic.mjs +22 -0
- package/dist/content/examples/clock/tests/logic.test.mjs +89 -0
- package/dist/content/examples/clock/tests/options.scenario.json +108 -0
- package/dist/content/examples/clock/tests/preview.scenario.json +25 -0
- package/dist/content/examples/clock/tests/render.scenario.json +94 -0
- package/dist/content/examples/clock/tests/summer-time.scenario.json +74 -0
- package/dist/content/examples/clock/tests/ticks.scenario.json +120 -0
- package/dist/content/examples/clock/tsconfig.json +16 -0
- package/dist/content/examples/clock/view.ocml +8 -0
- package/dist/content/examples/countdown/LICENSE +20 -0
- package/dist/content/examples/countdown/listing.json +10 -0
- package/dist/content/examples/countdown/locales/en.json +15 -0
- package/dist/content/examples/countdown/locales/fr.json +15 -0
- package/dist/content/examples/countdown/logic.ts +179 -0
- package/dist/content/examples/countdown/manifest.json +34 -0
- package/dist/content/examples/countdown/package.json +15 -0
- package/dist/content/examples/countdown/style.ocss +94 -0
- package/dist/content/examples/countdown/tsconfig.json +16 -0
- package/dist/content/examples/countdown/view.ocml +42 -0
- package/dist/content/examples/fps/LICENSE +21 -0
- package/dist/content/examples/fps/README.md +64 -0
- package/dist/content/examples/fps/listing.json +19 -0
- package/dist/content/examples/fps/locales/en.json +11 -0
- package/dist/content/examples/fps/locales/fr.json +11 -0
- package/dist/content/examples/fps/logic.ts +64 -0
- package/dist/content/examples/fps/manifest.json +30 -0
- package/dist/content/examples/fps/package.json +16 -0
- package/dist/content/examples/fps/style.ocss +31 -0
- package/dist/content/examples/fps/submission.json +8 -0
- package/dist/content/examples/fps/tests/label.scenario.json +63 -0
- package/dist/content/examples/fps/tests/load-logic.mjs +22 -0
- package/dist/content/examples/fps/tests/logic.test.mjs +60 -0
- package/dist/content/examples/fps/tests/preview.scenario.json +29 -0
- package/dist/content/examples/fps/tests/refused.scenario.json +20 -0
- package/dist/content/examples/fps/tests/render.scenario.json +96 -0
- package/dist/content/examples/fps/tests/stale.scenario.json +91 -0
- package/dist/content/examples/fps/tests/unavailable.scenario.json +111 -0
- package/dist/content/examples/fps/tsconfig.json +16 -0
- package/dist/content/examples/fps/view.ocml +11 -0
- package/dist/content/examples/media/LICENSE +21 -0
- package/dist/content/examples/media/README.md +147 -0
- package/dist/content/examples/media/listing.json +19 -0
- package/dist/content/examples/media/locales/en.json +11 -0
- package/dist/content/examples/media/locales/fr.json +11 -0
- package/dist/content/examples/media/logic.ts +191 -0
- package/dist/content/examples/media/manifest.json +35 -0
- package/dist/content/examples/media/package.json +16 -0
- package/dist/content/examples/media/style.ocss +148 -0
- package/dist/content/examples/media/submission.json +12 -0
- package/dist/content/examples/media/tests/covers.scenario.json +144 -0
- package/dist/content/examples/media/tests/gesture.scenario.json +173 -0
- package/dist/content/examples/media/tests/load-logic.mjs +22 -0
- package/dist/content/examples/media/tests/logic.test.mjs +176 -0
- package/dist/content/examples/media/tests/marquee.scenario.json +127 -0
- package/dist/content/examples/media/tests/preview.scenario.json +52 -0
- package/dist/content/examples/media/tests/read-only.scenario.json +53 -0
- package/dist/content/examples/media/tests/refused.scenario.json +22 -0
- package/dist/content/examples/media/tests/refused.test.mjs +31 -0
- package/dist/content/examples/media/tests/render.scenario.json +136 -0
- package/dist/content/examples/media/tests/states.scenario.json +257 -0
- package/dist/content/examples/media/tests/unavailable.scenario.json +120 -0
- package/dist/content/examples/media/tsconfig.json +16 -0
- package/dist/content/examples/media/view.ocml +41 -0
- package/dist/content/examples/notes/LICENSE +21 -0
- package/dist/content/examples/notes/README.md +219 -0
- package/dist/content/examples/notes/listing.json +19 -0
- package/dist/content/examples/notes/locales/en.json +25 -0
- package/dist/content/examples/notes/locales/fr.json +25 -0
- package/dist/content/examples/notes/logic.ts +799 -0
- package/dist/content/examples/notes/manifest.json +40 -0
- package/dist/content/examples/notes/package.json +16 -0
- package/dist/content/examples/notes/style.ocss +469 -0
- package/dist/content/examples/notes/submission.json +12 -0
- package/dist/content/examples/notes/tests/checks.scenario.json +237 -0
- package/dist/content/examples/notes/tests/create.scenario.json +260 -0
- package/dist/content/examples/notes/tests/delete.scenario.json +342 -0
- package/dist/content/examples/notes/tests/drafts.scenario.json +714 -0
- package/dist/content/examples/notes/tests/editor.scenario.json +232 -0
- package/dist/content/examples/notes/tests/frame.scenario.json +93 -0
- package/dist/content/examples/notes/tests/interactive.scenario.json +344 -0
- package/dist/content/examples/notes/tests/limits.scenario.json +1351 -0
- package/dist/content/examples/notes/tests/load-logic.mjs +22 -0
- package/dist/content/examples/notes/tests/logic.test.mjs +514 -0
- package/dist/content/examples/notes/tests/preview.scenario.json +99 -0
- package/dist/content/examples/notes/tests/read-only.scenario.json +105 -0
- package/dist/content/examples/notes/tests/refused.scenario.json +33 -0
- package/dist/content/examples/notes/tests/save.scenario.json +378 -0
- package/dist/content/examples/notes/tests/states.scenario.json +640 -0
- package/dist/content/examples/notes/tests/typing.scenario.json +562 -0
- package/dist/content/examples/notes/tests/unavailable.scenario.json +246 -0
- package/dist/content/examples/notes/tsconfig.json +16 -0
- package/dist/content/examples/notes/view.ocml +154 -0
- package/dist/content/examples/performance/LICENSE +21 -0
- package/dist/content/examples/performance/README.md +134 -0
- package/dist/content/examples/performance/listing.json +19 -0
- package/dist/content/examples/performance/locales/en.json +20 -0
- package/dist/content/examples/performance/locales/fr.json +20 -0
- package/dist/content/examples/performance/logic.ts +210 -0
- package/dist/content/examples/performance/manifest.json +83 -0
- package/dist/content/examples/performance/package.json +16 -0
- package/dist/content/examples/performance/style.ocss +75 -0
- package/dist/content/examples/performance/submission.json +12 -0
- package/dist/content/examples/performance/tests/fahrenheit.scenario.json +110 -0
- package/dist/content/examples/performance/tests/horizontal.scenario.json +96 -0
- package/dist/content/examples/performance/tests/load-logic.mjs +22 -0
- package/dist/content/examples/performance/tests/logic.test.mjs +226 -0
- package/dist/content/examples/performance/tests/menu.scenario.json +170 -0
- package/dist/content/examples/performance/tests/no-fps-source.scenario.json +47 -0
- package/dist/content/examples/performance/tests/preview.scenario.json +45 -0
- package/dist/content/examples/performance/tests/refused.scenario.json +20 -0
- package/dist/content/examples/performance/tests/refused.test.mjs +19 -0
- package/dist/content/examples/performance/tests/region.scenario.json +89 -0
- package/dist/content/examples/performance/tests/render.scenario.json +112 -0
- package/dist/content/examples/performance/tests/sources.scenario.json +151 -0
- package/dist/content/examples/performance/tests/stale.scenario.json +111 -0
- package/dist/content/examples/performance/tests/telemetry-only.scenario.json +44 -0
- package/dist/content/examples/performance/tests/thresholds.scenario.json +147 -0
- package/dist/content/examples/performance/tests/waiting.scenario.json +105 -0
- package/dist/content/examples/performance/tsconfig.json +16 -0
- package/dist/content/examples/performance/view.ocml +18 -0
- package/dist/content/examples/playervox-journal/LICENSE +21 -0
- package/dist/content/examples/playervox-journal/README.md +150 -0
- package/dist/content/examples/playervox-journal/listing.json +19 -0
- package/dist/content/examples/playervox-journal/locales/en.json +25 -0
- package/dist/content/examples/playervox-journal/locales/fr.json +25 -0
- package/dist/content/examples/playervox-journal/logic.ts +556 -0
- package/dist/content/examples/playervox-journal/manifest.json +19 -0
- package/dist/content/examples/playervox-journal/package.json +16 -0
- package/dist/content/examples/playervox-journal/style.ocss +142 -0
- package/dist/content/examples/playervox-journal/submission.json +12 -0
- package/dist/content/examples/playervox-journal/tests/changes.scenario.json +482 -0
- package/dist/content/examples/playervox-journal/tests/delete.scenario.json +432 -0
- package/dist/content/examples/playervox-journal/tests/frame.scenario.json +169 -0
- package/dist/content/examples/playervox-journal/tests/load-logic.mjs +22 -0
- package/dist/content/examples/playervox-journal/tests/logic.test.mjs +349 -0
- package/dist/content/examples/playervox-journal/tests/paging.scenario.json +428 -0
- package/dist/content/examples/playervox-journal/tests/preview.scenario.json +184 -0
- package/dist/content/examples/playervox-journal/tests/read-only.scenario.json +157 -0
- package/dist/content/examples/playervox-journal/tests/refused.scenario.json +39 -0
- package/dist/content/examples/playervox-journal/tests/scale.scenario.json +286 -0
- package/dist/content/examples/playervox-journal/tests/signed-out.scenario.json +134 -0
- package/dist/content/examples/playervox-journal/tests/states.scenario.json +741 -0
- package/dist/content/examples/playervox-journal/tests/unavailable.scenario.json +183 -0
- package/dist/content/examples/playervox-journal/tsconfig.json +16 -0
- package/dist/content/examples/playervox-journal/view.ocml +52 -0
- package/dist/content/examples/playervox-rating/LICENSE +21 -0
- package/dist/content/examples/playervox-rating/README.md +166 -0
- package/dist/content/examples/playervox-rating/listing.json +19 -0
- package/dist/content/examples/playervox-rating/locales/en.json +35 -0
- package/dist/content/examples/playervox-rating/locales/fr.json +35 -0
- package/dist/content/examples/playervox-rating/logic.ts +581 -0
- package/dist/content/examples/playervox-rating/manifest.json +19 -0
- package/dist/content/examples/playervox-rating/package.json +16 -0
- package/dist/content/examples/playervox-rating/style.ocss +333 -0
- package/dist/content/examples/playervox-rating/submission.json +12 -0
- package/dist/content/examples/playervox-rating/tests/account.scenario.json +125 -0
- package/dist/content/examples/playervox-rating/tests/bounds.scenario.json +73 -0
- package/dist/content/examples/playervox-rating/tests/draft.scenario.json +199 -0
- package/dist/content/examples/playervox-rating/tests/form.scenario.json +142 -0
- package/dist/content/examples/playervox-rating/tests/load-logic.mjs +22 -0
- package/dist/content/examples/playervox-rating/tests/logic.test.mjs +346 -0
- package/dist/content/examples/playervox-rating/tests/offline.scenario.json +142 -0
- package/dist/content/examples/playervox-rating/tests/preview.scenario.json +44 -0
- package/dist/content/examples/playervox-rating/tests/publish-keyboard.scenario.json +221 -0
- package/dist/content/examples/playervox-rating/tests/publish-pointer.scenario.json +314 -0
- package/dist/content/examples/playervox-rating/tests/read-only.scenario.json +70 -0
- package/dist/content/examples/playervox-rating/tests/refused.scenario.json +45 -0
- package/dist/content/examples/playervox-rating/tests/states.scenario.json +362 -0
- package/dist/content/examples/playervox-rating/tsconfig.json +16 -0
- package/dist/content/examples/playervox-rating/view.ocml +62 -0
- package/dist/content/examples/playervox-reviews/LICENSE +21 -0
- package/dist/content/examples/playervox-reviews/README.md +194 -0
- package/dist/content/examples/playervox-reviews/listing.json +19 -0
- package/dist/content/examples/playervox-reviews/locales/en.json +32 -0
- package/dist/content/examples/playervox-reviews/locales/fr.json +32 -0
- package/dist/content/examples/playervox-reviews/logic.ts +822 -0
- package/dist/content/examples/playervox-reviews/manifest.json +30 -0
- package/dist/content/examples/playervox-reviews/package.json +16 -0
- package/dist/content/examples/playervox-reviews/style.ocss +260 -0
- package/dist/content/examples/playervox-reviews/submission.json +8 -0
- package/dist/content/examples/playervox-reviews/tests/account.scenario.json +249 -0
- package/dist/content/examples/playervox-reviews/tests/bounds.scenario.json +336 -0
- package/dist/content/examples/playervox-reviews/tests/changes.scenario.json +515 -0
- package/dist/content/examples/playervox-reviews/tests/filter.scenario.json +400 -0
- package/dist/content/examples/playervox-reviews/tests/frame.scenario.json +185 -0
- package/dist/content/examples/playervox-reviews/tests/keyboard.scenario.json +188 -0
- package/dist/content/examples/playervox-reviews/tests/load-logic.mjs +22 -0
- package/dist/content/examples/playervox-reviews/tests/logic.test.mjs +559 -0
- package/dist/content/examples/playervox-reviews/tests/offline-start.scenario.json +152 -0
- package/dist/content/examples/playervox-reviews/tests/offline.scenario.json +311 -0
- package/dist/content/examples/playervox-reviews/tests/paging.scenario.json +497 -0
- package/dist/content/examples/playervox-reviews/tests/preview.scenario.json +286 -0
- package/dist/content/examples/playervox-reviews/tests/reading.scenario.json +591 -0
- package/dist/content/examples/playervox-reviews/tests/refused.scenario.json +54 -0
- package/dist/content/examples/playervox-reviews/tests/scale.scenario.json +303 -0
- package/dist/content/examples/playervox-reviews/tests/states.scenario.json +700 -0
- package/dist/content/examples/playervox-reviews/tests/unavailable.scenario.json +192 -0
- package/dist/content/examples/playervox-reviews/tsconfig.json +16 -0
- package/dist/content/examples/playervox-reviews/view.ocml +110 -0
- package/dist/content/examples/playervox-score/LICENSE +21 -0
- package/dist/content/examples/playervox-score/README.md +131 -0
- package/dist/content/examples/playervox-score/listing.json +19 -0
- package/dist/content/examples/playervox-score/locales/en.json +23 -0
- package/dist/content/examples/playervox-score/locales/fr.json +23 -0
- package/dist/content/examples/playervox-score/logic.ts +430 -0
- package/dist/content/examples/playervox-score/manifest.json +47 -0
- package/dist/content/examples/playervox-score/package.json +16 -0
- package/dist/content/examples/playervox-score/style.ocss +247 -0
- package/dist/content/examples/playervox-score/submission.json +8 -0
- package/dist/content/examples/playervox-score/tests/grades.scenario.json +279 -0
- package/dist/content/examples/playervox-score/tests/load-logic.mjs +22 -0
- package/dist/content/examples/playervox-score/tests/logic.test.mjs +229 -0
- package/dist/content/examples/playervox-score/tests/options.scenario.json +302 -0
- package/dist/content/examples/playervox-score/tests/preview.scenario.json +68 -0
- package/dist/content/examples/playervox-score/tests/pulse.scenario.json +157 -0
- package/dist/content/examples/playervox-score/tests/refused.scenario.json +21 -0
- package/dist/content/examples/playervox-score/tests/signed-out.scenario.json +46 -0
- package/dist/content/examples/playervox-score/tests/states.scenario.json +450 -0
- package/dist/content/examples/playervox-score/tests/unavailable.scenario.json +84 -0
- package/dist/content/examples/playervox-score/tsconfig.json +16 -0
- package/dist/content/examples/playervox-score/view.ocml +51 -0
- package/dist/content/examples/session/LICENSE +21 -0
- package/dist/content/examples/session/README.md +57 -0
- package/dist/content/examples/session/listing.json +19 -0
- package/dist/content/examples/session/locales/en.json +3 -0
- package/dist/content/examples/session/locales/fr.json +3 -0
- package/dist/content/examples/session/logic.ts +26 -0
- package/dist/content/examples/session/manifest.json +19 -0
- package/dist/content/examples/session/package.json +16 -0
- package/dist/content/examples/session/style.ocss +16 -0
- package/dist/content/examples/session/submission.json +8 -0
- package/dist/content/examples/session/tests/hidden.scenario.json +45 -0
- package/dist/content/examples/session/tests/load-logic.mjs +22 -0
- package/dist/content/examples/session/tests/logic.test.mjs +37 -0
- package/dist/content/examples/session/tests/preview.scenario.json +28 -0
- package/dist/content/examples/session/tests/refused.scenario.json +20 -0
- package/dist/content/examples/session/tests/refused.test.mjs +16 -0
- package/dist/content/examples/session/tests/render.scenario.json +95 -0
- package/dist/content/examples/session/tests/ticks.scenario.json +139 -0
- package/dist/content/examples/session/tests/unknown.scenario.json +37 -0
- package/dist/content/examples/session/tsconfig.json +16 -0
- package/dist/content/examples/session/view.ocml +11 -0
- package/dist/content/examples/stopwatch/LICENSE +21 -0
- package/dist/content/examples/stopwatch/README.md +99 -0
- package/dist/content/examples/stopwatch/listing.json +19 -0
- package/dist/content/examples/stopwatch/locales/en.json +8 -0
- package/dist/content/examples/stopwatch/locales/fr.json +8 -0
- package/dist/content/examples/stopwatch/logic.ts +93 -0
- package/dist/content/examples/stopwatch/manifest.json +19 -0
- package/dist/content/examples/stopwatch/package.json +16 -0
- package/dist/content/examples/stopwatch/style.ocss +54 -0
- package/dist/content/examples/stopwatch/submission.json +12 -0
- package/dist/content/examples/stopwatch/tests/errors.scenario.json +121 -0
- package/dist/content/examples/stopwatch/tests/gesture.scenario.json +154 -0
- package/dist/content/examples/stopwatch/tests/hidden.scenario.json +57 -0
- package/dist/content/examples/stopwatch/tests/hundredths.scenario.json +173 -0
- package/dist/content/examples/stopwatch/tests/load-logic.mjs +22 -0
- package/dist/content/examples/stopwatch/tests/logic.test.mjs +99 -0
- package/dist/content/examples/stopwatch/tests/preview.scenario.json +36 -0
- package/dist/content/examples/stopwatch/tests/read-only.scenario.json +42 -0
- package/dist/content/examples/stopwatch/tests/read-only.test.mjs +18 -0
- package/dist/content/examples/stopwatch/tests/refused.scenario.json +22 -0
- package/dist/content/examples/stopwatch/tests/refused.test.mjs +18 -0
- package/dist/content/examples/stopwatch/tests/render.scenario.json +105 -0
- package/dist/content/examples/stopwatch/tests/states.scenario.json +246 -0
- package/dist/content/examples/stopwatch/tests/unknown.scenario.json +40 -0
- package/dist/content/examples/stopwatch/tsconfig.json +16 -0
- package/dist/content/examples/stopwatch/view.ocml +29 -0
- package/dist/content/examples/twitch-chat/LICENSE +21 -0
- package/dist/content/examples/twitch-chat/README.md +283 -0
- package/dist/content/examples/twitch-chat/listing.json +19 -0
- package/dist/content/examples/twitch-chat/locales/en.json +52 -0
- package/dist/content/examples/twitch-chat/locales/fr.json +52 -0
- package/dist/content/examples/twitch-chat/logic.ts +887 -0
- package/dist/content/examples/twitch-chat/manifest.json +33 -0
- package/dist/content/examples/twitch-chat/package.json +16 -0
- package/dist/content/examples/twitch-chat/style.ocss +544 -0
- package/dist/content/examples/twitch-chat/submission.json +12 -0
- package/dist/content/examples/twitch-chat/tests/account.scenario.json +325 -0
- package/dist/content/examples/twitch-chat/tests/burst.scenario.json +1866 -0
- package/dist/content/examples/twitch-chat/tests/channel-refused.scenario.json +372 -0
- package/dist/content/examples/twitch-chat/tests/channel.scenario.json +480 -0
- package/dist/content/examples/twitch-chat/tests/draft.scenario.json +279 -0
- package/dist/content/examples/twitch-chat/tests/fade.scenario.json +269 -0
- package/dist/content/examples/twitch-chat/tests/failures.scenario.json +420 -0
- package/dist/content/examples/twitch-chat/tests/favorites.scenario.json +376 -0
- package/dist/content/examples/twitch-chat/tests/frame.scenario.json +152 -0
- package/dist/content/examples/twitch-chat/tests/lifetime.scenario.json +186 -0
- package/dist/content/examples/twitch-chat/tests/load-logic.mjs +22 -0
- package/dist/content/examples/twitch-chat/tests/logic.test.mjs +1053 -0
- package/dist/content/examples/twitch-chat/tests/passive.scenario.json +536 -0
- package/dist/content/examples/twitch-chat/tests/preview.scenario.json +147 -0
- package/dist/content/examples/twitch-chat/tests/read-only.scenario.json +202 -0
- package/dist/content/examples/twitch-chat/tests/read-only.test.mjs +63 -0
- package/dist/content/examples/twitch-chat/tests/refused.scenario.json +65 -0
- package/dist/content/examples/twitch-chat/tests/refused.test.mjs +43 -0
- package/dist/content/examples/twitch-chat/tests/render.scenario.json +347 -0
- package/dist/content/examples/twitch-chat/tests/reply.scenario.json +384 -0
- package/dist/content/examples/twitch-chat/tests/send-refused.scenario.json +383 -0
- package/dist/content/examples/twitch-chat/tests/send.scenario.json +300 -0
- package/dist/content/examples/twitch-chat/tests/states.scenario.json +455 -0
- package/dist/content/examples/twitch-chat/tests/unavailable.scenario.json +256 -0
- package/dist/content/examples/twitch-chat/tests/unread.scenario.json +997 -0
- package/dist/content/examples/twitch-chat/tsconfig.json +16 -0
- package/dist/content/examples/twitch-chat/view.ocml +141 -0
- package/dist/content/examples/warframe-market/LICENSE +21 -0
- package/dist/content/examples/warframe-market/README.md +176 -0
- package/dist/content/examples/warframe-market/listing.json +19 -0
- package/dist/content/examples/warframe-market/locales/en.json +44 -0
- package/dist/content/examples/warframe-market/locales/fr.json +44 -0
- package/dist/content/examples/warframe-market/logic.ts +1265 -0
- package/dist/content/examples/warframe-market/manifest.json +92 -0
- package/dist/content/examples/warframe-market/package.json +16 -0
- package/dist/content/examples/warframe-market/style.ocss +422 -0
- package/dist/content/examples/warframe-market/submission.json +24 -0
- package/dist/content/examples/warframe-market/tests/bounds.scenario.json +60 -0
- package/dist/content/examples/warframe-market/tests/cached.scenario.json +70 -0
- package/dist/content/examples/warframe-market/tests/detail.scenario.json +251 -0
- package/dist/content/examples/warframe-market/tests/errors.scenario.json +105 -0
- package/dist/content/examples/warframe-market/tests/fixtures.json +295 -0
- package/dist/content/examples/warframe-market/tests/load-logic.mjs +22 -0
- package/dist/content/examples/warframe-market/tests/logic.test.mjs +505 -0
- package/dist/content/examples/warframe-market/tests/no-clipboard.scenario.json +104 -0
- package/dist/content/examples/warframe-market/tests/passive.scenario.json +87 -0
- package/dist/content/examples/warframe-market/tests/preview.scenario.json +146 -0
- package/dist/content/examples/warframe-market/tests/refresh.scenario.json +56 -0
- package/dist/content/examples/warframe-market/tests/refused.scenario.json +74 -0
- package/dist/content/examples/warframe-market/tests/render.scenario.json +210 -0
- package/dist/content/examples/warframe-market/tests/search.scenario.json +189 -0
- package/dist/content/examples/warframe-market/tests/unavailable.scenario.json +54 -0
- package/dist/content/examples/warframe-market/tsconfig.json +16 -0
- package/dist/content/examples/warframe-market/view.ocml +116 -0
- package/dist/content/examples/weather/LICENSE +20 -0
- package/dist/content/examples/weather/listing.json +10 -0
- package/dist/content/examples/weather/locales/en.json +9 -0
- package/dist/content/examples/weather/locales/fr.json +9 -0
- package/dist/content/examples/weather/logic.ts +62 -0
- package/dist/content/examples/weather/manifest.json +51 -0
- package/dist/content/examples/weather/package.json +15 -0
- package/dist/content/examples/weather/style.ocss +29 -0
- package/dist/content/examples/weather/submission.json +17 -0
- package/dist/content/examples/weather/tsconfig.json +16 -0
- package/dist/content/examples/weather/view.ocml +12 -0
- package/dist/content/index.json +3705 -0
- package/dist/content/reference/errors.json +1924 -0
- package/dist/content/reference/limits.json +1154 -0
- package/dist/content/reference/manifest.md +223 -0
- package/dist/content/reference/permissions.json +413 -0
- package/dist/content/templates/blank/locales/en.json +3 -0
- package/dist/content/templates/blank/locales/fr.json +3 -0
- package/dist/content/templates/blank/logic.ts +7 -0
- package/dist/content/templates/blank/manifest.json +16 -0
- package/dist/content/templates/blank/style.ocss +10 -0
- package/dist/content/templates/blank/tests/example.scenario.json +10 -0
- package/dist/content/templates/blank/view.ocml +6 -0
- package/dist/content/templates/chart/locales/en.json +3 -0
- package/dist/content/templates/chart/locales/fr.json +3 -0
- package/dist/content/templates/chart/logic.ts +27 -0
- package/dist/content/templates/chart/manifest.json +16 -0
- package/dist/content/templates/chart/style.ocss +27 -0
- package/dist/content/templates/chart/tests/example.scenario.json +10 -0
- package/dist/content/templates/chart/view.ocml +10 -0
- package/dist/content/templates/counter/locales/en.json +4 -0
- package/dist/content/templates/counter/locales/fr.json +4 -0
- package/dist/content/templates/counter/logic.ts +20 -0
- package/dist/content/templates/counter/manifest.json +16 -0
- package/dist/content/templates/counter/style.ocss +26 -0
- package/dist/content/templates/counter/tests/example.scenario.json +11 -0
- package/dist/content/templates/counter/view.ocml +13 -0
- package/dist/content/templates/list/locales/en.json +8 -0
- package/dist/content/templates/list/locales/fr.json +8 -0
- package/dist/content/templates/list/logic.ts +35 -0
- package/dist/content/templates/list/manifest.json +16 -0
- package/dist/content/templates/list/style.ocss +42 -0
- package/dist/content/templates/list/tests/example.scenario.json +10 -0
- package/dist/content/templates/list/view.ocml +17 -0
- package/dist/content/templates/shared/LICENSE +20 -0
- package/dist/content/templates/shared/package.json +14 -0
- package/dist/content/templates/shared/tsconfig.json +16 -0
- package/dist/content.js +68 -0
- package/dist/env.js +156 -0
- package/dist/fingerprint.js +32 -0
- package/dist/hidden.js +47 -0
- package/dist/ids.js +27 -0
- package/dist/index.js +82 -0
- package/dist/knowledge.js +222 -0
- package/dist/npm.js +149 -0
- package/dist/prompts.js +47 -0
- package/dist/resources.js +82 -0
- package/dist/run.js +120 -0
- package/dist/server.js +43 -0
- package/dist/session.js +205 -0
- package/dist/sources.js +218 -0
- package/dist/text.js +80 -0
- package/dist/texts.js +44 -0
- package/dist/tools/audit.js +105 -0
- package/dist/tools/build.js +453 -0
- package/dist/tools/common.js +122 -0
- package/dist/tools/docs.js +196 -0
- package/dist/tools/preview.js +87 -0
- package/dist/tools/project.js +183 -0
- package/dist/tools/setup.js +146 -0
- package/dist/tools/submission.js +369 -0
- package/dist/version.js +3 -0
- package/npm-shrinkwrap.json +402 -0
- package/package.json +50 -4
|
@@ -0,0 +1,332 @@
|
|
|
1
|
+
# Result shapes
|
|
2
|
+
|
|
3
|
+
What the services of PlayerVox OverCrow answer: the shape of each result
|
|
4
|
+
and of each subscription update. The SDK exports a TypeScript type of the
|
|
5
|
+
same name for each shape, so the logic never describes them by hand.
|
|
6
|
+
|
|
7
|
+
<!-- source: widgets/stopwatch/logic.ts -->
|
|
8
|
+
```ts
|
|
9
|
+
declare module "@overcrow/sdk" {
|
|
10
|
+
interface WidgetState {
|
|
11
|
+
/** The latest state, or `null` while it is unknown. */
|
|
12
|
+
stopwatch: Stopwatch | null;
|
|
13
|
+
/** The buttons take input only in Interactive mode. */
|
|
14
|
+
interactive: boolean;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
The Stopwatch widget keeps the latest `Stopwatch` value in its state, and
|
|
20
|
+
the view reads its members:
|
|
21
|
+
|
|
22
|
+
<!-- source: widgets/stopwatch/view.ocml -->
|
|
23
|
+
```xml
|
|
24
|
+
<elapsed class="value" base={state.stopwatch.elapsedMs} at={state.stopwatch.at} running={state.stopwatch.running} format="hh:mm:ss.cc"/>
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## How to read a shape
|
|
28
|
+
|
|
29
|
+
- A shape is an exact record: every member is present, and a member
|
|
30
|
+
without a value is `null`, never absent.
|
|
31
|
+
- "text or `null`" means that the member may be `null`: test it before you
|
|
32
|
+
show it.
|
|
33
|
+
- An integer is below 2^53, so it is exact in JavaScript. Times are in
|
|
34
|
+
milliseconds: "Unix milliseconds" count from 1970 in UTC, as `Date.now()`
|
|
35
|
+
does.
|
|
36
|
+
- A member that goes with `offsetMinutes` is a timestamp to format with
|
|
37
|
+
that UTC offset; see
|
|
38
|
+
[time, dates and numbers](logic.md#time-dates-and-numbers).
|
|
39
|
+
- An `asset:` handle is an image that OverCrow holds for the widget: bind
|
|
40
|
+
it to the `src` of an `image` or an `avatar`, or draw it on a canvas. It
|
|
41
|
+
is not a URL and cannot be read as bytes.
|
|
42
|
+
- A subscription whose shape is "… or `null`" delivers `null` when there is
|
|
43
|
+
nothing to show: no active game, no media player.
|
|
44
|
+
|
|
45
|
+
Which service gives which shape is in the
|
|
46
|
+
[service reference](service-reference.md).
|
|
47
|
+
|
|
48
|
+
## Shapes
|
|
49
|
+
|
|
50
|
+
<!-- generated:result-shapes -->
|
|
51
|
+
### `HttpResponse`
|
|
52
|
+
|
|
53
|
+
Answer of `http.fetch`. `{ status, contentType }` or `{ status, asset }`
|
|
54
|
+
|
|
55
|
+
| Member | Shape | Meaning |
|
|
56
|
+
| --- | --- | --- |
|
|
57
|
+
| `status` | integer | HTTP status. |
|
|
58
|
+
| `contentType` | text or `null` | Response media type; the SDK adds the decoded body, `body`. |
|
|
59
|
+
|
|
60
|
+
| Member | Shape | Meaning |
|
|
61
|
+
| --- | --- | --- |
|
|
62
|
+
| `status` | integer | HTTP status. |
|
|
63
|
+
| `asset` | `asset:` handle | The decoded image (`as: "image"`). |
|
|
64
|
+
|
|
65
|
+
### `GameEvent`
|
|
66
|
+
|
|
67
|
+
One game event. `{ event, at }`
|
|
68
|
+
|
|
69
|
+
| Member | Shape | Meaning |
|
|
70
|
+
| --- | --- | --- |
|
|
71
|
+
| `event` | text | A declared game event. |
|
|
72
|
+
| `at` | integer | Host monotonic clock in ms. |
|
|
73
|
+
|
|
74
|
+
### `Session`
|
|
75
|
+
|
|
76
|
+
Duration of the active game session. `{ elapsedMs, at }`
|
|
77
|
+
|
|
78
|
+
| Member | Shape | Meaning |
|
|
79
|
+
| --- | --- | --- |
|
|
80
|
+
| `elapsedMs` | integer | Time since the game process started. |
|
|
81
|
+
| `at` | integer | Host monotonic clock in ms at which `elapsedMs` was measured. |
|
|
82
|
+
|
|
83
|
+
### `Telemetry`
|
|
84
|
+
|
|
85
|
+
Resource use of the active game. `{ cpu, ram, cpuTemperature, gpuTemperature, sources }`
|
|
86
|
+
|
|
87
|
+
| Member | Shape | Meaning |
|
|
88
|
+
| --- | --- | --- |
|
|
89
|
+
| `cpu` | number or `null` | The game's share of the whole machine in %, from 0 to 100. |
|
|
90
|
+
| `ram` | integer or `null` | Resident bytes of the game. |
|
|
91
|
+
| `cpuTemperature` | number or `null` | °C. |
|
|
92
|
+
| `gpuTemperature` | number or `null` | °C. |
|
|
93
|
+
| `sources` | `{ cpuTemperature, gpuTemperature }` | Sensors the host has. |
|
|
94
|
+
| `sources.cpuTemperature` | boolean | The host has a CPU sensor. |
|
|
95
|
+
| `sources.gpuTemperature` | boolean | The host has a GPU sensor. |
|
|
96
|
+
|
|
97
|
+
### `Fps`
|
|
98
|
+
|
|
99
|
+
Frame rate of the active game. `{ fps, stale, status }`
|
|
100
|
+
|
|
101
|
+
| Member | Shape | Meaning |
|
|
102
|
+
| --- | --- | --- |
|
|
103
|
+
| `fps` | integer or `null` | Frames per second. |
|
|
104
|
+
| `stale` | boolean | No sample for 3 s. |
|
|
105
|
+
| `status` | `ready` \| `waiting` \| `unsupported` \| `permission_denied` \| `ambiguous` \| `events_lost` \| `unavailable` | Measurement state. |
|
|
106
|
+
|
|
107
|
+
### `Stopwatch`
|
|
108
|
+
|
|
109
|
+
The manual stopwatch. `{ running, elapsedMs, at, shortcuts }`
|
|
110
|
+
|
|
111
|
+
| Member | Shape | Meaning |
|
|
112
|
+
| --- | --- | --- |
|
|
113
|
+
| `running` | boolean | It is counting. |
|
|
114
|
+
| `elapsedMs` | integer | Elapsed time at `at`. |
|
|
115
|
+
| `at` | integer | Host monotonic clock in ms at which `elapsedMs` was measured. |
|
|
116
|
+
| `shortcuts` | `{ toggle, reset, bound }` | Stopwatch shortcuts. |
|
|
117
|
+
| `shortcuts.toggle` | text | Host-formatted key chord. |
|
|
118
|
+
| `shortcuts.reset` | text | Host-formatted key chord. |
|
|
119
|
+
| `shortcuts.bound` | boolean | The shortcuts are active. |
|
|
120
|
+
|
|
121
|
+
### `Media`
|
|
122
|
+
|
|
123
|
+
The current media player. `{ player, title, artists, playing, canPrevious, canPlayPause, canNext, cover }`
|
|
124
|
+
|
|
125
|
+
| Member | Shape | Meaning |
|
|
126
|
+
| --- | --- | --- |
|
|
127
|
+
| `player` | text | Opaque ID of the current player. |
|
|
128
|
+
| `title` | text or `null` | Track title. |
|
|
129
|
+
| `artists` | list of text | Artists. |
|
|
130
|
+
| `playing` | boolean | Playing. |
|
|
131
|
+
| `canPrevious` | boolean | The player supports previous. |
|
|
132
|
+
| `canPlayPause` | boolean | The player supports play/pause. |
|
|
133
|
+
| `canNext` | boolean | The player supports next. |
|
|
134
|
+
| `cover` | `asset:` handle or `null` | Cover art, at most 512 px. |
|
|
135
|
+
|
|
136
|
+
### `NoteItem`
|
|
137
|
+
|
|
138
|
+
One checklist item. `{ id, text, checked }`
|
|
139
|
+
|
|
140
|
+
| Member | Shape | Meaning |
|
|
141
|
+
| --- | --- | --- |
|
|
142
|
+
| `id` | text or `null` | Item ID. |
|
|
143
|
+
| `text` | text | Text. |
|
|
144
|
+
| `checked` | boolean | Checked. |
|
|
145
|
+
|
|
146
|
+
### `Note`
|
|
147
|
+
|
|
148
|
+
One note. `{ id, title, body, items }`
|
|
149
|
+
|
|
150
|
+
| Member | Shape | Meaning |
|
|
151
|
+
| --- | --- | --- |
|
|
152
|
+
| `id` | text or `null` | Note ID. |
|
|
153
|
+
| `title` | text | Title. |
|
|
154
|
+
| `body` | text | Body text. |
|
|
155
|
+
| `items` | list of [`NoteItem`](#noteitem) | Checklist. |
|
|
156
|
+
|
|
157
|
+
### `Notes`
|
|
158
|
+
|
|
159
|
+
The user's notes document. `{ active, notes }`
|
|
160
|
+
|
|
161
|
+
| Member | Shape | Meaning |
|
|
162
|
+
| --- | --- | --- |
|
|
163
|
+
| `active` | text or `null` | ID of the active note. |
|
|
164
|
+
| `notes` | list of [`Note`](#note) | Notes. |
|
|
165
|
+
|
|
166
|
+
### `CreatedNote`
|
|
167
|
+
|
|
168
|
+
Answer of `notes.create`. `{ note }`
|
|
169
|
+
|
|
170
|
+
| Member | Shape | Meaning |
|
|
171
|
+
| --- | --- | --- |
|
|
172
|
+
| `note` | [`Note`](#note) | The new note. |
|
|
173
|
+
|
|
174
|
+
### `Score`
|
|
175
|
+
|
|
176
|
+
PlayerVox score of the active game. `{ state, name, score, grade, ratingsCount, criteria }`
|
|
177
|
+
|
|
178
|
+
| Member | Shape | Meaning |
|
|
179
|
+
| --- | --- | --- |
|
|
180
|
+
| `state` | `idle` \| `unsupported` \| `loading` \| `ready` \| `no_ratings` \| `not_found` \| `unavailable` | Score state: `idle` without an active game, `unsupported` for a game without a Steam app ID, `loading` until the game's first answer (never the previous game's score), `ready` and `no_ratings` with the score, `not_found` for a game PlayerVox cannot match, `unavailable` while the host retries. Every state but `ready` and `no_ratings` has a `null` name and score, grade `--`, no ratings and `null` criteria. |
|
|
181
|
+
| `name` | text or `null` | Game name. |
|
|
182
|
+
| `score` | number or `null` | 0–100. |
|
|
183
|
+
| `grade` | `S+` \| `S` \| `A` \| `B` \| `C` \| `D` \| `F` \| `--` | Grade of the score. |
|
|
184
|
+
| `ratingsCount` | integer | Number of ratings. |
|
|
185
|
+
| `criteria` | `{ gameplay, art, tech }` | Criteria scores. |
|
|
186
|
+
| `criteria.gameplay` | number or `null` | 0–100. |
|
|
187
|
+
| `criteria.art` | number or `null` | 0–100. |
|
|
188
|
+
| `criteria.tech` | number or `null` | 0–100. |
|
|
189
|
+
|
|
190
|
+
### `Rating`
|
|
191
|
+
|
|
192
|
+
The user's PlayerVox rating of the active game. `{ gameplay, art, tech, review, publishedAt, offsetMinutes }`
|
|
193
|
+
|
|
194
|
+
| Member | Shape | Meaning |
|
|
195
|
+
| --- | --- | --- |
|
|
196
|
+
| `gameplay` | integer | 0–100. |
|
|
197
|
+
| `art` | integer | 0–100. |
|
|
198
|
+
| `tech` | integer | 0–100. |
|
|
199
|
+
| `review` | text or `null` | Review text. |
|
|
200
|
+
| `publishedAt` | integer or `null` | Unix milliseconds. |
|
|
201
|
+
| `offsetMinutes` | integer or `null` | UTC offset in minutes to show the timestamp with. |
|
|
202
|
+
|
|
203
|
+
### `RatingState`
|
|
204
|
+
|
|
205
|
+
The user's own rating of the active game, with its state. `{ state, name, offline, rating }`
|
|
206
|
+
|
|
207
|
+
| Member | Shape | Meaning |
|
|
208
|
+
| --- | --- | --- |
|
|
209
|
+
| `state` | `idle` \| `unsupported` \| `loading` \| `ready` \| `unavailable` | Rating state: `idle` without an active game, `unsupported` for a game without a Steam app ID, `loading` until the first answer for this game and account (never the previous game's rating), `ready` with the rating, `unavailable` while the host retries a failed read. Every state but `ready` has a `null` name and rating. |
|
|
210
|
+
| `name` | text or `null` | Game name on PlayerVox. |
|
|
211
|
+
| `offline` | boolean | PlayerVox is unreachable: the rating is the last one read, and `playervox.rating.publish` answers `not_connected`. |
|
|
212
|
+
| `rating` | [`Rating`](#rating) or `null` | The user's rating; `null` before the first one. |
|
|
213
|
+
|
|
214
|
+
### `Review`
|
|
215
|
+
|
|
216
|
+
One player review. `{ id, author, grade, score, text, original, hidden, publishedAt, offsetMinutes }`
|
|
217
|
+
|
|
218
|
+
| Member | Shape | Meaning |
|
|
219
|
+
| --- | --- | --- |
|
|
220
|
+
| `id` | text | Review ID. |
|
|
221
|
+
| `author` | text | Author name. |
|
|
222
|
+
| `grade` | `S+` \| `S` \| `A` \| `B` \| `C` \| `D` \| `F` \| `--` | Grade. |
|
|
223
|
+
| `score` | integer | 0–100. |
|
|
224
|
+
| `text` | text or `null` | Text, translated when a translation exists. |
|
|
225
|
+
| `original` | text or `null` | Untranslated text when `text` is a translation; `null` otherwise. |
|
|
226
|
+
| `hidden` | boolean | Hidden by the community: show the text only once the user asks for it. |
|
|
227
|
+
| `publishedAt` | integer | Unix milliseconds. |
|
|
228
|
+
| `offsetMinutes` | integer | UTC offset in minutes to show the timestamp with. |
|
|
229
|
+
|
|
230
|
+
### `ReviewsState`
|
|
231
|
+
|
|
232
|
+
The player reviews of the active game: what to read, not the reviews. `{ state, revision, offline }`
|
|
233
|
+
|
|
234
|
+
| Member | Shape | Meaning |
|
|
235
|
+
| --- | --- | --- |
|
|
236
|
+
| `state` | `idle` \| `unsupported` \| `ready` | `idle` without an active game, `unsupported` for a game without a Steam app ID, `ready` when `playervox.reviews.page` reads the game's reviews. |
|
|
237
|
+
| `revision` | integer | Changes whenever the reviews to read change: another game, another PlayerVox account, or reviews changed on PlayerVox. |
|
|
238
|
+
| `offline` | boolean | PlayerVox is unreachable: `playervox.reviews.page` answers `not_connected`. |
|
|
239
|
+
|
|
240
|
+
### `ReviewsPage`
|
|
241
|
+
|
|
242
|
+
A page of player reviews. `{ gameName, items, page, totalPages, count }`
|
|
243
|
+
|
|
244
|
+
| Member | Shape | Meaning |
|
|
245
|
+
| --- | --- | --- |
|
|
246
|
+
| `gameName` | text | Game name on PlayerVox. |
|
|
247
|
+
| `items` | list of [`Review`](#review) | Reviews. |
|
|
248
|
+
| `page` | integer | Page number. |
|
|
249
|
+
| `totalPages` | integer | Number of pages. |
|
|
250
|
+
| `count` | integer | Number of reviews. |
|
|
251
|
+
|
|
252
|
+
### `JournalSession`
|
|
253
|
+
|
|
254
|
+
One journal session. `{ id, startedAt, offsetMinutes, durationMs, source }`
|
|
255
|
+
|
|
256
|
+
| Member | Shape | Meaning |
|
|
257
|
+
| --- | --- | --- |
|
|
258
|
+
| `id` | text | Session ID. |
|
|
259
|
+
| `startedAt` | integer | Unix milliseconds. |
|
|
260
|
+
| `offsetMinutes` | integer | UTC offset in minutes to show the timestamp with. |
|
|
261
|
+
| `durationMs` | integer | Duration. |
|
|
262
|
+
| `source` | `local` \| `cloud` | Where the session is stored. |
|
|
263
|
+
|
|
264
|
+
### `JournalState`
|
|
265
|
+
|
|
266
|
+
The journal of the active game. `{ revision, notice }`
|
|
267
|
+
|
|
268
|
+
| Member | Shape | Meaning |
|
|
269
|
+
| --- | --- | --- |
|
|
270
|
+
| `revision` | integer | Changes whenever the merged journal of the active game changes. |
|
|
271
|
+
| `notice` | `offline` \| `storage_unavailable` \| `full` \| `expired` \| `busy` \| `unavailable` or `null` | Journal condition to show above the sessions: `offline` sync is offline (local sessions remain), `storage_unavailable` the local journal cannot be read, `full` the local journal is full, `expired` the PlayerVox sign-in expired, `busy` PlayerVox asks to retry later, `unavailable` any other failure; `null` when none. |
|
|
272
|
+
|
|
273
|
+
### `JournalPage`
|
|
274
|
+
|
|
275
|
+
A page of the game journal. `{ gameName, items, page, next, previous }`
|
|
276
|
+
|
|
277
|
+
| Member | Shape | Meaning |
|
|
278
|
+
| --- | --- | --- |
|
|
279
|
+
| `gameName` | text | Active game; empty when the host has no name. |
|
|
280
|
+
| `items` | list of [`JournalSession`](#journalsession) | Sessions, newest first. |
|
|
281
|
+
| `page` | integer | Page number, from 1. |
|
|
282
|
+
| `next` | text or `null` | Cursor of the next page. |
|
|
283
|
+
| `previous` | text or `null` | Cursor of the previous page. |
|
|
284
|
+
|
|
285
|
+
### `ChatFragment`
|
|
286
|
+
|
|
287
|
+
A text run or an emote of a chat message. `{ text }` or `{ emote, alt }`
|
|
288
|
+
|
|
289
|
+
| Member | Shape | Meaning |
|
|
290
|
+
| --- | --- | --- |
|
|
291
|
+
| `text` | text | Text run. |
|
|
292
|
+
|
|
293
|
+
| Member | Shape | Meaning |
|
|
294
|
+
| --- | --- | --- |
|
|
295
|
+
| `emote` | `asset:` handle | Emote image. |
|
|
296
|
+
| `alt` | text | Emote name. |
|
|
297
|
+
|
|
298
|
+
### `ChatMessage`
|
|
299
|
+
|
|
300
|
+
One chat message. `{ id, author, color, badges, fragments, reply, deleted, receivedAt }`
|
|
301
|
+
|
|
302
|
+
| Member | Shape | Meaning |
|
|
303
|
+
| --- | --- | --- |
|
|
304
|
+
| `id` | text | Message ID. |
|
|
305
|
+
| `author` | text | Author name. |
|
|
306
|
+
| `color` | text or `null` | Author colour `#rrggbb`. |
|
|
307
|
+
| `badges` | list of `asset:` handle | Badge images. |
|
|
308
|
+
| `fragments` | list of [`ChatFragment`](#chatfragment) | Content runs. |
|
|
309
|
+
| `reply` | `{ author, text }` or `null` | The message replied to. |
|
|
310
|
+
| `reply.author` | text | Author replied to. |
|
|
311
|
+
| `reply.text` | text | Text replied to. |
|
|
312
|
+
| `deleted` | boolean | Deleted by a moderator. |
|
|
313
|
+
| `receivedAt` | integer | When the host received the message, in Unix milliseconds of the host's clock: compare it with `Date.now()` to age a message (the fade of Passive mode), also after a `reset`. |
|
|
314
|
+
|
|
315
|
+
### `TwitchChat`
|
|
316
|
+
|
|
317
|
+
Twitch chat state. `{ account, channel, joinState, failure, favorites, canSend, generation, reset, messages, removed, skipped }`
|
|
318
|
+
|
|
319
|
+
| Member | Shape | Meaning |
|
|
320
|
+
| --- | --- | --- |
|
|
321
|
+
| `account` | `signed_out` \| `pending` \| `connected` \| `expired` | Twitch account state; sign-in is drawn by the host. |
|
|
322
|
+
| `channel` | text or `null` | Joined channel login. |
|
|
323
|
+
| `joinState` | `idle` \| `connecting` \| `joined` \| `reconnecting` \| `failed` | Channel connection state. |
|
|
324
|
+
| `failure` | `channel_unavailable` \| `connection` \| `provider` \| `limit` or `null` | Why `joinState` is `failed`, as a fixed category: the channel does not exist or refuses the account, the connection failed, Twitch answered something unexpected, or another widget holds the host's one chat connection (`limit`). `null` in every other state. An account failure is not here: the host draws it. |
|
|
325
|
+
| `favorites` | list of text | Favorite channels. |
|
|
326
|
+
| `canSend` | boolean | A message can be sent now. |
|
|
327
|
+
| `generation` | integer | Changes with the channel or account. |
|
|
328
|
+
| `reset` | boolean | `messages` replaces the whole list. |
|
|
329
|
+
| `messages` | list of [`ChatMessage`](#chatmessage) | Messages, oldest first: the whole list with `reset`; otherwise the new messages, to append, and the changed ones, which replace the message of the same `id` in place. |
|
|
330
|
+
| `removed` | list of text | IDs of removed messages. |
|
|
331
|
+
| `skipped` | integer | New messages the host left out since the previous update, because the chat is faster than it delivers; 0 with `reset`. A removal is never left out. |
|
|
332
|
+
<!-- /generated:result-shapes -->
|
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
# SDK reference
|
|
2
|
+
|
|
3
|
+
`@overcrow/sdk` 1.0 is the API of the logic of a PlayerVox OverCrow
|
|
4
|
+
widget: the state, the data of the host, services, timers, drawing, the
|
|
5
|
+
options menu, messages, logs and formatting. This page lists every export
|
|
6
|
+
of the package. [The logic](logic.md) and
|
|
7
|
+
[services and permissions](services.md) explain how to use them.
|
|
8
|
+
|
|
9
|
+
The SDK is on npm, and the command below adds it to a project. A project
|
|
10
|
+
made by `overcrow-widget init` already lists it: run `npm install` there.
|
|
11
|
+
|
|
12
|
+
```sh
|
|
13
|
+
npm install --save-dev --save-exact @overcrow/sdk@1.0.0
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
<!-- source: widgets/clock/logic.ts -->
|
|
17
|
+
```ts
|
|
18
|
+
import {
|
|
19
|
+
formatDate,
|
|
20
|
+
formatTime,
|
|
21
|
+
initState,
|
|
22
|
+
onHost,
|
|
23
|
+
option,
|
|
24
|
+
t,
|
|
25
|
+
timers,
|
|
26
|
+
type DateOrder,
|
|
27
|
+
type Timer,
|
|
28
|
+
} from "@overcrow/sdk";
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
The SDK is bundled into the widget's `logic.js` when it is packaged, and
|
|
32
|
+
runs inside the widget's VM; loading it anywhere else throws an error.
|
|
33
|
+
Unused parts are removed from the bundle. It is a convenience, not a
|
|
34
|
+
security boundary: OverCrow checks every call, parameter and value that
|
|
35
|
+
leaves the VM.
|
|
36
|
+
|
|
37
|
+
| Export | Kind | Summary |
|
|
38
|
+
| --- | --- | --- |
|
|
39
|
+
| `SDK_VERSION` | constant | `"1.0.0"`. |
|
|
40
|
+
| `RUNTIME_SURFACE` | constant | `"0.1"`, the version of the VM's built-in interface that this SDK needs. |
|
|
41
|
+
|
|
42
|
+
## State and view
|
|
43
|
+
|
|
44
|
+
| Export | Kind | Summary |
|
|
45
|
+
| --- | --- | --- |
|
|
46
|
+
| `state` | constant | The widget state object. Change it; after each turn the VM evaluates the view again and sends only the differences. |
|
|
47
|
+
| `WidgetState` | interface | Type of `state`; declare its members by module augmentation. Undeclared members are `unknown`. |
|
|
48
|
+
| `initState(initial)` | function | Copies `initial` into `state` and returns `state` typed as `initial`. Call it once, while the module loads. |
|
|
49
|
+
| `registerView(table)` | function | Registers the compiled expressions and handlers of the view. The command-line tool generates this call: a widget never writes it. |
|
|
50
|
+
| `ViewTable` | type | The table that `registerView` takes. |
|
|
51
|
+
| `Expression` | type | `(state, scope) => value`: a compiled expression of the view. |
|
|
52
|
+
| `Handler` | type | `(state, scope, event) => void`: a compiled handler of the view. |
|
|
53
|
+
| `NodeEvent<E>` | interface | `{ type, detail }` of an event; `detail` is `EventDetailMap[E]`. |
|
|
54
|
+
| `Scope` | interface | The names in scope of an expression: `for` items, component properties. |
|
|
55
|
+
|
|
56
|
+
<!-- source: templates/chart/logic.ts -->
|
|
57
|
+
```ts
|
|
58
|
+
declare module "@overcrow/sdk" {
|
|
59
|
+
interface WidgetState {
|
|
60
|
+
values: number[];
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
const state = initState({ values: [50] as number[] });
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Host data
|
|
68
|
+
|
|
69
|
+
| Export | Kind | Summary |
|
|
70
|
+
| --- | --- | --- |
|
|
71
|
+
| `host` | constant | Frozen object whose members always read the latest values sent by OverCrow. |
|
|
72
|
+
| `HostData` | interface | Type of `host`: `locale`, `messages`, `theme`, `region`, `scale` (in thousandths), `viewport`, `mode`, `visible`, `options`, `grants`. |
|
|
73
|
+
| `onHost(listener)` | function | Calls `listener` with the names of the `host` members that OverCrow just sent (`options` after a menu change, `visible` when shown or hidden, `region`…), before the view is evaluated again. Returns `{ cancel() }`. |
|
|
74
|
+
| `HostKey` | type | The name of a member of `HostData`. |
|
|
75
|
+
| `HostListener` | type | A listener of `onHost`. |
|
|
76
|
+
| `Viewport` | interface | `{ width, height }`, in logical pixels. |
|
|
77
|
+
| `hasGrant(capability)` | function | Whether the user granted a capability. |
|
|
78
|
+
| `option(id, fallback)` | function | The stored value of a row of the options menu, or `fallback` when there is none or it has another type. |
|
|
79
|
+
| `MenuValue` | type | `boolean \| number \| string`. |
|
|
80
|
+
| `Widened<T>` | type | The result type of `option`: a `false` fallback gives `boolean`. |
|
|
81
|
+
|
|
82
|
+
<!-- source: widgets/clock/logic.ts -->
|
|
83
|
+
```ts
|
|
84
|
+
onHost((changed) => {
|
|
85
|
+
if (changed.includes("options")) {
|
|
86
|
+
const values = menuValues();
|
|
87
|
+
const unitChanged = values.seconds !== state.seconds;
|
|
88
|
+
Object.assign(state, values);
|
|
89
|
+
if (unitChanged) {
|
|
90
|
+
start();
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
// A new UTC offset (time zone or summer time) shows at once.
|
|
94
|
+
if (changed.includes("region")) {
|
|
95
|
+
tick();
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
## Services
|
|
101
|
+
|
|
102
|
+
Every service answers through OverCrow, which checks its permission or
|
|
103
|
+
capability, its parameters and the user action at each call.
|
|
104
|
+
|
|
105
|
+
| Export | Kind | Summary |
|
|
106
|
+
| --- | --- | --- |
|
|
107
|
+
| `storage` | namespace | `get({ key })`, `set({ key, value })`, `remove({ key })`, `keys()`. Permission `storage`. |
|
|
108
|
+
| `http` | namespace | `fetch(url, { as, method?, body?, contentType? })`. Permission `network`. |
|
|
109
|
+
| `clipboard` | namespace | `writeText({ text })`, during a user action. Permission `clipboardWrite`. |
|
|
110
|
+
| `gameEvents` | namespace | `subscribe(listener)`. Permission `gameEvents`. |
|
|
111
|
+
| `session` | namespace | `subscribe(listener)`. Capability `session.read`. |
|
|
112
|
+
| `telemetry` | namespace | `subscribe(listener)`. Capability `telemetry.read`. |
|
|
113
|
+
| `fps` | namespace | `subscribe(listener)`. Capability `fps.read`. |
|
|
114
|
+
| `media` | namespace | `subscribe({ cover? }, listener)`; `previous`, `playPause`, `next({ player? })` during a user action. |
|
|
115
|
+
| `stopwatch` | namespace | `subscribe(listener)`; `toggle()`, `reset()` during a user action. |
|
|
116
|
+
| `notes` | namespace | `subscribe(listener)`; `create()`, `select({ note })`, `setItem({ note, item, checked })`, `delete({ note })` during a user action. |
|
|
117
|
+
| `playervox` | namespace | `score.subscribe`, `rating.subscribe`, `reviews.subscribe`, `reviews.page({ page?, followedOnly? })`. |
|
|
118
|
+
| `journal` | namespace | `subscribe(listener)`; `page({ cursor? })`; `delete({ session })` during a user action, after the user's confirmation. |
|
|
119
|
+
| `twitch` | namespace | `chat.subscribe(listener)`; `chat.join({ channel })`, `chat.leave()`, `chat.favorite({ channel, favorite })` during a user action. |
|
|
120
|
+
| `call(service, params?)` | function | Calls any service that answers once, by its name. |
|
|
121
|
+
| `subscribe(service, params, listener)` | function | Subscribes to any subscription service, by its name. |
|
|
122
|
+
| `ServiceError` | class | The rejection of a failed call: `code` is a `ServiceErrorCode`. |
|
|
123
|
+
| `Listener<T>` | type | `(update: SubscriptionUpdate<T>) => void`. |
|
|
124
|
+
| `SubscriptionUpdate<T>` | type | `{ ok: true, value, final }` or `{ ok: false, error, final: true }`. |
|
|
125
|
+
| `Subscription` | interface | `cancel()`; calling it again does nothing. |
|
|
126
|
+
| `ServiceParams<N>` | type | The parameters of service `N`. |
|
|
127
|
+
| `ServiceResult<N>` | type | The result, or the update, of service `N`. |
|
|
128
|
+
| `FetchOptions<A>` | interface | The options of `http.fetch`. |
|
|
129
|
+
| `FetchResponse<A>` | type | `{ status, contentType, body }`, or `{ status, asset }` for `as: "image"`. |
|
|
130
|
+
| `BodyType` | type | `"json" \| "text" \| "bytes" \| "image"`. |
|
|
131
|
+
| `BodyTypes` | interface | The decoded body of each body type. |
|
|
132
|
+
| `HttpMethod` | type | The methods of network rules. |
|
|
133
|
+
| `HttpServices` | interface | Type of `http`. |
|
|
134
|
+
|
|
135
|
+
The listener always comes last, and a service without parameters takes
|
|
136
|
+
none:
|
|
137
|
+
|
|
138
|
+
<!-- source: widgets/fps/logic.ts -->
|
|
139
|
+
```ts
|
|
140
|
+
fps.subscribe((update) => {
|
|
141
|
+
Object.assign(state, reading(update));
|
|
142
|
+
});
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
<!-- source: widgets/media/logic.ts -->
|
|
146
|
+
```ts
|
|
147
|
+
const current = media.subscribe({ cover: state.showCover }, (update) => {
|
|
148
|
+
if (update.ok) {
|
|
149
|
+
state.media = update.value;
|
|
150
|
+
state.unavailable = false;
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
// The subscription ended: the host's source failed. Show it and ask
|
|
154
|
+
// again later; hidden, the timer waits until the widget shows.
|
|
155
|
+
if (subscription === current) {
|
|
156
|
+
subscription = null;
|
|
157
|
+
state.media = null;
|
|
158
|
+
state.unavailable = true;
|
|
159
|
+
retry = timers.after(RETRY_MS, subscribe);
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
`http.fetch` sends a string body as `text/plain` and any other body as
|
|
165
|
+
JSON, unless `contentType` says otherwise, and decodes the answer as `as`
|
|
166
|
+
asks. A response without a body gives `null`, `""` or an empty
|
|
167
|
+
`ArrayBuffer`.
|
|
168
|
+
|
|
169
|
+
The types of the other namespaces are generated from the schema:
|
|
170
|
+
`ClipboardServices`, `FpsServices`, `GameEventsServices`,
|
|
171
|
+
`JournalServices`, `MediaServices`, `NotesServices`, `PlayervoxServices`,
|
|
172
|
+
`SessionServices`, `StopwatchServices`, `StorageServices`,
|
|
173
|
+
`TelemetryServices` and `TwitchServices`. Each service is described in the
|
|
174
|
+
[service reference](service-reference.md).
|
|
175
|
+
|
|
176
|
+
## Timers
|
|
177
|
+
|
|
178
|
+
| Export | Kind | Summary |
|
|
179
|
+
| --- | --- | --- |
|
|
180
|
+
| `timers` | namespace | `after(ms, callback)`, `every(ms, callback)`, `atEach(unit, callback)`. |
|
|
181
|
+
| `Timer` | interface | `cancel()`; calling it again does nothing. |
|
|
182
|
+
|
|
183
|
+
- At most 16 timers, never shorter than 100 ms: a shorter interval is
|
|
184
|
+
raised to it.
|
|
185
|
+
- No timer ticks while the widget is hidden. A repeating timer skips the
|
|
186
|
+
hidden ticks; a one-shot timer that fell due while hidden ticks once when
|
|
187
|
+
the widget is shown again.
|
|
188
|
+
- `atEach("second" | "minute" | "hour" | "day", callback)` calls `callback`
|
|
189
|
+
at each boundary of the user's local time, and once when the widget is
|
|
190
|
+
shown again. It also wakes when the user's UTC offset changes.
|
|
191
|
+
|
|
192
|
+
<!-- source: widgets/media/logic.ts -->
|
|
193
|
+
```ts
|
|
194
|
+
retry = timers.after(RETRY_MS, subscribe);
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
## Drawing, menu, messages and log
|
|
198
|
+
|
|
199
|
+
| Export | Kind | Summary |
|
|
200
|
+
| --- | --- | --- |
|
|
201
|
+
| `draw(ref, commands)` | function | Replaces the commands of the `canvas` whose `ref` is given. |
|
|
202
|
+
| `onMenu(handler)` | function | Receives the ID of each `action` row of the options menu that the user chooses. |
|
|
203
|
+
| `t(key, params?)` | function | The message of the active language, with each `{name}` replaced by `params.name`; the key itself when there is no message. |
|
|
204
|
+
| `MessageParams` | type | `Record<string, string \| number>`. |
|
|
205
|
+
| `log` | namespace | `debug`, `info`, `warn`, `error(text)`: shown by `overcrow-widget dev`, dropped for an installed widget. |
|
|
206
|
+
|
|
207
|
+
The draw commands are typed tuples, listed in
|
|
208
|
+
[drawing](logic.md#drawing).
|
|
209
|
+
|
|
210
|
+
<!-- source: docs/content/examples/countdown/logic.ts -->
|
|
211
|
+
```ts
|
|
212
|
+
dots.push(["circle", 6 + index * 14, 6, 4], ["fill", "var(--color-accent)"]);
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
## Time, dates and numbers
|
|
216
|
+
|
|
217
|
+
The VM has no `Intl`, and its local time is UTC: `Date` never gives the
|
|
218
|
+
user's time. These helpers format from `host.region`. Numbers follow the
|
|
219
|
+
user's number format (`1,234.5`, `1 234,5` or `1.234,5`), whatever the
|
|
220
|
+
interface language; dates are numeric, in the user's date order; times are
|
|
221
|
+
24-hour. Each helper also accepts its region values as options, so it runs
|
|
222
|
+
in a unit test outside the VM.
|
|
223
|
+
|
|
224
|
+
| Export | Kind | Summary |
|
|
225
|
+
| --- | --- | --- |
|
|
226
|
+
| `localTime(ms, offsetMinutes?)` | function | The `LocalTime` fields of an instant in the user's UTC offset, or in the `offsetMinutes` of a service timestamp. |
|
|
227
|
+
| `formatTime(ms, options?)` | function | `14:08`, or `14:08:42` with `seconds: true`. |
|
|
228
|
+
| `formatDate(ms, options?)` | function | `17/07/2026` (`dmy`), `07/17/2026` (`mdy`), `2026-07-17` (`ymd`). |
|
|
229
|
+
| `formatNumber(value, options?)` | function | The separators of the user's number format; `minimumFractionDigits`, `maximumFractionDigits` (3 by default), `grouping`. |
|
|
230
|
+
| `formatDuration(ms, options?)` | function | `04:05`, `1:02:03`, `04:05.67` with `hundredths: true`; truncated, as a stopwatch shows it. |
|
|
231
|
+
| `delayToNext(unit, nowMs, region?)` | function | The milliseconds to the next boundary of local time, never past the next change of UTC offset. |
|
|
232
|
+
| `LocalTime` | interface | `year`, `month` (1 to 12), `day`, `weekday` (0 is Sunday), `hour`, `minute`, `second`, `millisecond`. |
|
|
233
|
+
| `TimeUnit` | type | `"second" \| "minute" \| "hour" \| "day"`. |
|
|
234
|
+
| `TimeOptions` | interface | `offsetMinutes`. |
|
|
235
|
+
| `DateOptions` | interface | `offsetMinutes`, `order`. |
|
|
236
|
+
| `ClockOptions` | interface | `offsetMinutes`, `seconds`. |
|
|
237
|
+
| `NumberOptions` | interface | The options of `formatNumber`. |
|
|
238
|
+
| `DurationOptions` | interface | `hours`, `hundredths`, `format`. |
|
|
239
|
+
|
|
240
|
+
<!-- source: widgets/clock/logic.ts -->
|
|
241
|
+
```ts
|
|
242
|
+
export function clockDate(now: number, order: DateOrder): string {
|
|
243
|
+
return formatDate(now, { order });
|
|
244
|
+
}
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
Month and weekday names, 12-hour clocks and plural rules are not part of
|
|
248
|
+
1.0.
|
|
249
|
+
|
|
250
|
+
## Generated types
|
|
251
|
+
|
|
252
|
+
These types are generated from the widget schema, so they always match
|
|
253
|
+
what OverCrow accepts.
|
|
254
|
+
|
|
255
|
+
| Export | Summary |
|
|
256
|
+
| --- | --- |
|
|
257
|
+
| `ServiceName`, `CallServiceName`, `SubscribeServiceName`, `GestureServiceName` | The service names: all of them, those that answer once, the subscriptions, and those that need a user action. |
|
|
258
|
+
| `ServiceParamsMap`, `ServiceResultMap` | The parameters and the result of each service. |
|
|
259
|
+
| `ServiceErrorCode`, `ServiceErrorPayload` | The [error codes](services.md#errors), and the `{ code }` value that carries one. |
|
|
260
|
+
| `Session`, `Telemetry`, `Fps`, `Stopwatch`, `Media`, `Notes`, `Note`, `NoteItem`, `CreatedNote`, `Score`, `Rating`, `RatingState`, `Review`, `ReviewsState`, `ReviewsPage`, `JournalState`, `JournalPage`, `JournalSession`, `TwitchChat`, `ChatMessage`, `ChatFragment`, `GameEvent`, `HttpResponse` | The [result shapes](result-shapes.md). |
|
|
261
|
+
| `Permission`, `Capability`, `SensitiveCapability`, `CapabilityServices`, `PermissionServices` | The permissions and capabilities of the manifest, and the services each one allows. |
|
|
262
|
+
| `Locale`, `Theme`, `Mode`, `Region`, `NumberFormat`, `DateOrder` | The values of `host`. |
|
|
263
|
+
| `EventName`, `GestureEventName`, `EventDetailMap`, `NamedKey` | The events of the view, those that are user actions, their details, and the named keys of `keydown`. |
|
|
264
|
+
| `DrawCommand`, `DrawCommandName`, `Color` | The canvas commands and colours. |
|
|
265
|
+
| `TokenName`, `ColorToken`, `LengthToken`, `FontSizeToken`, `FontFamilyToken`, `TimeToken`, `ShadowToken` | The [design tokens](style-properties.md#design-tokens). |
|
|
266
|
+
| `IconName` | The names of the [icons](style-properties.md#icons). |
|
|
267
|
+
| `MenuRowType`, `HostFeature` | The row types of the options menu, and the data sources of `requires`. |
|
|
268
|
+
| `JsonValue`, `AssetHandle`, `ImageSource` | Any JSON value; an image handle given by a service; an image of the package or such a handle. |
|
|
269
|
+
|
|
270
|
+
## Limit constants
|
|
271
|
+
|
|
272
|
+
The [limits](limits.md) a widget's logic works against are exported as
|
|
273
|
+
constants, so the code never repeats a number: `MAX_TIMERS`,
|
|
274
|
+
`MIN_TIMER_INTERVAL_MS`, `MAX_SERVICE_CALLS_IN_FLIGHT`,
|
|
275
|
+
`MAX_SUBSCRIPTIONS`, `MAX_STORAGE_KEYS`, `MAX_STORAGE_KEY_BYTES`,
|
|
276
|
+
`MAX_STORAGE_VALUE_BYTES`, `STORAGE_QUOTA_BYTES`, `MAX_REQUEST_URL_BYTES`,
|
|
277
|
+
`MAX_HTTP_REQUEST_BYTES`, `MAX_HTTP_RESPONSE_BYTES`,
|
|
278
|
+
`MAX_HTTP_DECLARED_RESPONSE_BYTES`, `MAX_CLIPBOARD_BYTES`,
|
|
279
|
+
`MAX_OBJECT_ID_BYTES`, `MAX_NOTES`, `MAX_NOTE_ITEMS`,
|
|
280
|
+
`MAX_NOTE_TITLE_BYTES`, `MAX_NOTE_BODY_BYTES`, `MAX_NOTE_ITEM_BYTES`,
|
|
281
|
+
`MAX_REVIEW_CHARS`, `MAX_CHAT_CHANNEL_BYTES`, `MAX_CHAT_MESSAGE_CHARS`,
|
|
282
|
+
`MAX_CHAT_FRAGMENTS`, `MAX_CHAT_FAVORITES`, `MAX_DRAW_COMMANDS`,
|
|
283
|
+
`MAX_DRAW_STATE_DEPTH`, `MAX_PATH_POINTS`, `MAX_PATCH_BYTES`,
|
|
284
|
+
`MAX_SCENE_NODES`, `MAX_CHILDREN`, `MAX_NODE_TEXT_BYTES`,
|
|
285
|
+
`MAX_ATTRIBUTE_TEXT_BYTES`, `MAX_LABEL_BYTES`, `MAX_FIELD_TEXT_BYTES`,
|
|
286
|
+
`MAX_LOCALE_ENTRIES`, `MAX_LOG_BYTES`, `VM_HEAP_BYTES`,
|
|
287
|
+
`VM_MAX_HEAP_BYTES`, `VM_TURN_BUDGET_MS`, `VM_JOBS_PER_TURN` and
|
|
288
|
+
`VM_MESSAGES_PER_TURN`.
|
|
289
|
+
|
|
290
|
+
## Unit tests: `@overcrow/sdk/testing`
|
|
291
|
+
|
|
292
|
+
A second entry point, never bundled into a widget, replaces OverCrow in a
|
|
293
|
+
unit test of the logic: `installRuntime()` gives virtual time, settles the
|
|
294
|
+
service calls and pushes the subscription values. See
|
|
295
|
+
[unit tests](testing.md#unit-tests).
|