@cardstack/boxel-cli 0.13.0-unstable.4 → 0.13.0-unstable.5
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/bundled-realms/pretui/components/doc-report.gts +2 -2
- package/bundled-realms/pretui/components/doc-report.usage.gts +3 -3
- package/bundled-realms/pretui/components/form-field.md +1 -1
- package/bundled-realms/pretui/components/icon-button.md +1 -1
- package/bundled-realms/pretui/components/popup.md +1 -1
- package/bundled-realms/pretui/components/switch.gts +13 -0
- package/bundled-realms/pretui/components/switch.md +5 -3
- package/bundled-realms/pretui/components/theme-frame.gts +49 -22
- package/bundled-realms/pretui/components/tooltip.gts +141 -42
- package/bundled-realms/pretui/components/tooltip.md +10 -12
- package/bundled-realms/pretui/components/tooltip.usage.gts +3 -5
- package/bundled-realms/pretui/docs/structure.md +1 -1
- package/bundled-realms/pretui/internal/overlay.gts +4 -2
- package/bundled-realms/pretui/pretui-css.gts +6 -2
- package/bundled-realms/pretui/theme-scoped-css.gts +262 -0
- package/bundled-test-harness/assets/account-switch-failed-test-DwAZq6Sc.js +45 -0
- package/bundled-test-harness/assets/adapter-C_6pnsx1.js +2 -0
- package/bundled-test-harness/assets/add-field-to-card-definition-tool-test-zMYtJWBv.js +112 -0
- package/bundled-test-harness/assets/ai-assistant-create-workspace-test-CwhAV-Ow.js +130 -0
- package/bundled-test-harness/assets/ai-assistant-panel-relogin-test-DNgclkGJ.js +46 -0
- package/bundled-test-harness/assets/ai-assistant-test-DGYFiRTb.js +2223 -0
- package/bundled-test-harness/assets/ai-function-generation-test-Dj6WzKkh.js +1176 -0
- package/bundled-test-harness/assets/ai-module-creation-test-EsOoJpQ1.js +151 -0
- package/bundled-test-harness/assets/aibot-message-uGaCPn5o.js +1312 -0
- package/bundled-test-harness/assets/app-pIzBYfiZ.js +14146 -0
- package/bundled-test-harness/assets/apply-markdown-edit-test-CPhfeg1i.js +230 -0
- package/bundled-test-harness/assets/ask-user-picker-NVRkhKwt.js +370 -0
- package/bundled-test-harness/assets/ask-user-picker-test-SsZqFm9W.js +39 -0
- package/bundled-test-harness/assets/assistant-transcript-test-DesuBCIB.js +57 -0
- package/bundled-test-harness/assets/audio-metadata-extractor-test-8JM6oZXG.js +1176 -0
- package/bundled-test-harness/assets/authed-fetch-test-yPTMe-9V.js +73 -0
- package/bundled-test-harness/assets/avif-image-def-test-Kyknj908.js +187 -0
- package/bundled-test-harness/assets/basic-test-D9OrrMaq.js +139 -0
- package/bundled-test-harness/assets/binary-upload-dedupe-test-Dnxlbbu6.js +308 -0
- package/bundled-test-harness/assets/bot-registration-test-Bk2lTaCW.js +97 -0
- package/bundled-test-harness/assets/box-test-BbV9sMyU.js +50 -0
- package/bundled-test-harness/assets/brand-guide-attachments-test-z4wTsKbI.js +84 -0
- package/bundled-test-harness/assets/brand-guide-custom-css-test-BlSJE8xo.js +196 -0
- package/bundled-test-harness/assets/brand-guide-edit-test-DJ1OQ6IB.js +140 -0
- package/bundled-test-harness/assets/brand-logo-mark-field-test-ux7eetkO.js +86 -0
- package/bundled-test-harness/assets/broken-link-template-test-CqB3MWyw.js +192 -0
- package/bundled-test-harness/assets/bundled-base-modules-test-B2oNLZSJ.js +54 -0
- package/bundled-test-harness/assets/bundled-base-oracle-test-DelPfFjn.js +37 -0
- package/bundled-test-harness/assets/buried-stack-item-scroll-test-Ixsl1tS0.js +236 -0
- package/bundled-test-harness/assets/button-BvYQm_A1.js +141 -0
- package/bundled-test-harness/assets/bxl-cyclic-graph-test-p23WCLRW.js +47 -0
- package/bundled-test-harness/assets/bxl-expression-test-CVTQYT_C.js +250 -0
- package/bundled-test-harness/assets/bxl-indexing-test-D_A7X2sr.js +212 -0
- package/bundled-test-harness/assets/bxl-platform-module-test-Cltfyybp.js +71 -0
- package/bundled-test-harness/assets/can-invoke-test-DJi7jMaU.js +455 -0
- package/bundled-test-harness/assets/can-read-realm-test-CIz6WX_K.js +56 -0
- package/bundled-test-harness/assets/cancel-indexing-job-test-0LlrOgYK.js +69 -0
- package/bundled-test-harness/assets/capture-test-diHIWmh0.js +360 -0
- package/bundled-test-harness/assets/card-api-test-Ci9b0ghP.js +198 -0
- package/bundled-test-harness/assets/card-basics-test-RKQoQWZD.js +5364 -0
- package/bundled-test-harness/assets/card-chooser-paging-test-BoUyFMEw.js +235 -0
- package/bundled-test-harness/assets/card-chooser-test-7ZwhxxkH.js +393 -0
- package/bundled-test-harness/assets/card-context-search-results-KmkXJbmC.js +30 -0
- package/bundled-test-harness/assets/card-context-search-results-test-CpMr8OlX.js +184 -0
- package/bundled-test-harness/assets/card-def-field-def-relationships-test-ByPl5n55.js +562 -0
- package/bundled-test-harness/assets/card-def-menu-items-test-ohuHc0b4.js +228 -0
- package/bundled-test-harness/assets/card-delete-test-Be971b-V.js +466 -0
- package/bundled-test-harness/assets/card-error-3q1o3i0e.js +72 -0
- package/bundled-test-harness/assets/card-error-awaiting-index-test-DPgYKfbF.js +53 -0
- package/bundled-test-harness/assets/card-info-thumbnail-picker-test-CVfeJyjt.js +219 -0
- package/bundled-test-harness/assets/card-playground-test-D-7bi4PQ.js +1491 -0
- package/bundled-test-harness/assets/card-prerender-DemTfK_a.js +12939 -0
- package/bundled-test-harness/assets/card-thunk-error-test-DCBh1vRT.js +48 -0
- package/bundled-test-harness/assets/card-type-service-test-DXPrfVYk.js +161 -0
- package/bundled-test-harness/assets/check-correctness-test-DjE7r1X2.js +1093 -0
- package/bundled-test-harness/assets/check-domain-availability-test-U10xSKbY.js +98 -0
- package/bundled-test-harness/assets/chip-0r_r9SC8.js +44 -0
- package/bundled-test-harness/assets/choreo-Ci5dG5fv.js +2 -0
- package/bundled-test-harness/assets/choreo-D1K9RyjM.js +1031 -0
- package/bundled-test-harness/assets/choreo-feature-reel-test-vzmW-SFd.js +155 -0
- package/bundled-test-harness/assets/choreo-gallery-build-order-test-J6n0_PKm.js +436 -0
- package/bundled-test-harness/assets/choreo-gallery-compositor-test-DSi1N9bi.js +399 -0
- package/bundled-test-harness/assets/choreo-gallery-cover-test-BT05gNKC.js +214 -0
- package/bundled-test-harness/assets/choreo-gallery-crossing-stage-test-BIuLOZH6.js +133 -0
- package/bundled-test-harness/assets/choreo-gallery-demos-alive-test-ClGjpnj6.js +42 -0
- package/bundled-test-harness/assets/choreo-gallery-drift-test-OjxMXV0Y.js +620 -0
- package/bundled-test-harness/assets/choreo-gallery-escort-test-D6VL4FfT.js +187 -0
- package/bundled-test-harness/assets/choreo-gallery-films-test-DBcDHGx8.js +140 -0
- package/bundled-test-harness/assets/choreo-gallery-filter-test-BUghtJZe.js +46 -0
- package/bundled-test-harness/assets/choreo-gallery-fold-test-0D9-_h_I.js +180 -0
- package/bundled-test-harness/assets/choreo-gallery-guide-pages-test-DS41eNNV.js +114 -0
- package/bundled-test-harness/assets/choreo-gallery-guides-test-CZnaxUNJ.js +321 -0
- package/bundled-test-harness/assets/choreo-gallery-hang-test-WFvsJ-MJ.js +426 -0
- package/bundled-test-harness/assets/choreo-gallery-highlight-test-Dn0hYPLC.js +60 -0
- package/bundled-test-harness/assets/choreo-gallery-inline-edit-test-C5WvS67s.js +370 -0
- package/bundled-test-harness/assets/choreo-gallery-interruption-test-CgT9RKTe.js +176 -0
- package/bundled-test-harness/assets/choreo-gallery-lone-stack-test-BZgqbTJd.js +104 -0
- package/bundled-test-harness/assets/choreo-gallery-navigation-test-CWzXkvbW.js +193 -0
- package/bundled-test-harness/assets/choreo-gallery-playhead-transport-test-Dt71t4CU.js +111 -0
- package/bundled-test-harness/assets/choreo-gallery-poplayout-subtree-test-B_rDq4em.js +127 -0
- package/bundled-test-harness/assets/choreo-gallery-presence-modes-test-j_cZ9cAM.js +100 -0
- package/bundled-test-harness/assets/choreo-gallery-presentation-test-CIFKR65J.js +157 -0
- package/bundled-test-harness/assets/choreo-gallery-reduced-motion-test-BvRCiCvB.js +145 -0
- package/bundled-test-harness/assets/choreo-gallery-sheet-standalone-test-DgO2MBzU.js +89 -0
- package/bundled-test-harness/assets/choreo-gallery-sheet-test-BntUKT_P.js +48 -0
- package/bundled-test-harness/assets/choreo-gallery-site-test-CvSE6Jyq.js +237 -0
- package/bundled-test-harness/assets/choreo-gallery-stage-Dj6tFzon.js +256 -0
- package/bundled-test-harness/assets/choreo-gallery-stage-keyboard-test-CkDrAPA8.js +102 -0
- package/bundled-test-harness/assets/choreo-gallery-stages-test-DHUmzoRW.js +35 -0
- package/bundled-test-harness/assets/choreo-gallery-subdivision-test-BZ9-cDFh.js +138 -0
- package/bundled-test-harness/assets/choreo-gallery-table-plan-test-7uP6mZpo.js +144 -0
- package/bundled-test-harness/assets/choreo-gallery-theater-test-DgEue9FD.js +252 -0
- package/bundled-test-harness/assets/choreo-gallery-tuning-test-CfPx5iCp.js +95 -0
- package/bundled-test-harness/assets/choreo-gallery-widget-room-test-o9T2EFKq.js +88 -0
- package/bundled-test-harness/assets/choreo-gallery-wires-test-73JLkxn6.js +148 -0
- package/bundled-test-harness/assets/client-telemetry-test-DFM4mML2.js +340 -0
- package/bundled-test-harness/assets/clip-CsRtHZiN.js +92 -0
- package/bundled-test-harness/assets/clip-CycGr0Lf.js +2 -0
- package/bundled-test-harness/assets/code-block-DRE8KQZQ.js +502 -0
- package/bundled-test-harness/assets/code-ref-test-CDcqE8_C.js +163 -0
- package/bundled-test-harness/assets/code-submode-availability-test-DPTqZYYm.js +198 -0
- package/bundled-test-harness/assets/code-submode-test-AHV4mzJ4.js +1839 -0
- package/bundled-test-harness/assets/codeblocks-test-D9pbJMK8.js +418 -0
- package/bundled-test-harness/assets/codemirror-editor-test-BeAMVivu.js +1512 -0
- package/bundled-test-harness/assets/codemirror-embed-toolbar-test-Bnb7_KUT.js +366 -0
- package/bundled-test-harness/assets/color-field-test-CR6gGEqE.js +212 -0
- package/bundled-test-harness/assets/compaction-test-BSqAGv4g.js +150 -0
- package/bundled-test-harness/assets/computed-test-DtyZGgdc.js +1320 -0
- package/bundled-test-harness/assets/container-CEslVSTe.js +10884 -0
- package/bundled-test-harness/assets/content-preview-components-test-BztI4fz-.js +462 -0
- package/bundled-test-harness/assets/copy-and-edit-test-Cqw7kcur.js +292 -0
- package/bundled-test-harness/assets/copy-card-test-D5m3eVEH.js +218 -0
- package/bundled-test-harness/assets/copy-file-to-realm-test-FPY-6Ddm.js +148 -0
- package/bundled-test-harness/assets/copy-source-test-9pJD-qey.js +56 -0
- package/bundled-test-harness/assets/create-file-test-DjMf88u_.js +1086 -0
- package/bundled-test-harness/assets/create-file-test-XbgOqg38.js +464 -0
- package/bundled-test-harness/assets/create-listing-modal-test-DyGlGMWu.js +273 -0
- package/bundled-test-harness/assets/create-listing-pr-request-test-CBtIV0Z8.js +117 -0
- package/bundled-test-harness/assets/create-spec-test-4xR0gM7E.js +256 -0
- package/bundled-test-harness/assets/create-submission-workflow-test-DQpWrpGT.js +132 -0
- package/bundled-test-harness/assets/create-workspace-test-BQAudgpS.js +104 -0
- package/bundled-test-harness/assets/credential-fields-test-DXKBdbZD.js +200 -0
- package/bundled-test-harness/assets/csv-file-def-test-Cnp4y834.js +102 -0
- package/bundled-test-harness/assets/dashboard-CmuOhIYC.js +3628 -0
- package/bundled-test-harness/assets/dashboard-CzN49x74.css +2400 -0
- package/bundled-test-harness/assets/dashboard-add-workspace-test-T32hWB-g.js +50 -0
- package/bundled-test-harness/assets/dashboard-agents-test-BN5maCgQ.js +334 -0
- package/bundled-test-harness/assets/dashboard-archive-test-BzwUte_Z.js +128 -0
- package/bundled-test-harness/assets/dashboard-delete-test-D2Gcp81V.js +163 -0
- package/bundled-test-harness/assets/dashboard-duplicate-offer-test-BgKNIr35.js +71 -0
- package/bundled-test-harness/assets/dashboard-duplicate-test-D7JEWylc.js +222 -0
- package/bundled-test-harness/assets/dashboard-get-started-test-DOGPzGoA.js +374 -0
- package/bundled-test-harness/assets/dashboard-ir2bakJS.js +142 -0
- package/bundled-test-harness/assets/dashboard-pinned-cards-test-Bn_P9xJU.js +220 -0
- package/bundled-test-harness/assets/dashboard-publish-test-64sGQ0nG.js +70 -0
- package/bundled-test-harness/assets/dashboard-reindex-test-DJjYq1ct.js +115 -0
- package/bundled-test-harness/assets/dashboard-section-rail-test-ZkAhWu5V.js +169 -0
- package/bundled-test-harness/assets/dashboard-state-test-BbkpPB5L.js +162 -0
- package/bundled-test-harness/assets/dashboard-test-CBLdPrSt.js +545 -0
- package/bundled-test-harness/assets/dashboard-unreachable-notice-test-DFT3R1Zx.js +62 -0
- package/bundled-test-harness/assets/dashboard-workspace-test-DqBdCFo2.js +537 -0
- package/bundled-test-harness/assets/dashboard-workspaces-section-test-CH1HDfxR.js +410 -0
- package/bundled-test-harness/assets/data-file-def-preview-test-CNsZwQEJ.js +155 -0
- package/bundled-test-harness/assets/date-time-fields-test-CEFaZTnF.js +359 -0
- package/bundled-test-harness/assets/debug-message-test-0hv0RwE_.js +117 -0
- package/bundled-test-harness/assets/declared-captures-test-C-0yPRU7.js +879 -0
- package/bundled-test-harness/assets/delete-workspace-test-CZOwGy78.js +102 -0
- package/bundled-test-harness/assets/diffing-test-BEKI905O.js +210 -0
- package/bundled-test-harness/assets/download-file-to-realm-test-C1kAGDll.js +119 -0
- package/bundled-test-harness/assets/editor-test-C9x5ZY6g.js +688 -0
- package/bundled-test-harness/assets/edits-D76-aanh.js +651 -0
- package/bundled-test-harness/assets/email-field-test-LGkrB_2B.js +75 -0
- package/bundled-test-harness/assets/enum-field-test-CPyV1J-m.js +935 -0
- package/bundled-test-harness/assets/error-display-test-bWuUtfIG.js +343 -0
- package/bundled-test-harness/assets/evaluate-module-test-CbS5h8t3.js +91 -0
- package/bundled-test-harness/assets/execute-atomic-operations-test-B4Kfco0k.js +113 -0
- package/bundled-test-harness/assets/externals-CDQm-Lm7.js +4393 -0
- package/bundled-test-harness/assets/fallback-banner-live-delete-test-DQSiTzvj.js +207 -0
- package/bundled-test-harness/assets/fallback-banner-test-CJFKLpOy.js +225 -0
- package/bundled-test-harness/assets/fallback-banner-test-DQkrFE4-.js +53 -0
- package/bundled-test-harness/assets/fallback-models-test-CiWfmxaB.js +161 -0
- package/bundled-test-harness/assets/fetch-card-json-test-DULUqUEu.js +61 -0
- package/bundled-test-harness/assets/field-configuration-test-BXZq28xa.js +551 -0
- package/bundled-test-harness/assets/field-markdown-domain-test-DdXCifs6.js +616 -0
- package/bundled-test-harness/assets/field-markdown-oversize-test-DouPPTHX.js +88 -0
- package/bundled-test-harness/assets/field-markdown-primitives-test-DSRGJeyl.js +365 -0
- package/bundled-test-harness/assets/field-markdown-specialized-test-DlTYLl_s.js +534 -0
- package/bundled-test-harness/assets/field-playground-test-NhS4VvoN.js +894 -0
- package/bundled-test-harness/assets/field-support-predicates-test-DWpyT1Qf.js +167 -0
- package/bundled-test-harness/assets/file-attachment-test-m72-VerW.js +796 -0
- package/bundled-test-harness/assets/file-chooser-panel-test-DuAqD9bn.js +153 -0
- package/bundled-test-harness/assets/file-chooser-test-CjaXXwpT.js +504 -0
- package/bundled-test-harness/assets/file-def-format-templates-test-BDs4OmHq.js +380 -0
- package/bundled-test-harness/assets/file-def-live-reload-test-BqTdnq-W.js +124 -0
- package/bundled-test-harness/assets/file-def-menu-items-test-DqdINXsD.js +138 -0
- package/bundled-test-harness/assets/file-def-navigation-test-BPGr0SQy.js +109 -0
- package/bundled-test-harness/assets/file-def-serialization-test-CvjW-FlC.js +89 -0
- package/bundled-test-harness/assets/file-def-test-C-Yv_NjS.js +216 -0
- package/bundled-test-harness/assets/file-preview-live-reload-test-MzwGwasU.js +310 -0
- package/bundled-test-harness/assets/file-resource-primitives-test-D3GmfqNs.js +255 -0
- package/bundled-test-harness/assets/file-tree-from-index-test-CfldnUgm.js +96 -0
- package/bundled-test-harness/assets/file-tree-test--0ZCPRe9.js +851 -0
- package/bundled-test-harness/assets/file-view-model-test-BDIAeBV8.js +346 -0
- package/bundled-test-harness/assets/filedef-export-shape-test-B2tgU404.js +61 -0
- package/bundled-test-harness/assets/film-D1E-odYG.js +13 -0
- package/bundled-test-harness/assets/film-D25Y0ED6.js +2 -0
- package/bundled-test-harness/assets/film-D97U-ydx.js +4074 -0
- package/bundled-test-harness/assets/flac-audio-def-test-ByoXMoQ1.js +143 -0
- package/bundled-test-harness/assets/font-metadata-extractor-test-hawLTDTG.js +415 -0
- package/bundled-test-harness/assets/formatted-aibot-message-test-Bdx_-Ktn.js +109 -0
- package/bundled-test-harness/assets/formatted-user-message-test-CodbrU3t.js +43 -0
- package/bundled-test-harness/assets/freestyle-test-faQhSciz.js +17 -0
- package/bundled-test-harness/assets/full-reindex-realm-test-CE5RJTIC.js +101 -0
- package/bundled-test-harness/assets/garbage-collection-test-v-3sev77.js +403 -0
- package/bundled-test-harness/assets/general-test-DQuxDvXK.js +923 -0
- package/bundled-test-harness/assets/generate-example-cards-one-shot-test-CucWyrkH.js +65 -0
- package/bundled-test-harness/assets/generic-file-def-preview-test-_EDRsebi.js +71 -0
- package/bundled-test-harness/assets/get-available-realm-identifiers-test-CV023yek.js +47 -0
- package/bundled-test-harness/assets/get-catalog-realm-identifiers-test--DOu3DyV.js +47 -0
- package/bundled-test-harness/assets/get-default-writable-realm-test-Bic8jl6R.js +54 -0
- package/bundled-test-harness/assets/get-published-realms-test-DrA5YcFN.js +71 -0
- package/bundled-test-harness/assets/get-realm-of-resource-identifier-test-jfU6SIWn.js +54 -0
- package/bundled-test-harness/assets/get-relationship-membership-state-test-Ccy2Z7MN.js +1308 -0
- package/bundled-test-harness/assets/get-user-system-card-test-Bmq2lmWv.js +67 -0
- package/bundled-test-harness/assets/gif-image-def-test-N1mMQC-X.js +188 -0
- package/bundled-test-harness/assets/glimmer-motion-and-choreo-in-cards-test-DzPKH76g.js +160 -0
- package/bundled-test-harness/assets/glimmer-motion-and-choreo-test-D9mlcQuN.js +74 -0
- package/bundled-test-harness/assets/gts-file-def-test-BL1jpQ9J.js +100 -0
- package/bundled-test-harness/assets/head-format-preview-test-BVCaPQqc.js +158 -0
- package/bundled-test-harness/assets/helpers-Ds68JxHe.js +5 -0
- package/bundled-test-harness/assets/host-mode-service-B4bisRdR.js +262 -0
- package/bundled-test-harness/assets/host-mode-test-BmkN2PCJ.js +831 -0
- package/bundled-test-harness/assets/host-submode-test-C6SxQ796.js +1392 -0
- package/bundled-test-harness/assets/html-component-test-CNQ9wF0Q.js +65 -0
- package/bundled-test-harness/assets/html-def-test-BcaCVVQq.js +160 -0
- package/bundled-test-harness/assets/html-meta-extractor-test-BU1hjkTp.js +60 -0
- package/bundled-test-harness/assets/hydratable-card-test-CX6MWiti.js +426 -0
- package/bundled-test-harness/assets/icon-button-C1zH38Nc.js +67 -0
- package/bundled-test-harness/assets/image-metadata-extractor-test-CakSBPZ_.js +1109 -0
- package/bundled-test-harness/assets/index-changes-test-D8RtgfyG.js +367 -0
- package/bundled-test-harness/assets/index-query-engine-test-BOvxkx07.js +2593 -0
- package/bundled-test-harness/assets/index-writer-test-B_bR2fjw.js +3040 -0
- package/bundled-test-harness/assets/inspector-test-BwPXJj1S.js +2058 -0
- package/bundled-test-harness/assets/instance-filter-matcher-test-COAlkUed.js +788 -0
- package/bundled-test-harness/assets/instantiate-card-test-BVQhZjpq.js +164 -0
- package/bundled-test-harness/assets/interact-submode-creation-and-permissions-test-DzQLG41H.js +475 -0
- package/bundled-test-harness/assets/interact-submode-setup-C5bKXq73.js +566 -0
- package/bundled-test-harness/assets/invalidate-realm-identifiers-test-Cd3dpjhB.js +99 -0
- package/bundled-test-harness/assets/invite-user-to-room-test-Brabz1tt.js +142 -0
- package/bundled-test-harness/assets/invoke-card-operation-test-C1Q1FUf4.js +333 -0
- package/bundled-test-harness/assets/isolated-render-test-BLJfS7BU.js +51 -0
- package/bundled-test-harness/assets/job-scoped-doc-cache-test-Bgv5woaB.js +181 -0
- package/bundled-test-harness/assets/job-scoped-instance-residency-test-C_bB6KpR.js +103 -0
- package/bundled-test-harness/assets/jpg-image-def-test-gdLIKocD.js +697 -0
- package/bundled-test-harness/assets/json-file-def-test-CPYMRBY-.js +95 -0
- package/bundled-test-harness/assets/key-notices-badge-test-DemslfLw.js +155 -0
- package/bundled-test-harness/assets/key-readiness-test-5tq5JycL.js +190 -0
- package/bundled-test-harness/assets/linksto-broken-link-placeholder-test-BbhDZ2PH.js +398 -0
- package/bundled-test-harness/assets/linksto-error-sentinel-test-C2t7fFPi.js +238 -0
- package/bundled-test-harness/assets/linksto-many-broken-link-placeholder-test--U_UvUty.js +354 -0
- package/bundled-test-harness/assets/linksto-many-per-slot-access-test-Dj3Xy0ZF.js +303 -0
- package/bundled-test-harness/assets/linksto-sentinel-reload-test-D0dK4Jjs.js +197 -0
- package/bundled-test-harness/assets/linksto-sentinel-roundtrip-test---IYiXok.js +260 -0
- package/bundled-test-harness/assets/linksto-singular-js-access-contract-test-CT04MhES.js +196 -0
- package/bundled-test-harness/assets/lint-and-fix-test-aadgx7rX.js +51 -0
- package/bundled-test-harness/assets/live-test-BGij_vuc.js +100 -0
- package/bundled-test-harness/assets/live-test-CppvValf.js +2 -0
- package/bundled-test-harness/assets/load-default-skills-test-Cp2m_ebp.js +74 -0
- package/bundled-test-harness/assets/loader-parallel-prefetch-test-vU_26Jqu.js +257 -0
- package/bundled-test-harness/assets/loader-test-CTaw8K_B.js +482 -0
- package/bundled-test-harness/assets/loading-test-DGGt4qZZ.js +63 -0
- package/bundled-test-harness/assets/m4a-audio-def-test-DAiReOXH.js +190 -0
- package/bundled-test-harness/assets/main-DUKPWRts.js +5 -0
- package/bundled-test-harness/assets/markdown-embed-chooser-modal-test-CIXq9FqR.js +470 -0
- package/bundled-test-harness/assets/markdown-embed-chooser-test-zFGh9WfP.js +334 -0
- package/bundled-test-harness/assets/markdown-embed-preview-pane-test-Byn_WFwY.js +447 -0
- package/bundled-test-harness/assets/markdown-embed-preview-test-Y3iFMttg.js +368 -0
- package/bundled-test-harness/assets/markdown-fallback-test-Br1TPkLZ.js +316 -0
- package/bundled-test-harness/assets/markdown-file-def-test-Crm2MAnq.js +380 -0
- package/bundled-test-harness/assets/markdown-helpers-test-CZ9Vvywc.js +188 -0
- package/bundled-test-harness/assets/markdown-highlighting-test-CFMkoVDl.js +244 -0
- package/bundled-test-harness/assets/markdown-preview-Df5fp1SY.js +72 -0
- package/bundled-test-harness/assets/markdown-preview-test-DDaPzsVs.js +238 -0
- package/bundled-test-harness/assets/markdown-skill-frontmatter-test-aH6HQly1.js +146 -0
- package/bundled-test-harness/assets/markdown-skill-search-test-CiNLQs-5.js +80 -0
- package/bundled-test-harness/assets/matrix-service-account-switch-sessions-test-DaA8w1Jj.js +63 -0
- package/bundled-test-harness/assets/matrix-service-boot-assembly-test-21GIlf55.js +300 -0
- package/bundled-test-harness/assets/matrix-service-personal-realm-test-jn9DUENm.js +125 -0
- package/bundled-test-harness/assets/matrix-service-realm-servers-test-eNZVJakl.js +55 -0
- package/bundled-test-harness/assets/matrix-service-realms-list-updated-test-Cabm8_dY.js +132 -0
- package/bundled-test-harness/assets/matrix-service-relogin-test-C77EFgjc.js +59 -0
- package/bundled-test-harness/assets/matrix-service-sliding-sync-test-BgM0fPiO.js +35 -0
- package/bundled-test-harness/assets/menu-Cl50TSFe.js +3561 -0
- package/bundled-test-harness/assets/message-service-subscription-test-CfEqH2jP.js +110 -0
- package/bundled-test-harness/assets/message-service-test-DsTzH1In.js +144 -0
- package/bundled-test-harness/assets/message-tool-test-C5xVfTtj.js +33 -0
- package/bundled-test-harness/assets/midi-audio-def-test-goLRCNCZ.js +182 -0
- package/bundled-test-harness/assets/migrate-skill-test-yPCbVfxG.js +161 -0
- package/bundled-test-harness/assets/mini-YXjrY_tH.js +1404 -0
- package/bundled-test-harness/assets/mini-card-chooser-test-DrllikHB.js +272 -0
- package/bundled-test-harness/assets/mini-file-chooser-test-BfqayhmI.js +201 -0
- package/bundled-test-harness/assets/mock-matrix-C7BrPS6S.js +2 -0
- package/bundled-test-harness/assets/mock-matrix-FjsXmU7-.js +15107 -0
- package/bundled-test-harness/assets/modal-BgaZavcs.js +322 -0
- package/bundled-test-harness/assets/model-cost-tier-test-CZlu1zww.js +174 -0
- package/bundled-test-harness/assets/model-file-extract-test-CjEBupY5.js +206 -0
- package/bundled-test-harness/assets/module-transpile-cache-test-XW6DDsmz.js +67 -0
- package/bundled-test-harness/assets/monaco-test-DkoRuFiQ.js +100 -0
- package/bundled-test-harness/assets/mp3-audio-def-test-v369NNsQ.js +133 -0
- package/bundled-test-harness/assets/multiple-stacks-test-CJpYPWdM.js +208 -0
- package/bundled-test-harness/assets/nested-query-field-render-test-CfDrBcUN.js +249 -0
- package/bundled-test-harness/assets/no-stacks-test-MmsJeLpz.js +48 -0
- package/bundled-test-harness/assets/number-field-test-A7B2r0M5.js +184 -0
- package/bundled-test-harness/assets/office-file-def-test-BNRvFmCB.js +263 -0
- package/bundled-test-harness/assets/office-metadata-extractor-test-zlDoEIEp.js +218 -0
- package/bundled-test-harness/assets/office-poster-capture-test-DdFEaOxR.js +203 -0
- package/bundled-test-harness/assets/ogg-audio-def-test-kk91BzQY.js +196 -0
- package/bundled-test-harness/assets/open-create-listing-modal-test-D1Dl1pov.js +131 -0
- package/bundled-test-harness/assets/open-image-in-new-tab-test-DyCmdMyO.js +52 -0
- package/bundled-test-harness/assets/open-secure-window-test-dz1vPudF.js +253 -0
- package/bundled-test-harness/assets/open-workspace-test-BvTcskzP.js +46 -0
- package/bundled-test-harness/assets/operation-lowering-test-CKkamOQt.js +2957 -0
- package/bundled-test-harness/assets/operations-invocation-test-BMj42rQe.js +523 -0
- package/bundled-test-harness/assets/operations-optimistic-test-KJLyzT8v.js +203 -0
- package/bundled-test-harness/assets/operations-query-test-J3HcnaoK.js +459 -0
- package/bundled-test-harness/assets/operations-store-reconciliation-test-CkbGBMBQ.js +406 -0
- package/bundled-test-harness/assets/operations-test-C7zXXpRW.js +2518 -0
- package/bundled-test-harness/assets/operator-mode-acceptance-test-BPolI_RD.js +1195 -0
- package/bundled-test-harness/assets/operator-mode-card-chooser-test-CQ1v8med.js +1036 -0
- package/bundled-test-harness/assets/operator-mode-links-test-BMHEauS3.js +797 -0
- package/bundled-test-harness/assets/operator-mode-test-blL_JVF8.js +696 -0
- package/bundled-test-harness/assets/operator-mode-ui-test-BG6I7-Hc.js +1045 -0
- package/bundled-test-harness/assets/overlay-D2rQi8lJ.js +427 -0
- package/bundled-test-harness/assets/overlay-menu-items-test-D-zmRQQ0.js +331 -0
- package/bundled-test-harness/assets/overlays-COinwHCP.js +2 -0
- package/bundled-test-harness/assets/overlays-detached-element-test-C73nMXes.js +56 -0
- package/bundled-test-harness/assets/overlays-nTqcu69K.js +75 -0
- package/bundled-test-harness/assets/panel-D9SEMehG.js +15124 -0
- package/bundled-test-harness/assets/past-sessions-test-De9N4wVX.js +321 -0
- package/bundled-test-harness/assets/patch-fields-test-Bp2IE0Jw.js +1014 -0
- package/bundled-test-harness/assets/patch-instance-test-DssuRGKP.js +348 -0
- package/bundled-test-harness/assets/pdf-file-def-test-Barj9ffD.js +111 -0
- package/bundled-test-harness/assets/pdf-metadata-extractor-test-B7KnXcIm.js +130 -0
- package/bundled-test-harness/assets/permission-checking-realm-test-OBzvhDB_.js +306 -0
- package/bundled-test-harness/assets/persist-module-inspector-view-test-BIdbkdPr.js +60 -0
- package/bundled-test-harness/assets/persist-scroll-position-test-Bhb7wJiy.js +254 -0
- package/bundled-test-harness/assets/phone-number-field-test-C2yuCrXY.js +73 -0
- package/bundled-test-harness/assets/pill-menu-test-BIp91YXi.js +60 -0
- package/bundled-test-harness/assets/plate-DAr_pvwC.js +41 -0
- package/bundled-test-harness/assets/plate-DeoQd99m.js +2 -0
- package/bundled-test-harness/assets/player-BvXGBItd.js +2 -0
- package/bundled-test-harness/assets/player-CAVQUyKk.js +82 -0
- package/bundled-test-harness/assets/playground-B02e8uqB.js +58 -0
- package/bundled-test-harness/assets/plural-field-components-test-C1acuN-A.js +198 -0
- package/bundled-test-harness/assets/png-image-def-test-B9QeVo1f.js +266 -0
- package/bundled-test-harness/assets/policy-audit-confirmation-test-CeVquvc_.js +155 -0
- package/bundled-test-harness/assets/policy-scoped-search-test-SFPiIqR3.js +339 -0
- package/bundled-test-harness/assets/prerender-file-extract-test-HSJKAHyO.js +346 -0
- package/bundled-test-harness/assets/prerender-html-test-BTAcFCme.js +670 -0
- package/bundled-test-harness/assets/prerender-meta-test-Csyz2b21.js +614 -0
- package/bundled-test-harness/assets/prerender-module-test-DpTYAbmI.js +409 -0
- package/bundled-test-harness/assets/prerender-persistence-block-test-BhIt-7kK.js +124 -0
- package/bundled-test-harness/assets/prerender-pre-model-error-test-DxKPQKqx.js +61 -0
- package/bundled-test-harness/assets/prerender-serialize-cycle-test-C8V5YWQO.js +134 -0
- package/bundled-test-harness/assets/prerendered-html-read-test-Cq7JVGwg.js +191 -0
- package/bundled-test-harness/assets/pretui-components-test-Ducr9fLT.css +743 -0
- package/bundled-test-harness/assets/pretui-components-test-Hs0uyIUQ.js +992 -0
- package/bundled-test-harness/assets/pretui-primitives-CRs8NRm0.js +69 -0
- package/bundled-test-harness/assets/preview-format-test-cCqLrfdY.js +103 -0
- package/bundled-test-harness/assets/preview-test-BMqJSoR1.js +474 -0
- package/bundled-test-harness/assets/process-card-test-578tfDvr.js +94 -0
- package/bundled-test-harness/assets/profile-settings-modal-CVnNl7Yu.js +990 -0
- package/bundled-test-harness/assets/publish-realm-COoeWexp.js +82 -0
- package/bundled-test-harness/assets/publish-realm-test-a5nkx0Ov.js +210 -0
- package/bundled-test-harness/assets/query-field-barrier-test-qX3xVPfk.js +113 -0
- package/bundled-test-harness/assets/query-field-error-sentinel-test-V6JDPFLX.js +201 -0
- package/bundled-test-harness/assets/query-field-membership-status-test-CK7eDf-K.js +323 -0
- package/bundled-test-harness/assets/query-field-page-optin-test-B5YBHUvU.js +126 -0
- package/bundled-test-harness/assets/query-field-schema-test-D4SjOGlK.js +231 -0
- package/bundled-test-harness/assets/query-field-search-throttle-test-BVkm1-D8.js +154 -0
- package/bundled-test-harness/assets/query-field-stale-prerender-test-9g7hcD91.js +152 -0
- package/bundled-test-harness/assets/query-fields-test-CQYqhzpN.js +535 -0
- package/bundled-test-harness/assets/quick-look-test-icQwb1NJ.js +139 -0
- package/bundled-test-harness/assets/read-card-for-ai-assistant-test-D0mJorwH.js +91 -0
- package/bundled-test-harness/assets/read-file-for-ai-assistant-test-B_F_2GEB.js +45 -0
- package/bundled-test-harness/assets/read-source-test-BgJV4B4F.js +67 -0
- package/bundled-test-harness/assets/read-text-file-test-DaeLzg4u.js +124 -0
- package/bundled-test-harness/assets/realm-C_a9su1j.js +2858 -0
- package/bundled-test-harness/assets/realm-api-keys-D5USFOoS.js +2 -0
- package/bundled-test-harness/assets/realm-api-keys-m_VOcixC.js +578 -0
- package/bundled-test-harness/assets/realm-api-keys-test-C_uZnTmq.js +588 -0
- package/bundled-test-harness/assets/realm-api-keys-test-gtJ8XZCE.js +109 -0
- package/bundled-test-harness/assets/realm-config-m5eccPW8.js +833 -0
- package/bundled-test-harness/assets/realm-config-policy-standing-test-CXJ4ZMde.js +290 -0
- package/bundled-test-harness/assets/realm-config-routing-rule-edit-test-DoEunShH.js +274 -0
- package/bundled-test-harness/assets/realm-config-settings-test-BYi9i4O6.js +187 -0
- package/bundled-test-harness/assets/realm-field-test-B_PUoqnk.js +100 -0
- package/bundled-test-harness/assets/realm-indexing-test-8iLjeV_e.js +4380 -0
- package/bundled-test-harness/assets/realm-policy-fitted-test-Bptvra0U.js +206 -0
- package/bundled-test-harness/assets/realm-policy-test-DwG0qqXE.js +1141 -0
- package/bundled-test-harness/assets/realm-querying-test-Dvw26A6Q.js +1067 -0
- package/bundled-test-harness/assets/realm-server-form-agnostic-test-DrXQH0UP.js +96 -0
- package/bundled-test-harness/assets/realm-server-subscriber-test-Dkj23vQK.js +46 -0
- package/bundled-test-harness/assets/realm-service-info-test-CdRlDhj-.js +67 -0
- package/bundled-test-harness/assets/realm-test-DGYN48Qx.js +2364 -0
- package/bundled-test-harness/assets/realm-token-refresh-test-CEWATL9h.js +153 -0
- package/bundled-test-harness/assets/realm-url-tooltip-test-8ZjTNPuy.js +78 -0
- package/bundled-test-harness/assets/reasoning-test-WUx-4agu.js +221 -0
- package/bundled-test-harness/assets/recent-files-test-Dc6L6Dm4.js +450 -0
- package/bundled-test-harness/assets/reindex-realm-test-CFRSt39u.js +117 -0
- package/bundled-test-harness/assets/relationship-loading-state-test-FKbtOFUr.js +290 -0
- package/bundled-test-harness/assets/remix-card-test-CKGC_Sgq.js +58 -0
- package/bundled-test-harness/assets/rendered-markdown-B_jWmDrK.js +292 -0
- package/bundled-test-harness/assets/rendered-markdown-test-sdWhU0NA.js +587 -0
- package/bundled-test-harness/assets/resident-instance-reuse-test-BjdhE6CM.js +82 -0
- package/bundled-test-harness/assets/result-tile-o6dtjgX4.js +144 -0
- package/bundled-test-harness/assets/rich-markdown-field-test-VXr6l20h.js +1647 -0
- package/bundled-test-harness/assets/room-message-test-BYNhZ39n.js +484 -0
- package/bundled-test-harness/assets/run-FzaqmBEl.js +3959 -0
- package/bundled-test-harness/assets/run-realm-code-DsBUf1si.js +2964 -0
- package/bundled-test-harness/assets/run-realm-code-test-cS0DzaKo.js +3844 -0
- package/bundled-test-harness/assets/sanitize-module-list-test-CvuOOiUY.js +85 -0
- package/bundled-test-harness/assets/save-card-skip-index-wait-test-fpJ1eq32.js +89 -0
- package/bundled-test-harness/assets/schema-editor-test-NkKjCgyf.js +785 -0
- package/bundled-test-harness/assets/schema-generation-test-Dmg3lWl7.js +28 -0
- package/bundled-test-harness/assets/scrolling-test-Dd4gv_fj.js +412 -0
- package/bundled-test-harness/assets/search-adorn-test-CZebk7_y.js +136 -0
- package/bundled-test-harness/assets/search-and-choose-test-Bd4NZUup.js +154 -0
- package/bundled-test-harness/assets/search-correlation-id-test-DXKlEO55.js +139 -0
- package/bundled-test-harness/assets/search-entries-result-test-QQawA8Fm.js +234 -0
- package/bundled-test-harness/assets/search-entries-test-3DlqGPQq.js +1486 -0
- package/bundled-test-harness/assets/search-entries-tool-test-D1TvDE9D.js +504 -0
- package/bundled-test-harness/assets/search-google-images-test-DqsoQGr1.js +166 -0
- package/bundled-test-harness/assets/search-results-DGrNaPxh.js +266 -0
- package/bundled-test-harness/assets/search-results-test-CqVHYNRt.js +578 -0
- package/bundled-test-harness/assets/search-selection-menu-test-D6bIjKiH.js +108 -0
- package/bundled-test-harness/assets/search-sheet-files-test-Bf37TQXo.js +126 -0
- package/bundled-test-harness/assets/search-sheet-persistence-test-CV4_XdxR.js +131 -0
- package/bundled-test-harness/assets/search-test-Dlb-wg3a.js +2249 -0
- package/bundled-test-harness/assets/search-tool-test-BJLgVMoL.js +156 -0
- package/bundled-test-harness/assets/searchable-option-test-eJaIPH_L.js +322 -0
- package/bundled-test-harness/assets/searchable-search-doc-test-yH9fLGNS.js +1271 -0
- package/bundled-test-harness/assets/section-rail-CNFCebtT.js +113 -0
- package/bundled-test-harness/assets/section-rail-test-KNJAWWl6.js +256 -0
- package/bundled-test-harness/assets/secure-sign-in-Dyljp0Th.js +174 -0
- package/bundled-test-harness/assets/secure-sign-in-test-QnqNuTP3.js +373 -0
- package/bundled-test-harness/assets/segmented-control-DxJdoJ4Z.js +173 -0
- package/bundled-test-harness/assets/select-BiQTg2ts.js +175 -0
- package/bundled-test-harness/assets/send-ai-assistant-message-test-CAn7M2dZ.js +52 -0
- package/bundled-test-harness/assets/send-bot-trigger-event-test-qBu5E_jy.js +56 -0
- package/bundled-test-harness/assets/send-request-via-proxy-test-CLuwLBq_.js +380 -0
- package/bundled-test-harness/assets/sending-test-Dt9Dh2wW.js +659 -0
- package/bundled-test-harness/assets/serialization-rri-form-audit-test-hMJukiKt.js +136 -0
- package/bundled-test-harness/assets/serialization-test-W5e3wKbz.js +8758 -0
- package/bundled-test-harness/assets/set-user-system-card-test-CjgWLkNV.js +59 -0
- package/bundled-test-harness/assets/setup-CssMNvui.js +772 -0
- package/bundled-test-harness/assets/setup-D8YXvK-p.js +2 -0
- package/bundled-test-harness/assets/shared-link-target-reuse-test-D42UO8DC.js +207 -0
- package/bundled-test-harness/assets/show-card-test-CHEaS514.js +365 -0
- package/bundled-test-harness/assets/signed-capture-link-test-BgEu0F-S.js +132 -0
- package/bundled-test-harness/assets/single-stack-test-DYcu_v7Z.js +652 -0
- package/bundled-test-harness/assets/skills-test-BP8QNesE.js +648 -0
- package/bundled-test-harness/assets/skip-boot-index-guard-test-BzRIncDN.js +46 -0
- package/bundled-test-harness/assets/spec-test-BYvFR6Xb.js +1077 -0
- package/bundled-test-harness/assets/spinner-Bx9x55NA.js +49 -0
- package/bundled-test-harness/assets/src-LqENIikj.js +5 -0
- package/bundled-test-harness/assets/src-a4d10Hra.js +216 -0
- package/bundled-test-harness/assets/stick-to-bottom-resize-test-BBLiCR3X.js +56 -0
- package/bundled-test-harness/assets/store-add-test-D_9IHQjZ.js +50 -0
- package/bundled-test-harness/assets/store-module-rebuild-test-BRGZoLRV.js +454 -0
- package/bundled-test-harness/assets/store-search-test-3G8JHuj2.js +175 -0
- package/bundled-test-harness/assets/store-test-Dd4WQp7L.js +3672 -0
- package/bundled-test-harness/assets/structured-theme-test-11TNsgUW.js +377 -0
- package/bundled-test-harness/assets/summarize-session-test-CwzD_ZbD.js +172 -0
- package/bundled-test-harness/assets/svg-image-def-test-zV6aMK9q.js +167 -0
- package/bundled-test-harness/assets/switch-submode-test-DQU2cP5_.js +168 -0
- package/bundled-test-harness/assets/sync-openrouter-models-test-xrXVaC2H.js +97 -0
- package/bundled-test-harness/assets/test-support-QTh6wGxu.js +3 -0
- package/bundled-test-harness/assets/test-support-Tr-PYFgc.js +99 -0
- package/bundled-test-harness/assets/tests-zLlwPutr.js +3598 -0
- package/bundled-test-harness/assets/text-file-def-test-Cyq78UFY.js +94 -0
- package/bundled-test-harness/assets/text-input-validator-test-C1uDVZU7.js +156 -0
- package/bundled-test-harness/assets/text-suggestion-test-C4XAqWqY.js +340 -0
- package/bundled-test-harness/assets/theme-card-test-dVNz4tgU.js +621 -0
- package/bundled-test-harness/assets/theme-dashboard-nav-test-DYSn5pqo.js +196 -0
- package/bundled-test-harness/assets/theme-scheme-island-test-C1WpkfEP.js +264 -0
- package/bundled-test-harness/assets/theme-scoped-css-parity-test-BVluppsE.js +176 -0
- package/bundled-test-harness/assets/titles-0a1luoTq.js +52 -0
- package/bundled-test-harness/assets/titles-DKHNLVwC.js +2 -0
- package/bundled-test-harness/assets/to-device-streaming-test-3A6jI0_r.js +163 -0
- package/bundled-test-harness/assets/token-usage-test-33ovcqPk.js +160 -0
- package/bundled-test-harness/assets/tools-J_Knr_W6.js +774 -0
- package/bundled-test-harness/assets/tools-calling-test-CfqZX0Ed.js +200 -0
- package/bundled-test-harness/assets/tools-test-B4x58ZmI.js +1624 -0
- package/bundled-test-harness/assets/tools-test-DtUQp5ez.js +3204 -0
- package/bundled-test-harness/assets/tooltip-B0rEgyMW.css +66 -0
- package/bundled-test-harness/assets/tooltip-DvUMUgVX.js +195 -0
- package/bundled-test-harness/assets/transform-cards-test-CYQbZeD9.js +341 -0
- package/bundled-test-harness/assets/ts-file-def-preview-test-m39f8Zio.js +95 -0
- package/bundled-test-harness/assets/ts-file-def-test-xIcL5xWe.js +92 -0
- package/bundled-test-harness/assets/ttf-font-def-test-ClQ2SzFF.js +206 -0
- package/bundled-test-harness/assets/turn-settling-test-DqYk312r.js +160 -0
- package/bundled-test-harness/assets/turn-summary-Bmt7ZxTS.js +1039 -0
- package/bundled-test-harness/assets/unpublish-realm-test-0ToTJczx.js +102 -0
- package/bundled-test-harness/assets/update-room-skills-test-o_j8NOUV.js +240 -0
- package/bundled-test-harness/assets/use-ai-assistant-test-D7HFpxKJ.js +384 -0
- package/bundled-test-harness/assets/user-message-BAOt1hS3.js +262 -0
- package/bundled-test-harness/assets/validate-realm-test-e3xIbNLB.js +67 -0
- package/bundled-test-harness/assets/video-metadata-extractor-test-D8naLSlg.js +520 -0
- package/bundled-test-harness/assets/view-visually-test-BuhGau5E.js +335 -0
- package/bundled-test-harness/assets/virtual-network-reset-test-CgaFNGPi.js +96 -0
- package/bundled-test-harness/assets/wav-audio-def-test-CWG_UdCh.js +160 -0
- package/bundled-test-harness/assets/webp-image-def-test-sN4yw8Zu.js +226 -0
- package/bundled-test-harness/assets/workspace-0LfPqbYB.js +445 -0
- package/bundled-test-harness/assets/workspace-a11y-test-DQxYDRAP.js +197 -0
- package/bundled-test-harness/assets/workspace-actions-jGJSfl8M.js +588 -0
- package/bundled-test-harness/assets/workspace-behavior-test-BnF-bmBN.js +338 -0
- package/bundled-test-harness/assets/workspace-delete-multiple-test-D-rxPDuT.js +212 -0
- package/bundled-test-harness/assets/workspace-delete-summary-test-C2-Mve5R.js +63 -0
- package/bundled-test-harness/assets/workspace-hosting-test-BvDKdlOb.js +138 -0
- package/bundled-test-harness/assets/workspace-indexing-test-B34T3kqD.js +71 -0
- package/bundled-test-harness/assets/workspace-test-CJivgv-m.js +51 -0
- package/bundled-test-harness/assets/workspace-test-CuSRpPnQ.js +385 -0
- package/bundled-test-harness/assets/workspace-timestamp-labels-test-aWgjdbCp.js +68 -0
- package/bundled-test-harness/assets/workspace-unit-test-DHMUf2KT.js +122 -0
- package/bundled-test-harness/assets/write-binary-file-test-P-hVQuin.js +124 -0
- package/bundled-test-harness/assets/write-text-file-test-fXvJueDd.js +191 -0
- package/bundled-test-harness/assets/zip-archive-test-C2P5CUSR.js +285 -0
- package/bundled-test-harness/assets/zip-file-def-test-BfJZAmGt.js +164 -0
- package/bundled-test-harness/boxel-ui-checksum.txt +1 -1
- package/bundled-test-harness/index.html +47 -47
- package/bundled-test-harness/tests/index.html +49 -49
- package/bundled-types/boxel-ui/helpers/theme-scoped-css.ts +4 -0
- package/bundled-types/choreo/choreo.gts +13 -1
- package/bundled-types/choreo/run.ts +19 -0
- package/bundled-types/host-app/components/operator-mode/dashboard/get-started.gts +152 -7
- package/bundled-types/host-app/components/operator-mode/dashboard/index.gts +2 -0
- package/bundled-types/host-app/components/operator-mode/dashboard/workspace.gts +5 -3
- package/bundled-types/host-app/components/operator-mode/dashboard-modals/workspace-modals.gts +5 -22
- package/bundled-types/host-app/components/operator-mode/host-submode/publishing-realm-popover.gts +1 -1
- package/bundled-types/host-app/components/operator-mode/host-submode.gts +111 -37
- package/bundled-types/host-app/components/operator-mode/publish-realm-modal.gts +1 -0
- package/bundled-types/host-app/lib/modal-focus-trap.ts +33 -0
- package/bundled-types/host-app/lib/workspace-actions.ts +21 -0
- package/bundled-types/host-app/services/host-mode-service.ts +39 -0
- package/bundled-types/host-app/services/realm.ts +14 -0
- package/bundled-types/host-tests/helpers/dashboard.ts +67 -0
- package/package.json +1 -1
- package/bundled-test-harness/assets/account-switch-failed-test-FytUFiPO.js +0 -45
- package/bundled-test-harness/assets/adapter-DvmPwSZv.js +0 -2
- package/bundled-test-harness/assets/add-field-to-card-definition-tool-test-DN525jiY.js +0 -112
- package/bundled-test-harness/assets/ai-assistant-create-workspace-test-q3tKqVJQ.js +0 -130
- package/bundled-test-harness/assets/ai-assistant-panel-relogin-test-DgeXcCyi.js +0 -46
- package/bundled-test-harness/assets/ai-assistant-test-lDIGPKFP.js +0 -2223
- package/bundled-test-harness/assets/ai-function-generation-test-D5GbLyvL.js +0 -1176
- package/bundled-test-harness/assets/ai-module-creation-test-I3-j2beD.js +0 -151
- package/bundled-test-harness/assets/aibot-message-Dmsjifs6.js +0 -1312
- package/bundled-test-harness/assets/app-BS9_-DhN.js +0 -14146
- package/bundled-test-harness/assets/apply-markdown-edit-test-4zlwt0Db.js +0 -230
- package/bundled-test-harness/assets/ask-user-picker-Dr-0qpNr.js +0 -370
- package/bundled-test-harness/assets/ask-user-picker-test-633AFdmS.js +0 -39
- package/bundled-test-harness/assets/assistant-transcript-test-BgRnLvMg.js +0 -57
- package/bundled-test-harness/assets/audio-metadata-extractor-test-4xsQqL-0.js +0 -1176
- package/bundled-test-harness/assets/authed-fetch-test-663mT5_N.js +0 -73
- package/bundled-test-harness/assets/avif-image-def-test-h01BPIJy.js +0 -187
- package/bundled-test-harness/assets/basic-test-DiD6T-8Q.js +0 -139
- package/bundled-test-harness/assets/binary-upload-dedupe-test-CkjMPO_e.js +0 -308
- package/bundled-test-harness/assets/bot-registration-test-CFZHpwdj.js +0 -97
- package/bundled-test-harness/assets/box-test-C3pSy5ED.js +0 -50
- package/bundled-test-harness/assets/brand-guide-attachments-test-EoC_u7Vc.js +0 -84
- package/bundled-test-harness/assets/brand-guide-custom-css-test-Dn3fvblr.js +0 -196
- package/bundled-test-harness/assets/brand-guide-edit-test-NeiT3MyK.js +0 -140
- package/bundled-test-harness/assets/brand-logo-mark-field-test-C2A1EnBB.js +0 -86
- package/bundled-test-harness/assets/broken-link-template-test-CWn6V5zZ.js +0 -192
- package/bundled-test-harness/assets/bundled-base-modules-test-D7mLzpsw.js +0 -54
- package/bundled-test-harness/assets/bundled-base-oracle-test-I7xCId_k.js +0 -37
- package/bundled-test-harness/assets/buried-stack-item-scroll-test-DFBev0h-.js +0 -236
- package/bundled-test-harness/assets/button-BeSuhveJ.js +0 -207
- package/bundled-test-harness/assets/bxl-cyclic-graph-test-DPykwvvx.js +0 -47
- package/bundled-test-harness/assets/bxl-expression-test-LBWJiFb9.js +0 -250
- package/bundled-test-harness/assets/bxl-indexing-test-BuZmLk7y.js +0 -212
- package/bundled-test-harness/assets/bxl-platform-module-test-BNIvlkCM.js +0 -71
- package/bundled-test-harness/assets/can-invoke-test-t-bFIIeX.js +0 -455
- package/bundled-test-harness/assets/can-read-realm-test-2Q_MzRT9.js +0 -56
- package/bundled-test-harness/assets/cancel-indexing-job-test-QeYxEukn.js +0 -69
- package/bundled-test-harness/assets/capture-test-CJmJG8YR.js +0 -360
- package/bundled-test-harness/assets/card-api-test-B43I510H.js +0 -198
- package/bundled-test-harness/assets/card-basics-test-CBClzP2y.js +0 -5364
- package/bundled-test-harness/assets/card-chooser-paging-test-HEVzf6pR.js +0 -235
- package/bundled-test-harness/assets/card-chooser-test-GfjBRPFI.js +0 -393
- package/bundled-test-harness/assets/card-context-search-results-CoSr4EdS.js +0 -30
- package/bundled-test-harness/assets/card-context-search-results-test-BLMlZu9t.js +0 -184
- package/bundled-test-harness/assets/card-def-field-def-relationships-test-DEBOzKan.js +0 -562
- package/bundled-test-harness/assets/card-def-menu-items-test-88_h8o0D.js +0 -228
- package/bundled-test-harness/assets/card-delete-test-DKom1phy.js +0 -466
- package/bundled-test-harness/assets/card-error-awaiting-index-test-DEwgFZMP.js +0 -53
- package/bundled-test-harness/assets/card-error-r6_cXst9.js +0 -72
- package/bundled-test-harness/assets/card-info-thumbnail-picker-test-B7LiY15e.js +0 -219
- package/bundled-test-harness/assets/card-playground-test-CgyIJHui.js +0 -1491
- package/bundled-test-harness/assets/card-prerender-rPfzpIOU.js +0 -12939
- package/bundled-test-harness/assets/card-thunk-error-test-L0pvg4Ce.js +0 -48
- package/bundled-test-harness/assets/card-type-service-test-B2dhqxSD.js +0 -161
- package/bundled-test-harness/assets/check-correctness-test-DgqaLlCW.js +0 -1093
- package/bundled-test-harness/assets/check-domain-availability-test-B0hJHY5l.js +0 -98
- package/bundled-test-harness/assets/chip-D01NW3WH.js +0 -44
- package/bundled-test-harness/assets/choreo-D2Jl79RU.js +0 -1019
- package/bundled-test-harness/assets/choreo-_E8SOEe-.js +0 -2
- package/bundled-test-harness/assets/choreo-feature-reel-test-WLjsZDmS.js +0 -155
- package/bundled-test-harness/assets/choreo-gallery-build-order-test-6jnS8PsS.js +0 -436
- package/bundled-test-harness/assets/choreo-gallery-compositor-test-CbUZsVB6.js +0 -399
- package/bundled-test-harness/assets/choreo-gallery-cover-test-CbvAStgk.js +0 -214
- package/bundled-test-harness/assets/choreo-gallery-crossing-stage-test-tdjvUSa6.js +0 -133
- package/bundled-test-harness/assets/choreo-gallery-demos-alive-test-CsnM3hQK.js +0 -42
- package/bundled-test-harness/assets/choreo-gallery-drift-test-DG2LQTa7.js +0 -620
- package/bundled-test-harness/assets/choreo-gallery-escort-test-mn3-qXP1.js +0 -187
- package/bundled-test-harness/assets/choreo-gallery-films-test-BuktaC0D.js +0 -140
- package/bundled-test-harness/assets/choreo-gallery-filter-test-Dd-zpps0.js +0 -46
- package/bundled-test-harness/assets/choreo-gallery-fold-test-CWc1ijGc.js +0 -180
- package/bundled-test-harness/assets/choreo-gallery-guide-pages-test-tk2QmYPU.js +0 -114
- package/bundled-test-harness/assets/choreo-gallery-guides-test-DVbf1zM4.js +0 -321
- package/bundled-test-harness/assets/choreo-gallery-hang-test-B7EFp2dx.js +0 -426
- package/bundled-test-harness/assets/choreo-gallery-highlight-test-BFgbdesP.js +0 -60
- package/bundled-test-harness/assets/choreo-gallery-inline-edit-test-DJb8FC5R.js +0 -370
- package/bundled-test-harness/assets/choreo-gallery-interruption-test-DWyMXo5D.js +0 -176
- package/bundled-test-harness/assets/choreo-gallery-lone-stack-test-D3b8LsJ6.js +0 -104
- package/bundled-test-harness/assets/choreo-gallery-navigation-test-CjjU6Rvn.js +0 -193
- package/bundled-test-harness/assets/choreo-gallery-playhead-transport-test-Le_h3QWU.js +0 -111
- package/bundled-test-harness/assets/choreo-gallery-poplayout-subtree-test-Cp-DlWj4.js +0 -127
- package/bundled-test-harness/assets/choreo-gallery-presence-modes-test-DayS4GCJ.js +0 -100
- package/bundled-test-harness/assets/choreo-gallery-presentation-test-DeAfuFS7.js +0 -157
- package/bundled-test-harness/assets/choreo-gallery-reduced-motion-test-BgPWpggq.js +0 -145
- package/bundled-test-harness/assets/choreo-gallery-sheet-standalone-test-PzyoMNYv.js +0 -89
- package/bundled-test-harness/assets/choreo-gallery-sheet-test-CxaiNBkL.js +0 -48
- package/bundled-test-harness/assets/choreo-gallery-site-test-6xtSntS5.js +0 -237
- package/bundled-test-harness/assets/choreo-gallery-stage-E6Q5r-zU.js +0 -256
- package/bundled-test-harness/assets/choreo-gallery-stage-keyboard-test-C7aWMr9a.js +0 -102
- package/bundled-test-harness/assets/choreo-gallery-stages-test-CDWWgC61.js +0 -35
- package/bundled-test-harness/assets/choreo-gallery-subdivision-test-Bkp15XJv.js +0 -138
- package/bundled-test-harness/assets/choreo-gallery-table-plan-test-CcGRi_3O.js +0 -144
- package/bundled-test-harness/assets/choreo-gallery-theater-test-Qph5pLT_.js +0 -252
- package/bundled-test-harness/assets/choreo-gallery-tuning-test-C4DhFLVA.js +0 -95
- package/bundled-test-harness/assets/choreo-gallery-widget-room-test-LK493r1M.js +0 -88
- package/bundled-test-harness/assets/choreo-gallery-wires-test-B7SeUCc8.js +0 -148
- package/bundled-test-harness/assets/client-telemetry-test-DGmHzAFx.js +0 -340
- package/bundled-test-harness/assets/clip-BpYQPVz_.js +0 -2
- package/bundled-test-harness/assets/clip-CNaYbIwL.js +0 -92
- package/bundled-test-harness/assets/code-block-Cp2CJo5-.js +0 -502
- package/bundled-test-harness/assets/code-ref-test-C8JBHDb-.js +0 -163
- package/bundled-test-harness/assets/code-submode-availability-test-CzG1Tv6L.js +0 -198
- package/bundled-test-harness/assets/code-submode-test-BclVWjm5.js +0 -1839
- package/bundled-test-harness/assets/codeblocks-test-CmQlyxN7.js +0 -418
- package/bundled-test-harness/assets/codemirror-editor-test-B74H_yn8.js +0 -1512
- package/bundled-test-harness/assets/codemirror-embed-toolbar-test-Bz6VEysU.js +0 -366
- package/bundled-test-harness/assets/color-field-test-DMCPQKIP.js +0 -212
- package/bundled-test-harness/assets/compaction-test-saQCLBrQ.js +0 -150
- package/bundled-test-harness/assets/computed-test-C05HliJC.js +0 -1320
- package/bundled-test-harness/assets/container-Cqcwrd-m.js +0 -10857
- package/bundled-test-harness/assets/content-preview-components-test-DZPj4_CU.js +0 -462
- package/bundled-test-harness/assets/copy-and-edit-test-DiXTQNTF.js +0 -292
- package/bundled-test-harness/assets/copy-card-test-ys7GquUY.js +0 -218
- package/bundled-test-harness/assets/copy-file-to-realm-test-Gn0Wn4vT.js +0 -148
- package/bundled-test-harness/assets/copy-source-test-BTLrOmPm.js +0 -56
- package/bundled-test-harness/assets/create-file-test-BCeIW-Rt.js +0 -464
- package/bundled-test-harness/assets/create-file-test-DbHQ5JsS.js +0 -1086
- package/bundled-test-harness/assets/create-listing-modal-test-CeHc4ter.js +0 -273
- package/bundled-test-harness/assets/create-listing-pr-request-test-DXbJNfMh.js +0 -117
- package/bundled-test-harness/assets/create-spec-test-BDIZoyHT.js +0 -256
- package/bundled-test-harness/assets/create-submission-workflow-test-Bix5J-3A.js +0 -132
- package/bundled-test-harness/assets/create-workspace-test-BmNnLHwC.js +0 -104
- package/bundled-test-harness/assets/credential-fields-test-NK1F4QWn.js +0 -200
- package/bundled-test-harness/assets/csv-file-def-test-BSfs4TTP.js +0 -102
- package/bundled-test-harness/assets/dashboard-C4T7ffKY.js +0 -3576
- package/bundled-test-harness/assets/dashboard-CFeHuP5-.js +0 -81
- package/bundled-test-harness/assets/dashboard-DQlpW-ux.css +0 -2392
- package/bundled-test-harness/assets/dashboard-add-workspace-test--rr6objf.js +0 -50
- package/bundled-test-harness/assets/dashboard-agents-test-D1y8H4xH.js +0 -334
- package/bundled-test-harness/assets/dashboard-archive-test-bN4EQaXv.js +0 -128
- package/bundled-test-harness/assets/dashboard-delete-test-BvsASb8B.js +0 -163
- package/bundled-test-harness/assets/dashboard-duplicate-offer-test-DEsd5ZzZ.js +0 -71
- package/bundled-test-harness/assets/dashboard-duplicate-test-BnR0sTgB.js +0 -222
- package/bundled-test-harness/assets/dashboard-get-started-test-DG4uUXLv.js +0 -246
- package/bundled-test-harness/assets/dashboard-pinned-cards-test-AoGGVRAS.js +0 -220
- package/bundled-test-harness/assets/dashboard-reindex-test-BN9a96Xp.js +0 -115
- package/bundled-test-harness/assets/dashboard-section-rail-test-B3OT9V2T.js +0 -169
- package/bundled-test-harness/assets/dashboard-state-test-BY0Zqrmj.js +0 -162
- package/bundled-test-harness/assets/dashboard-test-C13oNpWt.js +0 -545
- package/bundled-test-harness/assets/dashboard-unreachable-notice-test-DZIV4x5j.js +0 -62
- package/bundled-test-harness/assets/dashboard-workspace-test-CBnOQViI.js +0 -537
- package/bundled-test-harness/assets/dashboard-workspaces-section-test-KU8ZVOYp.js +0 -396
- package/bundled-test-harness/assets/data-file-def-preview-test-CI5gcdtK.js +0 -155
- package/bundled-test-harness/assets/date-time-fields-test-D2CpR_Pb.js +0 -359
- package/bundled-test-harness/assets/debug-message-test-Df1kHesw.js +0 -117
- package/bundled-test-harness/assets/declared-captures-test-hQ43zuox.js +0 -879
- package/bundled-test-harness/assets/delete-workspace-test-BhfMKsix.js +0 -102
- package/bundled-test-harness/assets/diffing-test-CHRh55mC.js +0 -210
- package/bundled-test-harness/assets/download-file-to-realm-test-CC1HURCi.js +0 -119
- package/bundled-test-harness/assets/editor-test-DkeCv28f.js +0 -688
- package/bundled-test-harness/assets/edits-BSJqtUXM.js +0 -651
- package/bundled-test-harness/assets/email-field-test-DihK0suO.js +0 -75
- package/bundled-test-harness/assets/enum-field-test-Gja3bzt5.js +0 -935
- package/bundled-test-harness/assets/error-display-test-GhYZu7cp.js +0 -343
- package/bundled-test-harness/assets/evaluate-module-test-D_t4CiUq.js +0 -91
- package/bundled-test-harness/assets/execute-atomic-operations-test-xtou8Zeg.js +0 -113
- package/bundled-test-harness/assets/externals-B02-sD_L.js +0 -4393
- package/bundled-test-harness/assets/fallback-banner-live-delete-test-DtxzNXdE.js +0 -207
- package/bundled-test-harness/assets/fallback-banner-test-BfmiQ_68.js +0 -53
- package/bundled-test-harness/assets/fallback-banner-test-DLtTdmvn.js +0 -225
- package/bundled-test-harness/assets/fallback-models-test-BxNJxhfd.js +0 -161
- package/bundled-test-harness/assets/fetch-card-json-test-DofKbzvC.js +0 -61
- package/bundled-test-harness/assets/field-configuration-test-SUoPaXWy.js +0 -551
- package/bundled-test-harness/assets/field-markdown-domain-test-BwtR0dPP.js +0 -616
- package/bundled-test-harness/assets/field-markdown-oversize-test-D8UJcBc3.js +0 -88
- package/bundled-test-harness/assets/field-markdown-primitives-test-D5_ZdoDO.js +0 -365
- package/bundled-test-harness/assets/field-markdown-specialized-test-Dpd5hs04.js +0 -534
- package/bundled-test-harness/assets/field-playground-test-CzhYzKGv.js +0 -894
- package/bundled-test-harness/assets/field-support-predicates-test-BSvVOFth.js +0 -167
- package/bundled-test-harness/assets/file-attachment-test-fM-yFedm.js +0 -796
- package/bundled-test-harness/assets/file-chooser-panel-test-CKj8YTdY.js +0 -153
- package/bundled-test-harness/assets/file-chooser-test-Bs8jFXqa.js +0 -504
- package/bundled-test-harness/assets/file-def-format-templates-test-CxrRoWoD.js +0 -380
- package/bundled-test-harness/assets/file-def-live-reload-test-X_8YEkve.js +0 -124
- package/bundled-test-harness/assets/file-def-menu-items-test-Dx879o_o.js +0 -138
- package/bundled-test-harness/assets/file-def-navigation-test-MMI_EEO1.js +0 -109
- package/bundled-test-harness/assets/file-def-serialization-test-B5lguBQD.js +0 -89
- package/bundled-test-harness/assets/file-def-test-Di9QWcrj.js +0 -216
- package/bundled-test-harness/assets/file-preview-live-reload-test-aqx93A7c.js +0 -310
- package/bundled-test-harness/assets/file-resource-primitives-test-a5abpcSB.js +0 -255
- package/bundled-test-harness/assets/file-tree-from-index-test-CnruGxJ8.js +0 -96
- package/bundled-test-harness/assets/file-tree-test-BCyWDdSE.js +0 -851
- package/bundled-test-harness/assets/file-view-model-test-BfpLa01Y.js +0 -346
- package/bundled-test-harness/assets/filedef-export-shape-test-CQ9XbrzS.js +0 -61
- package/bundled-test-harness/assets/film-CL1zj_bJ.js +0 -2
- package/bundled-test-harness/assets/film-Dq_quZ31.js +0 -13
- package/bundled-test-harness/assets/film-xbkQa060.js +0 -4074
- package/bundled-test-harness/assets/flac-audio-def-test-BmVp9dMx.js +0 -143
- package/bundled-test-harness/assets/focus-Dm4wkM72.js +0 -306
- package/bundled-test-harness/assets/font-metadata-extractor-test-OWEh9_MS.js +0 -415
- package/bundled-test-harness/assets/formatted-aibot-message-test-BpHsWpuV.js +0 -109
- package/bundled-test-harness/assets/formatted-user-message-test-DZW5TAr0.js +0 -43
- package/bundled-test-harness/assets/freestyle-test-D_uaPU_3.js +0 -17
- package/bundled-test-harness/assets/full-reindex-realm-test-C6vHL5kC.js +0 -101
- package/bundled-test-harness/assets/garbage-collection-test-D-Ao4t2n.js +0 -403
- package/bundled-test-harness/assets/general-test-PSGI8W0z.js +0 -923
- package/bundled-test-harness/assets/generate-example-cards-one-shot-test-J-m-0E6W.js +0 -65
- package/bundled-test-harness/assets/generic-file-def-preview-test-BAsOhTYU.js +0 -71
- package/bundled-test-harness/assets/get-available-realm-identifiers-test-D5PBOr97.js +0 -47
- package/bundled-test-harness/assets/get-catalog-realm-identifiers-test-NM9UURHE.js +0 -47
- package/bundled-test-harness/assets/get-default-writable-realm-test-BxXc9a3J.js +0 -54
- package/bundled-test-harness/assets/get-published-realms-test-C8TJEc4-.js +0 -71
- package/bundled-test-harness/assets/get-realm-of-resource-identifier-test-Dt8CB6lS.js +0 -54
- package/bundled-test-harness/assets/get-relationship-membership-state-test-9_8x3myJ.js +0 -1308
- package/bundled-test-harness/assets/get-user-system-card-test-k0UO-uba.js +0 -67
- package/bundled-test-harness/assets/gif-image-def-test-BWrqPGDX.js +0 -188
- package/bundled-test-harness/assets/glimmer-motion-and-choreo-in-cards-test-BgG8QI9E.js +0 -160
- package/bundled-test-harness/assets/glimmer-motion-and-choreo-test-BKOvNyCN.js +0 -74
- package/bundled-test-harness/assets/gts-file-def-test-BCRHwDeZ.js +0 -100
- package/bundled-test-harness/assets/head-format-preview-test-DnfUhniI.js +0 -158
- package/bundled-test-harness/assets/helpers-DklkegO_.js +0 -5
- package/bundled-test-harness/assets/host-mode-service-vOfN0smp.js +0 -232
- package/bundled-test-harness/assets/host-mode-test-CCCJFz6_.js +0 -831
- package/bundled-test-harness/assets/host-submode-test-CtCfbuPA.js +0 -1342
- package/bundled-test-harness/assets/html-component-test-CWyhb5ZX.js +0 -65
- package/bundled-test-harness/assets/html-def-test-Cb8C2lUx.js +0 -160
- package/bundled-test-harness/assets/html-meta-extractor-test-BHT9Rtir.js +0 -60
- package/bundled-test-harness/assets/hydratable-card-test-DpgpdesD.js +0 -426
- package/bundled-test-harness/assets/icon-button-ABCGVF3C.js +0 -67
- package/bundled-test-harness/assets/image-metadata-extractor-test-ClhPTouq.js +0 -1109
- package/bundled-test-harness/assets/index-changes-test-CgnVr3LH.js +0 -367
- package/bundled-test-harness/assets/index-query-engine-test-CQTwju5_.js +0 -2593
- package/bundled-test-harness/assets/index-writer-test-IoVOoZT2.js +0 -3040
- package/bundled-test-harness/assets/inspector-test-BN2Ieb77.js +0 -2058
- package/bundled-test-harness/assets/instance-filter-matcher-test-Bq-_Sy89.js +0 -788
- package/bundled-test-harness/assets/instantiate-card-test-DEeDTzFV.js +0 -164
- package/bundled-test-harness/assets/interact-submode-creation-and-permissions-test-DP6kOyJS.js +0 -475
- package/bundled-test-harness/assets/interact-submode-setup-B0_cHqH-.js +0 -566
- package/bundled-test-harness/assets/invalidate-realm-identifiers-test-9uUD91Pw.js +0 -99
- package/bundled-test-harness/assets/invite-user-to-room-test-CcDA45Ac.js +0 -142
- package/bundled-test-harness/assets/invoke-card-operation-test-DmUtgueM.js +0 -333
- package/bundled-test-harness/assets/isolated-render-test-B2eXNHu6.js +0 -51
- package/bundled-test-harness/assets/job-scoped-doc-cache-test-DF9D7cOc.js +0 -181
- package/bundled-test-harness/assets/job-scoped-instance-residency-test-CSS8xUU5.js +0 -103
- package/bundled-test-harness/assets/jpg-image-def-test-voECMTht.js +0 -697
- package/bundled-test-harness/assets/json-file-def-test-8Y4KLjUC.js +0 -95
- package/bundled-test-harness/assets/key-notices-badge-test-d1mYqx0e.js +0 -155
- package/bundled-test-harness/assets/key-readiness-test-BtCg7PCk.js +0 -190
- package/bundled-test-harness/assets/linksto-broken-link-placeholder-test-CyCMbJnN.js +0 -398
- package/bundled-test-harness/assets/linksto-error-sentinel-test-BDW572-v.js +0 -238
- package/bundled-test-harness/assets/linksto-many-broken-link-placeholder-test-B4wM97hD.js +0 -354
- package/bundled-test-harness/assets/linksto-many-per-slot-access-test-BhJmtJ0_.js +0 -303
- package/bundled-test-harness/assets/linksto-sentinel-reload-test-BpBQ5V_i.js +0 -197
- package/bundled-test-harness/assets/linksto-sentinel-roundtrip-test-pkBBl4e9.js +0 -260
- package/bundled-test-harness/assets/linksto-singular-js-access-contract-test-Bb6wjUdD.js +0 -196
- package/bundled-test-harness/assets/lint-and-fix-test-CcMLn-co.js +0 -51
- package/bundled-test-harness/assets/live-test-AyBnq7BX.js +0 -2
- package/bundled-test-harness/assets/live-test-CgnAcIDw.js +0 -100
- package/bundled-test-harness/assets/load-default-skills-test-BIOwtx0Y.js +0 -74
- package/bundled-test-harness/assets/loader-parallel-prefetch-test-D5_oRSER.js +0 -257
- package/bundled-test-harness/assets/loader-test-DSc_jR1c.js +0 -482
- package/bundled-test-harness/assets/loading-test-8pldx7S-.js +0 -63
- package/bundled-test-harness/assets/m4a-audio-def-test-BDI5apzM.js +0 -190
- package/bundled-test-harness/assets/main-5kHyCkdm.js +0 -5
- package/bundled-test-harness/assets/markdown-embed-chooser-modal-test-Wud0s7WZ.js +0 -470
- package/bundled-test-harness/assets/markdown-embed-chooser-test-DVzzS-0C.js +0 -334
- package/bundled-test-harness/assets/markdown-embed-preview-pane-test-B5W_iqsi.js +0 -447
- package/bundled-test-harness/assets/markdown-embed-preview-test-CZF_s0fB.js +0 -368
- package/bundled-test-harness/assets/markdown-fallback-test-fT6BS4W7.js +0 -316
- package/bundled-test-harness/assets/markdown-file-def-test-B1aTzazR.js +0 -380
- package/bundled-test-harness/assets/markdown-helpers-test-gNKZf7Mw.js +0 -188
- package/bundled-test-harness/assets/markdown-highlighting-test-Du5_CQmD.js +0 -244
- package/bundled-test-harness/assets/markdown-preview-h-_aJhRc.js +0 -72
- package/bundled-test-harness/assets/markdown-preview-test-DJvoVsXw.js +0 -238
- package/bundled-test-harness/assets/markdown-skill-frontmatter-test-VwJi3Paj.js +0 -146
- package/bundled-test-harness/assets/markdown-skill-search-test-ysCdf0xM.js +0 -80
- package/bundled-test-harness/assets/matrix-service-account-switch-sessions-test-K2JuMy36.js +0 -63
- package/bundled-test-harness/assets/matrix-service-boot-assembly-test-CkdL_-os.js +0 -300
- package/bundled-test-harness/assets/matrix-service-personal-realm-test-Dy1DultK.js +0 -125
- package/bundled-test-harness/assets/matrix-service-realm-servers-test-DHDDKuEg.js +0 -55
- package/bundled-test-harness/assets/matrix-service-realms-list-updated-test-DcTbZpMl.js +0 -132
- package/bundled-test-harness/assets/matrix-service-relogin-test-D3NQktoa.js +0 -59
- package/bundled-test-harness/assets/matrix-service-sliding-sync-test-6CAflWOA.js +0 -35
- package/bundled-test-harness/assets/menu-kUSaJIPq.js +0 -3562
- package/bundled-test-harness/assets/message-service-subscription-test-DaQdgDWi.js +0 -110
- package/bundled-test-harness/assets/message-service-test-BsGEgM_m.js +0 -144
- package/bundled-test-harness/assets/message-tool-test-BB_4kw1V.js +0 -33
- package/bundled-test-harness/assets/midi-audio-def-test-BbbkFjqf.js +0 -182
- package/bundled-test-harness/assets/migrate-skill-test-X9xImDuq.js +0 -161
- package/bundled-test-harness/assets/mini-AwF31elJ.js +0 -1404
- package/bundled-test-harness/assets/mini-card-chooser-test-BZtrEiWu.js +0 -272
- package/bundled-test-harness/assets/mini-file-chooser-test-MIHW3kCI.js +0 -201
- package/bundled-test-harness/assets/mock-matrix-Dd8k0DNa.js +0 -15107
- package/bundled-test-harness/assets/mock-matrix-DhPN_34j.js +0 -2
- package/bundled-test-harness/assets/modal-LTh3_oHK.js +0 -322
- package/bundled-test-harness/assets/model-cost-tier-test-h1IkU9mp.js +0 -174
- package/bundled-test-harness/assets/model-file-extract-test-ntSo0wZF.js +0 -206
- package/bundled-test-harness/assets/module-transpile-cache-test-CDeRaaeP.js +0 -67
- package/bundled-test-harness/assets/monaco-test-C0Fa744D.js +0 -100
- package/bundled-test-harness/assets/mp3-audio-def-test-B4j4qR9H.js +0 -133
- package/bundled-test-harness/assets/multiple-stacks-test-BhA25ywL.js +0 -208
- package/bundled-test-harness/assets/nested-query-field-render-test-S9Y8YNKB.js +0 -249
- package/bundled-test-harness/assets/no-stacks-test-B7VciWyg.js +0 -48
- package/bundled-test-harness/assets/number-field-test-CS74lDPN.js +0 -184
- package/bundled-test-harness/assets/office-file-def-test-2cKc1pmd.js +0 -263
- package/bundled-test-harness/assets/office-metadata-extractor-test-DC8Fo-OW.js +0 -218
- package/bundled-test-harness/assets/office-poster-capture-test-Ba0_5UrT.js +0 -203
- package/bundled-test-harness/assets/ogg-audio-def-test-CIPQ1d4w.js +0 -196
- package/bundled-test-harness/assets/open-create-listing-modal-test-bmQkY5Zl.js +0 -131
- package/bundled-test-harness/assets/open-image-in-new-tab-test-DBD7_vMH.js +0 -52
- package/bundled-test-harness/assets/open-secure-window-test-BgeuYAqz.js +0 -253
- package/bundled-test-harness/assets/open-workspace-test-DRHGljV0.js +0 -46
- package/bundled-test-harness/assets/operation-lowering-test-CH1c0pSH.js +0 -2957
- package/bundled-test-harness/assets/operations-invocation-test-B1YkCLrv.js +0 -523
- package/bundled-test-harness/assets/operations-optimistic-test-DAbtOwsC.js +0 -203
- package/bundled-test-harness/assets/operations-query-test-9p1ZIDe-.js +0 -459
- package/bundled-test-harness/assets/operations-store-reconciliation-test-D0EQh3w2.js +0 -406
- package/bundled-test-harness/assets/operations-test-BQhlrfe3.js +0 -2518
- package/bundled-test-harness/assets/operator-mode-acceptance-test-DtHnonEb.js +0 -1195
- package/bundled-test-harness/assets/operator-mode-card-chooser-test-DQUxZxaq.js +0 -1036
- package/bundled-test-harness/assets/operator-mode-links-test-BJ26HllS.js +0 -797
- package/bundled-test-harness/assets/operator-mode-test-DIPDI0qt.js +0 -696
- package/bundled-test-harness/assets/operator-mode-ui-test-CfA-fAh4.js +0 -1045
- package/bundled-test-harness/assets/overlay-DecPh3nt.js +0 -123
- package/bundled-test-harness/assets/overlay-menu-items-test-C6XqjLtu.js +0 -331
- package/bundled-test-harness/assets/overlays-Ctp8ePzZ.js +0 -75
- package/bundled-test-harness/assets/overlays-CzWpSg5T.js +0 -2
- package/bundled-test-harness/assets/overlays-detached-element-test-DvL_8Bb5.js +0 -56
- package/bundled-test-harness/assets/panel-CImumikB.js +0 -15124
- package/bundled-test-harness/assets/past-sessions-test-N6riGN_I.js +0 -321
- package/bundled-test-harness/assets/patch-fields-test-D30_-KwQ.js +0 -1014
- package/bundled-test-harness/assets/patch-instance-test-C5rGscZq.js +0 -348
- package/bundled-test-harness/assets/pdf-file-def-test-DtiqGRvZ.js +0 -111
- package/bundled-test-harness/assets/pdf-metadata-extractor-test-FU02KmdV.js +0 -130
- package/bundled-test-harness/assets/permission-checking-realm-test-DqdNJDwU.js +0 -306
- package/bundled-test-harness/assets/persist-module-inspector-view-test-BHOAgPVy.js +0 -60
- package/bundled-test-harness/assets/persist-scroll-position-test-qtmS518r.js +0 -254
- package/bundled-test-harness/assets/phone-number-field-test-DhdaM7uL.js +0 -73
- package/bundled-test-harness/assets/pill-menu-test-C9Mrrepl.js +0 -60
- package/bundled-test-harness/assets/plate-9n-sXyCw.js +0 -41
- package/bundled-test-harness/assets/plate-BnZcAk-_.js +0 -2
- package/bundled-test-harness/assets/player-Cu5b4LEJ.js +0 -82
- package/bundled-test-harness/assets/player-unk2mkxV.js +0 -2
- package/bundled-test-harness/assets/playground-BwA8wFGK.js +0 -58
- package/bundled-test-harness/assets/plural-field-components-test-CFNQKETg.js +0 -198
- package/bundled-test-harness/assets/png-image-def-test-DG5Vhlqb.js +0 -266
- package/bundled-test-harness/assets/policy-audit-confirmation-test-yfKU47LR.js +0 -155
- package/bundled-test-harness/assets/policy-scoped-search-test-BjQRDYqR.js +0 -339
- package/bundled-test-harness/assets/prerender-file-extract-test-CEU4SaAZ.js +0 -346
- package/bundled-test-harness/assets/prerender-html-test-CGB3ClCS.js +0 -670
- package/bundled-test-harness/assets/prerender-meta-test-xqc4fW_0.js +0 -614
- package/bundled-test-harness/assets/prerender-module-test-CI1TmZw-.js +0 -409
- package/bundled-test-harness/assets/prerender-persistence-block-test-Da0dJO_N.js +0 -124
- package/bundled-test-harness/assets/prerender-pre-model-error-test-BVLyhk8R.js +0 -61
- package/bundled-test-harness/assets/prerender-serialize-cycle-test-glJFfxHU.js +0 -134
- package/bundled-test-harness/assets/prerendered-html-read-test-Mp4L0VHQ.js +0 -191
- package/bundled-test-harness/assets/pretui-components-test-BBpA9UnA.js +0 -991
- package/bundled-test-harness/assets/pretui-components-test-BqFq7rw_.css +0 -730
- package/bundled-test-harness/assets/preview-format-test-C55Bwcur.js +0 -103
- package/bundled-test-harness/assets/preview-test-CTAhRGU8.js +0 -474
- package/bundled-test-harness/assets/process-card-test-UjqpuxB7.js +0 -94
- package/bundled-test-harness/assets/profile-settings-modal-C8bCgTMK.js +0 -989
- package/bundled-test-harness/assets/publish-realm-ixUB4FPK.js +0 -82
- package/bundled-test-harness/assets/publish-realm-test-CrrsdL4W.js +0 -210
- package/bundled-test-harness/assets/query-field-barrier-test-DjivFE93.js +0 -113
- package/bundled-test-harness/assets/query-field-error-sentinel-test-0HwnV4Mw.js +0 -201
- package/bundled-test-harness/assets/query-field-membership-status-test-C8yTTBkc.js +0 -323
- package/bundled-test-harness/assets/query-field-page-optin-test-D4l_GcII.js +0 -126
- package/bundled-test-harness/assets/query-field-schema-test-DDbcNNm5.js +0 -231
- package/bundled-test-harness/assets/query-field-search-throttle-test-CXp50Ax0.js +0 -154
- package/bundled-test-harness/assets/query-field-stale-prerender-test-DErzt-Cv.js +0 -152
- package/bundled-test-harness/assets/query-fields-test-Dz67fdSl.js +0 -535
- package/bundled-test-harness/assets/quick-look-test-B1ijDsh_.js +0 -139
- package/bundled-test-harness/assets/read-card-for-ai-assistant-test-DJxZ16H_.js +0 -91
- package/bundled-test-harness/assets/read-file-for-ai-assistant-test-BoRQkZ8c.js +0 -45
- package/bundled-test-harness/assets/read-source-test-Bl-NjchO.js +0 -67
- package/bundled-test-harness/assets/read-text-file-test-CP37CZoo.js +0 -124
- package/bundled-test-harness/assets/realm-CaK5mkT-.js +0 -2852
- package/bundled-test-harness/assets/realm-api-keys-BNUFWbGR.js +0 -579
- package/bundled-test-harness/assets/realm-api-keys-CkshxhXC.js +0 -2
- package/bundled-test-harness/assets/realm-api-keys-test-BP8xifjn.js +0 -109
- package/bundled-test-harness/assets/realm-api-keys-test-CwdK9YXp.js +0 -588
- package/bundled-test-harness/assets/realm-config-iKwE3Htp.js +0 -833
- package/bundled-test-harness/assets/realm-config-policy-standing-test-BgVEIDnB.js +0 -290
- package/bundled-test-harness/assets/realm-config-routing-rule-edit-test-BoJoKzmX.js +0 -274
- package/bundled-test-harness/assets/realm-config-settings-test-Kxw-GHye.js +0 -187
- package/bundled-test-harness/assets/realm-field-test-CdGOxrFb.js +0 -100
- package/bundled-test-harness/assets/realm-indexing-test-CHtsBV2b.js +0 -4380
- package/bundled-test-harness/assets/realm-policy-fitted-test--DhNZSdC.js +0 -206
- package/bundled-test-harness/assets/realm-policy-test-D7714iVa.js +0 -1141
- package/bundled-test-harness/assets/realm-querying-test-Cj1ekZ0H.js +0 -1067
- package/bundled-test-harness/assets/realm-server-form-agnostic-test-CZFPNJfD.js +0 -96
- package/bundled-test-harness/assets/realm-server-subscriber-test-C86WmBp0.js +0 -46
- package/bundled-test-harness/assets/realm-service-info-test-CdgcwKDR.js +0 -67
- package/bundled-test-harness/assets/realm-test-DPoLsvKz.js +0 -2364
- package/bundled-test-harness/assets/realm-token-refresh-test-Ch35Siwi.js +0 -153
- package/bundled-test-harness/assets/realm-url-tooltip-test-x8xWOENK.js +0 -78
- package/bundled-test-harness/assets/reasoning-test-BxpE8Jvf.js +0 -221
- package/bundled-test-harness/assets/recent-files-test-DTmEzPLq.js +0 -450
- package/bundled-test-harness/assets/reindex-realm-test-BQ8KULn4.js +0 -117
- package/bundled-test-harness/assets/relationship-loading-state-test-BJoArPWf.js +0 -290
- package/bundled-test-harness/assets/remix-card-test-DsTA1KoG.js +0 -58
- package/bundled-test-harness/assets/rendered-markdown-DvukulDO.js +0 -292
- package/bundled-test-harness/assets/rendered-markdown-test-DxGptXSV.js +0 -587
- package/bundled-test-harness/assets/resident-instance-reuse-test-ZWnVu8uj.js +0 -82
- package/bundled-test-harness/assets/result-tile-CPyI6Vmv.js +0 -144
- package/bundled-test-harness/assets/rich-markdown-field-test-CdygoXIO.js +0 -1647
- package/bundled-test-harness/assets/room-message-test-D3NfMqH0.js +0 -484
- package/bundled-test-harness/assets/run-D_Px28eF.js +0 -3956
- package/bundled-test-harness/assets/run-realm-code-qWCZxmJ7.js +0 -2964
- package/bundled-test-harness/assets/run-realm-code-test-UzyeEJq6.js +0 -3844
- package/bundled-test-harness/assets/sanitize-module-list-test-Babq44bP.js +0 -85
- package/bundled-test-harness/assets/save-card-skip-index-wait-test-BcELXlQ_.js +0 -89
- package/bundled-test-harness/assets/schema-editor-test-CEvruZbt.js +0 -785
- package/bundled-test-harness/assets/schema-generation-test-hYAMdCrn.js +0 -28
- package/bundled-test-harness/assets/scrolling-test-DVIsh-_1.js +0 -412
- package/bundled-test-harness/assets/search-adorn-test-CkVhqFd0.js +0 -136
- package/bundled-test-harness/assets/search-and-choose-test-DUhOB3FV.js +0 -154
- package/bundled-test-harness/assets/search-correlation-id-test-Drn4r26N.js +0 -139
- package/bundled-test-harness/assets/search-entries-result-test-DTCRJ_wc.js +0 -234
- package/bundled-test-harness/assets/search-entries-test-CE0B47pw.js +0 -1486
- package/bundled-test-harness/assets/search-entries-tool-test-C4aG0ckM.js +0 -504
- package/bundled-test-harness/assets/search-google-images-test-LyhcB2f3.js +0 -166
- package/bundled-test-harness/assets/search-results-D4pSne0x.js +0 -266
- package/bundled-test-harness/assets/search-results-test-CRZHhqhn.js +0 -578
- package/bundled-test-harness/assets/search-selection-menu-test-B7Y3E_nj.js +0 -108
- package/bundled-test-harness/assets/search-sheet-files-test-C2y534g8.js +0 -126
- package/bundled-test-harness/assets/search-sheet-persistence-test-DePC59Bk.js +0 -131
- package/bundled-test-harness/assets/search-test-Dy8NxFkU.js +0 -2249
- package/bundled-test-harness/assets/search-tool-test-lctDaMH3.js +0 -156
- package/bundled-test-harness/assets/searchable-option-test-CE64M8oM.js +0 -322
- package/bundled-test-harness/assets/searchable-search-doc-test-C6u3mVvT.js +0 -1271
- package/bundled-test-harness/assets/section-rail-B_UQX00B.js +0 -113
- package/bundled-test-harness/assets/section-rail-test-DIda7MIw.js +0 -256
- package/bundled-test-harness/assets/secure-sign-in-CqqqfQG8.js +0 -174
- package/bundled-test-harness/assets/secure-sign-in-test-DimbVr_W.js +0 -373
- package/bundled-test-harness/assets/segmented-control-iePxSdTS.js +0 -173
- package/bundled-test-harness/assets/select-tNs6_xwW.js +0 -175
- package/bundled-test-harness/assets/send-ai-assistant-message-test-2GVrMF9Z.js +0 -52
- package/bundled-test-harness/assets/send-bot-trigger-event-test-B_3dKfGN.js +0 -56
- package/bundled-test-harness/assets/send-request-via-proxy-test-_clNWyYc.js +0 -380
- package/bundled-test-harness/assets/sending-test-DCPFXUVg.js +0 -659
- package/bundled-test-harness/assets/serialization-rri-form-audit-test-BI0zCs8Y.js +0 -136
- package/bundled-test-harness/assets/serialization-test-bjdtVlZL.js +0 -8758
- package/bundled-test-harness/assets/set-user-system-card-test-BUv1vL08.js +0 -59
- package/bundled-test-harness/assets/setup-BW1mmC7C.js +0 -772
- package/bundled-test-harness/assets/setup-DsIcFT-T.js +0 -2
- package/bundled-test-harness/assets/shared-link-target-reuse-test-9NeJEjkb.js +0 -207
- package/bundled-test-harness/assets/show-card-test-mfyLwusD.js +0 -365
- package/bundled-test-harness/assets/signed-capture-link-test-BOtKNCAM.js +0 -132
- package/bundled-test-harness/assets/single-stack-test-B4MGjaLk.js +0 -652
- package/bundled-test-harness/assets/skills-test-BuP-Yzk1.js +0 -648
- package/bundled-test-harness/assets/skip-boot-index-guard-test-Cmrx2-K7.js +0 -46
- package/bundled-test-harness/assets/spec-test-BhZDdhVQ.js +0 -1077
- package/bundled-test-harness/assets/spinner-CpIBUG9m.js +0 -49
- package/bundled-test-harness/assets/src-DGHttmW-.js +0 -216
- package/bundled-test-harness/assets/src-DaNDSbp7.js +0 -5
- package/bundled-test-harness/assets/stick-to-bottom-resize-test-Dpy3OVum.js +0 -56
- package/bundled-test-harness/assets/store-add-test-_IYS8o74.js +0 -50
- package/bundled-test-harness/assets/store-module-rebuild-test-B5VMaICy.js +0 -454
- package/bundled-test-harness/assets/store-search-test-C2VZabrH.js +0 -175
- package/bundled-test-harness/assets/store-test-D6PObxoD.js +0 -3672
- package/bundled-test-harness/assets/structured-theme-test-BHjVeMf-.js +0 -377
- package/bundled-test-harness/assets/summarize-session-test-BFtTuhe0.js +0 -172
- package/bundled-test-harness/assets/svg-image-def-test-BL6lkWUX.js +0 -167
- package/bundled-test-harness/assets/switch-submode-test-6Uv3bZMl.js +0 -168
- package/bundled-test-harness/assets/sync-openrouter-models-test-Dp9E05tL.js +0 -97
- package/bundled-test-harness/assets/test-support-DYm8XZ0E.js +0 -3
- package/bundled-test-harness/assets/test-support-DfnhiIMV.js +0 -99
- package/bundled-test-harness/assets/tests-CZk0Iag2.js +0 -3596
- package/bundled-test-harness/assets/text-file-def-test-CHdC0yIU.js +0 -94
- package/bundled-test-harness/assets/text-input-validator-test-B9ZR8XPU.js +0 -156
- package/bundled-test-harness/assets/text-suggestion-test-CGLspKFQ.js +0 -340
- package/bundled-test-harness/assets/theme-card-test-CXZvSEvG.js +0 -621
- package/bundled-test-harness/assets/theme-dashboard-nav-test-CkEE0ILk.js +0 -196
- package/bundled-test-harness/assets/theme-scheme-island-test-URXTjipF.js +0 -264
- package/bundled-test-harness/assets/titles-C6enAdIv.js +0 -2
- package/bundled-test-harness/assets/titles-Dft1HoUT.js +0 -52
- package/bundled-test-harness/assets/to-device-streaming-test-D33ZOc9o.js +0 -163
- package/bundled-test-harness/assets/token-usage-test-BHQlU4J4.js +0 -160
- package/bundled-test-harness/assets/tools-CrudqfS3.js +0 -774
- package/bundled-test-harness/assets/tools-calling-test-jo7IREau.js +0 -200
- package/bundled-test-harness/assets/tools-test-D1wMfUa0.js +0 -1624
- package/bundled-test-harness/assets/tools-test-Dn1LYsXp.js +0 -3204
- package/bundled-test-harness/assets/tooltip-8Wyz4IIn.css +0 -68
- package/bundled-test-harness/assets/tooltip-CqwLzRz5.js +0 -134
- package/bundled-test-harness/assets/transform-cards-test-BPhwPFtp.js +0 -341
- package/bundled-test-harness/assets/ts-file-def-preview-test-Bq3zTgw8.js +0 -95
- package/bundled-test-harness/assets/ts-file-def-test-GLswMl7O.js +0 -92
- package/bundled-test-harness/assets/ttf-font-def-test-DQulvUWs.js +0 -206
- package/bundled-test-harness/assets/turn-settling-test-BspmOUQP.js +0 -160
- package/bundled-test-harness/assets/turn-summary-9A8nvC0-.js +0 -1039
- package/bundled-test-harness/assets/unpublish-realm-test-SkYPEhDz.js +0 -102
- package/bundled-test-harness/assets/update-room-skills-test-cTxb-WU6.js +0 -240
- package/bundled-test-harness/assets/use-ai-assistant-test-uaqW1T_A.js +0 -384
- package/bundled-test-harness/assets/user-message-BudkIP-3.js +0 -262
- package/bundled-test-harness/assets/validate-realm-test-DxrGgH9n.js +0 -67
- package/bundled-test-harness/assets/video-metadata-extractor-test-B2pe-Iqa.js +0 -520
- package/bundled-test-harness/assets/view-visually-test-PNon6fUo.js +0 -335
- package/bundled-test-harness/assets/virtual-network-reset-test-uYJLaQHf.js +0 -96
- package/bundled-test-harness/assets/wav-audio-def-test-F4OrFFR4.js +0 -160
- package/bundled-test-harness/assets/webp-image-def-test-B0a_-Vya.js +0 -226
- package/bundled-test-harness/assets/workspace-Cyftysy9.js +0 -440
- package/bundled-test-harness/assets/workspace-a11y-test-sKiPDcbl.js +0 -197
- package/bundled-test-harness/assets/workspace-actions-BuawjFmZ.js +0 -561
- package/bundled-test-harness/assets/workspace-behavior-test-CKa-pb3T.js +0 -338
- package/bundled-test-harness/assets/workspace-delete-multiple-test-Dt2weG5R.js +0 -212
- package/bundled-test-harness/assets/workspace-delete-summary-test-CkqgFqZ8.js +0 -63
- package/bundled-test-harness/assets/workspace-hosting-test-Ci7EEtHP.js +0 -138
- package/bundled-test-harness/assets/workspace-indexing-test-BPVxxY6W.js +0 -71
- package/bundled-test-harness/assets/workspace-test-CWr7vFbg.js +0 -385
- package/bundled-test-harness/assets/workspace-test-INNpQovc.js +0 -51
- package/bundled-test-harness/assets/workspace-timestamp-labels-test-CigQb5wr.js +0 -68
- package/bundled-test-harness/assets/workspace-unit-test-BwVKpuXT.js +0 -122
- package/bundled-test-harness/assets/write-binary-file-test-BKP3gv1k.js +0 -124
- package/bundled-test-harness/assets/write-text-file-test-B6ijTKTa.js +0 -191
- package/bundled-test-harness/assets/zip-archive-test-C-PBzkTn.js +0 -285
- package/bundled-test-harness/assets/zip-file-def-test-FyCzJT-9.js +0 -164
|
@@ -0,0 +1,2518 @@
|
|
|
1
|
+
import { s as __toESM } from "./chunk-Rp0pCe6z.js";
|
|
2
|
+
import { r as initializeDeferredDecorator, t as decorateFieldV2 } from "./runtime--fcdnjmJ-BoCBNIsz.js";
|
|
3
|
+
import { na as DEFINITION_FREE_BASE_OPERATIONS } from "./runtime-common-BTaLJEw-.js";
|
|
4
|
+
import "./card-operations-CzugytHO.js";
|
|
5
|
+
import { t as require_qunit } from "./qunit-C-Foo4Nd.js";
|
|
6
|
+
import { F as setupLocalIndexing, M as setupCardLogs, lt as setupRenderingTest, t as setupMockMatrix } from "./mock-matrix-FjsXmU7-.js";
|
|
7
|
+
import { r as getService } from "./dist-CPfIHBla.js";
|
|
8
|
+
import { a as CardDef, d as FileDef, l as FieldDef, n as BaseDef } from "./card-api-Cc8uZunB.js";
|
|
9
|
+
import "./file-api-BsT3Q6C9.js";
|
|
10
|
+
import { t as string_default } from "./string-5IAMEUit.js";
|
|
11
|
+
import { t as DateField } from "./date-DTBQL-Hc.js";
|
|
12
|
+
//#region tests/integration/operations-test.ts
|
|
13
|
+
var import_qunit = /* @__PURE__ */ __toESM(require_qunit());
|
|
14
|
+
var loader;
|
|
15
|
+
var operation;
|
|
16
|
+
var getOperations;
|
|
17
|
+
var getDeclaredOperations;
|
|
18
|
+
var params;
|
|
19
|
+
var actor;
|
|
20
|
+
var instance;
|
|
21
|
+
var realmConfig;
|
|
22
|
+
var card;
|
|
23
|
+
var bxl;
|
|
24
|
+
var linkTo;
|
|
25
|
+
function implied(base) {
|
|
26
|
+
return { base };
|
|
27
|
+
}
|
|
28
|
+
(0, import_qunit.module)("Integration | operations", function(hooks) {
|
|
29
|
+
setupRenderingTest(hooks);
|
|
30
|
+
setupCardLogs(hooks, async () => await loader.import("@cardstack/base/card-api"));
|
|
31
|
+
setupLocalIndexing(hooks);
|
|
32
|
+
setupMockMatrix(hooks);
|
|
33
|
+
hooks.beforeEach(async function() {
|
|
34
|
+
loader = getService("loader-service").loader;
|
|
35
|
+
({operation, getOperations, getDeclaredOperations, params, actor, instance, realmConfig, card, bxl, linkTo} = await loader.import("@cardstack/base/operations"));
|
|
36
|
+
});
|
|
37
|
+
(0, import_qunit.test)("getOperations merges declarations up the prototype chain, subclass winning per name", function(assert) {
|
|
38
|
+
class Report extends CardDef {
|
|
39
|
+
static {
|
|
40
|
+
decorateFieldV2(this, "addComment", [operation], function() {
|
|
41
|
+
return {
|
|
42
|
+
base: "transform",
|
|
43
|
+
params: { body: string_default },
|
|
44
|
+
append: {
|
|
45
|
+
to: "comments",
|
|
46
|
+
value: {
|
|
47
|
+
body: params("body"),
|
|
48
|
+
postedBy: actor()
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
#addComment = (initializeDeferredDecorator(this, "addComment"), void 0);
|
|
55
|
+
static {
|
|
56
|
+
decorateFieldV2(this, "escalate", [operation], function() {
|
|
57
|
+
return {
|
|
58
|
+
base: "transform",
|
|
59
|
+
transformations: bxl`.status = "escalated";`
|
|
60
|
+
};
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
#escalate = (initializeDeferredDecorator(this, "escalate"), void 0);
|
|
64
|
+
}
|
|
65
|
+
class ExternalReport extends Report {
|
|
66
|
+
static {
|
|
67
|
+
decorateFieldV2(this, "escalate", [operation], function() {
|
|
68
|
+
return {
|
|
69
|
+
base: "transform",
|
|
70
|
+
params: { reason: string_default },
|
|
71
|
+
set: {
|
|
72
|
+
status: "escalated",
|
|
73
|
+
escalationReason: params("reason")
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
#escalate = (initializeDeferredDecorator(this, "escalate"), void 0);
|
|
79
|
+
static {
|
|
80
|
+
decorateFieldV2(this, "listMine", [operation], function() {
|
|
81
|
+
return {
|
|
82
|
+
base: "query",
|
|
83
|
+
query: { filter: {
|
|
84
|
+
on: () => ExternalReport,
|
|
85
|
+
eq: { author: actor() }
|
|
86
|
+
} }
|
|
87
|
+
};
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
#listMine = (initializeDeferredDecorator(this, "listMine"), void 0);
|
|
91
|
+
}
|
|
92
|
+
assert.deepEqual(Object.keys(getDeclaredOperations(Report)).sort(), ["addComment", "escalate"], "a class sees the operations it declares");
|
|
93
|
+
assert.deepEqual(Object.keys(getDeclaredOperations(ExternalReport)).sort(), [
|
|
94
|
+
"addComment",
|
|
95
|
+
"escalate",
|
|
96
|
+
"listMine"
|
|
97
|
+
], "a subclass sees its own operations and the ones it inherits");
|
|
98
|
+
assert.deepEqual(Object.keys(getOperations(ExternalReport)).sort(), [
|
|
99
|
+
"addComment",
|
|
100
|
+
"appendContainsMany",
|
|
101
|
+
"create",
|
|
102
|
+
"delete",
|
|
103
|
+
"escalate",
|
|
104
|
+
"listMine",
|
|
105
|
+
"query",
|
|
106
|
+
"read",
|
|
107
|
+
"readSource",
|
|
108
|
+
"transform",
|
|
109
|
+
"update"
|
|
110
|
+
], "and reads them alongside the base operations its def type carries");
|
|
111
|
+
assert.deepEqual(getDeclaredOperations(Report).escalate, {
|
|
112
|
+
base: "transform",
|
|
113
|
+
transformations: { $bxl: ".status = \"escalated\";" }
|
|
114
|
+
}, "the ancestor keeps its own declaration");
|
|
115
|
+
let overridden = getOperations(ExternalReport).escalate;
|
|
116
|
+
assert.deepEqual(Object.keys(overridden.params ?? {}), ["reason"], "the subclass declaration replaces the inherited one of the same name");
|
|
117
|
+
assert.deepEqual(JSON.parse(JSON.stringify(overridden.set)), {
|
|
118
|
+
status: "escalated",
|
|
119
|
+
escalationReason: {
|
|
120
|
+
$ref: "params",
|
|
121
|
+
key: "reason"
|
|
122
|
+
}
|
|
123
|
+
}, "the overriding declaration is the one that comes back");
|
|
124
|
+
assert.deepEqual(Object.keys(getOperations(new ExternalReport())).sort(), Object.keys(getOperations(ExternalReport)).sort(), "an instance reads the same operations as its class");
|
|
125
|
+
assert.strictEqual(getOperations(new ExternalReport()).escalate, getOperations(ExternalReport).escalate, "and reads the very declarations the class holds");
|
|
126
|
+
});
|
|
127
|
+
(0, import_qunit.test)("the base operations a def type carries come back without being declared", function(assert) {
|
|
128
|
+
assert.deepEqual(getOperations(CardDef), {
|
|
129
|
+
read: implied("read"),
|
|
130
|
+
readSource: implied("readSource"),
|
|
131
|
+
create: implied("create"),
|
|
132
|
+
update: implied("update"),
|
|
133
|
+
delete: implied("delete"),
|
|
134
|
+
query: implied("query"),
|
|
135
|
+
transform: implied("transform"),
|
|
136
|
+
appendContainsMany: implied("appendContainsMany")
|
|
137
|
+
}, "a card def carries every base operation, implied by the def type");
|
|
138
|
+
assert.deepEqual(Object.keys(getDeclaredOperations(CardDef)), [], "none of which is written in author code");
|
|
139
|
+
assert.deepEqual(getOperations(FileDef), {
|
|
140
|
+
read: implied("read"),
|
|
141
|
+
readSource: implied("readSource"),
|
|
142
|
+
update: implied("update"),
|
|
143
|
+
appendLine: implied("appendLine")
|
|
144
|
+
}, "a file's metadata is read-only, so what a file def carries beyond its two reads are the two writes that work on its bytes");
|
|
145
|
+
assert.deepEqual(getOperations(FieldDef), {}, "a field has no URL, so nothing is invocable on one");
|
|
146
|
+
class Report extends CardDef {
|
|
147
|
+
static {
|
|
148
|
+
decorateFieldV2(this, "read", [operation], function() {
|
|
149
|
+
return {
|
|
150
|
+
base: "read",
|
|
151
|
+
output: {
|
|
152
|
+
title: true,
|
|
153
|
+
comments: true
|
|
154
|
+
}
|
|
155
|
+
};
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
#read = (initializeDeferredDecorator(this, "read"), void 0);
|
|
159
|
+
}
|
|
160
|
+
assert.deepEqual(JSON.parse(JSON.stringify(getOperations(Report).read)), {
|
|
161
|
+
base: "read",
|
|
162
|
+
output: {
|
|
163
|
+
title: true,
|
|
164
|
+
comments: true
|
|
165
|
+
}
|
|
166
|
+
}, "the declaration takes the place of the base operation it names");
|
|
167
|
+
assert.deepEqual(Object.keys(getOperations(Report)).sort(), [
|
|
168
|
+
"appendContainsMany",
|
|
169
|
+
"create",
|
|
170
|
+
"delete",
|
|
171
|
+
"query",
|
|
172
|
+
"read",
|
|
173
|
+
"readSource",
|
|
174
|
+
"transform",
|
|
175
|
+
"update"
|
|
176
|
+
], "and adds no name, because it is that base operation");
|
|
177
|
+
class Archivable extends CardDef {
|
|
178
|
+
static {
|
|
179
|
+
decorateFieldV2(this, "delete", [operation], function() {
|
|
180
|
+
return {
|
|
181
|
+
base: "transform",
|
|
182
|
+
set: { archived: true }
|
|
183
|
+
};
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
#delete = (initializeDeferredDecorator(this, "delete"), void 0);
|
|
187
|
+
}
|
|
188
|
+
assert.deepEqual(JSON.parse(JSON.stringify(getOperations(Archivable).delete)), {
|
|
189
|
+
base: "transform",
|
|
190
|
+
set: { archived: true }
|
|
191
|
+
}, "a delete declared on transform is a soft delete");
|
|
192
|
+
assert.deepEqual(Object.keys(getOperations(Archivable)).sort(), [
|
|
193
|
+
"appendContainsMany",
|
|
194
|
+
"create",
|
|
195
|
+
"delete",
|
|
196
|
+
"query",
|
|
197
|
+
"read",
|
|
198
|
+
"readSource",
|
|
199
|
+
"transform",
|
|
200
|
+
"update"
|
|
201
|
+
], "which stands in for the removal rather than beside it");
|
|
202
|
+
});
|
|
203
|
+
(0, import_qunit.test)("typed references are JSON-serializable markers", function(assert) {
|
|
204
|
+
class ClassroomActivity extends CardDef {}
|
|
205
|
+
class Classroom extends CardDef {
|
|
206
|
+
static {
|
|
207
|
+
decorateFieldV2(this, "createActivity", [operation], function() {
|
|
208
|
+
return {
|
|
209
|
+
base: "create",
|
|
210
|
+
of: ClassroomActivity,
|
|
211
|
+
params: {
|
|
212
|
+
title: string_default,
|
|
213
|
+
dueOn: DateField
|
|
214
|
+
},
|
|
215
|
+
fill: {
|
|
216
|
+
title: params("title"),
|
|
217
|
+
dueOn: params("dueOn"),
|
|
218
|
+
postedBy: actor(),
|
|
219
|
+
classroom: instance("id"),
|
|
220
|
+
room: realmConfig("defaultRoom"),
|
|
221
|
+
settings: realmConfig()
|
|
222
|
+
}
|
|
223
|
+
};
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
#createActivity = (initializeDeferredDecorator(this, "createActivity"), void 0);
|
|
227
|
+
static {
|
|
228
|
+
decorateFieldV2(this, "addActivity", [operation], function() {
|
|
229
|
+
return {
|
|
230
|
+
base: "transform",
|
|
231
|
+
params: { activity: linkTo(ClassroomActivity) },
|
|
232
|
+
append: {
|
|
233
|
+
to: "activities",
|
|
234
|
+
value: card(params("activity"))
|
|
235
|
+
}
|
|
236
|
+
};
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
#addActivity = (initializeDeferredDecorator(this, "addActivity"), void 0);
|
|
240
|
+
static {
|
|
241
|
+
decorateFieldV2(this, "addOwner", [operation], function() {
|
|
242
|
+
return {
|
|
243
|
+
base: "transform",
|
|
244
|
+
assert: {
|
|
245
|
+
unique: "owners",
|
|
246
|
+
by: instance("id"),
|
|
247
|
+
message: "This classroom already owns itself"
|
|
248
|
+
},
|
|
249
|
+
append: {
|
|
250
|
+
to: "owners",
|
|
251
|
+
value: card("https://example.test/people/1")
|
|
252
|
+
}
|
|
253
|
+
};
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
#addOwner = (initializeDeferredDecorator(this, "addOwner"), void 0);
|
|
257
|
+
}
|
|
258
|
+
let declarations = getOperations(Classroom);
|
|
259
|
+
let createActivity = declarations.createActivity;
|
|
260
|
+
let addActivity = declarations.addActivity;
|
|
261
|
+
let addOwner = declarations.addOwner;
|
|
262
|
+
assert.deepEqual(JSON.parse(JSON.stringify(createActivity.fill)), {
|
|
263
|
+
title: {
|
|
264
|
+
$ref: "params",
|
|
265
|
+
key: "title"
|
|
266
|
+
},
|
|
267
|
+
dueOn: {
|
|
268
|
+
$ref: "params",
|
|
269
|
+
key: "dueOn"
|
|
270
|
+
},
|
|
271
|
+
postedBy: { $ref: "actor" },
|
|
272
|
+
classroom: {
|
|
273
|
+
$ref: "instance",
|
|
274
|
+
key: "id"
|
|
275
|
+
},
|
|
276
|
+
room: {
|
|
277
|
+
$ref: "realmConfig",
|
|
278
|
+
key: "defaultRoom"
|
|
279
|
+
},
|
|
280
|
+
settings: { $ref: "realmConfig" }
|
|
281
|
+
}, "every accessor reference survives JSON round-tripping, with and without a key");
|
|
282
|
+
assert.strictEqual(createActivity.of, ClassroomActivity, "a create carries the class it creates");
|
|
283
|
+
assert.deepEqual(JSON.parse(JSON.stringify(addActivity.append)), {
|
|
284
|
+
to: "activities",
|
|
285
|
+
value: {
|
|
286
|
+
$ref: "card",
|
|
287
|
+
value: {
|
|
288
|
+
$ref: "params",
|
|
289
|
+
key: "activity"
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
}, "a card reference carries the reference that resolves to the card");
|
|
293
|
+
assert.deepEqual(JSON.parse(JSON.stringify(addOwner.assert)), {
|
|
294
|
+
unique: "owners",
|
|
295
|
+
by: {
|
|
296
|
+
$ref: "instance",
|
|
297
|
+
key: "id"
|
|
298
|
+
},
|
|
299
|
+
message: "This classroom already owns itself"
|
|
300
|
+
}, "an assertion keys its uniqueness check on a reference");
|
|
301
|
+
assert.deepEqual(JSON.parse(JSON.stringify(bxl`assert(.status == "open"; "not open");`)), { $bxl: "assert(.status == \"open\"; \"not open\");" }, "a raw program is a marker carrying its source");
|
|
302
|
+
});
|
|
303
|
+
(0, import_qunit.test)("the bxl tag rejects interpolation", function(assert) {
|
|
304
|
+
let fieldName = "status";
|
|
305
|
+
assert.throws(() => bxl`.${fieldName} = "escalated";`, /does not interpolate values/, "a program reads the operation context through builtins, not spliced text");
|
|
306
|
+
});
|
|
307
|
+
(0, import_qunit.test)("the decorator rejects a target that is not a card definition", function(assert) {
|
|
308
|
+
assert.throws(() => {
|
|
309
|
+
class NotADef {
|
|
310
|
+
static {
|
|
311
|
+
decorateFieldV2(this, "addComment", [operation], function() {
|
|
312
|
+
return { base: "read" };
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
#addComment = (initializeDeferredDecorator(this, "addComment"), void 0);
|
|
316
|
+
}
|
|
317
|
+
return NotADef;
|
|
318
|
+
}, /can only be used on static properties of classes that extend BaseDef/, "a plain class cannot carry operations");
|
|
319
|
+
});
|
|
320
|
+
(0, import_qunit.test)("the decorator rejects a symbol operation name", function(assert) {
|
|
321
|
+
assert.throws(() => {
|
|
322
|
+
class Report extends CardDef {
|
|
323
|
+
static {
|
|
324
|
+
decorateFieldV2(this, Symbol.for("cardstack-test-operation"), [operation], function() {
|
|
325
|
+
return { base: "read" };
|
|
326
|
+
});
|
|
327
|
+
}
|
|
328
|
+
#_ = (initializeDeferredDecorator(this, Symbol.for("cardstack-test-operation")), void 0);
|
|
329
|
+
}
|
|
330
|
+
return Report;
|
|
331
|
+
}, /only supports string operation names, not symbols/, "an operation is addressed by name on the wire, so it needs a string");
|
|
332
|
+
});
|
|
333
|
+
(0, import_qunit.test)("the decorator rejects a declaration that is not an object", function(assert) {
|
|
334
|
+
assert.throws(() => {
|
|
335
|
+
class Report extends CardDef {
|
|
336
|
+
static {
|
|
337
|
+
decorateFieldV2(this, "addComment", [operation], function() {
|
|
338
|
+
return "transform";
|
|
339
|
+
});
|
|
340
|
+
}
|
|
341
|
+
#addComment = (initializeDeferredDecorator(this, "addComment"), void 0);
|
|
342
|
+
}
|
|
343
|
+
return Report;
|
|
344
|
+
}, /must be a declaration object/, "a declaration is plain data, not a value of some other kind");
|
|
345
|
+
assert.throws(() => {
|
|
346
|
+
class Report extends CardDef {
|
|
347
|
+
static {
|
|
348
|
+
decorateFieldV2(this, "addComment", [operation]);
|
|
349
|
+
}
|
|
350
|
+
#addComment = (initializeDeferredDecorator(this, "addComment"), void 0);
|
|
351
|
+
}
|
|
352
|
+
return Report;
|
|
353
|
+
}, /must be assigned a declaration object/, "an operation with no declaration names no behavior at all");
|
|
354
|
+
});
|
|
355
|
+
(0, import_qunit.test)("a field cannot declare operations", function(assert) {
|
|
356
|
+
assert.throws(() => {
|
|
357
|
+
class Comment extends FieldDef {
|
|
358
|
+
static {
|
|
359
|
+
decorateFieldV2(this, "addReply", [operation], function() {
|
|
360
|
+
return { base: "read" };
|
|
361
|
+
});
|
|
362
|
+
}
|
|
363
|
+
#addReply = (initializeDeferredDecorator(this, "addReply"), void 0);
|
|
364
|
+
}
|
|
365
|
+
return Comment;
|
|
366
|
+
}, /a field has no URL of its own/, "field data is reached through the operations of the card that contains it");
|
|
367
|
+
});
|
|
368
|
+
(0, import_qunit.test)("a file definition declares reads and the writes that work on its bytes", function(assert) {
|
|
369
|
+
class LogFile extends FileDef {
|
|
370
|
+
static {
|
|
371
|
+
decorateFieldV2(this, "readRedacted", [operation], function() {
|
|
372
|
+
return {
|
|
373
|
+
base: "read",
|
|
374
|
+
output: { name: true }
|
|
375
|
+
};
|
|
376
|
+
});
|
|
377
|
+
}
|
|
378
|
+
#readRedacted = (initializeDeferredDecorator(this, "readRedacted"), void 0);
|
|
379
|
+
static {
|
|
380
|
+
decorateFieldV2(this, "record", [operation], function() {
|
|
381
|
+
return {
|
|
382
|
+
base: "appendLine",
|
|
383
|
+
params: { line: string_default }
|
|
384
|
+
};
|
|
385
|
+
});
|
|
386
|
+
}
|
|
387
|
+
#record = (initializeDeferredDecorator(this, "record"), void 0);
|
|
388
|
+
static {
|
|
389
|
+
decorateFieldV2(this, "replace", [operation], function() {
|
|
390
|
+
return { base: "update" };
|
|
391
|
+
});
|
|
392
|
+
}
|
|
393
|
+
#replace = (initializeDeferredDecorator(this, "replace"), void 0);
|
|
394
|
+
}
|
|
395
|
+
assert.deepEqual(Object.keys(getDeclaredOperations(LogFile)).sort(), [
|
|
396
|
+
"readRedacted",
|
|
397
|
+
"record",
|
|
398
|
+
"replace"
|
|
399
|
+
], "each is declarable on a file definition");
|
|
400
|
+
assert.strictEqual(getOperations(LogFile).record, LogFile.record, "and an author-declared one comes back from the read every consumer dispatches from, as the declaration itself");
|
|
401
|
+
assert.deepEqual(Object.keys(getOperations(LogFile)).sort(), [
|
|
402
|
+
"appendLine",
|
|
403
|
+
"read",
|
|
404
|
+
"readRedacted",
|
|
405
|
+
"readSource",
|
|
406
|
+
"record",
|
|
407
|
+
"replace",
|
|
408
|
+
"update"
|
|
409
|
+
], "beside every base operation the def type carries — a declaration under a name of its own adds to them rather than standing in for one");
|
|
410
|
+
assert.throws(() => {
|
|
411
|
+
class Mutable extends FileDef {
|
|
412
|
+
static {
|
|
413
|
+
decorateFieldV2(this, "rename", [operation], function() {
|
|
414
|
+
return {
|
|
415
|
+
base: "transform",
|
|
416
|
+
set: { name: "renamed" }
|
|
417
|
+
};
|
|
418
|
+
});
|
|
419
|
+
}
|
|
420
|
+
#rename = (initializeDeferredDecorator(this, "rename"), void 0);
|
|
421
|
+
}
|
|
422
|
+
return Mutable;
|
|
423
|
+
}, /carries only "read", "readSource", "update", "appendLine"/, "file metadata is content-derived, so there is no JSON:API document to transform");
|
|
424
|
+
assert.throws(() => {
|
|
425
|
+
class Bare extends FileDef {
|
|
426
|
+
static {
|
|
427
|
+
decorateFieldV2(this, "record", [operation], function() {
|
|
428
|
+
return { base: "appendLine" };
|
|
429
|
+
});
|
|
430
|
+
}
|
|
431
|
+
#record = (initializeDeferredDecorator(this, "record"), void 0);
|
|
432
|
+
}
|
|
433
|
+
return Bare;
|
|
434
|
+
}, /declares a `line` param — or an `input` program that produces one/, "an append with no line to append would be refused at every invocation");
|
|
435
|
+
assert.throws(() => {
|
|
436
|
+
class Linked extends FileDef {
|
|
437
|
+
static {
|
|
438
|
+
decorateFieldV2(this, "record", [operation], function() {
|
|
439
|
+
return {
|
|
440
|
+
base: "appendLine",
|
|
441
|
+
params: { line: linkTo(CardDef) }
|
|
442
|
+
};
|
|
443
|
+
});
|
|
444
|
+
}
|
|
445
|
+
#record = (initializeDeferredDecorator(this, "record"), void 0);
|
|
446
|
+
}
|
|
447
|
+
return Linked;
|
|
448
|
+
}, /`params.line` is the text a line holds/, "a link is a card identity, and what goes into a text file is text");
|
|
449
|
+
});
|
|
450
|
+
(0, import_qunit.test)("a card definition carries every behavior but the one that appends a line", function(assert) {
|
|
451
|
+
assert.throws(() => {
|
|
452
|
+
class Ledger extends CardDef {
|
|
453
|
+
static {
|
|
454
|
+
decorateFieldV2(this, "record", [operation], function() {
|
|
455
|
+
return {
|
|
456
|
+
base: "appendLine",
|
|
457
|
+
params: { line: string_default }
|
|
458
|
+
};
|
|
459
|
+
});
|
|
460
|
+
}
|
|
461
|
+
#record = (initializeDeferredDecorator(this, "record"), void 0);
|
|
462
|
+
}
|
|
463
|
+
return Ledger;
|
|
464
|
+
}, /carries only "read", "readSource", "create", "update", "delete", "query", "transform", "appendContainsMany"/, "a card's stored bytes are a JSON:API document, and a line appended to one is no longer a card");
|
|
465
|
+
});
|
|
466
|
+
(0, import_qunit.test)("an appendContainsMany names the fields it appends to and the item for each", function(assert) {
|
|
467
|
+
class EventLog extends CardDef {
|
|
468
|
+
static {
|
|
469
|
+
decorateFieldV2(this, "log", [operation], function() {
|
|
470
|
+
return {
|
|
471
|
+
base: "appendContainsMany",
|
|
472
|
+
params: { body: string_default },
|
|
473
|
+
field: "events",
|
|
474
|
+
item: {
|
|
475
|
+
body: params("body"),
|
|
476
|
+
at: actor()
|
|
477
|
+
}
|
|
478
|
+
};
|
|
479
|
+
});
|
|
480
|
+
}
|
|
481
|
+
#log = (initializeDeferredDecorator(this, "log"), void 0);
|
|
482
|
+
static {
|
|
483
|
+
decorateFieldV2(this, "logBoth", [operation], function() {
|
|
484
|
+
return {
|
|
485
|
+
base: "appendContainsMany",
|
|
486
|
+
params: {
|
|
487
|
+
body: string_default,
|
|
488
|
+
label: string_default
|
|
489
|
+
},
|
|
490
|
+
fields: {
|
|
491
|
+
events: { body: params("body") },
|
|
492
|
+
labels: params("label")
|
|
493
|
+
}
|
|
494
|
+
};
|
|
495
|
+
});
|
|
496
|
+
}
|
|
497
|
+
#logBoth = (initializeDeferredDecorator(this, "logBoth"), void 0);
|
|
498
|
+
}
|
|
499
|
+
assert.deepEqual(Object.keys(getDeclaredOperations(EventLog)).sort(), ["log", "logBoth"], "both spellings are declarations");
|
|
500
|
+
let rejected = [
|
|
501
|
+
[
|
|
502
|
+
"both spellings at once",
|
|
503
|
+
() => {
|
|
504
|
+
class Both extends CardDef {
|
|
505
|
+
static {
|
|
506
|
+
decorateFieldV2(this, "log", [operation], function() {
|
|
507
|
+
return {
|
|
508
|
+
base: "appendContainsMany",
|
|
509
|
+
field: "events",
|
|
510
|
+
item: { body: "x" },
|
|
511
|
+
fields: { events: { body: "y" } }
|
|
512
|
+
};
|
|
513
|
+
});
|
|
514
|
+
}
|
|
515
|
+
#log = (initializeDeferredDecorator(this, "log"), void 0);
|
|
516
|
+
}
|
|
517
|
+
return Both;
|
|
518
|
+
},
|
|
519
|
+
/names one field with its `item`, or several under `fields` — not both/
|
|
520
|
+
],
|
|
521
|
+
[
|
|
522
|
+
"neither spelling",
|
|
523
|
+
() => {
|
|
524
|
+
class Neither extends CardDef {
|
|
525
|
+
static {
|
|
526
|
+
decorateFieldV2(this, "log", [operation], function() {
|
|
527
|
+
return { base: "appendContainsMany" };
|
|
528
|
+
});
|
|
529
|
+
}
|
|
530
|
+
#log = (initializeDeferredDecorator(this, "log"), void 0);
|
|
531
|
+
}
|
|
532
|
+
return Neither;
|
|
533
|
+
},
|
|
534
|
+
/needs `field` and `item`, or `fields`/
|
|
535
|
+
],
|
|
536
|
+
[
|
|
537
|
+
"a field with no item",
|
|
538
|
+
() => {
|
|
539
|
+
class NoItem extends CardDef {
|
|
540
|
+
static {
|
|
541
|
+
decorateFieldV2(this, "log", [operation], function() {
|
|
542
|
+
return {
|
|
543
|
+
base: "appendContainsMany",
|
|
544
|
+
field: "events"
|
|
545
|
+
};
|
|
546
|
+
});
|
|
547
|
+
}
|
|
548
|
+
#log = (initializeDeferredDecorator(this, "log"), void 0);
|
|
549
|
+
}
|
|
550
|
+
return NoItem;
|
|
551
|
+
},
|
|
552
|
+
/needs an `item` to append to "events"/
|
|
553
|
+
],
|
|
554
|
+
[
|
|
555
|
+
"an empty fields map",
|
|
556
|
+
() => {
|
|
557
|
+
class Empty extends CardDef {
|
|
558
|
+
static {
|
|
559
|
+
decorateFieldV2(this, "log", [operation], function() {
|
|
560
|
+
return {
|
|
561
|
+
base: "appendContainsMany",
|
|
562
|
+
fields: {}
|
|
563
|
+
};
|
|
564
|
+
});
|
|
565
|
+
}
|
|
566
|
+
#log = (initializeDeferredDecorator(this, "log"), void 0);
|
|
567
|
+
}
|
|
568
|
+
return Empty;
|
|
569
|
+
},
|
|
570
|
+
/`fields` must be an object mapping each `containsMany` field/
|
|
571
|
+
]
|
|
572
|
+
];
|
|
573
|
+
for (let [name, build, pattern] of rejected) assert.throws(build, pattern, `${name} is refused`);
|
|
574
|
+
});
|
|
575
|
+
(0, import_qunit.test)("an appendContainsMany under its own name may name nothing, and is then the built-in", function(assert) {
|
|
576
|
+
class Journal extends CardDef {
|
|
577
|
+
static {
|
|
578
|
+
decorateFieldV2(this, "appendContainsMany", [operation], function() {
|
|
579
|
+
return {
|
|
580
|
+
base: "appendContainsMany",
|
|
581
|
+
nonGrantable: true
|
|
582
|
+
};
|
|
583
|
+
});
|
|
584
|
+
}
|
|
585
|
+
#appendContainsMany = (initializeDeferredDecorator(this, "appendContainsMany"), void 0);
|
|
586
|
+
}
|
|
587
|
+
assert.deepEqual(JSON.parse(JSON.stringify(getDeclaredOperations(Journal).appendContainsMany)), {
|
|
588
|
+
base: "appendContainsMany",
|
|
589
|
+
nonGrantable: true
|
|
590
|
+
}, "a def can mark the built-in append without changing what it appends");
|
|
591
|
+
assert.throws(() => {
|
|
592
|
+
class Named extends CardDef {
|
|
593
|
+
static {
|
|
594
|
+
decorateFieldV2(this, "log", [operation], function() {
|
|
595
|
+
return {
|
|
596
|
+
base: "appendContainsMany",
|
|
597
|
+
nonGrantable: true
|
|
598
|
+
};
|
|
599
|
+
});
|
|
600
|
+
}
|
|
601
|
+
#log = (initializeDeferredDecorator(this, "log"), void 0);
|
|
602
|
+
}
|
|
603
|
+
return Named;
|
|
604
|
+
}, /needs `field` and `item`, or `fields`/, "under any other name an append that names nothing is refused");
|
|
605
|
+
});
|
|
606
|
+
(0, import_qunit.test)("nonGrantable is a boolean any declaration may carry", function(assert) {
|
|
607
|
+
class Ledger extends CardDef {
|
|
608
|
+
static {
|
|
609
|
+
decorateFieldV2(this, "seal", [operation], function() {
|
|
610
|
+
return {
|
|
611
|
+
base: "transform",
|
|
612
|
+
set: { status: "sealed" },
|
|
613
|
+
nonGrantable: true
|
|
614
|
+
};
|
|
615
|
+
});
|
|
616
|
+
}
|
|
617
|
+
#seal = (initializeDeferredDecorator(this, "seal"), void 0);
|
|
618
|
+
static {
|
|
619
|
+
decorateFieldV2(this, "update", [operation], function() {
|
|
620
|
+
return {
|
|
621
|
+
base: "update",
|
|
622
|
+
nonGrantable: true
|
|
623
|
+
};
|
|
624
|
+
});
|
|
625
|
+
}
|
|
626
|
+
#update = (initializeDeferredDecorator(this, "update"), void 0);
|
|
627
|
+
}
|
|
628
|
+
assert.deepEqual(Object.keys(getDeclaredOperations(Ledger)).sort(), ["seal", "update"], "a named operation and a built-in both carry it");
|
|
629
|
+
assert.throws(() => {
|
|
630
|
+
class Loose extends CardDef {
|
|
631
|
+
static {
|
|
632
|
+
decorateFieldV2(this, "seal", [operation], function() {
|
|
633
|
+
return {
|
|
634
|
+
base: "transform",
|
|
635
|
+
set: { status: "sealed" },
|
|
636
|
+
nonGrantable: "yes"
|
|
637
|
+
};
|
|
638
|
+
});
|
|
639
|
+
}
|
|
640
|
+
#seal = (initializeDeferredDecorator(this, "seal"), void 0);
|
|
641
|
+
}
|
|
642
|
+
return Loose;
|
|
643
|
+
}, /`nonGrantable` must be a boolean/);
|
|
644
|
+
});
|
|
645
|
+
(0, import_qunit.test)("label is a short line of plain text any declaration may carry", function(assert) {
|
|
646
|
+
class Inbox extends CardDef {
|
|
647
|
+
static {
|
|
648
|
+
decorateFieldV2(this, "archive", [operation], function() {
|
|
649
|
+
return {
|
|
650
|
+
base: "transform",
|
|
651
|
+
label: "Archive this inbox",
|
|
652
|
+
set: { status: "archived" }
|
|
653
|
+
};
|
|
654
|
+
});
|
|
655
|
+
}
|
|
656
|
+
#archive = (initializeDeferredDecorator(this, "archive"), void 0);
|
|
657
|
+
static {
|
|
658
|
+
decorateFieldV2(this, "listOpen", [operation], function() {
|
|
659
|
+
return {
|
|
660
|
+
base: "query",
|
|
661
|
+
label: "List open inboxes",
|
|
662
|
+
query: { filter: {
|
|
663
|
+
on: () => Inbox,
|
|
664
|
+
eq: { status: "open" }
|
|
665
|
+
} }
|
|
666
|
+
};
|
|
667
|
+
});
|
|
668
|
+
}
|
|
669
|
+
#listOpen = (initializeDeferredDecorator(this, "listOpen"), void 0);
|
|
670
|
+
static {
|
|
671
|
+
decorateFieldV2(this, "update", [operation], function() {
|
|
672
|
+
return {
|
|
673
|
+
base: "update",
|
|
674
|
+
label: "Edit this inbox"
|
|
675
|
+
};
|
|
676
|
+
});
|
|
677
|
+
}
|
|
678
|
+
#update = (initializeDeferredDecorator(this, "update"), void 0);
|
|
679
|
+
}
|
|
680
|
+
class LogFile extends FileDef {
|
|
681
|
+
static {
|
|
682
|
+
decorateFieldV2(this, "record", [operation], function() {
|
|
683
|
+
return {
|
|
684
|
+
base: "appendLine",
|
|
685
|
+
label: "Add a line to the log",
|
|
686
|
+
params: { line: string_default }
|
|
687
|
+
};
|
|
688
|
+
});
|
|
689
|
+
}
|
|
690
|
+
#record = (initializeDeferredDecorator(this, "record"), void 0);
|
|
691
|
+
}
|
|
692
|
+
assert.deepEqual(Object.fromEntries(Object.entries({
|
|
693
|
+
...getDeclaredOperations(Inbox),
|
|
694
|
+
...getDeclaredOperations(LogFile)
|
|
695
|
+
}).map(([name, declaration]) => [name, declaration.label])), {
|
|
696
|
+
archive: "Archive this inbox",
|
|
697
|
+
listOpen: "List open inboxes",
|
|
698
|
+
update: "Edit this inbox",
|
|
699
|
+
record: "Add a line to the log"
|
|
700
|
+
}, "a named operation, a saved search, a built-in and a file operation all carry one");
|
|
701
|
+
let refused = [
|
|
702
|
+
[
|
|
703
|
+
"an empty label",
|
|
704
|
+
"",
|
|
705
|
+
/a label must not be empty/
|
|
706
|
+
],
|
|
707
|
+
[
|
|
708
|
+
"a blank label",
|
|
709
|
+
" ",
|
|
710
|
+
/a label must not be empty/
|
|
711
|
+
],
|
|
712
|
+
[
|
|
713
|
+
"a label over 80 characters",
|
|
714
|
+
"x".repeat(81),
|
|
715
|
+
/a label must be at most 80 characters, and this one is 81/
|
|
716
|
+
],
|
|
717
|
+
[
|
|
718
|
+
"a label with markup",
|
|
719
|
+
"Archive <b>now</b>",
|
|
720
|
+
/without markup/
|
|
721
|
+
],
|
|
722
|
+
[
|
|
723
|
+
"a label with a line break",
|
|
724
|
+
"Archive\nthis inbox",
|
|
725
|
+
/without line breaks/
|
|
726
|
+
],
|
|
727
|
+
[
|
|
728
|
+
"a label with a tab",
|
|
729
|
+
"Archive this inbox",
|
|
730
|
+
/without line breaks/
|
|
731
|
+
],
|
|
732
|
+
[
|
|
733
|
+
"a label that is not a string",
|
|
734
|
+
42,
|
|
735
|
+
/a label must be a string/
|
|
736
|
+
]
|
|
737
|
+
];
|
|
738
|
+
for (let [what, label, pattern] of refused) assert.throws(() => {
|
|
739
|
+
class Loose extends CardDef {
|
|
740
|
+
static {
|
|
741
|
+
decorateFieldV2(this, "update", [operation], function() {
|
|
742
|
+
return {
|
|
743
|
+
base: "update",
|
|
744
|
+
label
|
|
745
|
+
};
|
|
746
|
+
});
|
|
747
|
+
}
|
|
748
|
+
#update = (initializeDeferredDecorator(this, "update"), void 0);
|
|
749
|
+
}
|
|
750
|
+
return Loose;
|
|
751
|
+
}, pattern, `${what} is refused`);
|
|
752
|
+
class AtTheLimit extends CardDef {
|
|
753
|
+
static {
|
|
754
|
+
decorateFieldV2(this, "update", [operation], function() {
|
|
755
|
+
return {
|
|
756
|
+
base: "update",
|
|
757
|
+
label: "x".repeat(80)
|
|
758
|
+
};
|
|
759
|
+
});
|
|
760
|
+
}
|
|
761
|
+
#update = (initializeDeferredDecorator(this, "update"), void 0);
|
|
762
|
+
}
|
|
763
|
+
assert.strictEqual(getDeclaredOperations(AtTheLimit).update.label, "x".repeat(80), "a label of exactly 80 characters is accepted");
|
|
764
|
+
});
|
|
765
|
+
(0, import_qunit.test)("an explain is carried only where a card declares one, and is never grantable", function(assert) {
|
|
766
|
+
class Plain extends CardDef {}
|
|
767
|
+
assert.false("explain" in getOperations(Plain), "no card carries an explain it did not declare");
|
|
768
|
+
class Policy extends CardDef {
|
|
769
|
+
static {
|
|
770
|
+
decorateFieldV2(this, "explain", [operation], function() {
|
|
771
|
+
return {
|
|
772
|
+
base: "explain",
|
|
773
|
+
params: {
|
|
774
|
+
actor: string_default,
|
|
775
|
+
target: string_default,
|
|
776
|
+
operation: string_default
|
|
777
|
+
},
|
|
778
|
+
nonGrantable: true
|
|
779
|
+
};
|
|
780
|
+
});
|
|
781
|
+
}
|
|
782
|
+
#explain = (initializeDeferredDecorator(this, "explain"), void 0);
|
|
783
|
+
}
|
|
784
|
+
assert.strictEqual(getOperations(Policy).explain?.base, "explain", "a card that declares one carries it under the name it declared");
|
|
785
|
+
let rejected = [
|
|
786
|
+
[
|
|
787
|
+
"an explain that leaves the flag off",
|
|
788
|
+
() => {
|
|
789
|
+
class Open extends CardDef {
|
|
790
|
+
static {
|
|
791
|
+
decorateFieldV2(this, "explain", [operation], function() {
|
|
792
|
+
return { base: "explain" };
|
|
793
|
+
});
|
|
794
|
+
}
|
|
795
|
+
#explain = (initializeDeferredDecorator(this, "explain"), void 0);
|
|
796
|
+
}
|
|
797
|
+
return Open;
|
|
798
|
+
},
|
|
799
|
+
/declare it with `nonGrantable: true`/
|
|
800
|
+
],
|
|
801
|
+
[
|
|
802
|
+
"an explain that carries a program",
|
|
803
|
+
() => {
|
|
804
|
+
class Scripted extends CardDef {
|
|
805
|
+
static {
|
|
806
|
+
decorateFieldV2(this, "explain", [operation], function() {
|
|
807
|
+
return {
|
|
808
|
+
base: "explain",
|
|
809
|
+
nonGrantable: true,
|
|
810
|
+
transformations: bxl`.status = "x";`
|
|
811
|
+
};
|
|
812
|
+
});
|
|
813
|
+
}
|
|
814
|
+
#explain = (initializeDeferredDecorator(this, "explain"), void 0);
|
|
815
|
+
}
|
|
816
|
+
return Scripted;
|
|
817
|
+
},
|
|
818
|
+
/so it carries no `transformations`/
|
|
819
|
+
],
|
|
820
|
+
[
|
|
821
|
+
"an explain that reshapes its answer",
|
|
822
|
+
() => {
|
|
823
|
+
class Projected extends CardDef {
|
|
824
|
+
static {
|
|
825
|
+
decorateFieldV2(this, "explain", [operation], function() {
|
|
826
|
+
return {
|
|
827
|
+
base: "explain",
|
|
828
|
+
nonGrantable: true,
|
|
829
|
+
output: { decision: bxl`.decision` }
|
|
830
|
+
};
|
|
831
|
+
});
|
|
832
|
+
}
|
|
833
|
+
#explain = (initializeDeferredDecorator(this, "explain"), void 0);
|
|
834
|
+
}
|
|
835
|
+
return Projected;
|
|
836
|
+
},
|
|
837
|
+
/carries no `output` to reshape it/
|
|
838
|
+
],
|
|
839
|
+
[
|
|
840
|
+
"an explain that rewrites its question",
|
|
841
|
+
() => {
|
|
842
|
+
class Rewritten extends CardDef {
|
|
843
|
+
static {
|
|
844
|
+
decorateFieldV2(this, "explain", [operation], function() {
|
|
845
|
+
return {
|
|
846
|
+
base: "explain",
|
|
847
|
+
nonGrantable: true,
|
|
848
|
+
input: bxl`.`
|
|
849
|
+
};
|
|
850
|
+
});
|
|
851
|
+
}
|
|
852
|
+
#explain = (initializeDeferredDecorator(this, "explain"), void 0);
|
|
853
|
+
}
|
|
854
|
+
return Rewritten;
|
|
855
|
+
},
|
|
856
|
+
/carries no `input` to rewrite it/
|
|
857
|
+
],
|
|
858
|
+
[
|
|
859
|
+
"an explain on a file def",
|
|
860
|
+
() => {
|
|
861
|
+
class LogFile extends FileDef {
|
|
862
|
+
static {
|
|
863
|
+
decorateFieldV2(this, "explain", [operation], function() {
|
|
864
|
+
return {
|
|
865
|
+
base: "explain",
|
|
866
|
+
nonGrantable: true
|
|
867
|
+
};
|
|
868
|
+
});
|
|
869
|
+
}
|
|
870
|
+
#explain = (initializeDeferredDecorator(this, "explain"), void 0);
|
|
871
|
+
}
|
|
872
|
+
return LogFile;
|
|
873
|
+
},
|
|
874
|
+
/cannot declare a "explain" operation/
|
|
875
|
+
]
|
|
876
|
+
];
|
|
877
|
+
for (let [name, build, pattern] of rejected) assert.throws(build, pattern, `${name} is refused`);
|
|
878
|
+
});
|
|
879
|
+
(0, import_qunit.test)("a validate is carried only where a card declares one, and is never grantable", function(assert) {
|
|
880
|
+
class Plain extends CardDef {}
|
|
881
|
+
assert.false("validate" in getOperations(Plain), "no card carries a validate it did not declare");
|
|
882
|
+
class Policy extends CardDef {
|
|
883
|
+
static {
|
|
884
|
+
decorateFieldV2(this, "validate", [operation], function() {
|
|
885
|
+
return {
|
|
886
|
+
base: "validate",
|
|
887
|
+
nonGrantable: true
|
|
888
|
+
};
|
|
889
|
+
});
|
|
890
|
+
}
|
|
891
|
+
#validate = (initializeDeferredDecorator(this, "validate"), void 0);
|
|
892
|
+
}
|
|
893
|
+
assert.strictEqual(getOperations(Policy).validate?.base, "validate", "a card that declares one carries it under the name it declared");
|
|
894
|
+
let rejected = [
|
|
895
|
+
[
|
|
896
|
+
"a validate that leaves the flag off",
|
|
897
|
+
() => {
|
|
898
|
+
class Open extends CardDef {
|
|
899
|
+
static {
|
|
900
|
+
decorateFieldV2(this, "validate", [operation], function() {
|
|
901
|
+
return { base: "validate" };
|
|
902
|
+
});
|
|
903
|
+
}
|
|
904
|
+
#validate = (initializeDeferredDecorator(this, "validate"), void 0);
|
|
905
|
+
}
|
|
906
|
+
return Open;
|
|
907
|
+
},
|
|
908
|
+
/declare it with `nonGrantable: true`/
|
|
909
|
+
],
|
|
910
|
+
[
|
|
911
|
+
"a validate that carries a program",
|
|
912
|
+
() => {
|
|
913
|
+
class Scripted extends CardDef {
|
|
914
|
+
static {
|
|
915
|
+
decorateFieldV2(this, "validate", [operation], function() {
|
|
916
|
+
return {
|
|
917
|
+
base: "validate",
|
|
918
|
+
nonGrantable: true,
|
|
919
|
+
transformations: bxl`.status = "x";`
|
|
920
|
+
};
|
|
921
|
+
});
|
|
922
|
+
}
|
|
923
|
+
#validate = (initializeDeferredDecorator(this, "validate"), void 0);
|
|
924
|
+
}
|
|
925
|
+
return Scripted;
|
|
926
|
+
},
|
|
927
|
+
/so it carries no `transformations`/
|
|
928
|
+
],
|
|
929
|
+
[
|
|
930
|
+
"a validate that reshapes its answer",
|
|
931
|
+
() => {
|
|
932
|
+
class Projected extends CardDef {
|
|
933
|
+
static {
|
|
934
|
+
decorateFieldV2(this, "validate", [operation], function() {
|
|
935
|
+
return {
|
|
936
|
+
base: "validate",
|
|
937
|
+
nonGrantable: true,
|
|
938
|
+
output: { issues: bxl`.issues` }
|
|
939
|
+
};
|
|
940
|
+
});
|
|
941
|
+
}
|
|
942
|
+
#validate = (initializeDeferredDecorator(this, "validate"), void 0);
|
|
943
|
+
}
|
|
944
|
+
return Projected;
|
|
945
|
+
},
|
|
946
|
+
/carries no `output` to reshape it/
|
|
947
|
+
],
|
|
948
|
+
[
|
|
949
|
+
"a validate that takes params",
|
|
950
|
+
() => {
|
|
951
|
+
class WithParams extends CardDef {
|
|
952
|
+
static {
|
|
953
|
+
decorateFieldV2(this, "validate", [operation], function() {
|
|
954
|
+
return {
|
|
955
|
+
base: "validate",
|
|
956
|
+
nonGrantable: true,
|
|
957
|
+
params: { realm: string_default }
|
|
958
|
+
};
|
|
959
|
+
});
|
|
960
|
+
}
|
|
961
|
+
#validate = (initializeDeferredDecorator(this, "validate"), void 0);
|
|
962
|
+
}
|
|
963
|
+
return WithParams;
|
|
964
|
+
},
|
|
965
|
+
/takes no payload.*so it carries no `params`/
|
|
966
|
+
],
|
|
967
|
+
[
|
|
968
|
+
"a validate that takes an input",
|
|
969
|
+
() => {
|
|
970
|
+
class WithInput extends CardDef {
|
|
971
|
+
static {
|
|
972
|
+
decorateFieldV2(this, "validate", [operation], function() {
|
|
973
|
+
return {
|
|
974
|
+
base: "validate",
|
|
975
|
+
nonGrantable: true,
|
|
976
|
+
input: bxl`{ strict: true }`
|
|
977
|
+
};
|
|
978
|
+
});
|
|
979
|
+
}
|
|
980
|
+
#validate = (initializeDeferredDecorator(this, "validate"), void 0);
|
|
981
|
+
}
|
|
982
|
+
return WithInput;
|
|
983
|
+
},
|
|
984
|
+
/takes no payload.*so it carries no `input`/
|
|
985
|
+
],
|
|
986
|
+
[
|
|
987
|
+
"a validate on a file def",
|
|
988
|
+
() => {
|
|
989
|
+
class LogFile extends FileDef {
|
|
990
|
+
static {
|
|
991
|
+
decorateFieldV2(this, "validate", [operation], function() {
|
|
992
|
+
return {
|
|
993
|
+
base: "validate",
|
|
994
|
+
nonGrantable: true
|
|
995
|
+
};
|
|
996
|
+
});
|
|
997
|
+
}
|
|
998
|
+
#validate = (initializeDeferredDecorator(this, "validate"), void 0);
|
|
999
|
+
}
|
|
1000
|
+
return LogFile;
|
|
1001
|
+
},
|
|
1002
|
+
/cannot declare a "validate" operation/
|
|
1003
|
+
]
|
|
1004
|
+
];
|
|
1005
|
+
for (let [name, build, pattern] of rejected) assert.throws(build, pattern, `${name} is refused`);
|
|
1006
|
+
});
|
|
1007
|
+
(0, import_qunit.test)("a declaration that runs no program carries no raw one", function(assert) {
|
|
1008
|
+
let rejected = [
|
|
1009
|
+
["appendContainsMany", () => {
|
|
1010
|
+
class Ledger extends CardDef {
|
|
1011
|
+
static {
|
|
1012
|
+
decorateFieldV2(this, "log", [operation], function() {
|
|
1013
|
+
return {
|
|
1014
|
+
base: "appendContainsMany",
|
|
1015
|
+
transformations: bxl`.status = "logged";`
|
|
1016
|
+
};
|
|
1017
|
+
});
|
|
1018
|
+
}
|
|
1019
|
+
#log = (initializeDeferredDecorator(this, "log"), void 0);
|
|
1020
|
+
}
|
|
1021
|
+
return Ledger;
|
|
1022
|
+
}],
|
|
1023
|
+
["appendLine", () => {
|
|
1024
|
+
class LogFile extends FileDef {
|
|
1025
|
+
static {
|
|
1026
|
+
decorateFieldV2(this, "record", [operation], function() {
|
|
1027
|
+
return {
|
|
1028
|
+
base: "appendLine",
|
|
1029
|
+
params: { line: string_default },
|
|
1030
|
+
transformations: bxl`.name = "x";`
|
|
1031
|
+
};
|
|
1032
|
+
});
|
|
1033
|
+
}
|
|
1034
|
+
#record = (initializeDeferredDecorator(this, "record"), void 0);
|
|
1035
|
+
}
|
|
1036
|
+
return LogFile;
|
|
1037
|
+
}],
|
|
1038
|
+
["update on a file def", () => {
|
|
1039
|
+
class Replaceable extends FileDef {
|
|
1040
|
+
static {
|
|
1041
|
+
decorateFieldV2(this, "replace", [operation], function() {
|
|
1042
|
+
return {
|
|
1043
|
+
base: "update",
|
|
1044
|
+
transformations: bxl`.name = "x";`
|
|
1045
|
+
};
|
|
1046
|
+
});
|
|
1047
|
+
}
|
|
1048
|
+
#replace = (initializeDeferredDecorator(this, "replace"), void 0);
|
|
1049
|
+
}
|
|
1050
|
+
return Replaceable;
|
|
1051
|
+
}]
|
|
1052
|
+
];
|
|
1053
|
+
for (let [name, build] of rejected) assert.throws(build, /so it carries no `transformations`/, `${name} runs no program over a document`);
|
|
1054
|
+
});
|
|
1055
|
+
(0, import_qunit.test)("a stored-bytes read takes no declaration at all", function(assert) {
|
|
1056
|
+
for (let Def of [CardDef, FileDef]) assert.throws(() => {
|
|
1057
|
+
class Exported extends Def {
|
|
1058
|
+
static {
|
|
1059
|
+
decorateFieldV2(this, "exportBytes", [operation], function() {
|
|
1060
|
+
return { base: "readSource" };
|
|
1061
|
+
});
|
|
1062
|
+
}
|
|
1063
|
+
#exportBytes = (initializeDeferredDecorator(this, "exportBytes"), void 0);
|
|
1064
|
+
}
|
|
1065
|
+
return Exported;
|
|
1066
|
+
}, /serves the bytes stored at the def's URL/, `a ${Def.name} cannot build an operation on a stored-bytes read`);
|
|
1067
|
+
assert.throws(() => {
|
|
1068
|
+
class Redacted extends CardDef {
|
|
1069
|
+
static {
|
|
1070
|
+
decorateFieldV2(this, "readSource", [operation], function() {
|
|
1071
|
+
return {
|
|
1072
|
+
base: "readSource",
|
|
1073
|
+
output: { redacted: true }
|
|
1074
|
+
};
|
|
1075
|
+
});
|
|
1076
|
+
}
|
|
1077
|
+
#readSource = (initializeDeferredDecorator(this, "readSource"), void 0);
|
|
1078
|
+
}
|
|
1079
|
+
return Redacted;
|
|
1080
|
+
}, /reserved operation name/, "and it cannot be specialized under its own name either");
|
|
1081
|
+
assert.throws(() => {
|
|
1082
|
+
class Sneaky extends CardDef {
|
|
1083
|
+
static {
|
|
1084
|
+
decorateFieldV2(this, "readSource", [operation], function() {
|
|
1085
|
+
return {
|
|
1086
|
+
base: "read",
|
|
1087
|
+
output: { redacted: true }
|
|
1088
|
+
};
|
|
1089
|
+
});
|
|
1090
|
+
}
|
|
1091
|
+
#readSource = (initializeDeferredDecorator(this, "readSource"), void 0);
|
|
1092
|
+
}
|
|
1093
|
+
return Sneaky;
|
|
1094
|
+
}, /reserved operation name/, "a declaration cannot take the name by building on another base");
|
|
1095
|
+
});
|
|
1096
|
+
(0, import_qunit.test)("a saved search may not be named `query`", function(assert) {
|
|
1097
|
+
assert.throws(() => {
|
|
1098
|
+
class Listing extends CardDef {
|
|
1099
|
+
static {
|
|
1100
|
+
decorateFieldV2(this, "query", [operation], function() {
|
|
1101
|
+
return {
|
|
1102
|
+
base: "query",
|
|
1103
|
+
query: { filter: { type: () => Listing } }
|
|
1104
|
+
};
|
|
1105
|
+
});
|
|
1106
|
+
}
|
|
1107
|
+
#query = (initializeDeferredDecorator(this, "query"), void 0);
|
|
1108
|
+
}
|
|
1109
|
+
return Listing;
|
|
1110
|
+
}, /"query" is a reserved operation name/);
|
|
1111
|
+
});
|
|
1112
|
+
(0, import_qunit.test)("the decorator refuses every name the realm answers definition-free", function(assert) {
|
|
1113
|
+
assert.ok(DEFINITION_FREE_BASE_OPERATIONS.length > 0, "the list is non-empty, so the loop below asserts something");
|
|
1114
|
+
let applyOperation = operation;
|
|
1115
|
+
for (let name of DEFINITION_FREE_BASE_OPERATIONS) assert.throws(() => {
|
|
1116
|
+
class Shadow extends CardDef {}
|
|
1117
|
+
applyOperation(Shadow, name, { initializer: () => ({ base: "read" }) });
|
|
1118
|
+
return Shadow;
|
|
1119
|
+
}, /reserved operation name/, `${name} is refused as a declaration name`);
|
|
1120
|
+
});
|
|
1121
|
+
(0, import_qunit.test)("the decorator rejects an operation name that is already a static", function(assert) {
|
|
1122
|
+
assert.throws(() => {
|
|
1123
|
+
class Report extends CardDef {
|
|
1124
|
+
static {
|
|
1125
|
+
decorateFieldV2(this, "displayName", [operation], function() {
|
|
1126
|
+
return { base: "read" };
|
|
1127
|
+
});
|
|
1128
|
+
}
|
|
1129
|
+
#displayName = (initializeDeferredDecorator(this, "displayName"), void 0);
|
|
1130
|
+
}
|
|
1131
|
+
return Report;
|
|
1132
|
+
}, /already resolves on this class/, "an operation name that shadows a system static is refused");
|
|
1133
|
+
assert.throws(() => {
|
|
1134
|
+
class Report extends CardDef {
|
|
1135
|
+
static {
|
|
1136
|
+
decorateFieldV2(this, "toString", [operation], function() {
|
|
1137
|
+
return { base: "read" };
|
|
1138
|
+
});
|
|
1139
|
+
}
|
|
1140
|
+
#toString = (initializeDeferredDecorator(this, "toString"), void 0);
|
|
1141
|
+
}
|
|
1142
|
+
return Report;
|
|
1143
|
+
}, /already resolves on this class/, "nor one that shadows something every class inherits");
|
|
1144
|
+
assert.throws(() => {
|
|
1145
|
+
class Report extends CardDef {
|
|
1146
|
+
static {
|
|
1147
|
+
decorateFieldV2(this, "__proto__", [operation], function() {
|
|
1148
|
+
return { base: "read" };
|
|
1149
|
+
});
|
|
1150
|
+
}
|
|
1151
|
+
#__proto__ = (initializeDeferredDecorator(this, "__proto__"), void 0);
|
|
1152
|
+
}
|
|
1153
|
+
return Report;
|
|
1154
|
+
}, /already resolves on this class/, "and least of all a name that would reset a prototype instead of keying a map");
|
|
1155
|
+
class Report extends CardDef {
|
|
1156
|
+
static {
|
|
1157
|
+
decorateFieldV2(this, "addComment", [operation], function() {
|
|
1158
|
+
return {
|
|
1159
|
+
base: "transform",
|
|
1160
|
+
params: { body: string_default },
|
|
1161
|
+
append: {
|
|
1162
|
+
to: "comments",
|
|
1163
|
+
value: { body: params("body") }
|
|
1164
|
+
}
|
|
1165
|
+
};
|
|
1166
|
+
});
|
|
1167
|
+
}
|
|
1168
|
+
#addComment = (initializeDeferredDecorator(this, "addComment"), void 0);
|
|
1169
|
+
}
|
|
1170
|
+
assert.deepEqual(Object.keys(getDeclaredOperations(Report)), ["addComment"], "a rejected name leaves the store working");
|
|
1171
|
+
for (let inherited of [
|
|
1172
|
+
"toString",
|
|
1173
|
+
"constructor",
|
|
1174
|
+
"__proto__",
|
|
1175
|
+
"valueOf",
|
|
1176
|
+
"hasOwnProperty"
|
|
1177
|
+
]) {
|
|
1178
|
+
assert.false(inherited in getOperations(Report), `a name-keyed record does not answer for ${inherited}`);
|
|
1179
|
+
assert.false(inherited in getDeclaredOperations(Report), `nor does the declared-only record answer for ${inherited}`);
|
|
1180
|
+
}
|
|
1181
|
+
assert.true("addComment" in getOperations(Report), "while still answering for the operations it holds");
|
|
1182
|
+
assert.true("read" in getOperations(Report), "and for the base operations its def type carries");
|
|
1183
|
+
});
|
|
1184
|
+
(0, import_qunit.test)("the decorator installs the declaration on the class", function(assert) {
|
|
1185
|
+
class Report extends CardDef {
|
|
1186
|
+
static {
|
|
1187
|
+
decorateFieldV2(this, "addComment", [operation], function() {
|
|
1188
|
+
return {
|
|
1189
|
+
base: "transform",
|
|
1190
|
+
params: { body: string_default },
|
|
1191
|
+
append: {
|
|
1192
|
+
to: "comments",
|
|
1193
|
+
value: { body: params("body") }
|
|
1194
|
+
}
|
|
1195
|
+
};
|
|
1196
|
+
});
|
|
1197
|
+
}
|
|
1198
|
+
#addComment = (initializeDeferredDecorator(this, "addComment"), void 0);
|
|
1199
|
+
}
|
|
1200
|
+
assert.strictEqual(Report.addComment, getDeclaredOperations(Report).addComment, "the class carries the very declaration the reader returns");
|
|
1201
|
+
});
|
|
1202
|
+
(0, import_qunit.test)("the decorator validates the declaration against its base operation", function(assert) {
|
|
1203
|
+
assert.throws(() => {
|
|
1204
|
+
class Report extends CardDef {
|
|
1205
|
+
static {
|
|
1206
|
+
decorateFieldV2(this, "addComment", [operation], function() {
|
|
1207
|
+
return { base: "append" };
|
|
1208
|
+
});
|
|
1209
|
+
}
|
|
1210
|
+
#addComment = (initializeDeferredDecorator(this, "addComment"), void 0);
|
|
1211
|
+
}
|
|
1212
|
+
return Report;
|
|
1213
|
+
}, /must name the built-in behavior/, "a declaration builds on one of the built-in behaviors");
|
|
1214
|
+
assert.throws(() => {
|
|
1215
|
+
class Report extends CardDef {
|
|
1216
|
+
static {
|
|
1217
|
+
decorateFieldV2(this, "addComment", [operation], function() {
|
|
1218
|
+
return {
|
|
1219
|
+
base: "read",
|
|
1220
|
+
append: {
|
|
1221
|
+
to: "comments",
|
|
1222
|
+
value: "hello"
|
|
1223
|
+
}
|
|
1224
|
+
};
|
|
1225
|
+
});
|
|
1226
|
+
}
|
|
1227
|
+
#addComment = (initializeDeferredDecorator(this, "addComment"), void 0);
|
|
1228
|
+
}
|
|
1229
|
+
return Report;
|
|
1230
|
+
}, /"append" is not a valid key for a "read" operation/, "a clause is only legal on the base that can express it");
|
|
1231
|
+
assert.throws(() => {
|
|
1232
|
+
class Report extends CardDef {
|
|
1233
|
+
static {
|
|
1234
|
+
decorateFieldV2(this, "createComment", [operation], function() {
|
|
1235
|
+
return {
|
|
1236
|
+
base: "create",
|
|
1237
|
+
fill: { body: "x" }
|
|
1238
|
+
};
|
|
1239
|
+
});
|
|
1240
|
+
}
|
|
1241
|
+
#createComment = (initializeDeferredDecorator(this, "createComment"), void 0);
|
|
1242
|
+
}
|
|
1243
|
+
return Report;
|
|
1244
|
+
}, /a "create" operation needs/, "a create names the type it creates");
|
|
1245
|
+
assert.throws(() => {
|
|
1246
|
+
class Report extends CardDef {
|
|
1247
|
+
static {
|
|
1248
|
+
decorateFieldV2(this, "createComment", [operation], function() {
|
|
1249
|
+
return {
|
|
1250
|
+
base: "create",
|
|
1251
|
+
of: () => Report,
|
|
1252
|
+
links: "none"
|
|
1253
|
+
};
|
|
1254
|
+
});
|
|
1255
|
+
}
|
|
1256
|
+
#createComment = (initializeDeferredDecorator(this, "createComment"), void 0);
|
|
1257
|
+
}
|
|
1258
|
+
return Report;
|
|
1259
|
+
}, /"links" is not a valid key for a "create" operation/, "only a read or a query carries a link graph to narrow");
|
|
1260
|
+
assert.throws(() => {
|
|
1261
|
+
class Report extends CardDef {
|
|
1262
|
+
static {
|
|
1263
|
+
decorateFieldV2(this, "summary", [operation], function() {
|
|
1264
|
+
return {
|
|
1265
|
+
base: "read",
|
|
1266
|
+
links: "some"
|
|
1267
|
+
};
|
|
1268
|
+
});
|
|
1269
|
+
}
|
|
1270
|
+
#summary = (initializeDeferredDecorator(this, "summary"), void 0);
|
|
1271
|
+
}
|
|
1272
|
+
return Report;
|
|
1273
|
+
}, /`links` must name how much of the card's link graph this read carries/, "and it names one of the strategies a read applies");
|
|
1274
|
+
assert.throws(() => {
|
|
1275
|
+
class Report extends CardDef {
|
|
1276
|
+
static {
|
|
1277
|
+
decorateFieldV2(this, "read", [operation], function() {
|
|
1278
|
+
return {
|
|
1279
|
+
base: "read",
|
|
1280
|
+
links: "none"
|
|
1281
|
+
};
|
|
1282
|
+
});
|
|
1283
|
+
}
|
|
1284
|
+
#read = (initializeDeferredDecorator(this, "read"), void 0);
|
|
1285
|
+
}
|
|
1286
|
+
return Report;
|
|
1287
|
+
}, /this read carries — one of "full", "ids"\. .*"ids" narrows a read/, "a read may not withhold its links from the host that edits the card");
|
|
1288
|
+
class Gradebook extends CardDef {
|
|
1289
|
+
static {
|
|
1290
|
+
decorateFieldV2(this, "listAll", [operation], function() {
|
|
1291
|
+
return {
|
|
1292
|
+
base: "query",
|
|
1293
|
+
query: { filter: { type: () => Gradebook } },
|
|
1294
|
+
links: "none"
|
|
1295
|
+
};
|
|
1296
|
+
});
|
|
1297
|
+
}
|
|
1298
|
+
#listAll = (initializeDeferredDecorator(this, "listAll"), void 0);
|
|
1299
|
+
}
|
|
1300
|
+
assert.strictEqual(getDeclaredOperations(Gradebook).listAll.links, "none", "while a query may");
|
|
1301
|
+
assert.throws(() => {
|
|
1302
|
+
class Report extends CardDef {
|
|
1303
|
+
static {
|
|
1304
|
+
decorateFieldV2(this, "listAll", [operation], function() {
|
|
1305
|
+
return {
|
|
1306
|
+
base: "query",
|
|
1307
|
+
query: { filter: { type: () => Report } },
|
|
1308
|
+
links: "some"
|
|
1309
|
+
};
|
|
1310
|
+
});
|
|
1311
|
+
}
|
|
1312
|
+
#listAll = (initializeDeferredDecorator(this, "listAll"), void 0);
|
|
1313
|
+
}
|
|
1314
|
+
return Report;
|
|
1315
|
+
}, /`links` must name how much of the card's link graph each of this query's results carries/, "a query names one of the same three");
|
|
1316
|
+
class Roster extends CardDef {
|
|
1317
|
+
static {
|
|
1318
|
+
decorateFieldV2(this, "listAll", [operation], function() {
|
|
1319
|
+
return {
|
|
1320
|
+
base: "query",
|
|
1321
|
+
query: { filter: { type: () => Roster } },
|
|
1322
|
+
links: "ids"
|
|
1323
|
+
};
|
|
1324
|
+
});
|
|
1325
|
+
}
|
|
1326
|
+
#listAll = (initializeDeferredDecorator(this, "listAll"), void 0);
|
|
1327
|
+
}
|
|
1328
|
+
assert.strictEqual(getDeclaredOperations(Roster).listAll.links, "ids", "and a query that names one is declared with it");
|
|
1329
|
+
assert.throws(() => {
|
|
1330
|
+
class Report extends CardDef {
|
|
1331
|
+
static {
|
|
1332
|
+
decorateFieldV2(this, "rename", [operation], function() {
|
|
1333
|
+
return {
|
|
1334
|
+
base: "transform",
|
|
1335
|
+
set: { title: "Renamed" },
|
|
1336
|
+
html: { embedded: "unshareable" }
|
|
1337
|
+
};
|
|
1338
|
+
});
|
|
1339
|
+
}
|
|
1340
|
+
#rename = (initializeDeferredDecorator(this, "rename"), void 0);
|
|
1341
|
+
}
|
|
1342
|
+
return Report;
|
|
1343
|
+
}, /"html" is not a valid key for a "transform" operation/, "only a read or a query serves prerendered HTML to withhold");
|
|
1344
|
+
assert.throws(() => {
|
|
1345
|
+
class Report extends CardDef {
|
|
1346
|
+
static {
|
|
1347
|
+
decorateFieldV2(this, "summary", [operation], function() {
|
|
1348
|
+
return {
|
|
1349
|
+
base: "read",
|
|
1350
|
+
html: { edit: "unshareable" }
|
|
1351
|
+
};
|
|
1352
|
+
});
|
|
1353
|
+
}
|
|
1354
|
+
#summary = (initializeDeferredDecorator(this, "summary"), void 0);
|
|
1355
|
+
}
|
|
1356
|
+
return Report;
|
|
1357
|
+
}, /`html` names "edit", which is not a prerendered format/, "it names prerendered formats");
|
|
1358
|
+
assert.throws(() => {
|
|
1359
|
+
class Report extends CardDef {
|
|
1360
|
+
static {
|
|
1361
|
+
decorateFieldV2(this, "summary", [operation], function() {
|
|
1362
|
+
return {
|
|
1363
|
+
base: "read",
|
|
1364
|
+
html: { embedded: "hidden" }
|
|
1365
|
+
};
|
|
1366
|
+
});
|
|
1367
|
+
}
|
|
1368
|
+
#summary = (initializeDeferredDecorator(this, "summary"), void 0);
|
|
1369
|
+
}
|
|
1370
|
+
return Report;
|
|
1371
|
+
}, /`html.embedded` must say whether the format's prerendered HTML is served/, "each shareable or unshareable");
|
|
1372
|
+
assert.throws(() => {
|
|
1373
|
+
class Report extends CardDef {
|
|
1374
|
+
static {
|
|
1375
|
+
decorateFieldV2(this, "listAll", [operation], function() {
|
|
1376
|
+
return {
|
|
1377
|
+
base: "query",
|
|
1378
|
+
query: { filter: { type: () => Report } },
|
|
1379
|
+
html: ["embedded"]
|
|
1380
|
+
};
|
|
1381
|
+
});
|
|
1382
|
+
}
|
|
1383
|
+
#listAll = (initializeDeferredDecorator(this, "listAll"), void 0);
|
|
1384
|
+
}
|
|
1385
|
+
return Report;
|
|
1386
|
+
}, /`html` must be an object naming which prerendered formats this query's results are served data-only for/, "by format");
|
|
1387
|
+
class Classroom extends CardDef {
|
|
1388
|
+
static {
|
|
1389
|
+
decorateFieldV2(this, "read", [operation], function() {
|
|
1390
|
+
return {
|
|
1391
|
+
base: "read",
|
|
1392
|
+
html: { embedded: "unshareable" }
|
|
1393
|
+
};
|
|
1394
|
+
});
|
|
1395
|
+
}
|
|
1396
|
+
#read = (initializeDeferredDecorator(this, "read"), void 0);
|
|
1397
|
+
static {
|
|
1398
|
+
decorateFieldV2(this, "listAll", [operation], function() {
|
|
1399
|
+
return {
|
|
1400
|
+
base: "query",
|
|
1401
|
+
query: { filter: { type: () => Classroom } },
|
|
1402
|
+
html: {
|
|
1403
|
+
fitted: "unshareable",
|
|
1404
|
+
isolated: "shareable"
|
|
1405
|
+
}
|
|
1406
|
+
};
|
|
1407
|
+
});
|
|
1408
|
+
}
|
|
1409
|
+
#listAll = (initializeDeferredDecorator(this, "listAll"), void 0);
|
|
1410
|
+
}
|
|
1411
|
+
assert.deepEqual(getDeclaredOperations(Classroom).read.html, { embedded: "unshareable" }, "a read that names formats is declared with them");
|
|
1412
|
+
assert.deepEqual(getDeclaredOperations(Classroom).listAll.html, {
|
|
1413
|
+
fitted: "unshareable",
|
|
1414
|
+
isolated: "shareable"
|
|
1415
|
+
}, "and so is a query");
|
|
1416
|
+
assert.throws(() => {
|
|
1417
|
+
class Report extends CardDef {
|
|
1418
|
+
static {
|
|
1419
|
+
decorateFieldV2(this, "escalate", [operation], function() {
|
|
1420
|
+
return {
|
|
1421
|
+
base: "transform",
|
|
1422
|
+
set: { status: "escalated" },
|
|
1423
|
+
transformations: bxl`.status = "escalated";`
|
|
1424
|
+
};
|
|
1425
|
+
});
|
|
1426
|
+
}
|
|
1427
|
+
#escalate = (initializeDeferredDecorator(this, "escalate"), void 0);
|
|
1428
|
+
}
|
|
1429
|
+
return Report;
|
|
1430
|
+
}, /either with clauses .* or with a raw/, "the declarative clauses and a raw program are alternatives");
|
|
1431
|
+
assert.throws(() => {
|
|
1432
|
+
class Report extends CardDef {
|
|
1433
|
+
static {
|
|
1434
|
+
decorateFieldV2(this, "escalate", [operation], function() {
|
|
1435
|
+
return {
|
|
1436
|
+
base: "transform",
|
|
1437
|
+
transformations: ".status = \"escalated\";"
|
|
1438
|
+
};
|
|
1439
|
+
});
|
|
1440
|
+
}
|
|
1441
|
+
#escalate = (initializeDeferredDecorator(this, "escalate"), void 0);
|
|
1442
|
+
}
|
|
1443
|
+
return Report;
|
|
1444
|
+
}, /must be a program written with the bxl tag/, "a raw program comes from the bxl tag, not a bare string");
|
|
1445
|
+
assert.throws(() => {
|
|
1446
|
+
class Report extends CardDef {
|
|
1447
|
+
static {
|
|
1448
|
+
decorateFieldV2(this, "listMine", [operation], function() {
|
|
1449
|
+
return { base: "query" };
|
|
1450
|
+
});
|
|
1451
|
+
}
|
|
1452
|
+
#listMine = (initializeDeferredDecorator(this, "listMine"), void 0);
|
|
1453
|
+
}
|
|
1454
|
+
return Report;
|
|
1455
|
+
}, /a "query" operation needs/, "a named query is the query it saves");
|
|
1456
|
+
assert.throws(() => {
|
|
1457
|
+
class Report extends CardDef {
|
|
1458
|
+
static {
|
|
1459
|
+
decorateFieldV2(this, "addComment", [operation], function() {
|
|
1460
|
+
return {
|
|
1461
|
+
base: "transform",
|
|
1462
|
+
append: {
|
|
1463
|
+
to: "comments",
|
|
1464
|
+
value: "hello",
|
|
1465
|
+
into: "comments"
|
|
1466
|
+
}
|
|
1467
|
+
};
|
|
1468
|
+
});
|
|
1469
|
+
}
|
|
1470
|
+
#addComment = (initializeDeferredDecorator(this, "addComment"), void 0);
|
|
1471
|
+
}
|
|
1472
|
+
return Report;
|
|
1473
|
+
}, /"into" is not a valid key/, "a clause accepts only the keys it is made of");
|
|
1474
|
+
assert.throws(() => {
|
|
1475
|
+
class Report extends CardDef {
|
|
1476
|
+
static {
|
|
1477
|
+
decorateFieldV2(this, "addComment", [operation], function() {
|
|
1478
|
+
return {
|
|
1479
|
+
base: "transform",
|
|
1480
|
+
append: {
|
|
1481
|
+
to: "comments",
|
|
1482
|
+
value: { body: { $ref: "payload" } }
|
|
1483
|
+
}
|
|
1484
|
+
};
|
|
1485
|
+
});
|
|
1486
|
+
}
|
|
1487
|
+
#addComment = (initializeDeferredDecorator(this, "addComment"), void 0);
|
|
1488
|
+
}
|
|
1489
|
+
return Report;
|
|
1490
|
+
}, /is not a typed reference/, "a reference comes from one of the reference constructors");
|
|
1491
|
+
});
|
|
1492
|
+
(0, import_qunit.test)("a param is typed by a field class, and nothing else", function(assert) {
|
|
1493
|
+
assert.throws(() => {
|
|
1494
|
+
class Report extends CardDef {
|
|
1495
|
+
static {
|
|
1496
|
+
decorateFieldV2(this, "addComment", [operation], function() {
|
|
1497
|
+
return {
|
|
1498
|
+
base: "transform",
|
|
1499
|
+
params: { author: CardDef },
|
|
1500
|
+
append: {
|
|
1501
|
+
to: "comments",
|
|
1502
|
+
value: { author: params("author") }
|
|
1503
|
+
}
|
|
1504
|
+
};
|
|
1505
|
+
});
|
|
1506
|
+
}
|
|
1507
|
+
#addComment = (initializeDeferredDecorator(this, "addComment"), void 0);
|
|
1508
|
+
}
|
|
1509
|
+
return Report;
|
|
1510
|
+
}, /a card or file identity is a linkTo/, "a card class types a link param, which is what linkTo declares");
|
|
1511
|
+
assert.throws(() => {
|
|
1512
|
+
class Report extends CardDef {
|
|
1513
|
+
static {
|
|
1514
|
+
decorateFieldV2(this, "addComment", [operation], function() {
|
|
1515
|
+
return {
|
|
1516
|
+
base: "transform",
|
|
1517
|
+
params: { body: () => string_default },
|
|
1518
|
+
append: {
|
|
1519
|
+
to: "comments",
|
|
1520
|
+
value: { body: params("body") }
|
|
1521
|
+
}
|
|
1522
|
+
};
|
|
1523
|
+
});
|
|
1524
|
+
}
|
|
1525
|
+
#addComment = (initializeDeferredDecorator(this, "addComment"), void 0);
|
|
1526
|
+
}
|
|
1527
|
+
return Report;
|
|
1528
|
+
}, /param "body" must be a field class or linkTo/, "a scalar param takes the field class itself, not a thunk");
|
|
1529
|
+
});
|
|
1530
|
+
(0, import_qunit.test)("a declaration carries only what survives as data", function(assert) {
|
|
1531
|
+
for (let [value, pattern, message] of [
|
|
1532
|
+
[
|
|
1533
|
+
() => "escalated",
|
|
1534
|
+
/is a function; a declaration is data/,
|
|
1535
|
+
"a function would never reach the realm"
|
|
1536
|
+
],
|
|
1537
|
+
[
|
|
1538
|
+
/* @__PURE__ */ new Date(),
|
|
1539
|
+
/is a Date instance/,
|
|
1540
|
+
"a date would flatten to a string"
|
|
1541
|
+
],
|
|
1542
|
+
[
|
|
1543
|
+
/* @__PURE__ */ new Map(),
|
|
1544
|
+
/is a Map instance/,
|
|
1545
|
+
"a map would flatten to an empty object"
|
|
1546
|
+
],
|
|
1547
|
+
[
|
|
1548
|
+
void 0,
|
|
1549
|
+
/omit an optional key rather than declaring it as undefined/,
|
|
1550
|
+
"an undefined value would be dropped"
|
|
1551
|
+
],
|
|
1552
|
+
[
|
|
1553
|
+
1n,
|
|
1554
|
+
/is a bigint/,
|
|
1555
|
+
"a bigint cannot be serialized at all"
|
|
1556
|
+
]
|
|
1557
|
+
]) assert.throws(() => {
|
|
1558
|
+
class Report extends CardDef {
|
|
1559
|
+
static {
|
|
1560
|
+
decorateFieldV2(this, "escalate", [operation], function() {
|
|
1561
|
+
return {
|
|
1562
|
+
base: "transform",
|
|
1563
|
+
set: { status: value }
|
|
1564
|
+
};
|
|
1565
|
+
});
|
|
1566
|
+
}
|
|
1567
|
+
#escalate = (initializeDeferredDecorator(this, "escalate"), void 0);
|
|
1568
|
+
}
|
|
1569
|
+
return Report;
|
|
1570
|
+
}, pattern, message);
|
|
1571
|
+
class Activity extends CardDef {}
|
|
1572
|
+
class Classroom extends CardDef {
|
|
1573
|
+
static {
|
|
1574
|
+
decorateFieldV2(this, "createActivity", [operation], function() {
|
|
1575
|
+
return {
|
|
1576
|
+
base: "create",
|
|
1577
|
+
of: Activity,
|
|
1578
|
+
params: { title: string_default },
|
|
1579
|
+
fill: { title: params("title") }
|
|
1580
|
+
};
|
|
1581
|
+
});
|
|
1582
|
+
}
|
|
1583
|
+
#createActivity = (initializeDeferredDecorator(this, "createActivity"), void 0);
|
|
1584
|
+
static {
|
|
1585
|
+
decorateFieldV2(this, "listActivities", [operation], function() {
|
|
1586
|
+
return {
|
|
1587
|
+
base: "query",
|
|
1588
|
+
query: { filter: {
|
|
1589
|
+
on: Activity,
|
|
1590
|
+
eq: { classroom: instance("id") }
|
|
1591
|
+
} }
|
|
1592
|
+
};
|
|
1593
|
+
});
|
|
1594
|
+
}
|
|
1595
|
+
#listActivities = (initializeDeferredDecorator(this, "listActivities"), void 0);
|
|
1596
|
+
}
|
|
1597
|
+
let declarations = getOperations(Classroom);
|
|
1598
|
+
assert.strictEqual(declarations.createActivity.of, Activity, "a create names the class it creates");
|
|
1599
|
+
assert.strictEqual(declarations.listActivities.query.filter.on, Activity, "and a query names the class it filters on");
|
|
1600
|
+
});
|
|
1601
|
+
(0, import_qunit.test)("a def class is legal only where a slot names a type", function(assert) {
|
|
1602
|
+
class Activity extends CardDef {}
|
|
1603
|
+
class Classroom extends CardDef {
|
|
1604
|
+
static {
|
|
1605
|
+
decorateFieldV2(this, "listActivities", [operation], function() {
|
|
1606
|
+
return {
|
|
1607
|
+
base: "query",
|
|
1608
|
+
query: { filter: { any: [{
|
|
1609
|
+
on: () => Activity,
|
|
1610
|
+
eq: { status: "open" }
|
|
1611
|
+
}] } }
|
|
1612
|
+
};
|
|
1613
|
+
});
|
|
1614
|
+
}
|
|
1615
|
+
#listActivities = (initializeDeferredDecorator(this, "listActivities"), void 0);
|
|
1616
|
+
static {
|
|
1617
|
+
decorateFieldV2(this, "makeActivity", [operation], function() {
|
|
1618
|
+
return {
|
|
1619
|
+
base: "create",
|
|
1620
|
+
of: Activity,
|
|
1621
|
+
params: { title: string_default },
|
|
1622
|
+
transformations: bxl`.title = params("title");`
|
|
1623
|
+
};
|
|
1624
|
+
});
|
|
1625
|
+
}
|
|
1626
|
+
#makeActivity = (initializeDeferredDecorator(this, "makeActivity"), void 0);
|
|
1627
|
+
}
|
|
1628
|
+
let declarations = getDeclaredOperations(Classroom);
|
|
1629
|
+
assert.strictEqual(declarations.makeActivity.of, Activity, "a program-driven create still names what it creates");
|
|
1630
|
+
assert.strictEqual(typeof declarations.listActivities.query.filter.any[0].on, "function", "and a nested filter still names its type");
|
|
1631
|
+
assert.throws(() => {
|
|
1632
|
+
class Report extends CardDef {
|
|
1633
|
+
static {
|
|
1634
|
+
decorateFieldV2(this, "listSome", [operation], function() {
|
|
1635
|
+
return {
|
|
1636
|
+
base: "query",
|
|
1637
|
+
query: { filter: {
|
|
1638
|
+
on: Activity,
|
|
1639
|
+
eq: { owner: () => 1 }
|
|
1640
|
+
} }
|
|
1641
|
+
};
|
|
1642
|
+
});
|
|
1643
|
+
}
|
|
1644
|
+
#listSome = (initializeDeferredDecorator(this, "listSome"), void 0);
|
|
1645
|
+
}
|
|
1646
|
+
return Report;
|
|
1647
|
+
}, /is a function; a declaration is data/, "but a function anywhere else in a query would lower to nothing");
|
|
1648
|
+
assert.throws(() => {
|
|
1649
|
+
class Report extends CardDef {
|
|
1650
|
+
static {
|
|
1651
|
+
decorateFieldV2(this, "makeOne", [operation], function() {
|
|
1652
|
+
return {
|
|
1653
|
+
base: "create",
|
|
1654
|
+
of: string_default
|
|
1655
|
+
};
|
|
1656
|
+
});
|
|
1657
|
+
}
|
|
1658
|
+
#makeOne = (initializeDeferredDecorator(this, "makeOne"), void 0);
|
|
1659
|
+
}
|
|
1660
|
+
return Report;
|
|
1661
|
+
}, /must be a card class/, "and only a card can be created");
|
|
1662
|
+
assert.throws(() => linkTo(string_default), /card or file class/, "while a link points at something that has a URL");
|
|
1663
|
+
});
|
|
1664
|
+
(0, import_qunit.test)("a shared value is checked in every slot it appears", function(assert) {
|
|
1665
|
+
assert.throws(() => {
|
|
1666
|
+
let shared = { on: CardDef };
|
|
1667
|
+
class Report extends CardDef {
|
|
1668
|
+
static {
|
|
1669
|
+
decorateFieldV2(this, "listSome", [operation], function() {
|
|
1670
|
+
return {
|
|
1671
|
+
base: "query",
|
|
1672
|
+
query: { filter: shared },
|
|
1673
|
+
output: { leak: shared }
|
|
1674
|
+
};
|
|
1675
|
+
});
|
|
1676
|
+
}
|
|
1677
|
+
#listSome = (initializeDeferredDecorator(this, "listSome"), void 0);
|
|
1678
|
+
}
|
|
1679
|
+
return Report;
|
|
1680
|
+
}, /is a function; a declaration is data/, "validation does not memoize, so it cannot depend on key order");
|
|
1681
|
+
});
|
|
1682
|
+
(0, import_qunit.test)("a declaration must be a tree of finite values", function(assert) {
|
|
1683
|
+
assert.throws(() => {
|
|
1684
|
+
let value = { body: "x" };
|
|
1685
|
+
value.self = value;
|
|
1686
|
+
class Report extends CardDef {
|
|
1687
|
+
static {
|
|
1688
|
+
decorateFieldV2(this, "escalate", [operation], function() {
|
|
1689
|
+
return {
|
|
1690
|
+
base: "transform",
|
|
1691
|
+
set: value
|
|
1692
|
+
};
|
|
1693
|
+
});
|
|
1694
|
+
}
|
|
1695
|
+
#escalate = (initializeDeferredDecorator(this, "escalate"), void 0);
|
|
1696
|
+
}
|
|
1697
|
+
return Report;
|
|
1698
|
+
}, /refers back to a value that contains it/, "a cycle would throw when the declaration is serialized, far from here");
|
|
1699
|
+
assert.throws(() => {
|
|
1700
|
+
class Report extends CardDef {
|
|
1701
|
+
static {
|
|
1702
|
+
decorateFieldV2(this, "escalate", [operation], function() {
|
|
1703
|
+
return {
|
|
1704
|
+
base: "transform",
|
|
1705
|
+
set: { score: NaN }
|
|
1706
|
+
};
|
|
1707
|
+
});
|
|
1708
|
+
}
|
|
1709
|
+
#escalate = (initializeDeferredDecorator(this, "escalate"), void 0);
|
|
1710
|
+
}
|
|
1711
|
+
return Report;
|
|
1712
|
+
}, /serializes as null/, "and a non-finite number would quietly become null");
|
|
1713
|
+
});
|
|
1714
|
+
(0, import_qunit.test)("a marker carries only its own key", function(assert) {
|
|
1715
|
+
assert.throws(() => {
|
|
1716
|
+
class Report extends CardDef {
|
|
1717
|
+
static {
|
|
1718
|
+
decorateFieldV2(this, "escalate", [operation], function() {
|
|
1719
|
+
return {
|
|
1720
|
+
base: "transform",
|
|
1721
|
+
transformations: {
|
|
1722
|
+
$bxl: ".a = 1;",
|
|
1723
|
+
hook: () => 1
|
|
1724
|
+
}
|
|
1725
|
+
};
|
|
1726
|
+
});
|
|
1727
|
+
}
|
|
1728
|
+
#escalate = (initializeDeferredDecorator(this, "escalate"), void 0);
|
|
1729
|
+
}
|
|
1730
|
+
return Report;
|
|
1731
|
+
}, /is not a valid key/, "a program marker is not a place to smuggle a value past the walk");
|
|
1732
|
+
assert.throws(() => {
|
|
1733
|
+
class Report extends CardDef {
|
|
1734
|
+
static {
|
|
1735
|
+
decorateFieldV2(this, "addActivity", [operation], function() {
|
|
1736
|
+
return {
|
|
1737
|
+
base: "transform",
|
|
1738
|
+
params: { activity: {
|
|
1739
|
+
$linkTo: CardDef,
|
|
1740
|
+
junk: 1
|
|
1741
|
+
} },
|
|
1742
|
+
append: {
|
|
1743
|
+
to: "activities",
|
|
1744
|
+
value: card(params("activity"))
|
|
1745
|
+
}
|
|
1746
|
+
};
|
|
1747
|
+
});
|
|
1748
|
+
}
|
|
1749
|
+
#addActivity = (initializeDeferredDecorator(this, "addActivity"), void 0);
|
|
1750
|
+
}
|
|
1751
|
+
return Report;
|
|
1752
|
+
}, /is not a valid key/, "nor is a link param, which the reference walk skips");
|
|
1753
|
+
});
|
|
1754
|
+
(0, import_qunit.test)("a named query is checked for the shape a search needs", function(assert) {
|
|
1755
|
+
assert.throws(() => {
|
|
1756
|
+
class Report extends CardDef {
|
|
1757
|
+
static {
|
|
1758
|
+
decorateFieldV2(this, "listSome", [operation], function() {
|
|
1759
|
+
return {
|
|
1760
|
+
base: "query",
|
|
1761
|
+
query: {}
|
|
1762
|
+
};
|
|
1763
|
+
});
|
|
1764
|
+
}
|
|
1765
|
+
#listSome = (initializeDeferredDecorator(this, "listSome"), void 0);
|
|
1766
|
+
}
|
|
1767
|
+
return Report;
|
|
1768
|
+
}, /at least one of/, "a query with no query names no search");
|
|
1769
|
+
assert.throws(() => {
|
|
1770
|
+
class Report extends CardDef {
|
|
1771
|
+
static {
|
|
1772
|
+
decorateFieldV2(this, "listSome", [operation], function() {
|
|
1773
|
+
return {
|
|
1774
|
+
base: "query",
|
|
1775
|
+
query: {
|
|
1776
|
+
filter: { type: CardDef },
|
|
1777
|
+
page: { size: 0 }
|
|
1778
|
+
}
|
|
1779
|
+
};
|
|
1780
|
+
});
|
|
1781
|
+
}
|
|
1782
|
+
#listSome = (initializeDeferredDecorator(this, "listSome"), void 0);
|
|
1783
|
+
}
|
|
1784
|
+
return Report;
|
|
1785
|
+
}, /must be a positive integer/, "a page size is a count");
|
|
1786
|
+
assert.throws(() => {
|
|
1787
|
+
class Report extends CardDef {
|
|
1788
|
+
static {
|
|
1789
|
+
decorateFieldV2(this, "listSome", [operation], function() {
|
|
1790
|
+
return {
|
|
1791
|
+
base: "query",
|
|
1792
|
+
query: {
|
|
1793
|
+
filter: { type: CardDef },
|
|
1794
|
+
realms: "https://x/"
|
|
1795
|
+
}
|
|
1796
|
+
};
|
|
1797
|
+
});
|
|
1798
|
+
}
|
|
1799
|
+
#listSome = (initializeDeferredDecorator(this, "listSome"), void 0);
|
|
1800
|
+
}
|
|
1801
|
+
return Report;
|
|
1802
|
+
}, /non-empty array of realm URLs/, "and realms is the fan-out list, not one realm");
|
|
1803
|
+
});
|
|
1804
|
+
(0, import_qunit.test)("a query names a type only where the filter grammar has one", function(assert) {
|
|
1805
|
+
class Activity extends CardDef {}
|
|
1806
|
+
class Classroom extends CardDef {
|
|
1807
|
+
static {
|
|
1808
|
+
decorateFieldV2(this, "listAll", [operation], function() {
|
|
1809
|
+
return {
|
|
1810
|
+
base: "query",
|
|
1811
|
+
query: {
|
|
1812
|
+
filter: { any: [{ type: Activity }, { not: { type: Activity } }] },
|
|
1813
|
+
sort: [{
|
|
1814
|
+
by: "title",
|
|
1815
|
+
on: Activity
|
|
1816
|
+
}]
|
|
1817
|
+
}
|
|
1818
|
+
};
|
|
1819
|
+
});
|
|
1820
|
+
}
|
|
1821
|
+
#listAll = (initializeDeferredDecorator(this, "listAll"), void 0);
|
|
1822
|
+
static {
|
|
1823
|
+
decorateFieldV2(this, "listOpen", [operation], function() {
|
|
1824
|
+
return {
|
|
1825
|
+
base: "query",
|
|
1826
|
+
query: { filter: {
|
|
1827
|
+
on: Activity,
|
|
1828
|
+
eq: { status: "open" }
|
|
1829
|
+
} }
|
|
1830
|
+
};
|
|
1831
|
+
});
|
|
1832
|
+
}
|
|
1833
|
+
#listOpen = (initializeDeferredDecorator(this, "listOpen"), void 0);
|
|
1834
|
+
static {
|
|
1835
|
+
decorateFieldV2(this, "listEvery", [operation], function() {
|
|
1836
|
+
return {
|
|
1837
|
+
base: "query",
|
|
1838
|
+
query: { filter: { every: [{
|
|
1839
|
+
on: Activity,
|
|
1840
|
+
eq: { status: "open" }
|
|
1841
|
+
}, {
|
|
1842
|
+
on: Activity,
|
|
1843
|
+
range: { views: { gt: 10 } }
|
|
1844
|
+
}] } }
|
|
1845
|
+
};
|
|
1846
|
+
});
|
|
1847
|
+
}
|
|
1848
|
+
#listEvery = (initializeDeferredDecorator(this, "listEvery"), void 0);
|
|
1849
|
+
static {
|
|
1850
|
+
decorateFieldV2(this, "listRecent", [operation], function() {
|
|
1851
|
+
return {
|
|
1852
|
+
base: "query",
|
|
1853
|
+
query: { filter: {
|
|
1854
|
+
on: Activity,
|
|
1855
|
+
range: { on: { gt: 1 } }
|
|
1856
|
+
} }
|
|
1857
|
+
};
|
|
1858
|
+
});
|
|
1859
|
+
}
|
|
1860
|
+
#listRecent = (initializeDeferredDecorator(this, "listRecent"), void 0);
|
|
1861
|
+
}
|
|
1862
|
+
let declarations = getDeclaredOperations(Classroom);
|
|
1863
|
+
let queryOf = (name) => declarations[name].query;
|
|
1864
|
+
assert.strictEqual(queryOf("listAll").filter.any[0].type, Activity, "a pure card-type filter names the class itself");
|
|
1865
|
+
assert.strictEqual(queryOf("listEvery").filter.every[0].on, Activity, "and `every` holds filter nodes the same way `any` does");
|
|
1866
|
+
assert.strictEqual(queryOf("listAll").sort[0].on, Activity, "and so does a sort entry");
|
|
1867
|
+
assert.deepEqual(JSON.parse(JSON.stringify(queryOf("listRecent").filter.range)), { on: { gt: 1 } }, "a field named `on` under a predicate is data, not a type slot");
|
|
1868
|
+
assert.throws(() => {
|
|
1869
|
+
class Report extends CardDef {
|
|
1870
|
+
static {
|
|
1871
|
+
decorateFieldV2(this, "listSome", [operation], function() {
|
|
1872
|
+
return {
|
|
1873
|
+
base: "query",
|
|
1874
|
+
query: { filter: { eq: {
|
|
1875
|
+
on: Activity,
|
|
1876
|
+
status: "open"
|
|
1877
|
+
} } }
|
|
1878
|
+
};
|
|
1879
|
+
});
|
|
1880
|
+
}
|
|
1881
|
+
#listSome = (initializeDeferredDecorator(this, "listSome"), void 0);
|
|
1882
|
+
}
|
|
1883
|
+
return Report;
|
|
1884
|
+
}, /`query.filter.eq.on` is a function/, "a class under a predicate would lower to nothing and match everything");
|
|
1885
|
+
assert.throws(() => {
|
|
1886
|
+
class Report extends CardDef {
|
|
1887
|
+
static {
|
|
1888
|
+
decorateFieldV2(this, "listSome", [operation], function() {
|
|
1889
|
+
return {
|
|
1890
|
+
base: "query",
|
|
1891
|
+
query: { filter: {
|
|
1892
|
+
on: string_default,
|
|
1893
|
+
eq: { a: 1 }
|
|
1894
|
+
} }
|
|
1895
|
+
};
|
|
1896
|
+
});
|
|
1897
|
+
}
|
|
1898
|
+
#listSome = (initializeDeferredDecorator(this, "listSome"), void 0);
|
|
1899
|
+
}
|
|
1900
|
+
return Report;
|
|
1901
|
+
}, /must be a card or file class/, "and a type slot names something that has a type of its own");
|
|
1902
|
+
});
|
|
1903
|
+
(0, import_qunit.test)("a declaration pins the page the realm implements", function(assert) {
|
|
1904
|
+
class Activity extends CardDef {}
|
|
1905
|
+
class Report extends CardDef {
|
|
1906
|
+
static {
|
|
1907
|
+
decorateFieldV2(this, "listRecent", [operation], function() {
|
|
1908
|
+
return {
|
|
1909
|
+
base: "query",
|
|
1910
|
+
query: {
|
|
1911
|
+
filter: { type: Activity },
|
|
1912
|
+
page: {
|
|
1913
|
+
size: 20,
|
|
1914
|
+
number: 1
|
|
1915
|
+
}
|
|
1916
|
+
}
|
|
1917
|
+
};
|
|
1918
|
+
});
|
|
1919
|
+
}
|
|
1920
|
+
#listRecent = (initializeDeferredDecorator(this, "listRecent"), void 0);
|
|
1921
|
+
}
|
|
1922
|
+
assert.deepEqual(JSON.parse(JSON.stringify(getDeclaredOperations(Report).listRecent.query?.page)), {
|
|
1923
|
+
size: 20,
|
|
1924
|
+
number: 1
|
|
1925
|
+
}, "a page is a length and a 0-based offset, which is how the realm pages");
|
|
1926
|
+
});
|
|
1927
|
+
(0, import_qunit.test)("a declared query is checked against the realm grammar itself", function(assert) {
|
|
1928
|
+
class Activity extends CardDef {}
|
|
1929
|
+
class Report extends CardDef {
|
|
1930
|
+
static {
|
|
1931
|
+
decorateFieldV2(this, "search", [operation], function() {
|
|
1932
|
+
return {
|
|
1933
|
+
base: "query",
|
|
1934
|
+
params: { term: string_default },
|
|
1935
|
+
query: {
|
|
1936
|
+
filter: { type: Activity },
|
|
1937
|
+
queryString: params("term")
|
|
1938
|
+
}
|
|
1939
|
+
};
|
|
1940
|
+
});
|
|
1941
|
+
}
|
|
1942
|
+
#search = (initializeDeferredDecorator(this, "search"), void 0);
|
|
1943
|
+
}
|
|
1944
|
+
assert.strictEqual(getDeclaredOperations(Report).search.query.queryString.$ref, "params", "a query carrying a reference is left to the placement rule");
|
|
1945
|
+
assert.throws(() => {
|
|
1946
|
+
class Listing extends CardDef {
|
|
1947
|
+
static {
|
|
1948
|
+
decorateFieldV2(this, "listSome", [operation], function() {
|
|
1949
|
+
return {
|
|
1950
|
+
base: "query",
|
|
1951
|
+
query: { filter: { any: [{ on: Activity }] } }
|
|
1952
|
+
};
|
|
1953
|
+
});
|
|
1954
|
+
}
|
|
1955
|
+
#listSome = (initializeDeferredDecorator(this, "listSome"), void 0);
|
|
1956
|
+
}
|
|
1957
|
+
return Listing;
|
|
1958
|
+
}, /is not a query the realm accepts/, "a filter node with no predicate is not a filter");
|
|
1959
|
+
assert.throws(() => {
|
|
1960
|
+
class Listing extends CardDef {
|
|
1961
|
+
static {
|
|
1962
|
+
decorateFieldV2(this, "listSome", [operation], function() {
|
|
1963
|
+
return {
|
|
1964
|
+
base: "query",
|
|
1965
|
+
query: {
|
|
1966
|
+
filter: { type: Activity },
|
|
1967
|
+
sort: [{ by: "title" }]
|
|
1968
|
+
}
|
|
1969
|
+
};
|
|
1970
|
+
});
|
|
1971
|
+
}
|
|
1972
|
+
#listSome = (initializeDeferredDecorator(this, "listSome"), void 0);
|
|
1973
|
+
}
|
|
1974
|
+
return Listing;
|
|
1975
|
+
}, /is not a query the realm accepts/, "and a sort by a card field names the type it is rooted in");
|
|
1976
|
+
assert.throws(() => {
|
|
1977
|
+
class Listing extends CardDef {
|
|
1978
|
+
static {
|
|
1979
|
+
decorateFieldV2(this, "listSome", [operation], function() {
|
|
1980
|
+
return {
|
|
1981
|
+
base: "query",
|
|
1982
|
+
query: {
|
|
1983
|
+
filter: { type: Activity },
|
|
1984
|
+
queryString: 42
|
|
1985
|
+
}
|
|
1986
|
+
};
|
|
1987
|
+
});
|
|
1988
|
+
}
|
|
1989
|
+
#listSome = (initializeDeferredDecorator(this, "listSome"), void 0);
|
|
1990
|
+
}
|
|
1991
|
+
return Listing;
|
|
1992
|
+
}, /`query.queryString` must be a search term/, "a full-text term is a string, or a reference to one");
|
|
1993
|
+
});
|
|
1994
|
+
(0, import_qunit.test)("a create names what it creates whichever form its work takes", function(assert) {
|
|
1995
|
+
assert.throws(() => {
|
|
1996
|
+
class Report extends CardDef {
|
|
1997
|
+
static {
|
|
1998
|
+
decorateFieldV2(this, "makeOne", [operation], function() {
|
|
1999
|
+
return {
|
|
2000
|
+
base: "create",
|
|
2001
|
+
transformations: bxl`.title = "x";`
|
|
2002
|
+
};
|
|
2003
|
+
});
|
|
2004
|
+
}
|
|
2005
|
+
#makeOne = (initializeDeferredDecorator(this, "makeOne"), void 0);
|
|
2006
|
+
}
|
|
2007
|
+
return Report;
|
|
2008
|
+
}, /needs `of` to name what it creates/, "a program computes fields without saying what kind of card to create");
|
|
2009
|
+
});
|
|
2010
|
+
(0, import_qunit.test)("a marker is identified by a key of its own", function(assert) {
|
|
2011
|
+
assert.throws(() => {
|
|
2012
|
+
class Report extends CardDef {
|
|
2013
|
+
static {
|
|
2014
|
+
decorateFieldV2(this, "escalate", [operation], function() {
|
|
2015
|
+
return {
|
|
2016
|
+
base: "transform",
|
|
2017
|
+
set: { author: Object.create({ $ref: "actor" }) }
|
|
2018
|
+
};
|
|
2019
|
+
});
|
|
2020
|
+
}
|
|
2021
|
+
#escalate = (initializeDeferredDecorator(this, "escalate"), void 0);
|
|
2022
|
+
}
|
|
2023
|
+
return Report;
|
|
2024
|
+
}, /a declaration carries plain objects, arrays and primitives/, "a reference reached through a prototype is not a reference");
|
|
2025
|
+
assert.throws(() => {
|
|
2026
|
+
let reference = { $ref: "card" };
|
|
2027
|
+
reference.value = reference;
|
|
2028
|
+
class Report extends CardDef {
|
|
2029
|
+
static {
|
|
2030
|
+
decorateFieldV2(this, "escalate", [operation], function() {
|
|
2031
|
+
return {
|
|
2032
|
+
base: "transform",
|
|
2033
|
+
set: { owner: reference }
|
|
2034
|
+
};
|
|
2035
|
+
});
|
|
2036
|
+
}
|
|
2037
|
+
#escalate = (initializeDeferredDecorator(this, "escalate"), void 0);
|
|
2038
|
+
}
|
|
2039
|
+
return Report;
|
|
2040
|
+
}, /refers back to a value that contains it/, "and a reference that contains itself is refused, not recursed into");
|
|
2041
|
+
assert.throws(() => {
|
|
2042
|
+
class Report extends CardDef {
|
|
2043
|
+
static {
|
|
2044
|
+
decorateFieldV2(this, "addComment", [operation], function() {
|
|
2045
|
+
return {
|
|
2046
|
+
base: "transform",
|
|
2047
|
+
params: { body: string_default },
|
|
2048
|
+
append: {
|
|
2049
|
+
to: "comments",
|
|
2050
|
+
value: { body: {
|
|
2051
|
+
$ref: "params",
|
|
2052
|
+
key: "body",
|
|
2053
|
+
extra: 1
|
|
2054
|
+
} }
|
|
2055
|
+
}
|
|
2056
|
+
};
|
|
2057
|
+
});
|
|
2058
|
+
}
|
|
2059
|
+
#addComment = (initializeDeferredDecorator(this, "addComment"), void 0);
|
|
2060
|
+
}
|
|
2061
|
+
return Report;
|
|
2062
|
+
}, /"extra" is not a valid key/, "a reference marker carries only what its constructor puts there");
|
|
2063
|
+
assert.throws(() => {
|
|
2064
|
+
class Report extends CardDef {
|
|
2065
|
+
static {
|
|
2066
|
+
decorateFieldV2(this, "addActivity", [operation], function() {
|
|
2067
|
+
return {
|
|
2068
|
+
base: "transform",
|
|
2069
|
+
params: { activity: { $linkTo: string_default } },
|
|
2070
|
+
append: {
|
|
2071
|
+
to: "activities",
|
|
2072
|
+
value: card(params("activity"))
|
|
2073
|
+
}
|
|
2074
|
+
};
|
|
2075
|
+
});
|
|
2076
|
+
}
|
|
2077
|
+
#addActivity = (initializeDeferredDecorator(this, "addActivity"), void 0);
|
|
2078
|
+
}
|
|
2079
|
+
return Report;
|
|
2080
|
+
}, /links to a card or file class/, "a hand-written link marker is held to what linkTo requires");
|
|
2081
|
+
});
|
|
2082
|
+
(0, import_qunit.test)("the bxl tag reports being called as a function", function(assert) {
|
|
2083
|
+
assert.throws(() => bxl([".a = 1;"]), /template tag/, "every reference constructor says what it wanted");
|
|
2084
|
+
});
|
|
2085
|
+
(0, import_qunit.test)("every declaration guard reports what it wanted", function(assert) {
|
|
2086
|
+
let rejected = [
|
|
2087
|
+
[
|
|
2088
|
+
"optimistic",
|
|
2089
|
+
{
|
|
2090
|
+
base: "read",
|
|
2091
|
+
optimistic: "yes"
|
|
2092
|
+
},
|
|
2093
|
+
/`optimistic` must be a boolean/
|
|
2094
|
+
],
|
|
2095
|
+
[
|
|
2096
|
+
"input",
|
|
2097
|
+
{
|
|
2098
|
+
base: "read",
|
|
2099
|
+
input: ".a = 1;"
|
|
2100
|
+
},
|
|
2101
|
+
/`input` must be a program written with the bxl tag/
|
|
2102
|
+
],
|
|
2103
|
+
[
|
|
2104
|
+
"output",
|
|
2105
|
+
{
|
|
2106
|
+
base: "read",
|
|
2107
|
+
output: "title"
|
|
2108
|
+
},
|
|
2109
|
+
/`output` must be a projection object or a bxl program/
|
|
2110
|
+
],
|
|
2111
|
+
[
|
|
2112
|
+
"append not an object",
|
|
2113
|
+
{
|
|
2114
|
+
base: "transform",
|
|
2115
|
+
append: "comments"
|
|
2116
|
+
},
|
|
2117
|
+
/`append` must be an object naming the field/
|
|
2118
|
+
],
|
|
2119
|
+
[
|
|
2120
|
+
"append.to empty",
|
|
2121
|
+
{
|
|
2122
|
+
base: "transform",
|
|
2123
|
+
append: {
|
|
2124
|
+
to: "",
|
|
2125
|
+
value: 1
|
|
2126
|
+
}
|
|
2127
|
+
},
|
|
2128
|
+
/`append.to` must name the collection field/
|
|
2129
|
+
],
|
|
2130
|
+
[
|
|
2131
|
+
"append with no value",
|
|
2132
|
+
{
|
|
2133
|
+
base: "transform",
|
|
2134
|
+
append: { to: "comments" }
|
|
2135
|
+
},
|
|
2136
|
+
/`append` must carry a `value` to append/
|
|
2137
|
+
],
|
|
2138
|
+
[
|
|
2139
|
+
"assert not an object",
|
|
2140
|
+
{
|
|
2141
|
+
base: "transform",
|
|
2142
|
+
assert: "unique"
|
|
2143
|
+
},
|
|
2144
|
+
/`assert` must be an object naming the collection/
|
|
2145
|
+
],
|
|
2146
|
+
[
|
|
2147
|
+
"assert.unique empty",
|
|
2148
|
+
{
|
|
2149
|
+
base: "transform",
|
|
2150
|
+
assert: {
|
|
2151
|
+
unique: "",
|
|
2152
|
+
by: 1
|
|
2153
|
+
}
|
|
2154
|
+
},
|
|
2155
|
+
/`assert.unique` must name the collection field/
|
|
2156
|
+
],
|
|
2157
|
+
[
|
|
2158
|
+
"assert with no by",
|
|
2159
|
+
{
|
|
2160
|
+
base: "transform",
|
|
2161
|
+
assert: { unique: "owners" }
|
|
2162
|
+
},
|
|
2163
|
+
/`assert` must carry a `by` value/
|
|
2164
|
+
],
|
|
2165
|
+
[
|
|
2166
|
+
"assert.message",
|
|
2167
|
+
{
|
|
2168
|
+
base: "transform",
|
|
2169
|
+
assert: {
|
|
2170
|
+
unique: "o",
|
|
2171
|
+
by: 1,
|
|
2172
|
+
message: 2
|
|
2173
|
+
}
|
|
2174
|
+
},
|
|
2175
|
+
/`assert.message` must be a string/
|
|
2176
|
+
],
|
|
2177
|
+
[
|
|
2178
|
+
"set empty",
|
|
2179
|
+
{
|
|
2180
|
+
base: "transform",
|
|
2181
|
+
set: {}
|
|
2182
|
+
},
|
|
2183
|
+
/`set` must be an object mapping field names to values/
|
|
2184
|
+
],
|
|
2185
|
+
[
|
|
2186
|
+
"fill empty",
|
|
2187
|
+
{
|
|
2188
|
+
base: "create",
|
|
2189
|
+
of: CardDef,
|
|
2190
|
+
fill: {}
|
|
2191
|
+
},
|
|
2192
|
+
/`fill` must be an object mapping field names to values/
|
|
2193
|
+
],
|
|
2194
|
+
[
|
|
2195
|
+
"of not a function",
|
|
2196
|
+
{
|
|
2197
|
+
base: "create",
|
|
2198
|
+
of: "Activity"
|
|
2199
|
+
},
|
|
2200
|
+
/`of` must be the card class to create/
|
|
2201
|
+
],
|
|
2202
|
+
[
|
|
2203
|
+
"query not an object",
|
|
2204
|
+
{
|
|
2205
|
+
base: "query",
|
|
2206
|
+
query: "everything"
|
|
2207
|
+
},
|
|
2208
|
+
/`query` must be an object with at least one of/
|
|
2209
|
+
],
|
|
2210
|
+
[
|
|
2211
|
+
"query with an unknown key",
|
|
2212
|
+
{
|
|
2213
|
+
base: "query",
|
|
2214
|
+
query: {
|
|
2215
|
+
filter: { type: CardDef },
|
|
2216
|
+
junk: 1
|
|
2217
|
+
}
|
|
2218
|
+
},
|
|
2219
|
+
/"junk" is not a valid key for `query`/
|
|
2220
|
+
],
|
|
2221
|
+
[
|
|
2222
|
+
"query.page not an object",
|
|
2223
|
+
{
|
|
2224
|
+
base: "query",
|
|
2225
|
+
query: {
|
|
2226
|
+
filter: { type: CardDef },
|
|
2227
|
+
page: 10
|
|
2228
|
+
}
|
|
2229
|
+
},
|
|
2230
|
+
/`query.page` must be an object/
|
|
2231
|
+
],
|
|
2232
|
+
[
|
|
2233
|
+
"query.page with no size",
|
|
2234
|
+
{
|
|
2235
|
+
base: "query",
|
|
2236
|
+
query: {
|
|
2237
|
+
filter: { type: CardDef },
|
|
2238
|
+
page: { number: 1 }
|
|
2239
|
+
}
|
|
2240
|
+
},
|
|
2241
|
+
/`query.page.size` must be a positive integer/
|
|
2242
|
+
],
|
|
2243
|
+
[
|
|
2244
|
+
"query.page.number below zero",
|
|
2245
|
+
{
|
|
2246
|
+
base: "query",
|
|
2247
|
+
query: {
|
|
2248
|
+
filter: { type: CardDef },
|
|
2249
|
+
page: {
|
|
2250
|
+
size: 10,
|
|
2251
|
+
number: -1
|
|
2252
|
+
}
|
|
2253
|
+
}
|
|
2254
|
+
},
|
|
2255
|
+
/`query.page.number` must be a whole number/
|
|
2256
|
+
],
|
|
2257
|
+
[
|
|
2258
|
+
"cursor is not a page key",
|
|
2259
|
+
{
|
|
2260
|
+
base: "query",
|
|
2261
|
+
query: {
|
|
2262
|
+
filter: { type: CardDef },
|
|
2263
|
+
page: {
|
|
2264
|
+
size: 10,
|
|
2265
|
+
cursor: "x"
|
|
2266
|
+
}
|
|
2267
|
+
}
|
|
2268
|
+
},
|
|
2269
|
+
/"cursor" is not a valid key for `query.page`/
|
|
2270
|
+
],
|
|
2271
|
+
[
|
|
2272
|
+
"a params reference with a non-string key",
|
|
2273
|
+
{
|
|
2274
|
+
base: "transform",
|
|
2275
|
+
params: { body: string_default },
|
|
2276
|
+
set: { x: {
|
|
2277
|
+
$ref: "params",
|
|
2278
|
+
key: 1
|
|
2279
|
+
} }
|
|
2280
|
+
},
|
|
2281
|
+
/must name a param/
|
|
2282
|
+
],
|
|
2283
|
+
[
|
|
2284
|
+
"an actor reference carrying a key",
|
|
2285
|
+
{
|
|
2286
|
+
base: "transform",
|
|
2287
|
+
set: { x: {
|
|
2288
|
+
$ref: "actor",
|
|
2289
|
+
key: "id"
|
|
2290
|
+
} }
|
|
2291
|
+
},
|
|
2292
|
+
/carries a key; actor\(\) is the caller's user id and has no members to read/
|
|
2293
|
+
],
|
|
2294
|
+
[
|
|
2295
|
+
"an instance reference with an empty key",
|
|
2296
|
+
{
|
|
2297
|
+
base: "transform",
|
|
2298
|
+
set: { x: {
|
|
2299
|
+
$ref: "instance",
|
|
2300
|
+
key: ""
|
|
2301
|
+
} }
|
|
2302
|
+
},
|
|
2303
|
+
/must name a member, or none at all/
|
|
2304
|
+
],
|
|
2305
|
+
[
|
|
2306
|
+
"a card reference wrapping the caller",
|
|
2307
|
+
{
|
|
2308
|
+
base: "transform",
|
|
2309
|
+
set: { x: {
|
|
2310
|
+
$ref: "card",
|
|
2311
|
+
value: { $ref: "actor" }
|
|
2312
|
+
} }
|
|
2313
|
+
},
|
|
2314
|
+
/`actor\(\)` is the caller's user id rather than a card/
|
|
2315
|
+
],
|
|
2316
|
+
[
|
|
2317
|
+
"a card reference with a non-reference value",
|
|
2318
|
+
{
|
|
2319
|
+
base: "transform",
|
|
2320
|
+
set: { x: {
|
|
2321
|
+
$ref: "card",
|
|
2322
|
+
value: 1
|
|
2323
|
+
} }
|
|
2324
|
+
},
|
|
2325
|
+
/must carry a card URL or a reference to one/
|
|
2326
|
+
]
|
|
2327
|
+
];
|
|
2328
|
+
for (let [name, declaration, pattern] of rejected) assert.throws(() => {
|
|
2329
|
+
class Report extends CardDef {
|
|
2330
|
+
static {
|
|
2331
|
+
decorateFieldV2(this, "candidate", [operation], function() {
|
|
2332
|
+
return declaration;
|
|
2333
|
+
});
|
|
2334
|
+
}
|
|
2335
|
+
#candidate = (initializeDeferredDecorator(this, "candidate"), void 0);
|
|
2336
|
+
}
|
|
2337
|
+
return Report;
|
|
2338
|
+
}, pattern, `a declaration is refused for ${name}`);
|
|
2339
|
+
});
|
|
2340
|
+
(0, import_qunit.test)("the caller is typed as a user id, not as a card", function(assert) {
|
|
2341
|
+
let keyed = () => actor("id");
|
|
2342
|
+
let wrapped = () => card(actor());
|
|
2343
|
+
assert.throws(keyed, /takes no argument/);
|
|
2344
|
+
assert.throws(wrapped, /rather than a card/);
|
|
2345
|
+
assert.deepEqual(actor(), { $ref: "actor" }, "the one form it does have carries nothing but its kind");
|
|
2346
|
+
});
|
|
2347
|
+
(0, import_qunit.test)("every reference constructor reports what it wanted", function(assert) {
|
|
2348
|
+
let rejected = [
|
|
2349
|
+
[
|
|
2350
|
+
"params with no name",
|
|
2351
|
+
() => params(""),
|
|
2352
|
+
/takes the name of a param declared/
|
|
2353
|
+
],
|
|
2354
|
+
[
|
|
2355
|
+
"params with a non-string",
|
|
2356
|
+
() => params(1),
|
|
2357
|
+
/takes the name of a param declared/
|
|
2358
|
+
],
|
|
2359
|
+
[
|
|
2360
|
+
"card with no URL",
|
|
2361
|
+
() => card(""),
|
|
2362
|
+
/takes a card URL or a typed reference to one/
|
|
2363
|
+
],
|
|
2364
|
+
[
|
|
2365
|
+
"card with a non-reference",
|
|
2366
|
+
() => card(1),
|
|
2367
|
+
/takes a card URL or a typed reference to one/
|
|
2368
|
+
],
|
|
2369
|
+
[
|
|
2370
|
+
"linkTo with a non-class",
|
|
2371
|
+
() => linkTo("Activity"),
|
|
2372
|
+
/takes a card class/
|
|
2373
|
+
],
|
|
2374
|
+
[
|
|
2375
|
+
"actor with an argument",
|
|
2376
|
+
() => actor("id"),
|
|
2377
|
+
/actor\(\) takes no argument; it is the caller's user id/
|
|
2378
|
+
],
|
|
2379
|
+
[
|
|
2380
|
+
"card wrapping the caller",
|
|
2381
|
+
() => card(actor()),
|
|
2382
|
+
/`actor\(\)` is the caller's user id rather than a card/
|
|
2383
|
+
],
|
|
2384
|
+
[
|
|
2385
|
+
"instance with a non-string key",
|
|
2386
|
+
() => instance(1),
|
|
2387
|
+
/takes the name of a member to read, or no argument at all/
|
|
2388
|
+
],
|
|
2389
|
+
[
|
|
2390
|
+
"realmConfig with an empty key",
|
|
2391
|
+
() => realmConfig(""),
|
|
2392
|
+
/takes the name of a member to read, or no argument at all/
|
|
2393
|
+
]
|
|
2394
|
+
];
|
|
2395
|
+
for (let [name, build, pattern] of rejected) assert.throws(build, pattern, `${name} is refused`);
|
|
2396
|
+
});
|
|
2397
|
+
(0, import_qunit.test)("a def with no mutation surface carries only its reads", function(assert) {
|
|
2398
|
+
class Bare extends BaseDef {}
|
|
2399
|
+
assert.deepEqual(getOperations(Bare), {
|
|
2400
|
+
read: implied("read"),
|
|
2401
|
+
readSource: implied("readSource")
|
|
2402
|
+
}, "the two reads are what every addressable def shares");
|
|
2403
|
+
assert.throws(() => {
|
|
2404
|
+
class Mutable extends BaseDef {
|
|
2405
|
+
static {
|
|
2406
|
+
decorateFieldV2(this, "escalate", [operation], function() {
|
|
2407
|
+
return {
|
|
2408
|
+
base: "transform",
|
|
2409
|
+
set: { status: "escalated" }
|
|
2410
|
+
};
|
|
2411
|
+
});
|
|
2412
|
+
}
|
|
2413
|
+
#escalate = (initializeDeferredDecorator(this, "escalate"), void 0);
|
|
2414
|
+
}
|
|
2415
|
+
return Mutable;
|
|
2416
|
+
}, /carries only "read", "readSource"/, "and a def that carries no mutation base cannot declare one");
|
|
2417
|
+
});
|
|
2418
|
+
(0, import_qunit.test)("getOperations rejects a target that is not a card definition", function(assert) {
|
|
2419
|
+
assert.throws(() => getDeclaredOperations({}), /getDeclaredOperations\(\) takes a class that extends BaseDef/, "each reader names itself in its own error");
|
|
2420
|
+
assert.throws(() => getOperations({}), /getOperations\(\) takes a class that extends BaseDef/, "operations hang off a definition, so a plain object reads none");
|
|
2421
|
+
});
|
|
2422
|
+
(0, import_qunit.test)("a params reference must name a declared param", function(assert) {
|
|
2423
|
+
assert.throws(() => {
|
|
2424
|
+
class Report extends CardDef {
|
|
2425
|
+
static {
|
|
2426
|
+
decorateFieldV2(this, "addComment", [operation], function() {
|
|
2427
|
+
return {
|
|
2428
|
+
base: "transform",
|
|
2429
|
+
params: { body: string_default },
|
|
2430
|
+
append: {
|
|
2431
|
+
to: "comments",
|
|
2432
|
+
value: { body: params("title") }
|
|
2433
|
+
}
|
|
2434
|
+
};
|
|
2435
|
+
});
|
|
2436
|
+
}
|
|
2437
|
+
#addComment = (initializeDeferredDecorator(this, "addComment"), void 0);
|
|
2438
|
+
}
|
|
2439
|
+
return Report;
|
|
2440
|
+
}, /references the param "title"/, "the declared schema is the single source for what the payload carries");
|
|
2441
|
+
assert.throws(() => {
|
|
2442
|
+
class Report extends CardDef {
|
|
2443
|
+
static {
|
|
2444
|
+
decorateFieldV2(this, "addComment", [operation], function() {
|
|
2445
|
+
return {
|
|
2446
|
+
base: "transform",
|
|
2447
|
+
params: { body: "string" },
|
|
2448
|
+
append: {
|
|
2449
|
+
to: "comments",
|
|
2450
|
+
value: { body: params("body") }
|
|
2451
|
+
}
|
|
2452
|
+
};
|
|
2453
|
+
});
|
|
2454
|
+
}
|
|
2455
|
+
#addComment = (initializeDeferredDecorator(this, "addComment"), void 0);
|
|
2456
|
+
}
|
|
2457
|
+
return Report;
|
|
2458
|
+
}, /param "body" must be a field class or linkTo/, "a param names the field class that types it");
|
|
2459
|
+
});
|
|
2460
|
+
(0, import_qunit.test)("the declared params schema types the operation payload", function(assert) {
|
|
2461
|
+
class ClassroomActivity extends CardDef {}
|
|
2462
|
+
let addActivity = {
|
|
2463
|
+
base: "transform",
|
|
2464
|
+
params: {
|
|
2465
|
+
note: string_default,
|
|
2466
|
+
activity: linkTo(ClassroomActivity)
|
|
2467
|
+
},
|
|
2468
|
+
append: {
|
|
2469
|
+
to: "activities",
|
|
2470
|
+
value: card(params("activity"))
|
|
2471
|
+
}
|
|
2472
|
+
};
|
|
2473
|
+
let bodyReference = params("body");
|
|
2474
|
+
class Report extends CardDef {
|
|
2475
|
+
static {
|
|
2476
|
+
decorateFieldV2(this, "addComment", [operation], function() {
|
|
2477
|
+
return {
|
|
2478
|
+
base: "transform",
|
|
2479
|
+
params: { body: string_default },
|
|
2480
|
+
append: {
|
|
2481
|
+
to: "comments",
|
|
2482
|
+
value: { body: params("body") }
|
|
2483
|
+
}
|
|
2484
|
+
};
|
|
2485
|
+
});
|
|
2486
|
+
}
|
|
2487
|
+
#addComment = (initializeDeferredDecorator(this, "addComment"), void 0);
|
|
2488
|
+
}
|
|
2489
|
+
class Themed extends CardDef {
|
|
2490
|
+
static theme = {
|
|
2491
|
+
base: "dark",
|
|
2492
|
+
accent: "#fff"
|
|
2493
|
+
};
|
|
2494
|
+
static {
|
|
2495
|
+
decorateFieldV2(this, "ping", [operation], function() {
|
|
2496
|
+
return { base: "read" };
|
|
2497
|
+
});
|
|
2498
|
+
}
|
|
2499
|
+
#ping = (initializeDeferredDecorator(this, "ping"), void 0);
|
|
2500
|
+
}
|
|
2501
|
+
assert.deepEqual(Object.keys(getDeclaredOperations(Themed)), ["ping"], "and the reader agrees with the type at run time");
|
|
2502
|
+
class Classroom extends CardDef {
|
|
2503
|
+
static {
|
|
2504
|
+
decorateFieldV2(this, "addActivity", [operation], function() {
|
|
2505
|
+
return addActivity;
|
|
2506
|
+
});
|
|
2507
|
+
}
|
|
2508
|
+
#addActivity = (initializeDeferredDecorator(this, "addActivity"), void 0);
|
|
2509
|
+
}
|
|
2510
|
+
assert.deepEqual(Object.keys(getDeclaredOperations(Classroom).addActivity.params ?? {}), ["note", "activity"], "a scalar param and a link param sit in the same schema");
|
|
2511
|
+
assert.deepEqual(bodyReference, {
|
|
2512
|
+
$ref: "params",
|
|
2513
|
+
key: "body"
|
|
2514
|
+
}, "the key a reference names is carried in the marker and in its type");
|
|
2515
|
+
assert.deepEqual(Object.keys(getDeclaredOperations(Report)), ["addComment"], "a declaration written against the exported types is recorded like any other");
|
|
2516
|
+
});
|
|
2517
|
+
});
|
|
2518
|
+
//#endregion
|