@cardstack/boxel-cli 0.9.0 → 0.10.0-unstable.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -0
- package/bundled-test-harness/assets/account-switch-failed-GCSVbJML.js +23 -0
- package/bundled-test-harness/assets/account-switch-failed-GsWni_Gk.css +18 -0
- package/bundled-test-harness/assets/account-switch-failed-test-CdZWNths.js +45 -0
- package/bundled-test-harness/assets/add-workspace-c7L50Gx8.js +141 -0
- package/bundled-test-harness/assets/add-workspace-test-BZxHa6Pe.js +72 -0
- package/bundled-test-harness/assets/advanced-color-picker-0pGF-3WG.js +504 -0
- package/bundled-test-harness/assets/advanced-color-picker-pbO4HWc_.js +2 -0
- package/bundled-test-harness/assets/ai-assistant-test-Dnm4o9vK.js +2211 -0
- package/bundled-test-harness/assets/ai-module-creation-test-C6253CMt.js +151 -0
- package/bundled-test-harness/assets/aibot-message-miKyGeKk.js +278 -0
- package/bundled-test-harness/assets/app-i8pGdQkw.js +22855 -0
- package/bundled-test-harness/assets/app-zC7o6PyQ.css +2718 -0
- package/bundled-test-harness/assets/audio-file-def-DHnydP0t.js +133 -0
- package/bundled-test-harness/assets/auth-container-BP2gSoo4.css +51 -0
- package/bundled-test-harness/assets/auth-container-DN94iVfX.js +24 -0
- package/bundled-test-harness/assets/avif-meta-extractor-Bo5zRX1V.js +162 -0
- package/bundled-test-harness/assets/base64-image-B0RYxzHT.js +2 -0
- package/bundled-test-harness/assets/base64-image-Bxjqdwew.js +262 -0
- package/bundled-test-harness/assets/big-integer-7RLj5_7H.js +89 -0
- package/bundled-test-harness/assets/big-integer-C9sJxKVy.js +2 -0
- package/bundled-test-harness/assets/binary-upload-dedupe-test-DZo3EaV0.js +308 -0
- package/bundled-test-harness/assets/boolean-CcKPYUph.js +94 -0
- package/bundled-test-harness/assets/boolean-DvsSmtM7.js +2 -0
- package/bundled-test-harness/assets/brand-functional-palette-KpVSY2Sa.js +137 -0
- package/bundled-test-harness/assets/brand-logo-DDiOec0t.js +295 -0
- package/bundled-test-harness/assets/broken-link-template-test-DAngUbFJ.js +192 -0
- package/bundled-test-harness/assets/bundled-base-C_lumba6.js +254 -0
- package/bundled-test-harness/assets/bundled-base-modules-test-CSF7Rl4Z.js +54 -0
- package/bundled-test-harness/assets/buried-stack-item-scroll-test-B0J_EP88.js +236 -0
- package/bundled-test-harness/assets/bxl-expression-test-Dej7WgI6.js +250 -0
- package/bundled-test-harness/assets/can-invoke-test-elyUcOKT.js +401 -0
- package/bundled-test-harness/assets/card-api-CjWXCkqh.js +8 -0
- package/bundled-test-harness/assets/card-api-Dzje0smT.js +4393 -0
- package/bundled-test-harness/assets/card-api-test-DA8d4Ooc.js +198 -0
- package/bundled-test-harness/assets/card-basics-test-mp1Odo-l.js +5364 -0
- package/bundled-test-harness/assets/card-chooser-paging-test-y8OfboYd.js +235 -0
- package/bundled-test-harness/assets/card-chooser-test-nmg2zkDj.js +393 -0
- package/bundled-test-harness/assets/card-collection-BXiO3i7R.js +118 -0
- package/bundled-test-harness/assets/card-context-search-results-Dbhn7lvW.js +30 -0
- package/bundled-test-harness/assets/card-context-search-results-test-DVXT-YC5.js +184 -0
- package/bundled-test-harness/assets/card-def-field-def-relationships-test-mX4rxrtO.js +562 -0
- package/bundled-test-harness/assets/card-delete-test-BxFsqFnX.js +466 -0
- package/bundled-test-harness/assets/card-error-C-7hjxu9.js +72 -0
- package/bundled-test-harness/assets/card-error-awaiting-index-test-BvfY2eaW.js +53 -0
- package/bundled-test-harness/assets/card-error-detail-nMwopDir.js +271 -0
- package/bundled-test-harness/assets/card-info-CTFxdohf.js +2 -0
- package/bundled-test-harness/assets/card-list-B9QrkJ97.js +2 -0
- package/bundled-test-harness/assets/card-list-XbwLCXZS.js +202 -0
- package/bundled-test-harness/assets/card-resource-JGLjQUy6.js +86 -0
- package/bundled-test-harness/assets/cards-grid-CWG41hZE.js +344 -0
- package/bundled-test-harness/assets/cards-grid-DSpX99p6.js +2 -0
- package/bundled-test-harness/assets/cards-grid-layout-Bht0LwZy.js +2 -0
- package/bundled-test-harness/assets/cards-grid-layout-CdpKlHUb.js +111 -0
- package/bundled-test-harness/assets/check-correctness-test-C4BrUeKA.js +554 -0
- package/bundled-test-harness/assets/clip-BEVvLrXx.js +2 -0
- package/bundled-test-harness/assets/clip-CoB714qX.js +92 -0
- package/bundled-test-harness/assets/code-ref-C2uguisI.js +2 -0
- package/bundled-test-harness/assets/code-ref-Cy7sV5a4.js +138 -0
- package/bundled-test-harness/assets/code-submode-availability-test-BsA_Ul01.js +198 -0
- package/bundled-test-harness/assets/code-submode-test-DkBhpEPB.js +1839 -0
- package/bundled-test-harness/assets/codeblocks-test-B1eZ2_JF.js +418 -0
- package/bundled-test-harness/assets/codemirror-editor-C6pxSm5y.js +2 -0
- package/bundled-test-harness/assets/codemirror-editor-DzM46Cd8.js +701 -0
- package/bundled-test-harness/assets/codemirror-embed-toolbar-test-BemP-ZdG.js +366 -0
- package/bundled-test-harness/assets/color-C-jGNFWZ.js +2 -0
- package/bundled-test-harness/assets/color-field-test-DPIRaBec.js +212 -0
- package/bundled-test-harness/assets/color-picker-field-Bv4IjS-d.js +139 -0
- package/bundled-test-harness/assets/color-picker-field-D1bYCQIg.js +2 -0
- package/bundled-test-harness/assets/color-wheel-picker-IIaCQplL.js +283 -0
- package/bundled-test-harness/assets/color-wheel-picker-Kw-UN3kV.js +2 -0
- package/bundled-test-harness/assets/color-zzCBneih.js +65 -0
- package/bundled-test-harness/assets/command-data-BMBtjT1E.js +95 -0
- package/bundled-test-harness/assets/command-data-BXC5Z0oA.js +2 -0
- package/bundled-test-harness/assets/compaction-test-CxUKnxlQ.js +150 -0
- package/bundled-test-harness/assets/components-Ct_agx0G.js +14294 -0
- package/bundled-test-harness/assets/computed-test-C-lpGQQ3.js +1320 -0
- package/bundled-test-harness/assets/container-BdPu8rvc.css +5565 -0
- package/bundled-test-harness/assets/container-Dj-5prh9.js +11288 -0
- package/bundled-test-harness/assets/contains-many-component-CAWqzX8W.js +2 -0
- package/bundled-test-harness/assets/contrast-checker-addon-BTLD7oMx.js +2 -0
- package/bundled-test-harness/assets/contrast-checker-addon-DBzizR04.js +71 -0
- package/bundled-test-harness/assets/convert-to-class-name-test-zZuKxYvF.js +17 -0
- package/bundled-test-harness/assets/coordinate-Bw8va6tO.js +48 -0
- package/bundled-test-harness/assets/copy-file-to-realm-test-DtCKPzqj.js +148 -0
- package/bundled-test-harness/assets/country-B_tWpLlO.js +199 -0
- package/bundled-test-harness/assets/create-file-modal-D-VPyEYp.js +570 -0
- package/bundled-test-harness/assets/create-listing-modal-test-hyLkQY0u.js +273 -0
- package/bundled-test-harness/assets/create-listing-pr-request-test-rjWFA_5S.js +117 -0
- package/bundled-test-harness/assets/create-spec-test-HKIxZGxK.js +256 -0
- package/bundled-test-harness/assets/create-specs-9-ELVyJP.js +215 -0
- package/bundled-test-harness/assets/create-submission-workflow-test-DNZrbRX8.js +132 -0
- package/bundled-test-harness/assets/credential-fields-test-xPEdA911.js +157 -0
- package/bundled-test-harness/assets/css-value-Du3HL39X.js +48 -0
- package/bundled-test-harness/assets/csv-file-def-EHRmilrp.js +277 -0
- package/bundled-test-harness/assets/currency-y6ZCHIqG.js +134 -0
- package/bundled-test-harness/assets/date-B27PrSFT.js +183 -0
- package/bundled-test-harness/assets/date-CiP5Eb9i.js +2 -0
- package/bundled-test-harness/assets/date-time-fields-test-Clf5vxRW.js +359 -0
- package/bundled-test-harness/assets/datetime-BEbR9YgU.js +201 -0
- package/bundled-test-harness/assets/datetime-DPnrt1wl.js +2 -0
- package/bundled-test-harness/assets/datetime-stamp-AuT7F7qn.js +2 -0
- package/bundled-test-harness/assets/datetime-stamp-CGwP2P3f.js +81 -0
- package/bundled-test-harness/assets/day-BFLxZ9bQ.js +2 -0
- package/bundled-test-harness/assets/day-CQoEkqgE.js +113 -0
- package/bundled-test-harness/assets/debug-message-test-CzgOpfcI.js +117 -0
- package/bundled-test-harness/assets/dist-B-fYvxfL.js +389 -0
- package/bundled-test-harness/assets/dist-C2IXvIKX.js +323 -0
- package/bundled-test-harness/assets/dist-CdNZu43l.js +1710 -0
- package/bundled-test-harness/assets/docx-file-def-BQMw460_.js +60 -0
- package/bundled-test-harness/assets/docx-meta-extractor-DBlmH_kV.js +60 -0
- package/bundled-test-harness/assets/docx-meta-extractor-Dw4gZ0ae.js +2 -0
- package/bundled-test-harness/assets/duration-B0SnEiw1.js +184 -0
- package/bundled-test-harness/assets/duration-DbjJTFeA.js +2 -0
- package/bundled-test-harness/assets/email-C-8cyWiQ.js +80 -0
- package/bundled-test-harness/assets/email-field-test-BOBmvQqx.js +75 -0
- package/bundled-test-harness/assets/email-xUgCst-p.js +2 -0
- package/bundled-test-harness/assets/enum-BWiCyJlu.js +167 -0
- package/bundled-test-harness/assets/enum-CzYjivhO.js +2 -0
- package/bundled-test-harness/assets/enum-field-test-Bea9EsQR.js +953 -0
- package/bundled-test-harness/assets/error-display-test-Cbl2D_0c.js +343 -0
- package/bundled-test-harness/assets/ethereum-address-Bw_J05bD.js +78 -0
- package/bundled-test-harness/assets/ethereum-address-C9wHMBt3.js +2 -0
- package/bundled-test-harness/assets/expiration-warning-BHcJEjZt.js +90 -0
- package/bundled-test-harness/assets/expiration-warning-_G8SKZd0.js +2 -0
- package/bundled-test-harness/assets/externals-CKblKBo1.js +4393 -0
- package/bundled-test-harness/assets/fallback-banner-BqCrvTDt.js +24 -0
- package/bundled-test-harness/assets/fallback-banner-live-delete-test-D_AYMvf6.js +207 -0
- package/bundled-test-harness/assets/fallback-banner-test-B8Ne9a5g.js +225 -0
- package/bundled-test-harness/assets/fallback-banner-test-C7oaSxd1.js +53 -0
- package/bundled-test-harness/assets/fallback-models-test-DY-PvU9k.js +161 -0
- package/bundled-test-harness/assets/field-component-Bj8YthPE.js +2 -0
- package/bundled-test-harness/assets/field-configuration-test-B5LztQ47.js +548 -0
- package/bundled-test-harness/assets/field-edit-Cx_haspD.js +36 -0
- package/bundled-test-harness/assets/field-edit-DQZWUz3F.js +2 -0
- package/bundled-test-harness/assets/field-markdown-domain-test-DnqK3CrE.js +616 -0
- package/bundled-test-harness/assets/field-markdown-oversize-test-BEpbXIvl.js +88 -0
- package/bundled-test-harness/assets/field-markdown-primitives-test-BDORWoOk.js +365 -0
- package/bundled-test-harness/assets/field-markdown-specialized-test-BmIzadYq.js +534 -0
- package/bundled-test-harness/assets/field-test-helpers-CRF9-jFw.js +45 -0
- package/bundled-test-harness/assets/file-api-DPMJghBY.js +7 -0
- package/bundled-test-harness/assets/file-attachment-test-DFLXg3xV.js +796 -0
- package/bundled-test-harness/assets/file-chooser-panel-test-B4DzCWkt.js +153 -0
- package/bundled-test-harness/assets/file-chooser-test-DpjOWgpB.js +504 -0
- package/bundled-test-harness/assets/file-def-edit-Bstl7Kkl.js +2 -0
- package/bundled-test-harness/assets/file-def-edit-C1dzJxmQ.js +26 -0
- package/bundled-test-harness/assets/file-def-embedded-CUy4G7Vc.js +2 -0
- package/bundled-test-harness/assets/file-def-embedded-DJs6P5t0.js +38 -0
- package/bundled-test-harness/assets/file-def-fitted-BlrBFfLh.js +38 -0
- package/bundled-test-harness/assets/file-def-fitted-Bo5Qfkyf.js +2 -0
- package/bundled-test-harness/assets/file-def-isolated-BsHydanv.js +38 -0
- package/bundled-test-harness/assets/file-def-isolated-Dp-Lc99-.js +2 -0
- package/bundled-test-harness/assets/file-def-serialization-test-CISKpt_o.js +89 -0
- package/bundled-test-harness/assets/file-menu-items-7_ltrFZq.js +117 -0
- package/bundled-test-harness/assets/file-menu-items-BnRG9ydE.js +2 -0
- package/bundled-test-harness/assets/file-preview-stage-CV3qZpiK.js +72 -0
- package/bundled-test-harness/assets/file-preview-stage-DTA5X8rX.js +2 -0
- package/bundled-test-harness/assets/file-shell-embedded-BpmiVzIG.js +2 -0
- package/bundled-test-harness/assets/file-shell-embedded-CEv0-6OE.js +68 -0
- package/bundled-test-harness/assets/file-shell-fitted-C6k3GnMc.js +2 -0
- package/bundled-test-harness/assets/file-shell-fitted-iSTg3PJa.js +98 -0
- package/bundled-test-harness/assets/file-shell-isolated-C-pEod2J.js +195 -0
- package/bundled-test-harness/assets/file-shell-isolated-DI9oU7ix.js +2 -0
- package/bundled-test-harness/assets/file-tree-from-index-BtOOMqnb.js +151 -0
- package/bundled-test-harness/assets/file-tree-from-index-test-T8w3hPw_.js +96 -0
- package/bundled-test-harness/assets/film-5n9_gRqZ.js +4074 -0
- package/bundled-test-harness/assets/film-Ca2Vzlfu.js +13 -0
- package/bundled-test-harness/assets/film-DEvhBbBu.js +2 -0
- package/bundled-test-harness/assets/fitted-6OGuHgoU.js +2 -0
- package/bundled-test-harness/assets/fitted-B2l1jlSp.js +34 -0
- package/bundled-test-harness/assets/flac-meta-extractor-BoJqvmDC.js +99 -0
- package/bundled-test-harness/assets/font-file-def-Czzt5paT.js +64 -0
- package/bundled-test-harness/assets/font-meta-extractor-DQYT_e5b.js +2 -0
- package/bundled-test-harness/assets/font-meta-extractor-IHD-pG8V.js +303 -0
- package/bundled-test-harness/assets/formatted-aibot-message-test-Djsl8RzE.js +109 -0
- package/bundled-test-harness/assets/from-elsewhere-BXcLYxxu.js +131 -0
- package/bundled-test-harness/assets/frontmatter-field-CciolgL3.js +41 -0
- package/bundled-test-harness/assets/garbage-collection-test-BTOLAfB6.js +403 -0
- package/bundled-test-harness/assets/gauge-C1loqGq3.js +2 -0
- package/bundled-test-harness/assets/gauge-u8dxl90d.js +106 -0
- package/bundled-test-harness/assets/general-test-Cd5WtVvd.js +926 -0
- package/bundled-test-harness/assets/get-relationship-membership-state-test-DJAuhOVM.js +1308 -0
- package/bundled-test-harness/assets/gif-meta-extractor-tSaPtuYW.js +114 -0
- package/bundled-test-harness/assets/glimmer-motion-and-choreo-in-cards-test-DNSy5l59.js +160 -0
- package/bundled-test-harness/assets/glimmer-motion-and-choreo-test-B6BbQxYq.js +74 -0
- package/bundled-test-harness/assets/helper-m6jA5HmU.js +478 -0
- package/bundled-test-harness/assets/host-submode-test-CsgdksBi.js +1243 -0
- package/bundled-test-harness/assets/html-file-def-yKtdMSa-.js +82 -0
- package/bundled-test-harness/assets/hydratable-card-CxNfbqly.js +147 -0
- package/bundled-test-harness/assets/hydratable-card-test-NJ4CI4ey.js +426 -0
- package/bundled-test-harness/assets/icons-B3SAtRoj.js +894 -0
- package/bundled-test-harness/assets/image-file-def-B0rpS3Yy.js +3 -0
- package/bundled-test-harness/assets/image-file-def-DUFmjNL8.js +65 -0
- package/bundled-test-harness/assets/image-olOUqgMQ.js +47 -0
- package/bundled-test-harness/assets/index-changes-test-D7OE-99k.js +367 -0
- package/bundled-test-harness/assets/index-query-engine-test-BBKqgSmg.js +2593 -0
- package/bundled-test-harness/assets/inspector-test-DV6Ms2uz.js +1930 -0
- package/bundled-test-harness/assets/instance-filter-matcher-test-Bs4kf7E8.js +788 -0
- package/bundled-test-harness/assets/interact-submode-creation-and-permissions-test-DIfgRhIN.js +475 -0
- package/bundled-test-harness/assets/interact-submode-setup-D4M_e580.js +566 -0
- package/bundled-test-harness/assets/is-component-declaration-test-jPGRTVh1.js +50 -0
- package/bundled-test-harness/assets/iso-bmff-DHtkSbQM.js +205 -0
- package/bundled-test-harness/assets/iso-bmff-zmOHoSVg.js +2 -0
- package/bundled-test-harness/assets/isolated-and-edit-BAnwcK1T.js +2 -0
- package/bundled-test-harness/assets/job-priority-header-test-7j2f3Dtl.js +81 -0
- package/bundled-test-harness/assets/job-scoped-instance-residency-test-DPzVQUL3.js +103 -0
- package/bundled-test-harness/assets/join-the-community-Ft5fjeIA.js +86 -0
- package/bundled-test-harness/assets/jpg-meta-extractor-Dsq6rZ8F.js +88 -0
- package/bundled-test-harness/assets/json-field-CxOZvp3k.js +19 -0
- package/bundled-test-harness/assets/json-field-ojdwGD6T.js +2 -0
- package/bundled-test-harness/assets/json-file-def-Da_5-zSM.js +298 -0
- package/bundled-test-harness/assets/last-modified-date-BnyJsc04.js +43 -0
- package/bundled-test-harness/assets/last-modified-date-test-DFl2mo1B.js +28 -0
- package/bundled-test-harness/assets/links-to-editor-DO24-71w.js +2 -0
- package/bundled-test-harness/assets/links-to-many-component-C7DabwAY.js +2 -0
- package/bundled-test-harness/assets/linksto-broken-link-placeholder-test-D4lDhvnQ.js +398 -0
- package/bundled-test-harness/assets/linksto-error-sentinel-test-oWgDz00K.js +238 -0
- package/bundled-test-harness/assets/linksto-many-broken-link-placeholder-test-CpSl7zJ7.js +354 -0
- package/bundled-test-harness/assets/linksto-many-per-slot-access-test-DJY3J8Xl.js +303 -0
- package/bundled-test-harness/assets/linksto-sentinel-reload-test-BxzfoONe.js +197 -0
- package/bundled-test-harness/assets/linksto-sentinel-roundtrip-test-DyE99km_.js +260 -0
- package/bundled-test-harness/assets/linksto-singular-js-access-contract-test-dcWAAgxt.js +196 -0
- package/bundled-test-harness/assets/llm-model-DrswiczZ.js +64 -0
- package/bundled-test-harness/assets/login-C-EIG0-Q.css +543 -0
- package/bundled-test-harness/assets/login-CNeL-9IC.js +408 -0
- package/bundled-test-harness/assets/login-error-text-test-CEH2tjNP.js +51 -0
- package/bundled-test-harness/assets/login-test-BpMx7qwV.js +246 -0
- package/bundled-test-harness/assets/m4a-meta-extractor-BJkMHUIK.js +204 -0
- package/bundled-test-harness/assets/main-BaUgfpPE.js +5 -0
- package/bundled-test-harness/assets/markdown-ByEGbwov.js +7 -0
- package/bundled-test-harness/assets/markdown-KJzgTg-A.js +2 -0
- package/bundled-test-harness/assets/markdown-editor-mode-select-BUGPXaSE.js +2 -0
- package/bundled-test-harness/assets/markdown-editor-mode-select-DBk8dG0O.js +54 -0
- package/bundled-test-harness/assets/markdown-embed-chooser-modal-test-BIlEmna9.js +470 -0
- package/bundled-test-harness/assets/markdown-embed-preview-pane-test-B6rscKpk.js +447 -0
- package/bundled-test-harness/assets/markdown-embed-preview-test-CTQw1wq-.js +368 -0
- package/bundled-test-harness/assets/markdown-fallback-BVsco6gJ.js +2 -0
- package/bundled-test-harness/assets/markdown-fallback-test-C_CIFEzH.js +316 -0
- package/bundled-test-harness/assets/markdown-highlighting-test-D6YvywF5.js +244 -0
- package/bundled-test-harness/assets/markdown-preview-1TSMSUv0.js +64 -0
- package/bundled-test-harness/assets/markdown-preview-jbuUjLoD.js +72 -0
- package/bundled-test-harness/assets/markdown-preview-test-zuU5uoA_.js +238 -0
- package/bundled-test-harness/assets/markdown-skill-frontmatter-test-CoicGRkb.js +146 -0
- package/bundled-test-harness/assets/menu-items-DZ_uOoYu.js +2 -0
- package/bundled-test-harness/assets/message-tool-test-K6LgTq5d.js +33 -0
- package/bundled-test-harness/assets/metadata-fields-WiOuUCDl.js +1415 -0
- package/bundled-test-harness/assets/metadata-fields-iu5AfQp3.js +2 -0
- package/bundled-test-harness/assets/midi-audio-def-CD2-4Wjx.js +52 -0
- package/bundled-test-harness/assets/midi-meta-extractor-CE3sLiEV.js +284 -0
- package/bundled-test-harness/assets/midi-meta-extractor-O7c8LHYV.js +2 -0
- package/bundled-test-harness/assets/migrate-skill-test-Beh-AeSN.js +161 -0
- package/bundled-test-harness/assets/mini-BNXINKKF.js +85 -0
- package/bundled-test-harness/assets/mini-C43Q4BWp.js +1519 -0
- package/bundled-test-harness/assets/mini-card-chooser-test-B1GMp-31.js +272 -0
- package/bundled-test-harness/assets/mini-file-chooser-test-CbI1vrQn.js +201 -0
- package/bundled-test-harness/assets/missing-template-BPhJRbDs.js +48 -0
- package/bundled-test-harness/assets/missing-template-DP-Pi-HQ.js +2 -0
- package/bundled-test-harness/assets/modal-KpPz2f8x.js +322 -0
- package/bundled-test-harness/assets/modal-container-0Efz_h2z.js +40 -0
- package/bundled-test-harness/assets/model-cost-tier-test-D-5VSjh6.js +173 -0
- package/bundled-test-harness/assets/module-contents-service-BRkTETb6.js +256 -0
- package/bundled-test-harness/assets/moment-Cln59YUK.js +3474 -0
- package/bundled-test-harness/assets/monaco-AbHCoDJY.js +143 -0
- package/bundled-test-harness/assets/monaco-test-DCPi18sy.js +100 -0
- package/bundled-test-harness/assets/monaco-test-waiter-lvFEYpFj.js +190 -0
- package/bundled-test-harness/assets/month-1eUIsvWN.js +2 -0
- package/bundled-test-harness/assets/month-BeUdWMWQ.js +123 -0
- package/bundled-test-harness/assets/month-day-Bbsd8YbR.js +192 -0
- package/bundled-test-harness/assets/month-day-Dks5STJu.js +2 -0
- package/bundled-test-harness/assets/month-year-pL_rpUhX.js +2 -0
- package/bundled-test-harness/assets/month-year-wH_YnYgL.js +93 -0
- package/bundled-test-harness/assets/mp3-meta-extractor-C3u34UHM.js +476 -0
- package/bundled-test-harness/assets/mp4-meta-extractor-Bj3F7dxs.js +188 -0
- package/bundled-test-harness/assets/multiple-stacks-test-mkNdTUMI.js +208 -0
- package/bundled-test-harness/assets/nested-query-field-render-test-BQLn3wg9.js +249 -0
- package/bundled-test-harness/assets/no-stacks-test-DpwZQAJ-.js +48 -0
- package/bundled-test-harness/assets/number-DZa-fHpu.js +151 -0
- package/bundled-test-harness/assets/number-Dvua76YP.js +3 -0
- package/bundled-test-harness/assets/number-field-test-BiaH2eaB.js +184 -0
- package/bundled-test-harness/assets/number-input-D5nDYDkK.js +82 -0
- package/bundled-test-harness/assets/office-extract-JzYva33g.js +27 -0
- package/bundled-test-harness/assets/office-extract-XMpsyYRh.js +2 -0
- package/bundled-test-harness/assets/ogg-meta-extractor-DJosZ9LA.js +225 -0
- package/bundled-test-harness/assets/on-key-BBVkS8Bi.js +472 -0
- package/bundled-test-harness/assets/ooxml-BlAE2w4d.js +172 -0
- package/bundled-test-harness/assets/ooxml-D-p8OmuM.js +2 -0
- package/bundled-test-harness/assets/open-image-in-new-tab-test-DWBU5pw9.js +52 -0
- package/bundled-test-harness/assets/operation-lowering-test-nzqprueU.js +2812 -0
- package/bundled-test-harness/assets/operations-CPvfTuY3.js +766 -0
- package/bundled-test-harness/assets/operations-invocation-test-C75T6zn3.js +523 -0
- package/bundled-test-harness/assets/operations-query-test-BoCszQEW.js +459 -0
- package/bundled-test-harness/assets/operations-test-79ipSnpM.js +2518 -0
- package/bundled-test-harness/assets/operations-x3Aw2Nky.js +3 -0
- package/bundled-test-harness/assets/operator-mode-acceptance-test-jjsYtt96.js +1188 -0
- package/bundled-test-harness/assets/operator-mode-card-chooser-test-hZP9gEQK.js +1036 -0
- package/bundled-test-harness/assets/operator-mode-links-test-DN16SuIx.js +793 -0
- package/bundled-test-harness/assets/operator-mode-state-service-gwiTSiWX.js +1275 -0
- package/bundled-test-harness/assets/operator-mode-state-service-test-Dt2qnKKP.js +206 -0
- package/bundled-test-harness/assets/operator-mode-test-BZnnxO9q.js +683 -0
- package/bundled-test-harness/assets/operator-mode-ui-test-O--qEo-y.js +1027 -0
- package/bundled-test-harness/assets/overlay-menu-items-test-Bl2k0aAa.js +317 -0
- package/bundled-test-harness/assets/overlays-CdN_JokA.js +270 -0
- package/bundled-test-harness/assets/overlays-clip-test-DpbR1ZTz.js +91 -0
- package/bundled-test-harness/assets/overlays-detached-element-test-cLgEGvMs.js +56 -0
- package/bundled-test-harness/assets/pane-PYdezM7g.js +330 -0
- package/bundled-test-harness/assets/panel-7FDqkxrr.js +474 -0
- package/bundled-test-harness/assets/panel-C3E0s49q.js +3540 -0
- package/bundled-test-harness/assets/past-sessions-test-BsjEeoze.js +321 -0
- package/bundled-test-harness/assets/patch-fields-test-CsixJmSr.js +1014 -0
- package/bundled-test-harness/assets/patch-instance-test-CBDgTi0L.js +348 -0
- package/bundled-test-harness/assets/pdf-file-def-9VNjnqDa.js +76 -0
- package/bundled-test-harness/assets/pdf-meta-extractor-BF4e5kMR.js +156 -0
- package/bundled-test-harness/assets/pdf-meta-extractor-D8Bxh2cc.js +2 -0
- package/bundled-test-harness/assets/pdf-viewer-Bu413sN8.js +112 -0
- package/bundled-test-harness/assets/pdf-viewer-GKDi_xmf.js +2 -0
- package/bundled-test-harness/assets/percentage-TOr6qK2T.js +84 -0
- package/bundled-test-harness/assets/permission-checking-realm-test-BRNVYszm.js +306 -0
- package/bundled-test-harness/assets/phone-number-D5SR8nWu.js +236 -0
- package/bundled-test-harness/assets/phone-number-field-test-DffwtqGd.js +73 -0
- package/bundled-test-harness/assets/phone-number-hf_xIVGQ.js +2 -0
- package/bundled-test-harness/assets/plate-Vojc88hM.js +41 -0
- package/bundled-test-harness/assets/plate-dTUzEMj5.js +2 -0
- package/bundled-test-harness/assets/player-CmRw0uM5.js +82 -0
- package/bundled-test-harness/assets/player-Dt85lPZl.js +2 -0
- package/bundled-test-harness/assets/plural-field-components-test-DNpGuH1D.js +198 -0
- package/bundled-test-harness/assets/png-image-def-GY7gjqya.js +48 -0
- package/bundled-test-harness/assets/png-meta-extractor-4pI611re.js +2 -0
- package/bundled-test-harness/assets/png-meta-extractor-CHp_rpAi.js +111 -0
- package/bundled-test-harness/assets/policy-scoped-search-test-CipPu7tY.js +339 -0
- package/bundled-test-harness/assets/pptx-file-def-lBBiebvn.js +60 -0
- package/bundled-test-harness/assets/pptx-meta-extractor-BjJYWiOJ.js +77 -0
- package/bundled-test-harness/assets/pptx-meta-extractor-DbT-dPRg.js +2 -0
- package/bundled-test-harness/assets/prerender-persistence-block-test-ClHMVvJt.js +124 -0
- package/bundled-test-harness/assets/prerender-serialize-cycle-test-LdqaMTK8.js +134 -0
- package/bundled-test-harness/assets/preview-CYlam_aW.js +74 -0
- package/bundled-test-harness/assets/preview-format-CiSo4kEa.js +41 -0
- package/bundled-test-harness/assets/preview-format-test-MsB1TOLB.js +103 -0
- package/bundled-test-harness/assets/process-card-B3xBGkv1.js +2 -0
- package/bundled-test-harness/assets/process-card-DumVcx9E.js +114 -0
- package/bundled-test-harness/assets/process-card-test-C44H8yVy.js +94 -0
- package/bundled-test-harness/assets/profile-settings-modal-ipYzrVTz.js +708 -0
- package/bundled-test-harness/assets/progress-circle-DJ6WSO2E.js +95 -0
- package/bundled-test-harness/assets/progress-circle-q358_9Sn.js +2 -0
- package/bundled-test-harness/assets/quarter-BjO5DlU2.js +2 -0
- package/bundled-test-harness/assets/quarter-_D72FwfS.js +168 -0
- package/bundled-test-harness/assets/query-field-membership-status-test-CzDyfK49.js +323 -0
- package/bundled-test-harness/assets/query-field-page-optin-test-B-x3vsmC.js +126 -0
- package/bundled-test-harness/assets/query-field-schema-test-DFw6KuYv.js +231 -0
- package/bundled-test-harness/assets/query-field-stale-prerender-test-DSQ-cv_O.js +152 -0
- package/bundled-test-harness/assets/query-fields-test-DQiMFRCe.js +535 -0
- package/bundled-test-harness/assets/rail-CNspDFyn.js +44 -0
- package/bundled-test-harness/assets/rail-D2YcQ0VP.js +2 -0
- package/bundled-test-harness/assets/realm-82Z5RUM_.js +95 -0
- package/bundled-test-harness/assets/realm-config-SgrwqjRu.js +844 -0
- package/bundled-test-harness/assets/realm-config-policy-standing-test-C6sQNk2u.js +290 -0
- package/bundled-test-harness/assets/realm-config-routing-rule-edit-test-DcYXBlvi.js +274 -0
- package/bundled-test-harness/assets/realm-config-settings-test-DblJv06X.js +187 -0
- package/bundled-test-harness/assets/realm-dropdown-CDvL8k3B.js +560 -0
- package/bundled-test-harness/assets/realm-et890flh.js +2 -0
- package/bundled-test-harness/assets/realm-field-test-pBK_x-Xw.js +100 -0
- package/bundled-test-harness/assets/realm-indexing-test-DSFn2F8F.js +4380 -0
- package/bundled-test-harness/assets/realm-policy-test-DYnLqzTS.js +1141 -0
- package/bundled-test-harness/assets/realm-test-DOZT2EG5.js +2363 -0
- package/bundled-test-harness/assets/realm-url-tooltip-qaXTjRb-.js +56 -0
- package/bundled-test-harness/assets/realm-url-tooltip-test-DGTEeLH9.js +78 -0
- package/bundled-test-harness/assets/reasoning-test-BRkhvYjr.js +234 -0
- package/bundled-test-harness/assets/recent-colors-addon-BreXcpg8.js +2 -0
- package/bundled-test-harness/assets/recent-colors-addon-CmCkbJ2_.js +61 -0
- package/bundled-test-harness/assets/relationship-loading-state-test-B6UGYKzG.js +290 -0
- package/bundled-test-harness/assets/relative-time-BjHvL023.js +2 -0
- package/bundled-test-harness/assets/relative-time-ChYKOMIM.js +129 -0
- package/bundled-test-harness/assets/remix-card-test-CpV0kKfq.js +58 -0
- package/bundled-test-harness/assets/rendered-markdown-CJa7IzCC.js +263 -0
- package/bundled-test-harness/assets/rendered-markdown-test-CVKsHS4P.js +587 -0
- package/bundled-test-harness/assets/resident-instance-reuse-test-jQfW1NMn.js +82 -0
- package/bundled-test-harness/assets/response-field-B2-daCl2.js +38 -0
- package/bundled-test-harness/assets/result-tile-BSg4mzbc.js +140 -0
- package/bundled-test-harness/assets/rich-markdown-BtP1yamM.js +2 -0
- package/bundled-test-harness/assets/rich-markdown-C6rQUngb.js +218 -0
- package/bundled-test-harness/assets/rich-markdown-field-test-9yB6ykCe.js +1647 -0
- package/bundled-test-harness/assets/room-C7tKd02X.js +1008 -0
- package/bundled-test-harness/assets/room-message-test-DsMmRYpV.js +445 -0
- package/bundled-test-harness/assets/room-test-golI1H61.js +95 -0
- package/bundled-test-harness/assets/run-realm-code-CbXk6bnK.js +1600 -0
- package/bundled-test-harness/assets/run-realm-code-test-B9JeesaW.js +2468 -0
- package/bundled-test-harness/assets/schema-generation-test-uLLGm5Vh.js +28 -0
- package/bundled-test-harness/assets/score-BQhCQdUP.js +2 -0
- package/bundled-test-harness/assets/score-CoWEzENH.js +100 -0
- package/bundled-test-harness/assets/scrolling-test-WHWEkKeZ.js +384 -0
- package/bundled-test-harness/assets/search-BkQYpQDY.js +605 -0
- package/bundled-test-harness/assets/search-adorn-test-CW92JPOk.js +136 -0
- package/bundled-test-harness/assets/search-entries-BU4w6Ymc.js +472 -0
- package/bundled-test-harness/assets/search-entries-result-test-9eydsDtD.js +234 -0
- package/bundled-test-harness/assets/search-entries-test-ByUREx0G.js +1486 -0
- package/bundled-test-harness/assets/search-result-header-UFkdo0Bx.js +128 -0
- package/bundled-test-harness/assets/search-results-DrHTuVRZ.js +266 -0
- package/bundled-test-harness/assets/search-results-test-krtQQM57.js +578 -0
- package/bundled-test-harness/assets/search-selection-menu-test-DoqSbez7.js +108 -0
- package/bundled-test-harness/assets/search-sheet-persistence-test-4ZPaEY-y.js +131 -0
- package/bundled-test-harness/assets/search-test-BYpq32RM.js +2241 -0
- package/bundled-test-harness/assets/searchable-BXw4T11q.js +192 -0
- package/bundled-test-harness/assets/searchable-CVvPDA3Q.js +2 -0
- package/bundled-test-harness/assets/searchable-option-test-BhLFI4ei.js +322 -0
- package/bundled-test-harness/assets/searchable-search-doc-test-DrNLCF73.js +1271 -0
- package/bundled-test-harness/assets/secure-sign-in-VNQhe0ae.js +130 -0
- package/bundled-test-harness/assets/secure-sign-in-Za8PX9cD.css +24 -0
- package/bundled-test-harness/assets/secure-sign-in-aunWHCrB.js +73 -0
- package/bundled-test-harness/assets/secure-sign-in-test-BcY1TcNd.js +32 -0
- package/bundled-test-harness/assets/secure-sign-in-test-DRdz89BT.js +245 -0
- package/bundled-test-harness/assets/sending-test-mbHpGZUu.js +576 -0
- package/bundled-test-harness/assets/serialization-rri-form-audit-test-nypV9J82.js +136 -0
- package/bundled-test-harness/assets/serialization-test-aLwrFv4d.js +8758 -0
- package/bundled-test-harness/assets/setup-Dgn0s6Zk.js +772 -0
- package/bundled-test-harness/assets/shared-link-target-reuse-test-D9MR2UNc.js +207 -0
- package/bundled-test-harness/assets/show-card-Dwfk332M.js +67 -0
- package/bundled-test-harness/assets/show-card-test-CRPwwJvc.js +365 -0
- package/bundled-test-harness/assets/show-file-DLdFPHMR.js +34 -0
- package/bundled-test-harness/assets/signed-capture-DUR9PohQ.js +204 -0
- package/bundled-test-harness/assets/signed-capture-link-test-DfTAB6OT.js +132 -0
- package/bundled-test-harness/assets/single-stack-test-Crr_8nti.js +652 -0
- package/bundled-test-harness/assets/skill-DQ00VonZ.js +3 -0
- package/bundled-test-harness/assets/skill-reference-LEitQV9i.js +112 -0
- package/bundled-test-harness/assets/skill-yZXS1VHQ.js +76 -0
- package/bundled-test-harness/assets/skills-test-D3-C-Dbm.js +648 -0
- package/bundled-test-harness/assets/slider-picker-B6AxKL2j.js +245 -0
- package/bundled-test-harness/assets/slider-picker-C4Tc5o-s.js +2 -0
- package/bundled-test-harness/assets/spec-Cl_LB6nC.js +602 -0
- package/bundled-test-harness/assets/spinner-BHFM7zcR.js +39 -0
- package/bundled-test-harness/assets/spinner-DvAvsyDT.css +21 -0
- package/bundled-test-harness/assets/store-BV6WX8oV.js +2205 -0
- package/bundled-test-harness/assets/store-module-rebuild-test-HyphFJiF.js +454 -0
- package/bundled-test-harness/assets/store-search-test-nUeJ5opb.js +175 -0
- package/bundled-test-harness/assets/store-test-BebUIJAg.js +3460 -0
- package/bundled-test-harness/assets/string-BHZZwNlZ.js +9 -0
- package/bundled-test-harness/assets/submode-switcher-D-U9cXo0.js +169 -0
- package/bundled-test-harness/assets/svg-meta-extractor-BsG4w2nX.js +42 -0
- package/bundled-test-harness/assets/swatches-picker-4vFztxHo.js +33 -0
- package/bundled-test-harness/assets/swatches-picker-C7RE7uJ8.js +2 -0
- package/bundled-test-harness/assets/switch-submode-CuA0Zfjn.js +79 -0
- package/bundled-test-harness/assets/switch-submode-test-i1Qic_Cp.js +168 -0
- package/bundled-test-harness/assets/tag-CZNs3DPN.js +105 -0
- package/bundled-test-harness/assets/tests-BneuP252.js +3523 -0
- package/bundled-test-harness/assets/text-area-DAShQQBe.js +9 -0
- package/bundled-test-harness/assets/text-file-def-D2Rs6nS1.js +151 -0
- package/bundled-test-harness/assets/text-input-validator-test-C9IG-1GZ.js +156 -0
- package/bundled-test-harness/assets/theme-Dm8LWaRK.js +9 -0
- package/bundled-test-harness/assets/theme-card-test-Cbb6tAap.js +621 -0
- package/bundled-test-harness/assets/theme-scheme-island-test-DOVLakx3.js +264 -0
- package/bundled-test-harness/assets/three-d-model-def-DWSPQGgD.js +70 -0
- package/bundled-test-harness/assets/time--_Txqya1.js +126 -0
- package/bundled-test-harness/assets/time-DKD7Bdjd.js +2 -0
- package/bundled-test-harness/assets/time-slots-BZaugjq_.js +2 -0
- package/bundled-test-harness/assets/time-slots-C85M0rWl.js +85 -0
- package/bundled-test-harness/assets/timeline-B3KGDm3M.js +2 -0
- package/bundled-test-harness/assets/timeline-BMwgaZZu.js +59 -0
- package/bundled-test-harness/assets/to-device-streaming-test-CMp5bFiz.js +163 -0
- package/bundled-test-harness/assets/token-usage-test-CXA0b8Ep.js +166 -0
- package/bundled-test-harness/assets/tool-field-BGLelnsr.js +94 -0
- package/bundled-test-harness/assets/tool-field-BOFuDDt3.js +2 -0
- package/bundled-test-harness/assets/tools-CTjy7Aub.js +725 -0
- package/bundled-test-harness/assets/tools-calling-test--JR-7AK7.js +200 -0
- package/bundled-test-harness/assets/tools-test-6yAW3W5I.js +2820 -0
- package/bundled-test-harness/assets/tools-test-DhpMUQkz.js +1624 -0
- package/bundled-test-harness/assets/ts-file-def-CDbf8aw2.js +159 -0
- package/bundled-test-harness/assets/update-room-skills-test-DoKsS_1C.js +240 -0
- package/bundled-test-harness/assets/url-D0ooeJxC.js +2 -0
- package/bundled-test-harness/assets/url-mFskVPSX.js +96 -0
- package/bundled-test-harness/assets/video-file-def-AcmWqzev.js +76 -0
- package/bundled-test-harness/assets/wav-meta-extractor-CbTLruQf.js +368 -0
- package/bundled-test-harness/assets/webm-meta-extractor-C9JH-CMX.js +178 -0
- package/bundled-test-harness/assets/webp-meta-extractor-C6sHm4J7.js +98 -0
- package/bundled-test-harness/assets/website-Bxuk_OmR.js +92 -0
- package/bundled-test-harness/assets/week-Bxssxce7.js +2 -0
- package/bundled-test-harness/assets/week-DQLj9974.js +111 -0
- package/bundled-test-harness/assets/welcome-to-boxel-BH82RsW5.js +172 -0
- package/bundled-test-harness/assets/workspace-DJ_s2x4g.js +614 -0
- package/bundled-test-harness/assets/workspace-a11y-test-BJbZNgoP.js +197 -0
- package/bundled-test-harness/assets/workspace-behavior-test-BLBARTfb.js +200 -0
- package/bundled-test-harness/assets/workspace-chooser-BpmlVrVn.js +2219 -0
- package/bundled-test-harness/assets/workspace-chooser-CqLR2Dzh.css +1296 -0
- package/bundled-test-harness/assets/workspace-chooser-catalog-order-test-CmAVNAWC.js +36 -0
- package/bundled-test-harness/assets/workspace-chooser-unreachable-notice-test-DEfG7Uh9.js +60 -0
- package/bundled-test-harness/assets/workspace-delete-multiple-test-DE7Z8ooj.js +212 -0
- package/bundled-test-harness/assets/workspace-delete-summary-test-CwtG_zLH.js +63 -0
- package/bundled-test-harness/assets/workspace-timestamp-labels-test-DFAaRmJW.js +58 -0
- package/bundled-test-harness/assets/xlsx-file-def-DcvaRYnZ.js +60 -0
- package/bundled-test-harness/assets/xlsx-meta-extractor-0RlViVaf.js +101 -0
- package/bundled-test-harness/assets/xlsx-meta-extractor-BH30Vuem.js +2 -0
- package/bundled-test-harness/assets/year-B_MBk_hE.js +78 -0
- package/bundled-test-harness/assets/year-hSpccI9L.js +2 -0
- package/bundled-test-harness/assets/zip-file-def-c84iddi9.js +288 -0
- package/bundled-test-harness/index.html +78 -68
- package/bundled-test-harness/tests/index.html +78 -68
- package/bundled-types/host-app/components/matrix/account-switch-failed.gts +2 -2
- package/bundled-types/host-app/components/matrix/auth.gts +2 -2
- package/bundled-types/host-app/components/matrix/cli-auth.gts +7 -6
- package/bundled-types/host-app/components/matrix/forgot-password.gts +43 -129
- package/bundled-types/host-app/components/matrix/login.gts +15 -118
- package/bundled-types/host-app/components/matrix/register-user.gts +45 -226
- package/bundled-types/host-app/components/matrix/secure-sign-in.gts +235 -0
- package/bundled-types/host-app/components/operator-mode/container.gts +13 -1
- package/bundled-types/host-app/components/operator-mode/profile-info-popover.gts +1 -1
- package/bundled-types/host-app/config/environment.ts +1 -1
- package/bundled-types/host-app/lib/secure-sign-in.ts +130 -0
- package/bundled-types/host-app/services/matrix-service.ts +46 -0
- package/bundled-types/host-app/services/monaco-service.ts +0 -5
- package/bundled-types/host-app/utils/login-token.ts +23 -10
- package/dist/api.js +1 -1
- package/dist/index.js +289 -285
- package/package.json +1 -1
- package/src/build-program.ts +6 -2
- package/src/commands/profile.ts +72 -3
- package/src/lib/profile-manager.ts +5 -1
- package/src/lib/secure-session.ts +29 -0
- package/src/lib/sso-login.ts +94 -15
- package/bundled-test-harness/assets/account-switch-failed-B3pr_iC3.js +0 -32
- package/bundled-test-harness/assets/account-switch-failed-DTGZZo-G.css +0 -61
- package/bundled-test-harness/assets/account-switch-failed-test-9ENVgvlx.js +0 -45
- package/bundled-test-harness/assets/add-workspace-BAbk0250.js +0 -141
- package/bundled-test-harness/assets/add-workspace-test-ChAja_t-.js +0 -72
- package/bundled-test-harness/assets/advanced-color-picker-C-xBFJ2S.js +0 -504
- package/bundled-test-harness/assets/advanced-color-picker-bWAmCT-8.js +0 -2
- package/bundled-test-harness/assets/ai-assistant-test-BJ9yetuC.js +0 -2211
- package/bundled-test-harness/assets/ai-module-creation-test-Bw3TKS9d.js +0 -151
- package/bundled-test-harness/assets/aibot-message-DkgHT6eJ.js +0 -465
- package/bundled-test-harness/assets/app-DW5QjtRp.js +0 -22816
- package/bundled-test-harness/assets/app-yCDjO4mk.css +0 -2718
- package/bundled-test-harness/assets/audio-file-def-bJ3cXVmC.js +0 -133
- package/bundled-test-harness/assets/avif-meta-extractor-CrSDfYEt.js +0 -162
- package/bundled-test-harness/assets/base64-image-C7UBjK5W.js +0 -262
- package/bundled-test-harness/assets/base64-image-CjWpxROT.js +0 -2
- package/bundled-test-harness/assets/big-integer-BBql7oGZ.js +0 -89
- package/bundled-test-harness/assets/big-integer-B_TrzRy_.js +0 -2
- package/bundled-test-harness/assets/binary-upload-dedupe-test-BiX8kS7D.js +0 -308
- package/bundled-test-harness/assets/boolean-9LNUUTfw.js +0 -2
- package/bundled-test-harness/assets/boolean-BAmK01TF.js +0 -94
- package/bundled-test-harness/assets/brand-functional-palette-CFuoS-LS.js +0 -137
- package/bundled-test-harness/assets/brand-logo-By89eknI.js +0 -295
- package/bundled-test-harness/assets/broken-link-template-test-odBriDSP.js +0 -192
- package/bundled-test-harness/assets/bundled-base-CLQkkmN4.js +0 -254
- package/bundled-test-harness/assets/bundled-base-modules-test-BYrTaTwa.js +0 -54
- package/bundled-test-harness/assets/buried-stack-item-scroll-test-DU4bM5nd.js +0 -236
- package/bundled-test-harness/assets/bxl-expression-test-Cs9JaZbC.js +0 -250
- package/bundled-test-harness/assets/can-invoke-test-ccMc06BU.js +0 -401
- package/bundled-test-harness/assets/card-api-Bn65NUT0.js +0 -8
- package/bundled-test-harness/assets/card-api-test-COrFXu2i.js +0 -198
- package/bundled-test-harness/assets/card-api-u1pOrwS6.js +0 -4393
- package/bundled-test-harness/assets/card-basics-test-D4rn3iN-.js +0 -5364
- package/bundled-test-harness/assets/card-chooser-paging-test-bZhdrUXt.js +0 -235
- package/bundled-test-harness/assets/card-chooser-test-D9w1duob.js +0 -393
- package/bundled-test-harness/assets/card-collection-ClCV-__1.js +0 -118
- package/bundled-test-harness/assets/card-context-search-results-H_rN3Upz.js +0 -30
- package/bundled-test-harness/assets/card-context-search-results-test-jciyaouV.js +0 -184
- package/bundled-test-harness/assets/card-def-field-def-relationships-test-BVZoQzM8.js +0 -562
- package/bundled-test-harness/assets/card-delete-test-CuLcZFnY.js +0 -466
- package/bundled-test-harness/assets/card-error-DIOivSkD.js +0 -72
- package/bundled-test-harness/assets/card-error-awaiting-index-test-JMwcRONq.js +0 -53
- package/bundled-test-harness/assets/card-error-detail-96jWBx6B.js +0 -271
- package/bundled-test-harness/assets/card-info-BxPtwG1h.js +0 -2
- package/bundled-test-harness/assets/card-list-B34qY3io.js +0 -2
- package/bundled-test-harness/assets/card-list-BpCaKkZJ.js +0 -202
- package/bundled-test-harness/assets/card-resource-DcPbIwH9.js +0 -86
- package/bundled-test-harness/assets/cards-grid-CTN8nBT_.js +0 -344
- package/bundled-test-harness/assets/cards-grid-Cx44vL-M.js +0 -2
- package/bundled-test-harness/assets/cards-grid-layout-BdL0Uzxl.js +0 -111
- package/bundled-test-harness/assets/cards-grid-layout-Dn8Yb4ma.js +0 -2
- package/bundled-test-harness/assets/check-correctness-test-BfMV-MC0.js +0 -554
- package/bundled-test-harness/assets/clip-CK6mVuyN.js +0 -92
- package/bundled-test-harness/assets/clip-CfXD1JTr.js +0 -2
- package/bundled-test-harness/assets/code-ref-85Bih6Zl.js +0 -138
- package/bundled-test-harness/assets/code-ref-DATHaoyt.js +0 -2
- package/bundled-test-harness/assets/code-submode-availability-test-DLYlx0wo.js +0 -198
- package/bundled-test-harness/assets/code-submode-test-CDIi7MjD.js +0 -1824
- package/bundled-test-harness/assets/codeblocks-test-CNPyTvuv.js +0 -418
- package/bundled-test-harness/assets/codemirror-editor-BPOPTR-f.js +0 -2
- package/bundled-test-harness/assets/codemirror-editor-DPhG0pec.js +0 -701
- package/bundled-test-harness/assets/codemirror-embed-toolbar-test-Dk5lFOUq.js +0 -366
- package/bundled-test-harness/assets/color-BxN5gRSg.js +0 -65
- package/bundled-test-harness/assets/color-CrunRcis.js +0 -2
- package/bundled-test-harness/assets/color-field-test-COjFIpXV.js +0 -212
- package/bundled-test-harness/assets/color-picker-field-C-GS1CIw.js +0 -139
- package/bundled-test-harness/assets/color-picker-field-D3RXhbCK.js +0 -2
- package/bundled-test-harness/assets/color-wheel-picker-Bz8cBmf4.js +0 -283
- package/bundled-test-harness/assets/color-wheel-picker-DrwPrB8B.js +0 -2
- package/bundled-test-harness/assets/command-data-BxXgtNBf.js +0 -2
- package/bundled-test-harness/assets/command-data-ZdkcpEgG.js +0 -95
- package/bundled-test-harness/assets/compaction-test-DS7DTGT_.js +0 -150
- package/bundled-test-harness/assets/components-CbCTWAON.js +0 -17777
- package/bundled-test-harness/assets/computed-test-D_OrXDtR.js +0 -1320
- package/bundled-test-harness/assets/container-DDolu1gk.js +0 -11109
- package/bundled-test-harness/assets/container-DndcCIMv.css +0 -5169
- package/bundled-test-harness/assets/contains-many-component-BtgnAXih.js +0 -2
- package/bundled-test-harness/assets/contrast-checker-addon-kwtLKWdL.js +0 -2
- package/bundled-test-harness/assets/contrast-checker-addon-zFY5cen1.js +0 -71
- package/bundled-test-harness/assets/convert-to-class-name-test-BcGWl2K1.js +0 -17
- package/bundled-test-harness/assets/coordinate-D72EF1Pl.js +0 -48
- package/bundled-test-harness/assets/copy-file-to-realm-test-CYoDX4YV.js +0 -148
- package/bundled-test-harness/assets/country-B-iIe5v8.js +0 -199
- package/bundled-test-harness/assets/create-file-modal-PpvMksjR.js +0 -570
- package/bundled-test-harness/assets/create-listing-modal-test-CQtEf_UD.js +0 -273
- package/bundled-test-harness/assets/create-listing-pr-request-test-CDtKWyfk.js +0 -117
- package/bundled-test-harness/assets/create-spec-test-Cbqk8I9T.js +0 -256
- package/bundled-test-harness/assets/create-specs-CZg2cpnh.js +0 -215
- package/bundled-test-harness/assets/create-submission-workflow-test-CYrxF7bg.js +0 -132
- package/bundled-test-harness/assets/credential-fields-test-Di4jCJgU.js +0 -157
- package/bundled-test-harness/assets/css-value-CceJyI5o.js +0 -48
- package/bundled-test-harness/assets/csv-file-def-DJL2aZI9.js +0 -277
- package/bundled-test-harness/assets/currency-Bn5WIqzF.js +0 -134
- package/bundled-test-harness/assets/date-XI2CVYA2.js +0 -2
- package/bundled-test-harness/assets/date-h83UJcFR.js +0 -183
- package/bundled-test-harness/assets/date-time-fields-test-Cterr2mj.js +0 -359
- package/bundled-test-harness/assets/datetime-DadI80tC.js +0 -201
- package/bundled-test-harness/assets/datetime-Dpb_Sejj.js +0 -2
- package/bundled-test-harness/assets/datetime-stamp-C4vv397u.js +0 -81
- package/bundled-test-harness/assets/datetime-stamp-DIsJdQux.js +0 -2
- package/bundled-test-harness/assets/day-C4pZoGNM.js +0 -113
- package/bundled-test-harness/assets/day-D0goBhKb.js +0 -2
- package/bundled-test-harness/assets/debug-message-test-CV0sj-fl.js +0 -117
- package/bundled-test-harness/assets/dist-CAIttNZm.js +0 -1710
- package/bundled-test-harness/assets/dist-CLbqnmnm.js +0 -389
- package/bundled-test-harness/assets/dist-qkBOmIQy.js +0 -323
- package/bundled-test-harness/assets/docx-file-def-hz2tVQKf.js +0 -60
- package/bundled-test-harness/assets/docx-meta-extractor-CeRshlxL.js +0 -60
- package/bundled-test-harness/assets/docx-meta-extractor-muK5CKF3.js +0 -2
- package/bundled-test-harness/assets/duration-BYx1dLfm.js +0 -2
- package/bundled-test-harness/assets/duration-FAmTFeUa.js +0 -184
- package/bundled-test-harness/assets/email-D-bFy_C1.js +0 -80
- package/bundled-test-harness/assets/email-field-test-CY9K2zur.js +0 -75
- package/bundled-test-harness/assets/email-j4DZNH2-.js +0 -2
- package/bundled-test-harness/assets/enum-B7_baAn_.js +0 -167
- package/bundled-test-harness/assets/enum-BQqNzVQS.js +0 -2
- package/bundled-test-harness/assets/enum-field-test-BJ9Epz15.js +0 -953
- package/bundled-test-harness/assets/error-display-test-CbDWjJ2F.js +0 -343
- package/bundled-test-harness/assets/ethereum-address-BOLEnKsm.js +0 -78
- package/bundled-test-harness/assets/ethereum-address-s3Kvb2wG.js +0 -2
- package/bundled-test-harness/assets/expiration-warning-BaIP1MOZ.js +0 -2
- package/bundled-test-harness/assets/expiration-warning-gjEtxPk0.js +0 -90
- package/bundled-test-harness/assets/externals-Bih8ejPS.js +0 -4393
- package/bundled-test-harness/assets/fallback-banner-MlImHjSD.js +0 -24
- package/bundled-test-harness/assets/fallback-banner-live-delete-test-Bm7IKXPf.js +0 -207
- package/bundled-test-harness/assets/fallback-banner-test-C7TGA0Ob.js +0 -53
- package/bundled-test-harness/assets/fallback-banner-test-lvuaVRXu.js +0 -225
- package/bundled-test-harness/assets/fallback-models-test-Dy7iIKUS.js +0 -161
- package/bundled-test-harness/assets/field-component-DBoOxTke.js +0 -2
- package/bundled-test-harness/assets/field-configuration-test-DnAnzyC-.js +0 -548
- package/bundled-test-harness/assets/field-edit-DdJ8Akso.js +0 -2
- package/bundled-test-harness/assets/field-edit-XAop92l8.js +0 -36
- package/bundled-test-harness/assets/field-markdown-domain-test-cZCqbcjj.js +0 -616
- package/bundled-test-harness/assets/field-markdown-oversize-test-BuATetVz.js +0 -88
- package/bundled-test-harness/assets/field-markdown-primitives-test-BsubQfhv.js +0 -365
- package/bundled-test-harness/assets/field-markdown-specialized-test-4eNLiYpF.js +0 -534
- package/bundled-test-harness/assets/field-test-helpers-9I7cHnaU.js +0 -45
- package/bundled-test-harness/assets/file-api-CC86I7Er.js +0 -7
- package/bundled-test-harness/assets/file-attachment-test-o9191GMb.js +0 -796
- package/bundled-test-harness/assets/file-chooser-panel-test-C8aZuJlk.js +0 -153
- package/bundled-test-harness/assets/file-chooser-test-B0Tn8CCR.js +0 -504
- package/bundled-test-harness/assets/file-def-edit-BSiF2Lje.js +0 -2
- package/bundled-test-harness/assets/file-def-edit-C5TYBp_q.js +0 -26
- package/bundled-test-harness/assets/file-def-embedded-BLVTCiVB.js +0 -2
- package/bundled-test-harness/assets/file-def-embedded-Bep4iD6s.js +0 -38
- package/bundled-test-harness/assets/file-def-fitted-BTs-AS78.js +0 -2
- package/bundled-test-harness/assets/file-def-fitted-DcPitdYu.js +0 -38
- package/bundled-test-harness/assets/file-def-isolated-Kg1YVhm-.js +0 -38
- package/bundled-test-harness/assets/file-def-isolated-tK5JWCam.js +0 -2
- package/bundled-test-harness/assets/file-def-serialization-test-D4wnd5XK.js +0 -89
- package/bundled-test-harness/assets/file-menu-items-CH4-naSK.js +0 -117
- package/bundled-test-harness/assets/file-menu-items-emUxx3ZI.js +0 -2
- package/bundled-test-harness/assets/file-preview-stage-B1McIWwu.js +0 -2
- package/bundled-test-harness/assets/file-preview-stage-BgZLNMN4.js +0 -72
- package/bundled-test-harness/assets/file-shell-embedded-BmfuwWfU.js +0 -2
- package/bundled-test-harness/assets/file-shell-embedded-zh8CJanA.js +0 -68
- package/bundled-test-harness/assets/file-shell-fitted-DSFUNRGJ.js +0 -2
- package/bundled-test-harness/assets/file-shell-fitted-DXKDH0fn.js +0 -98
- package/bundled-test-harness/assets/file-shell-isolated-0F1MFv4q.js +0 -2
- package/bundled-test-harness/assets/file-shell-isolated-DduZZzmi.js +0 -195
- package/bundled-test-harness/assets/file-tree-from-index-BzDvvUHy.js +0 -151
- package/bundled-test-harness/assets/file-tree-from-index-test-D0hfI4a1.js +0 -96
- package/bundled-test-harness/assets/film-BN_HVXBU.js +0 -13
- package/bundled-test-harness/assets/film-CKkbUi0L.js +0 -2
- package/bundled-test-harness/assets/film-CMNJITZ-.js +0 -4074
- package/bundled-test-harness/assets/fitted-CAvdcKpu.js +0 -34
- package/bundled-test-harness/assets/fitted-CbKOwd1u.js +0 -2
- package/bundled-test-harness/assets/flac-meta-extractor-e8qajPSl.js +0 -99
- package/bundled-test-harness/assets/font-file-def-9atde5W8.js +0 -64
- package/bundled-test-harness/assets/font-meta-extractor-IralDC8M.js +0 -303
- package/bundled-test-harness/assets/font-meta-extractor-zPBVOfoR.js +0 -2
- package/bundled-test-harness/assets/formatted-aibot-message-test-CWOiZUng.js +0 -109
- package/bundled-test-harness/assets/from-elsewhere-ChxbtsBa.js +0 -131
- package/bundled-test-harness/assets/frontmatter-field-cdig7KR9.js +0 -41
- package/bundled-test-harness/assets/garbage-collection-test-Dg-ww_Sb.js +0 -403
- package/bundled-test-harness/assets/gauge-B45nLOGe.js +0 -106
- package/bundled-test-harness/assets/gauge-BK-768BM.js +0 -2
- package/bundled-test-harness/assets/general-test-D7cn7PUr.js +0 -926
- package/bundled-test-harness/assets/get-relationship-membership-state-test-Skmj9V6y.js +0 -1308
- package/bundled-test-harness/assets/gif-meta-extractor-BychhK9q.js +0 -114
- package/bundled-test-harness/assets/glimmer-motion-and-choreo-in-cards-test-C09YUmk4.js +0 -160
- package/bundled-test-harness/assets/glimmer-motion-and-choreo-test-DYskx_Kk.js +0 -74
- package/bundled-test-harness/assets/helper-BHX0HLF2.js +0 -478
- package/bundled-test-harness/assets/host-submode-test-Clw_QnvF.js +0 -1243
- package/bundled-test-harness/assets/html-file-def-C0P9giwU.js +0 -82
- package/bundled-test-harness/assets/hydratable-card-DnjrxKsT.js +0 -147
- package/bundled-test-harness/assets/hydratable-card-test-BAmWHfv1.js +0 -426
- package/bundled-test-harness/assets/icons-DBXBZgLe.js +0 -894
- package/bundled-test-harness/assets/image-Cip6ojDd.js +0 -47
- package/bundled-test-harness/assets/image-file-def-BdQxjZcN.js +0 -65
- package/bundled-test-harness/assets/image-file-def-DP4aqWcS.js +0 -3
- package/bundled-test-harness/assets/index-changes-test-D8b_56Ke.js +0 -367
- package/bundled-test-harness/assets/index-query-engine-test-CCyaUwMX.js +0 -2593
- package/bundled-test-harness/assets/inspector-test-BJTVGdOO.js +0 -1930
- package/bundled-test-harness/assets/instance-filter-matcher-test-DjsPrXL7.js +0 -788
- package/bundled-test-harness/assets/interact-submode-creation-and-permissions-test-DSqM0vxh.js +0 -475
- package/bundled-test-harness/assets/interact-submode-setup-DF31UMX-.js +0 -566
- package/bundled-test-harness/assets/is-component-declaration-test-Did47eG9.js +0 -50
- package/bundled-test-harness/assets/iso-bmff-LuWkGL__.js +0 -205
- package/bundled-test-harness/assets/iso-bmff-_flO6c20.js +0 -2
- package/bundled-test-harness/assets/isolated-and-edit-frocLHin.js +0 -2
- package/bundled-test-harness/assets/job-priority-header-test-DHLAXfp7.js +0 -81
- package/bundled-test-harness/assets/job-scoped-instance-residency-test-C1Bt5j98.js +0 -103
- package/bundled-test-harness/assets/join-the-community-BBUSO2cs.js +0 -86
- package/bundled-test-harness/assets/jpg-meta-extractor-CoybO4Hq.js +0 -88
- package/bundled-test-harness/assets/json-field-8sdH5RQb.js +0 -2
- package/bundled-test-harness/assets/json-field-BDD3iTUh.js +0 -19
- package/bundled-test-harness/assets/json-file-def-BKibsfc6.js +0 -298
- package/bundled-test-harness/assets/last-modified-date-CR5jru2m.js +0 -43
- package/bundled-test-harness/assets/last-modified-date-test-jJ00YdTm.js +0 -28
- package/bundled-test-harness/assets/links-to-editor-rDoCYaN-.js +0 -2
- package/bundled-test-harness/assets/links-to-many-component-BqZT88Fb.js +0 -2
- package/bundled-test-harness/assets/linksto-broken-link-placeholder-test-Cp1Eb_4U.js +0 -398
- package/bundled-test-harness/assets/linksto-error-sentinel-test-Bddavnh_.js +0 -238
- package/bundled-test-harness/assets/linksto-many-broken-link-placeholder-test-c5WegXnR.js +0 -354
- package/bundled-test-harness/assets/linksto-many-per-slot-access-test-CWskzfGW.js +0 -303
- package/bundled-test-harness/assets/linksto-sentinel-reload-test-ByeVNhr8.js +0 -197
- package/bundled-test-harness/assets/linksto-sentinel-roundtrip-test-DP26i6Gb.js +0 -260
- package/bundled-test-harness/assets/linksto-singular-js-access-contract-test-fDUXx8tO.js +0 -196
- package/bundled-test-harness/assets/llm-model-BcLEkTV7.js +0 -64
- package/bundled-test-harness/assets/login-CeuuNVvU.css +0 -139
- package/bundled-test-harness/assets/login-DV0WlJv-.js +0 -348
- package/bundled-test-harness/assets/login-error-text-test-BMGY_9gW.js +0 -51
- package/bundled-test-harness/assets/login-test-CL9YpMH5.js +0 -246
- package/bundled-test-harness/assets/m4a-meta-extractor-CHO1JQtb.js +0 -204
- package/bundled-test-harness/assets/main-CPLT8JNu.js +0 -5
- package/bundled-test-harness/assets/markdown-BvBALLGh.js +0 -7
- package/bundled-test-harness/assets/markdown-DFezmrFD.js +0 -2
- package/bundled-test-harness/assets/markdown-editor-mode-select-Au64bcIO.js +0 -2
- package/bundled-test-harness/assets/markdown-editor-mode-select-rK9PP8rv.js +0 -54
- package/bundled-test-harness/assets/markdown-embed-chooser-modal-test-CIxizf5k.js +0 -470
- package/bundled-test-harness/assets/markdown-embed-preview-pane-test-C7GoNN7l.js +0 -447
- package/bundled-test-harness/assets/markdown-embed-preview-test-CDnj4uhd.js +0 -368
- package/bundled-test-harness/assets/markdown-fallback-n7PsLNmO.js +0 -2
- package/bundled-test-harness/assets/markdown-fallback-test-DTHT6OwQ.js +0 -316
- package/bundled-test-harness/assets/markdown-highlighting-test-DJ-4WSE_.js +0 -244
- package/bundled-test-harness/assets/markdown-preview-Ccelx5W-.js +0 -64
- package/bundled-test-harness/assets/markdown-preview-JXuMC_ve.js +0 -72
- package/bundled-test-harness/assets/markdown-preview-test-ByZqrpPk.js +0 -238
- package/bundled-test-harness/assets/markdown-skill-frontmatter-test-DAHGeL4K.js +0 -146
- package/bundled-test-harness/assets/menu-items-DzJm9H_H.js +0 -2
- package/bundled-test-harness/assets/message-tool-test-lmdrIEdY.js +0 -33
- package/bundled-test-harness/assets/metadata-fields-BZZr4Qe5.js +0 -2
- package/bundled-test-harness/assets/metadata-fields-BtdjGsKE.js +0 -1415
- package/bundled-test-harness/assets/midi-audio-def-uYbYFmFi.js +0 -52
- package/bundled-test-harness/assets/midi-meta-extractor-DNI5gc1q.js +0 -284
- package/bundled-test-harness/assets/midi-meta-extractor-DbKZ4fMG.js +0 -2
- package/bundled-test-harness/assets/migrate-skill-test-DI1xceiL.js +0 -161
- package/bundled-test-harness/assets/mini-CNoDyHqG.js +0 -1519
- package/bundled-test-harness/assets/mini-DexlIeKK.js +0 -85
- package/bundled-test-harness/assets/mini-card-chooser-test-DT5eIf1_.js +0 -272
- package/bundled-test-harness/assets/mini-file-chooser-test-DTQnKTZJ.js +0 -201
- package/bundled-test-harness/assets/missing-template-DL2mwddM.js +0 -2
- package/bundled-test-harness/assets/missing-template-ltqlJ4JC.js +0 -48
- package/bundled-test-harness/assets/modal-container-DRnt95-S.js +0 -40
- package/bundled-test-harness/assets/modal-zE95eEFp.js +0 -322
- package/bundled-test-harness/assets/model-cost-tier-test-CcFz7hcv.js +0 -173
- package/bundled-test-harness/assets/module-contents-service-Dk_zWt-V.js +0 -256
- package/bundled-test-harness/assets/month-BqReBYWo.js +0 -2
- package/bundled-test-harness/assets/month-RhvmIp40.js +0 -123
- package/bundled-test-harness/assets/month-day-XFAQA72z.js +0 -2
- package/bundled-test-harness/assets/month-day-XzKpk6nz.js +0 -192
- package/bundled-test-harness/assets/month-year-BeuNr2Cl.js +0 -2
- package/bundled-test-harness/assets/month-year-DhU7hATV.js +0 -93
- package/bundled-test-harness/assets/mp3-meta-extractor-Dx2RnJc5.js +0 -476
- package/bundled-test-harness/assets/mp4-meta-extractor--k0m8KsT.js +0 -188
- package/bundled-test-harness/assets/multiple-stacks-test-bC24IWcJ.js +0 -208
- package/bundled-test-harness/assets/nested-query-field-render-test-qxElXx1e.js +0 -249
- package/bundled-test-harness/assets/no-stacks-test-Br7IGAgV.js +0 -48
- package/bundled-test-harness/assets/number-73SsCMEF.js +0 -3
- package/bundled-test-harness/assets/number-CicTBWQd.js +0 -151
- package/bundled-test-harness/assets/number-field-test-kV5zXo1J.js +0 -184
- package/bundled-test-harness/assets/number-input-CQy4xUeA.js +0 -82
- package/bundled-test-harness/assets/office-extract-Bo8sbNkK.js +0 -27
- package/bundled-test-harness/assets/office-extract-CfBaoRMD.js +0 -2
- package/bundled-test-harness/assets/ogg-meta-extractor-aIf5q_Rq.js +0 -225
- package/bundled-test-harness/assets/on-key-C8acaldQ.js +0 -472
- package/bundled-test-harness/assets/ooxml-Bu3iZezv.js +0 -172
- package/bundled-test-harness/assets/ooxml-jQPBQK25.js +0 -2
- package/bundled-test-harness/assets/open-image-in-new-tab-test-CP7q3kMm.js +0 -52
- package/bundled-test-harness/assets/operation-lowering-test-9Mdr0hRT.js +0 -2812
- package/bundled-test-harness/assets/operations-R9b661Qn.js +0 -3
- package/bundled-test-harness/assets/operations-Zv_V3Api.js +0 -766
- package/bundled-test-harness/assets/operations-invocation-test-BJPpWb2H.js +0 -523
- package/bundled-test-harness/assets/operations-query-test-DufdmPQF.js +0 -459
- package/bundled-test-harness/assets/operations-test-CzT051YH.js +0 -2518
- package/bundled-test-harness/assets/operator-mode-acceptance-test-ByOIOcD0.js +0 -1188
- package/bundled-test-harness/assets/operator-mode-card-chooser-test-CNhR9mvv.js +0 -1036
- package/bundled-test-harness/assets/operator-mode-links-test-CuxSVTPR.js +0 -793
- package/bundled-test-harness/assets/operator-mode-state-service-CCeHt5SH.js +0 -1275
- package/bundled-test-harness/assets/operator-mode-state-service-test-C8TI9WWg.js +0 -206
- package/bundled-test-harness/assets/operator-mode-test-DG-mG8Tn.js +0 -683
- package/bundled-test-harness/assets/operator-mode-ui-test-DB7xhjS0.js +0 -1027
- package/bundled-test-harness/assets/overlay-menu-items-test-C6rcdF_S.js +0 -317
- package/bundled-test-harness/assets/overlays-D2zmPxzK.js +0 -270
- package/bundled-test-harness/assets/overlays-clip-test-Clpq3JzQ.js +0 -91
- package/bundled-test-harness/assets/overlays-detached-element-test-BtsTeJch.js +0 -56
- package/bundled-test-harness/assets/pane-f-IYhcWT.js +0 -330
- package/bundled-test-harness/assets/panel-B3PCSBbf.js +0 -3540
- package/bundled-test-harness/assets/panel-Ban7zCBP.js +0 -474
- package/bundled-test-harness/assets/past-sessions-test-uM2m-oKV.js +0 -321
- package/bundled-test-harness/assets/patch-fields-test-COPjDhnt.js +0 -1014
- package/bundled-test-harness/assets/patch-instance-test-CRb3dfby.js +0 -348
- package/bundled-test-harness/assets/pdf-file-def-J_yOUU8_.js +0 -76
- package/bundled-test-harness/assets/pdf-meta-extractor-83T5Bdo7.js +0 -156
- package/bundled-test-harness/assets/pdf-meta-extractor-INFIklMy.js +0 -2
- package/bundled-test-harness/assets/pdf-viewer-B4rRluWA.js +0 -2
- package/bundled-test-harness/assets/pdf-viewer-vYem8ozk.js +0 -112
- package/bundled-test-harness/assets/percentage-ChagfNRG.js +0 -84
- package/bundled-test-harness/assets/permission-checking-realm-test-Dmb2a428.js +0 -306
- package/bundled-test-harness/assets/phone-number-BiD2eaSd.js +0 -236
- package/bundled-test-harness/assets/phone-number-C-wt4_UK.js +0 -2
- package/bundled-test-harness/assets/phone-number-field-test-BHzAmuBP.js +0 -73
- package/bundled-test-harness/assets/plate-CqN2nM6P.js +0 -41
- package/bundled-test-harness/assets/plate-DaIfpORN.js +0 -2
- package/bundled-test-harness/assets/player-CGt5fTd5.js +0 -2
- package/bundled-test-harness/assets/player-CN0l44LK.js +0 -82
- package/bundled-test-harness/assets/plural-field-components-test-CO2g2opW.js +0 -198
- package/bundled-test-harness/assets/png-image-def-B_oou2wS.js +0 -48
- package/bundled-test-harness/assets/png-meta-extractor-BfPz1qP_.js +0 -2
- package/bundled-test-harness/assets/png-meta-extractor-C8ai8sPw.js +0 -111
- package/bundled-test-harness/assets/policy-scoped-search-test-BRRp2a1A.js +0 -339
- package/bundled-test-harness/assets/pptx-file-def-C3qYEHDM.js +0 -60
- package/bundled-test-harness/assets/pptx-meta-extractor-8IuoBq4I.js +0 -77
- package/bundled-test-harness/assets/pptx-meta-extractor-BPhy9RMM.js +0 -2
- package/bundled-test-harness/assets/prerender-persistence-block-test-Cteb_Rs_.js +0 -124
- package/bundled-test-harness/assets/prerender-serialize-cycle-test-CH7b6Ra9.js +0 -134
- package/bundled-test-harness/assets/preview-CmERZpI6.js +0 -74
- package/bundled-test-harness/assets/preview-format-BPMlCSbb.js +0 -41
- package/bundled-test-harness/assets/preview-format-test-B7sA8fbZ.js +0 -103
- package/bundled-test-harness/assets/process-card-CtDzDB-_.js +0 -2
- package/bundled-test-harness/assets/process-card-erbWKY5h.js +0 -114
- package/bundled-test-harness/assets/process-card-test-DXOt1jDW.js +0 -94
- package/bundled-test-harness/assets/profile-settings-modal-11BrR058.js +0 -708
- package/bundled-test-harness/assets/progress-circle-Cd79Zqh2.js +0 -2
- package/bundled-test-harness/assets/progress-circle-sc-W5aUl.js +0 -95
- package/bundled-test-harness/assets/quarter-B61kCpcD.js +0 -168
- package/bundled-test-harness/assets/quarter-d5jkTzcz.js +0 -2
- package/bundled-test-harness/assets/query-field-membership-status-test-BmpVfohw.js +0 -323
- package/bundled-test-harness/assets/query-field-page-optin-test-9_Cce-OJ.js +0 -126
- package/bundled-test-harness/assets/query-field-schema-test-CwV7xanX.js +0 -231
- package/bundled-test-harness/assets/query-field-stale-prerender-test-RkdnZ-VV.js +0 -152
- package/bundled-test-harness/assets/query-fields-test-BLxYkTAM.js +0 -535
- package/bundled-test-harness/assets/rail-CFPU0tFe.js +0 -2
- package/bundled-test-harness/assets/rail-CQ53Dakr.js +0 -44
- package/bundled-test-harness/assets/realm-DdVH9lSZ.js +0 -95
- package/bundled-test-harness/assets/realm-DdsFw3b-.js +0 -2
- package/bundled-test-harness/assets/realm-config-DIslxoB7.js +0 -844
- package/bundled-test-harness/assets/realm-config-policy-standing-test-b4WxNDor.js +0 -290
- package/bundled-test-harness/assets/realm-config-routing-rule-edit-test-C-rcvkkD.js +0 -274
- package/bundled-test-harness/assets/realm-config-settings-test-DDUkM3zw.js +0 -187
- package/bundled-test-harness/assets/realm-dropdown-1j55Dy-1.js +0 -560
- package/bundled-test-harness/assets/realm-field-test-D-uEtFKO.js +0 -100
- package/bundled-test-harness/assets/realm-indexing-test-U9m0epR-.js +0 -4380
- package/bundled-test-harness/assets/realm-policy-test-DhKabhlk.js +0 -1141
- package/bundled-test-harness/assets/realm-test-BX6C9SS5.js +0 -2363
- package/bundled-test-harness/assets/realm-url-tooltip-BjjcKqBx.js +0 -56
- package/bundled-test-harness/assets/realm-url-tooltip-test-DW0ZwEEE.js +0 -78
- package/bundled-test-harness/assets/reasoning-test-BWT94KXG.js +0 -234
- package/bundled-test-harness/assets/recent-colors-addon-CfgmgilF.js +0 -61
- package/bundled-test-harness/assets/recent-colors-addon-D--Ry3Pf.js +0 -2
- package/bundled-test-harness/assets/relationship-loading-state-test-C5R6jao_.js +0 -290
- package/bundled-test-harness/assets/relative-time-Bq7pqums.js +0 -2
- package/bundled-test-harness/assets/relative-time-D0QyW4ig.js +0 -129
- package/bundled-test-harness/assets/remix-card-test-Cy0h3Xdf.js +0 -58
- package/bundled-test-harness/assets/rendered-markdown-Hw_EF8SO.js +0 -263
- package/bundled-test-harness/assets/rendered-markdown-test-CqeF-UZd.js +0 -587
- package/bundled-test-harness/assets/resident-instance-reuse-test-BiI6L40n.js +0 -82
- package/bundled-test-harness/assets/response-field-BCxG5phG.js +0 -38
- package/bundled-test-harness/assets/result-tile-DMzRnTP8.js +0 -140
- package/bundled-test-harness/assets/rich-markdown-C4RUl7L0.js +0 -2
- package/bundled-test-harness/assets/rich-markdown-DxQSCg-o.js +0 -218
- package/bundled-test-harness/assets/rich-markdown-field-test-B7wpedKs.js +0 -1647
- package/bundled-test-harness/assets/room-D0M0Zwrs.js +0 -1008
- package/bundled-test-harness/assets/room-message-test-BWWd4xC8.js +0 -445
- package/bundled-test-harness/assets/room-test-DFH-nOwi.js +0 -95
- package/bundled-test-harness/assets/run-realm-code-DyVyEDBl.js +0 -1600
- package/bundled-test-harness/assets/run-realm-code-test-BpxF-tOz.js +0 -2468
- package/bundled-test-harness/assets/schema-generation-test-DjaJqpYP.js +0 -28
- package/bundled-test-harness/assets/score-Cfp34BE7.js +0 -2
- package/bundled-test-harness/assets/score-DIWWpeyf.js +0 -100
- package/bundled-test-harness/assets/scrolling-test-hA_uBwBg.js +0 -384
- package/bundled-test-harness/assets/search-C0-b7dJI.js +0 -605
- package/bundled-test-harness/assets/search-adorn-test-C6KP3AwA.js +0 -136
- package/bundled-test-harness/assets/search-entries-BfPq5sPS.js +0 -472
- package/bundled-test-harness/assets/search-entries-result-test-Bl9u_BOD.js +0 -234
- package/bundled-test-harness/assets/search-entries-test-BDC_lS43.js +0 -1486
- package/bundled-test-harness/assets/search-result-header-DCAze_cg.js +0 -128
- package/bundled-test-harness/assets/search-results-Dd0enVun.js +0 -266
- package/bundled-test-harness/assets/search-results-test-T5KEEII4.js +0 -578
- package/bundled-test-harness/assets/search-selection-menu-test-CCssnBq1.js +0 -108
- package/bundled-test-harness/assets/search-sheet-persistence-test-BzQiO-FK.js +0 -131
- package/bundled-test-harness/assets/search-test-fyCWb24m.js +0 -2241
- package/bundled-test-harness/assets/searchable-BkgeKQMl.js +0 -2
- package/bundled-test-harness/assets/searchable-D_6p6fyb.js +0 -192
- package/bundled-test-harness/assets/searchable-option-test-CnCUYGaq.js +0 -322
- package/bundled-test-harness/assets/searchable-search-doc-test-B8Q0D98v.js +0 -1271
- package/bundled-test-harness/assets/sending-test-D5PGBDys.js +0 -576
- package/bundled-test-harness/assets/serialization-rri-form-audit-test-BRJ1cJ31.js +0 -136
- package/bundled-test-harness/assets/serialization-test-DM6hK258.js +0 -8758
- package/bundled-test-harness/assets/setup-C_GgVgzM.js +0 -772
- package/bundled-test-harness/assets/shared-link-target-reuse-test-Be-lSKib.js +0 -207
- package/bundled-test-harness/assets/show-card-BFG6KR1m.js +0 -67
- package/bundled-test-harness/assets/show-card-test-l0wMrfZq.js +0 -365
- package/bundled-test-harness/assets/show-file-B8-FRVHj.js +0 -34
- package/bundled-test-harness/assets/signed-capture-D_Q44TQ7.js +0 -204
- package/bundled-test-harness/assets/signed-capture-link-test-DOS5xpYv.js +0 -132
- package/bundled-test-harness/assets/single-stack-test-BIEtzHVS.js +0 -652
- package/bundled-test-harness/assets/skill-BUTGmSsm.js +0 -76
- package/bundled-test-harness/assets/skill-Bo7R_2Ud.js +0 -3
- package/bundled-test-harness/assets/skill-reference-Cs64py3k.js +0 -112
- package/bundled-test-harness/assets/skills-test-CXxSIkYa.js +0 -648
- package/bundled-test-harness/assets/slider-picker-C81errGI.js +0 -245
- package/bundled-test-harness/assets/slider-picker-mvKsy6cR.js +0 -2
- package/bundled-test-harness/assets/spec-B55lJurX.js +0 -602
- package/bundled-test-harness/assets/store-DyQ0KiyI.js +0 -2205
- package/bundled-test-harness/assets/store-module-rebuild-test-C7532_bS.js +0 -454
- package/bundled-test-harness/assets/store-search-test-80NMJuoW.js +0 -175
- package/bundled-test-harness/assets/store-test-dHiWXXMs.js +0 -3460
- package/bundled-test-harness/assets/string-DHlQEHYm.js +0 -9
- package/bundled-test-harness/assets/submode-switcher-DQv-CD6G.js +0 -169
- package/bundled-test-harness/assets/svg-meta-extractor-Uw_EJytF.js +0 -42
- package/bundled-test-harness/assets/swatches-picker-CaEoibN1.js +0 -33
- package/bundled-test-harness/assets/swatches-picker-gPl50JbP.js +0 -2
- package/bundled-test-harness/assets/switch-submode-BKDnJd4m.js +0 -79
- package/bundled-test-harness/assets/switch-submode-test-_E2mVk4z.js +0 -168
- package/bundled-test-harness/assets/tag-B60lDr-j.js +0 -105
- package/bundled-test-harness/assets/tests-BBBgPBB6.js +0 -3520
- package/bundled-test-harness/assets/text-area-CJjWmwpi.js +0 -9
- package/bundled-test-harness/assets/text-file-def-u_dl0i2z.js +0 -151
- package/bundled-test-harness/assets/text-input-validator-test-BTwnkSS2.js +0 -156
- package/bundled-test-harness/assets/theme-BK-fAHVn.js +0 -9
- package/bundled-test-harness/assets/theme-card-test-BQmT7rqr.js +0 -621
- package/bundled-test-harness/assets/theme-scheme-island-test-Oi3aeyp1.js +0 -264
- package/bundled-test-harness/assets/three-d-model-def-B4KckPVC.js +0 -70
- package/bundled-test-harness/assets/time-BcuaSkHg.js +0 -126
- package/bundled-test-harness/assets/time-f7Irg7Z7.js +0 -2
- package/bundled-test-harness/assets/time-slots-ClYIZN53.js +0 -2
- package/bundled-test-harness/assets/time-slots-TI1aaqRN.js +0 -85
- package/bundled-test-harness/assets/timeline-Cof9eyq0.js +0 -59
- package/bundled-test-harness/assets/timeline-DFWQtCWE.js +0 -2
- package/bundled-test-harness/assets/to-device-streaming-test-BDrUUlOt.js +0 -163
- package/bundled-test-harness/assets/token-usage-test-CiZo03fY.js +0 -166
- package/bundled-test-harness/assets/tool-field-BXHr9r0w.js +0 -94
- package/bundled-test-harness/assets/tool-field-CoRO5C4R.js +0 -2
- package/bundled-test-harness/assets/tools-CmVaYDIS.js +0 -725
- package/bundled-test-harness/assets/tools-calling-test-B454__XF.js +0 -200
- package/bundled-test-harness/assets/tools-test-CLu51dJO.js +0 -1624
- package/bundled-test-harness/assets/tools-test-XGRAvVug.js +0 -2820
- package/bundled-test-harness/assets/ts-file-def-C05BDwdg.js +0 -159
- package/bundled-test-harness/assets/update-room-skills-test-jOvP14JX.js +0 -240
- package/bundled-test-harness/assets/url-BFf2CNo-.js +0 -2
- package/bundled-test-harness/assets/url-CYm-CeXp.js +0 -96
- package/bundled-test-harness/assets/video-file-def-B2UIrOFS.js +0 -76
- package/bundled-test-harness/assets/wav-meta-extractor-BNkv7e2f.js +0 -368
- package/bundled-test-harness/assets/webm-meta-extractor-C933kYyc.js +0 -178
- package/bundled-test-harness/assets/webp-meta-extractor-BLz0z1pZ.js +0 -98
- package/bundled-test-harness/assets/website-BuOMUW1v.js +0 -92
- package/bundled-test-harness/assets/week-Bo0666ji.js +0 -111
- package/bundled-test-harness/assets/week-CaVFA8Vc.js +0 -2
- package/bundled-test-harness/assets/welcome-to-boxel-PWard7GF.js +0 -172
- package/bundled-test-harness/assets/workspace-KXfFTQNV.js +0 -614
- package/bundled-test-harness/assets/workspace-a11y-test-Buwb-rfO.js +0 -197
- package/bundled-test-harness/assets/workspace-behavior-test-CbgFUOOo.js +0 -200
- package/bundled-test-harness/assets/workspace-chooser-BmQvhhrl.js +0 -2248
- package/bundled-test-harness/assets/workspace-chooser-Cu84Gd_E.css +0 -1317
- package/bundled-test-harness/assets/workspace-chooser-catalog-order-test-rcRw6sni.js +0 -36
- package/bundled-test-harness/assets/workspace-chooser-unreachable-notice-test-DUXnBIdY.js +0 -60
- package/bundled-test-harness/assets/workspace-delete-multiple-test-DjRKhZ2g.js +0 -212
- package/bundled-test-harness/assets/workspace-delete-summary-test-CvkLVYyN.js +0 -63
- package/bundled-test-harness/assets/workspace-timestamp-labels-test-AYJT4inv.js +0 -58
- package/bundled-test-harness/assets/xlsx-file-def-DuKdbGrJ.js +0 -60
- package/bundled-test-harness/assets/xlsx-meta-extractor-Bz-C2JWP.js +0 -101
- package/bundled-test-harness/assets/xlsx-meta-extractor-ClwwgABg.js +0 -2
- package/bundled-test-harness/assets/year-B6ctHikl.js +0 -2
- package/bundled-test-harness/assets/year-C11uAQE6.js +0 -78
- package/bundled-test-harness/assets/zip-file-def-B8XN-OS_.js +0 -288
- package/bundled-types/host-app/components/matrix/auth-button.gts +0 -39
- package/bundled-types/host-app/components/matrix/auth-container.gts +0 -69
- package/bundled-types/host-app/components/matrix/auth-form-field.gts +0 -43
|
@@ -0,0 +1,1141 @@
|
|
|
1
|
+
import { s as __toESM } from "./chunk-Rp0pCe6z.js";
|
|
2
|
+
import { Ar as testRealmURL, di as DEFAULT_ANONYMOUS_RATE_LIMIT, ua as IndexWriter } from "./runtime-common-ClpqhbwG.js";
|
|
3
|
+
import { y as rri } from "./paths-BYHDgqsT.js";
|
|
4
|
+
import { b as PermissionsContextName } from "./constants-CqKWhRfY.js";
|
|
5
|
+
import { M as waitUntil, T as settled, d as click, o as waitFor, s as fillIn } from "./dist-BOAdzfkP.js";
|
|
6
|
+
import { t as require_qunit } from "./qunit-C-Foo4Nd.js";
|
|
7
|
+
import { D as realmConfigCardJSON, F as setupLocalIndexing, M as setupCardLogs, P as setupIntegrationTestRealm, b as getDbAdapter, lt as setupRenderingTest, nt as provide, t as setupMockMatrix } from "./mock-matrix-DPQ0j2MD.js";
|
|
8
|
+
import { r as getService } from "./dist-CPfIHBla.js";
|
|
9
|
+
import { Y as serializeCard } from "./field-support-DdQ7XgyM.js";
|
|
10
|
+
import "./card-api-Dzje0smT.js";
|
|
11
|
+
import { t as renderCard } from "./render-component-B15Z0e2v.js";
|
|
12
|
+
import { t as setupCatalogTestSubset } from "./catalog-test-subset-Dvz5g8wa.js";
|
|
13
|
+
//#region tests/integration/realm-policy-test.gts
|
|
14
|
+
var import_qunit = /* @__PURE__ */ __toESM(require_qunit());
|
|
15
|
+
var policyRef = {
|
|
16
|
+
module: rri("@cardstack/catalog/realm-policy/realm-policy"),
|
|
17
|
+
name: "RealmPolicy"
|
|
18
|
+
};
|
|
19
|
+
var teacherPredicate = " actor() in .teacherIds ";
|
|
20
|
+
var rosterPredicate = ".roster.providerIds contains actor()";
|
|
21
|
+
var providerPredicate = ".providerId == actor()";
|
|
22
|
+
function policyDocument(rules) {
|
|
23
|
+
return { data: {
|
|
24
|
+
type: "card",
|
|
25
|
+
attributes: {
|
|
26
|
+
cardInfo: { name: "Education" },
|
|
27
|
+
rules
|
|
28
|
+
},
|
|
29
|
+
meta: { adoptsFrom: policyRef }
|
|
30
|
+
} };
|
|
31
|
+
}
|
|
32
|
+
var educationPolicy = policyDocument([{
|
|
33
|
+
targetType: {
|
|
34
|
+
module: "../classroom",
|
|
35
|
+
name: "Classroom"
|
|
36
|
+
},
|
|
37
|
+
grants: [{ operation: "read" }, {
|
|
38
|
+
operation: "appendActivity",
|
|
39
|
+
where: teacherPredicate
|
|
40
|
+
}]
|
|
41
|
+
}, {
|
|
42
|
+
targetType: {
|
|
43
|
+
module: "../schedule",
|
|
44
|
+
name: "Schedule"
|
|
45
|
+
},
|
|
46
|
+
grants: [{
|
|
47
|
+
operation: "read",
|
|
48
|
+
where: {
|
|
49
|
+
bxl: rosterPredicate,
|
|
50
|
+
snapshot: true
|
|
51
|
+
}
|
|
52
|
+
}, {
|
|
53
|
+
operation: "listMySchedules",
|
|
54
|
+
where: providerPredicate
|
|
55
|
+
}]
|
|
56
|
+
}]);
|
|
57
|
+
var BACKTICK = "`";
|
|
58
|
+
var ANONYMOUS = "actor() == \"anonymous\"";
|
|
59
|
+
var PLATFORM_LIMIT = {
|
|
60
|
+
requests: 17,
|
|
61
|
+
windowSeconds: 45
|
|
62
|
+
};
|
|
63
|
+
var PLATFORM_LIMIT_LINE = `${PLATFORM_LIMIT.requests}/${PLATFORM_LIMIT.windowSeconds} (platform default where unset)`;
|
|
64
|
+
var TEACHER = "@teacher:localhost";
|
|
65
|
+
var COLLEAGUE = "@colleague:localhost";
|
|
66
|
+
var leadsPredicate = ".leadTeacherIds | any(. == actor())";
|
|
67
|
+
var teachesPredicate = ".teacherIds | any(. == actor())";
|
|
68
|
+
var classroomModule = `
|
|
69
|
+
import { contains, containsMany, field, CardDef } from "@cardstack/base/card-api";
|
|
70
|
+
import StringField from "@cardstack/base/string";
|
|
71
|
+
|
|
72
|
+
export class Classroom extends CardDef {
|
|
73
|
+
@field title = contains(StringField);
|
|
74
|
+
@field teacherIds = containsMany(StringField);
|
|
75
|
+
@field leadTeacherIds = containsMany(StringField);
|
|
76
|
+
}
|
|
77
|
+
`;
|
|
78
|
+
var rosterModule = `
|
|
79
|
+
import { contains, containsMany, field, linksToMany, CardDef } from "@cardstack/base/card-api";
|
|
80
|
+
import StringField from "@cardstack/base/string";
|
|
81
|
+
|
|
82
|
+
export class Student extends CardDef {
|
|
83
|
+
@field name = contains(StringField);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
export class Roster extends CardDef {
|
|
87
|
+
@field teacherIds = containsMany(StringField);
|
|
88
|
+
@field students = linksToMany(() => Student);
|
|
89
|
+
}
|
|
90
|
+
`;
|
|
91
|
+
function classroom(teacherIds) {
|
|
92
|
+
return { data: {
|
|
93
|
+
type: "card",
|
|
94
|
+
attributes: {
|
|
95
|
+
teacherIds,
|
|
96
|
+
leadTeacherIds: []
|
|
97
|
+
},
|
|
98
|
+
meta: { adoptsFrom: {
|
|
99
|
+
module: "../classroom",
|
|
100
|
+
name: "Classroom"
|
|
101
|
+
} }
|
|
102
|
+
} };
|
|
103
|
+
}
|
|
104
|
+
var classroomPolicy = policyDocument([{
|
|
105
|
+
targetType: {
|
|
106
|
+
module: "../classroom",
|
|
107
|
+
name: "Classroom"
|
|
108
|
+
},
|
|
109
|
+
grants: [
|
|
110
|
+
{
|
|
111
|
+
operation: "delete",
|
|
112
|
+
where: leadsPredicate
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
operation: "delete",
|
|
116
|
+
where: teachesPredicate
|
|
117
|
+
},
|
|
118
|
+
{ operation: "update" }
|
|
119
|
+
]
|
|
120
|
+
}]);
|
|
121
|
+
(0, import_qunit.module)("Integration | realm policy", function(hooks) {
|
|
122
|
+
setupRenderingTest(hooks);
|
|
123
|
+
setupCatalogTestSubset(hooks);
|
|
124
|
+
setupLocalIndexing(hooks);
|
|
125
|
+
let loader;
|
|
126
|
+
let mockMatrixUtils = setupMockMatrix(hooks, {
|
|
127
|
+
loggedInAs: "@testuser:localhost",
|
|
128
|
+
activeRealms: [testRealmURL],
|
|
129
|
+
autostart: true
|
|
130
|
+
});
|
|
131
|
+
hooks.beforeEach(function() {
|
|
132
|
+
loader = getService("loader-service").loader;
|
|
133
|
+
});
|
|
134
|
+
setupCardLogs(hooks, async () => await loader.import("@cardstack/base/card-api"));
|
|
135
|
+
async function setupPolicyRealm(contents) {
|
|
136
|
+
let { realm } = await setupIntegrationTestRealm({
|
|
137
|
+
mockMatrixUtils,
|
|
138
|
+
contents,
|
|
139
|
+
anonymousRateLimit: PLATFORM_LIMIT
|
|
140
|
+
});
|
|
141
|
+
return realm;
|
|
142
|
+
}
|
|
143
|
+
async function loadPolicy(path) {
|
|
144
|
+
return await getService("store").get(`${testRealmURL}${path}`);
|
|
145
|
+
}
|
|
146
|
+
(0, import_qunit.test)("an authored policy indexes and reads back with its predicates as written", async function(assert) {
|
|
147
|
+
let doc = await (await setupPolicyRealm({ "policies/education.json": educationPolicy })).realmIndexQueryEngine.cardDocument(new URL(`${testRealmURL}policies/education`));
|
|
148
|
+
assert.strictEqual(doc?.type, "doc", `the policy indexes cleanly: ${JSON.stringify(doc?.type === "error" ? doc.error : void 0)}`);
|
|
149
|
+
let rules = doc?.type === "doc" ? doc.doc.data.attributes?.rules : [];
|
|
150
|
+
assert.deepEqual(rules.map((rule) => rule.grants.map((grant) => grant.operation)), [["read", "appendActivity"], ["read", "listMySchedules"]], "both rules and all four grants survive indexing, in order");
|
|
151
|
+
assert.strictEqual(rules[0].grants[1].where, teacherPredicate, "a bare-string predicate reads back as the same bare string");
|
|
152
|
+
assert.deepEqual(rules[1].grants[0].where, {
|
|
153
|
+
bxl: rosterPredicate,
|
|
154
|
+
snapshot: true
|
|
155
|
+
}, "the annotated snapshot form reads back as the annotated form");
|
|
156
|
+
assert.strictEqual(rules[1].grants[1].where, providerPredicate, "a second bare-string predicate is unaffected by its annotated sibling");
|
|
157
|
+
assert.strictEqual(rules[0].grants[0].where, null, "a grant authored with no predicate reads back with none, not an empty string");
|
|
158
|
+
});
|
|
159
|
+
(0, import_qunit.test)("a loaded policy resolves each target type relative to the policy card", async function(assert) {
|
|
160
|
+
await setupPolicyRealm({ "policies/education.json": educationPolicy });
|
|
161
|
+
let policy = await loadPolicy("policies/education");
|
|
162
|
+
assert.deepEqual(policy.rules.map((rule) => rule.targetType), [{
|
|
163
|
+
module: `${testRealmURL}classroom`,
|
|
164
|
+
name: "Classroom"
|
|
165
|
+
}, {
|
|
166
|
+
module: `${testRealmURL}schedule`,
|
|
167
|
+
name: "Schedule"
|
|
168
|
+
}], "targetType is a code ref resolved against the policy card");
|
|
169
|
+
assert.deepEqual(policy.rules.flatMap((rule) => rule.grants.map((grant) => grant.where)), [
|
|
170
|
+
null,
|
|
171
|
+
{
|
|
172
|
+
source: teacherPredicate,
|
|
173
|
+
snapshot: false
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
source: rosterPredicate,
|
|
177
|
+
snapshot: true
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
source: providerPredicate,
|
|
181
|
+
snapshot: false
|
|
182
|
+
}
|
|
183
|
+
], "both stored shapes read as one representation, told apart only by snapshot");
|
|
184
|
+
});
|
|
185
|
+
(0, import_qunit.test)("a predicate that is present but malformed fails the policy instead of reading as unconditional", async function(assert) {
|
|
186
|
+
let realm = await setupPolicyRealm({
|
|
187
|
+
"policies/typo.json": policyDocument([{
|
|
188
|
+
targetType: {
|
|
189
|
+
module: "../classroom",
|
|
190
|
+
name: "Classroom"
|
|
191
|
+
},
|
|
192
|
+
grants: [{
|
|
193
|
+
operation: "update",
|
|
194
|
+
where: {
|
|
195
|
+
bxl: rosterPredicate,
|
|
196
|
+
snapshop: true
|
|
197
|
+
}
|
|
198
|
+
}]
|
|
199
|
+
}]),
|
|
200
|
+
"policies/number.json": policyDocument([{
|
|
201
|
+
targetType: {
|
|
202
|
+
module: "../classroom",
|
|
203
|
+
name: "Classroom"
|
|
204
|
+
},
|
|
205
|
+
grants: [{
|
|
206
|
+
operation: "update",
|
|
207
|
+
where: 42
|
|
208
|
+
}]
|
|
209
|
+
}])
|
|
210
|
+
});
|
|
211
|
+
for (let [path, reason] of [["policies/typo", "accepts only 'bxl' and 'snapshot'"], ["policies/number", "must be a string of BXL source"]]) {
|
|
212
|
+
let entry = await realm.realmIndexQueryEngine.instance(new URL(`${testRealmURL}${path}`));
|
|
213
|
+
assert.strictEqual(entry?.type, "instance-error", `${path} is an index error rather than a policy with an unconditional grant`);
|
|
214
|
+
let error = entry?.type === "instance-error" ? entry.error : void 0;
|
|
215
|
+
assert.true(JSON.stringify(error ?? null).includes(reason), `${path} fails because its predicate is malformed: ${JSON.stringify(error?.message)}`);
|
|
216
|
+
}
|
|
217
|
+
});
|
|
218
|
+
(0, import_qunit.test)("the policy lists its rules and grants in isolated format", async function(assert) {
|
|
219
|
+
await setupPolicyRealm({ "policies/education.json": educationPolicy });
|
|
220
|
+
let policy = await loadPolicy("policies/education");
|
|
221
|
+
await renderCard(loader, policy, "isolated");
|
|
222
|
+
assert.dom("[data-test-realm-policy-isolated]").exists();
|
|
223
|
+
assert.dom("[data-test-policy-rule]").exists({ count: 2 });
|
|
224
|
+
assert.dom("[data-test-policy-rule-type-name]").exists({ count: 2 }).hasText("Classroom", "rules are listed by the type they govern");
|
|
225
|
+
assert.dom("[data-test-operation-grant]").exists({ count: 4 }, "every grant is listed");
|
|
226
|
+
assert.dom("[data-test-policy-rule-type-module]").hasText(`${testRealmURL}classroom`, "with the module that defines it");
|
|
227
|
+
assert.dom("[data-test-operation-grant-unconditional]").exists({ count: 1 }, "the grant with no predicate reads as always");
|
|
228
|
+
assert.dom("[data-test-policy-predicate-source]").exists({ count: 3 }, "each predicate is shown");
|
|
229
|
+
assert.deepEqual([...document.querySelectorAll("[data-test-policy-predicate-source]")].map((el) => el.textContent), [
|
|
230
|
+
teacherPredicate,
|
|
231
|
+
rosterPredicate,
|
|
232
|
+
providerPredicate
|
|
233
|
+
], "each predicate is shown exactly as written, with no added whitespace");
|
|
234
|
+
assert.dom("[data-test-policy-predicate-snapshot]").exists({ count: 1 }, "only the annotated predicate is marked snapshot");
|
|
235
|
+
});
|
|
236
|
+
(0, import_qunit.test)("the policy lists its rules and grants in embedded format", async function(assert) {
|
|
237
|
+
await setupPolicyRealm({ "policies/education.json": educationPolicy });
|
|
238
|
+
let policy = await loadPolicy("policies/education");
|
|
239
|
+
await renderCard(loader, policy, "embedded");
|
|
240
|
+
assert.dom("[data-test-realm-policy-embedded]").exists();
|
|
241
|
+
assert.dom("[data-test-policy-rule]").exists({ count: 2 });
|
|
242
|
+
assert.dom("[data-test-operation-grant]").exists({ count: 4 });
|
|
243
|
+
assert.dom("[data-test-operation-grant-operation]").hasText("read", "grants are listed by operation name");
|
|
244
|
+
assert.dom("[data-test-policy-predicate-snapshot]").exists({ count: 1 });
|
|
245
|
+
});
|
|
246
|
+
(0, import_qunit.test)("a grant opened to callers who are not signed in says so, and a write names the setting it acts as", async function(assert) {
|
|
247
|
+
await setupPolicyRealm({ "policies/public.json": policyDocument([{
|
|
248
|
+
targetType: {
|
|
249
|
+
module: "../classroom",
|
|
250
|
+
name: "Classroom"
|
|
251
|
+
},
|
|
252
|
+
grants: [
|
|
253
|
+
{
|
|
254
|
+
operation: "read",
|
|
255
|
+
where: ANONYMOUS
|
|
256
|
+
},
|
|
257
|
+
{
|
|
258
|
+
operation: "update",
|
|
259
|
+
where: ANONYMOUS,
|
|
260
|
+
actingUser: "realmConfig(\"feedbackWriter\")"
|
|
261
|
+
},
|
|
262
|
+
{ operation: "delete" }
|
|
263
|
+
]
|
|
264
|
+
}]) });
|
|
265
|
+
let policy = await loadPolicy("policies/public");
|
|
266
|
+
await renderCard(loader, policy, "embedded");
|
|
267
|
+
assert.dom("[data-test-operation-grant]").exists({ count: 3 });
|
|
268
|
+
assert.dom("[data-test-operation-grant-anonymous]").exists({ count: 2 }, "only the grants that opt in are marked").hasText("anyone");
|
|
269
|
+
assert.dom("[data-test-operation-grant-acting-user]").exists({ count: 1 }, "only the write names who it acts as").hasText("realmConfig(\"feedbackWriter\")");
|
|
270
|
+
assert.dom("[data-test-operation-grant-rate-limit]").exists({ count: 2 }, "and each grant opened to them says what it limits them to");
|
|
271
|
+
});
|
|
272
|
+
(0, import_qunit.test)("an anonymous write without an acting user carries a warning", async function(assert) {
|
|
273
|
+
await renderPolicyNamed("policies/public", [{
|
|
274
|
+
targetType: {
|
|
275
|
+
module: "../classroom",
|
|
276
|
+
name: "Classroom"
|
|
277
|
+
},
|
|
278
|
+
grants: [{
|
|
279
|
+
operation: "update",
|
|
280
|
+
where: ANONYMOUS
|
|
281
|
+
}]
|
|
282
|
+
}]);
|
|
283
|
+
assert.dom("[data-test-policy-grant-warning-message=\"anonymous-write-without-acting-user\"]").exists().includesText("needs an");
|
|
284
|
+
});
|
|
285
|
+
(0, import_qunit.test)("an anonymous write editor shows Realm Config-backed rate limits", async function(assert) {
|
|
286
|
+
await setupPolicyRealm({ "policies/public.json": policyDocument([{
|
|
287
|
+
targetType: {
|
|
288
|
+
module: "../classroom",
|
|
289
|
+
name: "Classroom"
|
|
290
|
+
},
|
|
291
|
+
grants: [{
|
|
292
|
+
operation: "update",
|
|
293
|
+
where: ANONYMOUS,
|
|
294
|
+
rateLimitRequests: "realmConfig(\"publicRequests\")",
|
|
295
|
+
rateLimitWindowSeconds: "realmConfig(\"publicWindow\")"
|
|
296
|
+
}]
|
|
297
|
+
}]) });
|
|
298
|
+
let policy = await loadPolicy("policies/public");
|
|
299
|
+
provide(PermissionsContextName, {
|
|
300
|
+
canWrite: true,
|
|
301
|
+
canRead: true
|
|
302
|
+
});
|
|
303
|
+
await renderCard(loader, policy, "edit");
|
|
304
|
+
assert.dom("[data-test-field=\"rateLimitRequests\"] input").hasValue("realmConfig(\"publicRequests\")");
|
|
305
|
+
assert.dom("[data-test-field=\"rateLimitWindowSeconds\"] input").hasValue("realmConfig(\"publicWindow\")");
|
|
306
|
+
});
|
|
307
|
+
(0, import_qunit.test)("a policy with no rules says it grants nothing", async function(assert) {
|
|
308
|
+
await setupPolicyRealm({ "policies/empty.json": policyDocument([]) });
|
|
309
|
+
let policy = await loadPolicy("policies/empty");
|
|
310
|
+
await renderCard(loader, policy, "isolated");
|
|
311
|
+
assert.dom("[data-test-realm-policy-no-rules]").exists();
|
|
312
|
+
assert.dom("[data-test-policy-rule]").doesNotExist();
|
|
313
|
+
});
|
|
314
|
+
(0, import_qunit.test)("an empty predicate and an unannotated object are kept as present predicates", async function(assert) {
|
|
315
|
+
let doc = await (await setupPolicyRealm({ "policies/edge.json": policyDocument([{
|
|
316
|
+
targetType: {
|
|
317
|
+
module: "../classroom",
|
|
318
|
+
name: "Classroom"
|
|
319
|
+
},
|
|
320
|
+
grants: [
|
|
321
|
+
{
|
|
322
|
+
operation: "read",
|
|
323
|
+
where: ""
|
|
324
|
+
},
|
|
325
|
+
{
|
|
326
|
+
operation: "update",
|
|
327
|
+
where: {
|
|
328
|
+
bxl: providerPredicate,
|
|
329
|
+
snapshot: false
|
|
330
|
+
}
|
|
331
|
+
},
|
|
332
|
+
{
|
|
333
|
+
operation: "delete",
|
|
334
|
+
where: { bxl: providerPredicate }
|
|
335
|
+
}
|
|
336
|
+
]
|
|
337
|
+
}]) })).realmIndexQueryEngine.cardDocument(new URL(`${testRealmURL}policies/edge`));
|
|
338
|
+
let rules = doc?.type === "doc" ? doc.doc.data.attributes?.rules : [];
|
|
339
|
+
assert.deepEqual(rules[0]?.grants.map((grant) => grant.where), [
|
|
340
|
+
"",
|
|
341
|
+
providerPredicate,
|
|
342
|
+
providerPredicate
|
|
343
|
+
], "an empty source stays an empty string, and an object without snapshot: true is stored as the bare string");
|
|
344
|
+
let policy = await loadPolicy("policies/edge");
|
|
345
|
+
assert.deepEqual(policy.rules[0].grants.map((grant) => grant.where), [
|
|
346
|
+
{
|
|
347
|
+
source: "",
|
|
348
|
+
snapshot: false
|
|
349
|
+
},
|
|
350
|
+
{
|
|
351
|
+
source: providerPredicate,
|
|
352
|
+
snapshot: false
|
|
353
|
+
},
|
|
354
|
+
{
|
|
355
|
+
source: providerPredicate,
|
|
356
|
+
snapshot: false
|
|
357
|
+
}
|
|
358
|
+
], "none of them reads as an unconditional grant");
|
|
359
|
+
});
|
|
360
|
+
(0, import_qunit.test)("emptying a predicate while editing keeps it, and removing it is explicit", async function(assert) {
|
|
361
|
+
await setupPolicyRealm({ "policies/one.json": policyDocument([{
|
|
362
|
+
targetType: {
|
|
363
|
+
module: "../schedule",
|
|
364
|
+
name: "Schedule"
|
|
365
|
+
},
|
|
366
|
+
grants: [{
|
|
367
|
+
operation: "read",
|
|
368
|
+
where: {
|
|
369
|
+
bxl: rosterPredicate,
|
|
370
|
+
snapshot: true
|
|
371
|
+
}
|
|
372
|
+
}]
|
|
373
|
+
}]) });
|
|
374
|
+
let grant = (await loadPolicy("policies/one")).rules[0].grants[0];
|
|
375
|
+
provide(PermissionsContextName, {
|
|
376
|
+
canWrite: true,
|
|
377
|
+
canRead: true
|
|
378
|
+
});
|
|
379
|
+
await renderCard(loader, grant, "edit");
|
|
380
|
+
await fillIn("[data-test-policy-predicate-input]", "");
|
|
381
|
+
assert.deepEqual(grant.where, {
|
|
382
|
+
source: "",
|
|
383
|
+
snapshot: true
|
|
384
|
+
}, "an emptied predicate is still a predicate, and keeps its snapshot flag");
|
|
385
|
+
assert.dom("[data-test-policy-predicate-input]").hasAttribute("placeholder", "Empty condition", "an emptied predicate does not read as always allowed");
|
|
386
|
+
await fillIn("[data-test-policy-predicate-input]", providerPredicate);
|
|
387
|
+
assert.deepEqual(grant.where, {
|
|
388
|
+
source: providerPredicate,
|
|
389
|
+
snapshot: true
|
|
390
|
+
}, "retyping the source keeps the snapshot flag");
|
|
391
|
+
await click("[data-test-policy-predicate-remove]");
|
|
392
|
+
assert.strictEqual(grant.where, null, "removing the condition makes the grant unconditional");
|
|
393
|
+
assert.dom("[data-test-policy-predicate-remove]").doesNotExist("an unconditional grant has no condition to remove");
|
|
394
|
+
assert.dom("[data-test-policy-predicate-input]").hasAttribute("placeholder", "Always allowed", "an unconditional grant reads as always allowed");
|
|
395
|
+
});
|
|
396
|
+
function grantLinesInEditor() {
|
|
397
|
+
return [...document.querySelectorAll("[data-test-policy-rule-grant] [data-test-operation-grant]")].map((el) => el.textContent?.replace(/\s+/g, " ").trim());
|
|
398
|
+
}
|
|
399
|
+
function ruleEditor(index) {
|
|
400
|
+
return `[data-test-contains-many="rules"] [data-test-item="${index}"]`;
|
|
401
|
+
}
|
|
402
|
+
(0, import_qunit.test)("editing a policy shows each grant as its view does, and adds, changes and removes grants", async function(assert) {
|
|
403
|
+
await setupPolicyRealm({ "policies/education.json": educationPolicy });
|
|
404
|
+
let policy = await loadPolicy("policies/education");
|
|
405
|
+
provide(PermissionsContextName, {
|
|
406
|
+
canWrite: true,
|
|
407
|
+
canRead: true
|
|
408
|
+
});
|
|
409
|
+
await renderCard(loader, policy, "edit");
|
|
410
|
+
assert.dom("[data-test-policy-rule-edit]").exists({ count: 2 });
|
|
411
|
+
assert.deepEqual(grantLinesInEditor(), [
|
|
412
|
+
"read always",
|
|
413
|
+
`appendActivity where ${teacherPredicate.trim()}`,
|
|
414
|
+
`read where ${rosterPredicate} snapshot`,
|
|
415
|
+
`listMySchedules where ${providerPredicate}`
|
|
416
|
+
], "each grant is shown by its operation and condition, in order");
|
|
417
|
+
assert.dom("[data-test-contains-many=\"rules\"]").doesNotIncludeText("Untitled", "no grant is shown as an untitled field");
|
|
418
|
+
assert.dom("[data-test-policy-rule-target-type] input").exists({ count: 2 }, "every rule's target type can be edited");
|
|
419
|
+
assert.dom("[data-test-policy-rule-grant] [data-test-policy-predicate-input]").exists({ count: 4 }, "every grant's condition can be edited");
|
|
420
|
+
assert.dom("[data-test-policy-rule-grant] [data-test-field=\"actingUser\"]").exists({ count: 4 }, "every grant says who a write by a caller who is not signed in is made as");
|
|
421
|
+
assert.dom("[data-test-policy-rule-grant] [data-test-field=\"blocklist\"]").exists({ count: 4 }, "and which addresses it refuses them from");
|
|
422
|
+
assert.dom(`${ruleEditor(0)} [data-test-rate-limit-requests-default]`).includesText(`${PLATFORM_LIMIT.requests}`, "the rate-limit fields say what applies when they are left empty");
|
|
423
|
+
assert.dom(`${ruleEditor(0)} [data-test-rate-limit-window-default]`).includesText(`${PLATFORM_LIMIT.windowSeconds}`);
|
|
424
|
+
assert.dom(`${ruleEditor(1)} [data-test-policy-rule-remove-grant="0"]`).hasAttribute("aria-label", "Remove grant 1 (read)", "each remove button names the grant it removes");
|
|
425
|
+
let studentPredicate = ".studentIds | any(. == actor())";
|
|
426
|
+
await fillIn(`${ruleEditor(0)} [data-test-policy-rule-grant="1"] [data-test-policy-predicate-input]`, studentPredicate);
|
|
427
|
+
await click(`${ruleEditor(0)} [data-test-policy-rule-add-grant]`);
|
|
428
|
+
await fillIn(`${ruleEditor(0)} [data-test-policy-rule-grant="2"] [data-test-field="operation"] input`, "update");
|
|
429
|
+
await click(`${ruleEditor(1)} [data-test-policy-rule-remove-grant="0"]`);
|
|
430
|
+
await fillIn(`${ruleEditor(0)} [data-test-policy-rule-grant="2"] [data-test-policy-predicate-input]`, ANONYMOUS);
|
|
431
|
+
await fillIn(`${ruleEditor(0)} [data-test-policy-rule-grant="2"] [data-test-field="actingUser"] input`, "realmConfig(\"feedbackWriter\")");
|
|
432
|
+
assert.deepEqual(grantLinesInEditor(), [
|
|
433
|
+
"read always",
|
|
434
|
+
`appendActivity where ${studentPredicate}`,
|
|
435
|
+
`update where ${ANONYMOUS} anyone as realmConfig("feedbackWriter") limit ${PLATFORM_LIMIT_LINE}`,
|
|
436
|
+
`listMySchedules where ${providerPredicate}`
|
|
437
|
+
], "each grant reads as it now stands");
|
|
438
|
+
let rules = serializeCard(policy, {}).data.attributes?.rules;
|
|
439
|
+
assert.deepEqual(rules.map((rule) => rule.grants.map(({ operation, where, actingUser }) => ({
|
|
440
|
+
operation,
|
|
441
|
+
where,
|
|
442
|
+
actingUser: actingUser ?? null
|
|
443
|
+
}))), [[
|
|
444
|
+
{
|
|
445
|
+
operation: "read",
|
|
446
|
+
where: null,
|
|
447
|
+
actingUser: null
|
|
448
|
+
},
|
|
449
|
+
{
|
|
450
|
+
operation: "appendActivity",
|
|
451
|
+
where: studentPredicate,
|
|
452
|
+
actingUser: null
|
|
453
|
+
},
|
|
454
|
+
{
|
|
455
|
+
operation: "update",
|
|
456
|
+
where: ANONYMOUS,
|
|
457
|
+
actingUser: "realmConfig(\"feedbackWriter\")"
|
|
458
|
+
}
|
|
459
|
+
], [{
|
|
460
|
+
operation: "listMySchedules",
|
|
461
|
+
where: providerPredicate,
|
|
462
|
+
actingUser: null
|
|
463
|
+
}]], "the saved policy holds the added, changed and remaining grants");
|
|
464
|
+
});
|
|
465
|
+
(0, import_qunit.test)("a policy edited without write permission shows its grants but cannot add or remove them", async function(assert) {
|
|
466
|
+
await setupPolicyRealm({ "policies/education.json": educationPolicy });
|
|
467
|
+
let policy = await loadPolicy("policies/education");
|
|
468
|
+
provide(PermissionsContextName, {
|
|
469
|
+
canWrite: false,
|
|
470
|
+
canRead: true
|
|
471
|
+
});
|
|
472
|
+
await renderCard(loader, policy, "edit");
|
|
473
|
+
assert.strictEqual(grantLinesInEditor().length, 4, "every grant is still shown");
|
|
474
|
+
assert.dom("[data-test-policy-rule-add-grant]").doesNotExist();
|
|
475
|
+
assert.dom("[data-test-policy-rule-remove-grant]").doesNotExist();
|
|
476
|
+
});
|
|
477
|
+
(0, import_qunit.test)("a document shape assigned in code is refused rather than read as a predicate", async function(assert) {
|
|
478
|
+
await setupPolicyRealm({ "policies/education.json": educationPolicy });
|
|
479
|
+
let policy = await loadPolicy("policies/education");
|
|
480
|
+
let grant = policy.rules[0].grants[1];
|
|
481
|
+
grant.where = providerPredicate;
|
|
482
|
+
assert.throws(() => serializeCard(policy, {}), /a policy predicate in memory must be \{ source, snapshot \}/, "a bare string on the instance fails the save instead of being written");
|
|
483
|
+
grant.where = {
|
|
484
|
+
bxl: providerPredicate,
|
|
485
|
+
snapshot: true
|
|
486
|
+
};
|
|
487
|
+
assert.throws(() => serializeCard(policy, {}), /a policy predicate in memory must be \{ source, snapshot \}/, "so does the annotated document shape");
|
|
488
|
+
grant.where = {
|
|
489
|
+
source: providerPredicate,
|
|
490
|
+
snapshot: true
|
|
491
|
+
};
|
|
492
|
+
let serialized = serializeCard(policy, {});
|
|
493
|
+
assert.deepEqual((serialized.data.attributes?.rules)[0].grants[1].where, {
|
|
494
|
+
bxl: providerPredicate,
|
|
495
|
+
snapshot: true
|
|
496
|
+
}, "an in-memory predicate serializes to its document shape");
|
|
497
|
+
});
|
|
498
|
+
async function renderClassroomPolicy() {
|
|
499
|
+
await setupIntegrationTestRealm({
|
|
500
|
+
mockMatrixUtils,
|
|
501
|
+
permissions: {
|
|
502
|
+
"*": ["read"],
|
|
503
|
+
"@testuser:localhost": [
|
|
504
|
+
"read",
|
|
505
|
+
"write",
|
|
506
|
+
"realm-owner"
|
|
507
|
+
]
|
|
508
|
+
},
|
|
509
|
+
contents: {
|
|
510
|
+
"realm.json": realmConfigCardJSON({ policy: `${testRealmURL}policies/classrooms` }),
|
|
511
|
+
"classroom.gts": classroomModule,
|
|
512
|
+
"classrooms/room-204.json": classroom([TEACHER]),
|
|
513
|
+
"classrooms/room-205.json": classroom([COLLEAGUE]),
|
|
514
|
+
"policies/classrooms.json": classroomPolicy
|
|
515
|
+
}
|
|
516
|
+
});
|
|
517
|
+
await getService("realm").login(testRealmURL);
|
|
518
|
+
getService("operations");
|
|
519
|
+
let policy = await loadPolicy("policies/classrooms");
|
|
520
|
+
await renderCard(loader, policy, "isolated");
|
|
521
|
+
}
|
|
522
|
+
async function ask(actor, target, operation) {
|
|
523
|
+
await fillIn("[data-test-explain-actor]", actor);
|
|
524
|
+
await fillIn("[data-test-explain-target]", target);
|
|
525
|
+
await fillIn("[data-test-explain-operation]", operation);
|
|
526
|
+
await click("[data-test-explain-submit]");
|
|
527
|
+
await waitFor("[data-test-explanation], [data-test-explain-refusal]", { timeout: 1e4 });
|
|
528
|
+
}
|
|
529
|
+
function grantsShown() {
|
|
530
|
+
return [...document.querySelectorAll("[data-test-explanation-grant]")].map((el) => [el.querySelector("[data-test-explanation-grant-where]")?.textContent, el.getAttribute("data-test-explanation-grant")]);
|
|
531
|
+
}
|
|
532
|
+
(0, import_qunit.test)("an explanation for someone who is not signed in shows what each grant opened to them limits, blocks and writes as", async function(assert) {
|
|
533
|
+
await setupIntegrationTestRealm({
|
|
534
|
+
mockMatrixUtils,
|
|
535
|
+
permissions: {
|
|
536
|
+
"*": ["read"],
|
|
537
|
+
"@testuser:localhost": [
|
|
538
|
+
"read",
|
|
539
|
+
"write",
|
|
540
|
+
"realm-owner"
|
|
541
|
+
]
|
|
542
|
+
},
|
|
543
|
+
contents: {
|
|
544
|
+
"realm.json": realmConfigCardJSON({
|
|
545
|
+
policy: `${testRealmURL}policies/classrooms`,
|
|
546
|
+
config: {
|
|
547
|
+
submitter: "@testuser:localhost",
|
|
548
|
+
blockedIps: "not an address"
|
|
549
|
+
}
|
|
550
|
+
}),
|
|
551
|
+
"classroom.gts": classroomModule,
|
|
552
|
+
"classrooms/room-204.json": classroom([TEACHER]),
|
|
553
|
+
"policies/classrooms.json": policyDocument([{
|
|
554
|
+
targetType: {
|
|
555
|
+
module: "../classroom",
|
|
556
|
+
name: "Classroom"
|
|
557
|
+
},
|
|
558
|
+
grants: [
|
|
559
|
+
{
|
|
560
|
+
operation: "update",
|
|
561
|
+
where: ANONYMOUS,
|
|
562
|
+
actingUser: "realmConfig(\"submitter\")",
|
|
563
|
+
blocklist: "realmConfig(\"blockedIps\")",
|
|
564
|
+
rateLimitRequests: "7",
|
|
565
|
+
rateLimitWindowSeconds: "30"
|
|
566
|
+
},
|
|
567
|
+
{
|
|
568
|
+
operation: "update",
|
|
569
|
+
where: ANONYMOUS,
|
|
570
|
+
actingUser: "realmConfig(\"missing\")"
|
|
571
|
+
},
|
|
572
|
+
{
|
|
573
|
+
operation: "update",
|
|
574
|
+
where: teachesPredicate,
|
|
575
|
+
actingUser: "realmConfig(\"submitter\")"
|
|
576
|
+
}
|
|
577
|
+
]
|
|
578
|
+
}])
|
|
579
|
+
}
|
|
580
|
+
});
|
|
581
|
+
await getService("realm").login(testRealmURL);
|
|
582
|
+
getService("operations");
|
|
583
|
+
let policy = await loadPolicy("policies/classrooms");
|
|
584
|
+
await renderCard(loader, policy, "isolated");
|
|
585
|
+
await ask("", `${testRealmURL}classrooms/room-204`, "update");
|
|
586
|
+
assert.dom("[data-test-explanation-actor]").hasText("not signed in");
|
|
587
|
+
assert.dom("[data-test-explanation-anonymous-limit]").hasText(`${DEFAULT_ANONYMOUS_RATE_LIMIT.requests} requests per ${DEFAULT_ANONYMOUS_RATE_LIMIT.windowSeconds} seconds from one address, the platform default, for a grant that sets none`);
|
|
588
|
+
assert.deepEqual([...document.querySelectorAll("[data-test-explanation-grant-anonymous]")].map((el) => el.textContent?.trim()), [
|
|
589
|
+
"Open to people who aren't signed in.",
|
|
590
|
+
"Their writes are made as @testuser:localhost.",
|
|
591
|
+
"Limit: 7 requests (set by this grant) per 30 seconds (set by this grant) from one address.",
|
|
592
|
+
"Its blocklist has entries that aren't an address or a range (\"not an address\"), so it turns away everyone who isn't signed in until it's fixed.",
|
|
593
|
+
"Open to people who aren't signed in.",
|
|
594
|
+
"Their writes: its \"Write as\" expression produced nothing, so this grant admits none of their writes.",
|
|
595
|
+
`Limit: ${DEFAULT_ANONYMOUS_RATE_LIMIT.requests} requests (the platform default) per ${DEFAULT_ANONYMOUS_RATE_LIMIT.windowSeconds} seconds (the platform default) from one address.`
|
|
596
|
+
], "only the grants opened to them carry these lines");
|
|
597
|
+
assert.deepEqual([...document.querySelectorAll("[data-test-explanation-grant-issue]")].map((el) => el.getAttribute("data-test-explanation-grant-issue")), ["acting-user-never-used"], "the grant that names an acting user it can never use carries its warning");
|
|
598
|
+
});
|
|
599
|
+
(0, import_qunit.test)("the policy explains what it decides for one caller, one card and one operation", async function(assert) {
|
|
600
|
+
await renderClassroomPolicy();
|
|
601
|
+
assert.dom("[data-test-realm-policy-explain]").exists();
|
|
602
|
+
assert.dom("[data-test-explain-actor-hint]").hasText("Leave this empty to check what someone who isn't signed in can do.", "the person field says how to ask about someone who is not signed in");
|
|
603
|
+
assert.dom("[data-test-explain-submit]").isDisabled("nothing to ask yet");
|
|
604
|
+
await ask(TEACHER, `${testRealmURL}classrooms/room-204`, "delete");
|
|
605
|
+
assert.strictEqual(document.querySelector("[data-test-explain-refusal]")?.textContent?.trim(), void 0, "the realm answers the question rather than refusing it");
|
|
606
|
+
assert.dom("[data-test-explanation-decision]").hasText("allowed");
|
|
607
|
+
assert.dom("[data-test-explanation-reason]").hasText("A grant in this policy allows it.");
|
|
608
|
+
assert.dom("[data-test-explanation-actor]").hasText(TEACHER);
|
|
609
|
+
assert.dom("[data-test-explanation-acl]").hasText("read", "the realm's own permissions let the teacher only read");
|
|
610
|
+
assert.dom("[data-test-explanation-refusal]").doesNotExist("an allowed invocation has no refusal to report");
|
|
611
|
+
assert.dom("[data-test-explanation-rule]").exists({ count: 1 }, "the one rule governing a classroom");
|
|
612
|
+
assert.deepEqual(grantsShown(), [[leadsPredicate, "did-not-hold"], [teachesPredicate, "held"]], "each delete grant is listed with its predicate and what it said, and the update grant is not");
|
|
613
|
+
assert.dom("[data-test-explanation-grant=\"held\"] [data-test-explanation-admitting]").exists("the grant that admitted the delete is marked");
|
|
614
|
+
assert.dom("[data-test-explanation-admitting]").exists({ count: 1 }, "and no other grant is");
|
|
615
|
+
});
|
|
616
|
+
(0, import_qunit.test)("the policy explains a refusal, and says when a question is refused", async function(assert) {
|
|
617
|
+
await renderClassroomPolicy();
|
|
618
|
+
await ask(TEACHER, `${testRealmURL}classrooms/room-205`, "delete");
|
|
619
|
+
assert.dom("[data-test-explanation-decision]").hasText("denied");
|
|
620
|
+
assert.dom("[data-test-explanation-reason]").hasText("This policy has grants for this operation on this card, but none of their conditions is met.");
|
|
621
|
+
assert.dom("[data-test-explanation-refusal]").hasText("403 operation-not-permitted", "the teacher may read the realm, so they would be told the gate refused them");
|
|
622
|
+
assert.deepEqual(grantsShown(), [[leadsPredicate, "did-not-hold"], [teachesPredicate, "did-not-hold"]], "neither delete grant holds for a classroom the teacher does not teach");
|
|
623
|
+
assert.dom("[data-test-explanation-admitting]").doesNotExist("no grant admitted the delete");
|
|
624
|
+
await ask(TEACHER, `${testRealmURL}classrooms/room-999`, "delete");
|
|
625
|
+
assert.dom("[data-test-explain-refusal]").hasText("no such target", "a card that is not there is refused the way the realm refuses one");
|
|
626
|
+
assert.dom("[data-test-explanation]").doesNotExist("and the earlier answer is not left on the page");
|
|
627
|
+
});
|
|
628
|
+
const MISTYPED = `${teachesPredicate} and .title ==`;
|
|
629
|
+
const UNFILTERABLE = "(.title | tonumber) > 0";
|
|
630
|
+
async function renderPolicyNamed(path, rules, modules = {}) {
|
|
631
|
+
let { realm } = await setupIntegrationTestRealm({
|
|
632
|
+
mockMatrixUtils,
|
|
633
|
+
contents: {
|
|
634
|
+
"classroom.gts": classroomModule,
|
|
635
|
+
...modules,
|
|
636
|
+
[`${path}.json`]: policyDocument(rules)
|
|
637
|
+
}
|
|
638
|
+
});
|
|
639
|
+
getService("operations");
|
|
640
|
+
let policy = await loadPolicy(path);
|
|
641
|
+
await renderCard(loader, policy, "isolated");
|
|
642
|
+
return realm;
|
|
643
|
+
}
|
|
644
|
+
async function grantStatuses() {
|
|
645
|
+
await waitFor("[data-test-policy-grant-status]", { timeout: 1e4 });
|
|
646
|
+
return [...document.querySelectorAll("[data-test-policy-grant-status]")].map((el) => el.getAttribute("data-test-policy-grant-status"));
|
|
647
|
+
}
|
|
648
|
+
(0, import_qunit.test)("a grant that does not compile is marked inactive among the live ones, and its issue names its rule and grant", async function(assert) {
|
|
649
|
+
await renderPolicyNamed("policies/mistyped", [{
|
|
650
|
+
targetType: {
|
|
651
|
+
module: "../classroom",
|
|
652
|
+
name: "Classroom"
|
|
653
|
+
},
|
|
654
|
+
grants: [
|
|
655
|
+
{ operation: "read" },
|
|
656
|
+
{
|
|
657
|
+
operation: "delete",
|
|
658
|
+
where: MISTYPED
|
|
659
|
+
},
|
|
660
|
+
{ operation: "update" }
|
|
661
|
+
]
|
|
662
|
+
}]);
|
|
663
|
+
assert.deepEqual(await grantStatuses(), [
|
|
664
|
+
"live",
|
|
665
|
+
"inactive",
|
|
666
|
+
"live"
|
|
667
|
+
], "the grant that does not compile is inactive, and the others are live");
|
|
668
|
+
assert.dom("[data-test-policy-grant-inactive]").exists({ count: 1 }, "and it is marked where it is listed");
|
|
669
|
+
assert.dom("[data-test-policy-grant-status=\"inactive\"] [data-test-operation-grant-operation]").hasText("delete", "the marked grant is the delete");
|
|
670
|
+
assert.dom("[data-test-realm-policy-uncompilable]").doesNotExist();
|
|
671
|
+
assert.dom("[data-test-realm-policy-issues]").exists();
|
|
672
|
+
assert.dom("[data-test-policy-issue]").exists({ count: 1 }).hasAttribute("data-test-policy-issue", "invalid-predicate");
|
|
673
|
+
assert.dom("[data-test-policy-issue-rule]").hasText("Classroom", "the issue names its rule's type");
|
|
674
|
+
assert.dom("[data-test-policy-issue-operation]").hasText("delete", "and its grant's operation");
|
|
675
|
+
assert.dom("[data-test-policy-issue-message]").includesText("has a syntax error", "and says what is wrong");
|
|
676
|
+
});
|
|
677
|
+
(0, import_qunit.test)("a query grant whose predicate compiles no search filter is inactive, and its issue says why", async function(assert) {
|
|
678
|
+
await renderPolicyNamed("policies/unfilterable", [{
|
|
679
|
+
targetType: {
|
|
680
|
+
module: "../classroom",
|
|
681
|
+
name: "Classroom"
|
|
682
|
+
},
|
|
683
|
+
grants: [{ operation: "read" }, {
|
|
684
|
+
operation: "query",
|
|
685
|
+
where: UNFILTERABLE
|
|
686
|
+
}]
|
|
687
|
+
}]);
|
|
688
|
+
assert.deepEqual(await grantStatuses(), ["live", "inactive"], "a query is authorized only through a filter, so the grant admits nothing");
|
|
689
|
+
assert.dom("[data-test-policy-grant-status=\"inactive\"] [data-test-operation-grant-operation]").hasText("query", "the marked grant is the query");
|
|
690
|
+
assert.dom("[data-test-policy-grant-inactive]").exists({ count: 1 }, "and it is marked where it is listed");
|
|
691
|
+
assert.dom("[data-test-policy-issue]").exists({ count: 1 }).hasAttribute("data-test-policy-issue", "policy-not-filterable");
|
|
692
|
+
assert.dom("[data-test-policy-issue-operation]").hasText("query");
|
|
693
|
+
});
|
|
694
|
+
(0, import_qunit.test)("a grant whose condition is annotated as reading a snapshot is live", async function(assert) {
|
|
695
|
+
await renderPolicyNamed("policies/snapshot", [{
|
|
696
|
+
targetType: {
|
|
697
|
+
module: "../classroom",
|
|
698
|
+
name: "Classroom"
|
|
699
|
+
},
|
|
700
|
+
grants: [{
|
|
701
|
+
operation: "read",
|
|
702
|
+
where: {
|
|
703
|
+
bxl: teachesPredicate,
|
|
704
|
+
snapshot: true
|
|
705
|
+
}
|
|
706
|
+
}, {
|
|
707
|
+
operation: "update",
|
|
708
|
+
where: teachesPredicate
|
|
709
|
+
}]
|
|
710
|
+
}]);
|
|
711
|
+
assert.deepEqual(await grantStatuses(), ["live", "live"], "the gate evaluates an annotated condition, so the annotation leaves the read in force");
|
|
712
|
+
assert.dom("[data-test-realm-policy-issues]").doesNotExist("compiling recorded no issue");
|
|
713
|
+
});
|
|
714
|
+
(0, import_qunit.test)("a rule whose type does not resolve is marked inactive with its grants", async function(assert) {
|
|
715
|
+
await renderPolicyNamed("policies/unresolved", [{
|
|
716
|
+
targetType: {
|
|
717
|
+
module: "../no-such-module",
|
|
718
|
+
name: "Nope"
|
|
719
|
+
},
|
|
720
|
+
grants: [{ operation: "read" }]
|
|
721
|
+
}, {
|
|
722
|
+
targetType: {
|
|
723
|
+
module: "../classroom",
|
|
724
|
+
name: "Classroom"
|
|
725
|
+
},
|
|
726
|
+
grants: [{ operation: "read" }]
|
|
727
|
+
}]);
|
|
728
|
+
assert.deepEqual(await grantStatuses(), ["inactive", "live"]);
|
|
729
|
+
assert.dom("[data-test-policy-rule-inactive]").exists({ count: 1 }, "the rule is marked, once");
|
|
730
|
+
assert.dom("[data-test-policy-grant-inactive]").doesNotExist("rather than each grant in it");
|
|
731
|
+
assert.dom("[data-test-policy-issue]").hasAttribute("data-test-policy-issue", "unresolved-type");
|
|
732
|
+
assert.dom("[data-test-policy-issue-rule]").hasText("Nope");
|
|
733
|
+
assert.dom("[data-test-policy-issue-operation]").doesNotExist("a rule-level issue names no grant");
|
|
734
|
+
});
|
|
735
|
+
(0, import_qunit.test)("a policy that does not compile at all says so apart from any one grant", async function(assert) {
|
|
736
|
+
await setupIntegrationTestRealm({
|
|
737
|
+
mockMatrixUtils,
|
|
738
|
+
contents: {
|
|
739
|
+
"classroom.gts": classroomModule,
|
|
740
|
+
"policies/broken.json": classroomPolicy
|
|
741
|
+
}
|
|
742
|
+
});
|
|
743
|
+
getService("operations");
|
|
744
|
+
let policy = await loadPolicy("policies/broken");
|
|
745
|
+
let batch = await new IndexWriter(await getDbAdapter()).createBatch(new URL(testRealmURL), getService("network").virtualNetwork);
|
|
746
|
+
await batch.updateEntry(new URL(`${testRealmURL}policies/broken.json`), {
|
|
747
|
+
type: "instance-error",
|
|
748
|
+
error: {
|
|
749
|
+
message: "Bad Gateway",
|
|
750
|
+
status: 502,
|
|
751
|
+
additionalErrors: null
|
|
752
|
+
},
|
|
753
|
+
diagnostics: { gatewayFailure: ["instance"] }
|
|
754
|
+
});
|
|
755
|
+
await batch.done();
|
|
756
|
+
await renderCard(loader, policy, "isolated");
|
|
757
|
+
await waitFor("[data-test-realm-policy-uncompilable]", { timeout: 1e4 });
|
|
758
|
+
assert.dom("[data-test-realm-policy-uncompilable]").includesText("Not in force", "the whole policy is out of force").includesText("This card couldn't be indexed this time", "and says why of the card itself");
|
|
759
|
+
assert.dom("[data-test-policy-rule-inactive]").doesNotExist("which is said once, not on each rule");
|
|
760
|
+
assert.dom("[data-test-policy-issue]").hasAttribute("data-test-policy-issue", "policy-card-unloadable");
|
|
761
|
+
assert.dom("[data-test-policy-issue-rule]").doesNotExist("a card-level issue names no rule");
|
|
762
|
+
});
|
|
763
|
+
(0, import_qunit.test)("fixing a grant clears its issue", async function(assert) {
|
|
764
|
+
let realm = await renderPolicyNamed("policies/fixable", [{
|
|
765
|
+
targetType: {
|
|
766
|
+
module: "../classroom",
|
|
767
|
+
name: "Classroom"
|
|
768
|
+
},
|
|
769
|
+
grants: [{
|
|
770
|
+
operation: "delete",
|
|
771
|
+
where: MISTYPED
|
|
772
|
+
}]
|
|
773
|
+
}]);
|
|
774
|
+
assert.deepEqual(await grantStatuses(), ["inactive"]);
|
|
775
|
+
await realm.write("policies/fixable.json", JSON.stringify(policyDocument([{
|
|
776
|
+
targetType: {
|
|
777
|
+
module: "../classroom",
|
|
778
|
+
name: "Classroom"
|
|
779
|
+
},
|
|
780
|
+
grants: [{
|
|
781
|
+
operation: "delete",
|
|
782
|
+
where: teachesPredicate
|
|
783
|
+
}]
|
|
784
|
+
}])));
|
|
785
|
+
await waitUntil(() => document.querySelector("[data-test-policy-grant-status]")?.getAttribute("data-test-policy-grant-status") === "live", { timeout: 1e4 });
|
|
786
|
+
await settled();
|
|
787
|
+
assert.deepEqual(await grantStatuses(), ["live"], "the grant is live");
|
|
788
|
+
assert.dom("[data-test-realm-policy-issues]").doesNotExist("and the issue is gone");
|
|
789
|
+
});
|
|
790
|
+
(0, import_qunit.test)("a policy with no issues shows no issue affordance", async function(assert) {
|
|
791
|
+
await renderPolicyNamed("policies/clean", [{
|
|
792
|
+
targetType: {
|
|
793
|
+
module: "../classroom",
|
|
794
|
+
name: "Classroom"
|
|
795
|
+
},
|
|
796
|
+
grants: [{
|
|
797
|
+
operation: "read",
|
|
798
|
+
where: teachesPredicate
|
|
799
|
+
}, { operation: "update" }]
|
|
800
|
+
}]);
|
|
801
|
+
assert.deepEqual(await grantStatuses(), ["live", "live"], "the realm has answered");
|
|
802
|
+
assert.dom("[data-test-realm-policy-issues]").doesNotExist();
|
|
803
|
+
assert.dom("[data-test-realm-policy-uncompilable]").doesNotExist();
|
|
804
|
+
assert.dom("[data-test-policy-grant-inactive]").doesNotExist();
|
|
805
|
+
assert.dom("[data-test-policy-rule-inactive]").doesNotExist();
|
|
806
|
+
assert.dom("[data-test-realm-policy-validate-failure]").doesNotExist();
|
|
807
|
+
});
|
|
808
|
+
function grantMarkedWithWarning() {
|
|
809
|
+
return document.querySelector("[data-test-policy-grant-warning]")?.closest("[data-test-policy-grant-status]");
|
|
810
|
+
}
|
|
811
|
+
(0, import_qunit.test)("a live grant that hands over cards of a type no rule grants is marked live with its warning beside it", async function(assert) {
|
|
812
|
+
await renderPolicyNamed("policies/reaching", [{
|
|
813
|
+
targetType: {
|
|
814
|
+
module: "../roster",
|
|
815
|
+
name: "Roster"
|
|
816
|
+
},
|
|
817
|
+
grants: [{
|
|
818
|
+
operation: "read",
|
|
819
|
+
where: teachesPredicate
|
|
820
|
+
}, {
|
|
821
|
+
operation: "update",
|
|
822
|
+
where: teachesPredicate
|
|
823
|
+
}]
|
|
824
|
+
}], { "roster.gts": rosterModule });
|
|
825
|
+
assert.deepEqual(await grantStatuses(), ["live", "live"], "a warning leaves its grant live");
|
|
826
|
+
assert.dom("[data-test-policy-grant-inactive]").doesNotExist("and marks nothing inactive");
|
|
827
|
+
assert.dom("[data-test-policy-grant-warning]").exists({ count: 1 }, "one grant is marked with a warning");
|
|
828
|
+
let marked = grantMarkedWithWarning();
|
|
829
|
+
assert.strictEqual(marked?.getAttribute("data-test-policy-grant-status"), "live", "the marked grant is live");
|
|
830
|
+
assert.dom("[data-test-operation-grant-operation]", marked ?? void 0).hasText("read", "it is the read, whose document carries the students");
|
|
831
|
+
await click("[data-test-policy-grant-warning] summary");
|
|
832
|
+
assert.dom("[data-test-policy-grant-warning-message=\"grant-reaches-ungranted-type\"]").exists({ count: 1 }).isVisible("opening the mark shows the warning").includesText("no rule lets anyone read Student cards", "which says what the grant hands over");
|
|
833
|
+
assert.dom("[data-test-policy-issue]").exists({ count: 1 }).hasAttribute("data-test-policy-issue", "grant-reaches-ungranted-type");
|
|
834
|
+
assert.dom("[data-test-policy-issue-rule]").hasText("Roster", "the warning is listed with its rule");
|
|
835
|
+
assert.dom("[data-test-policy-issue-operation]").hasText("read", "and its grant");
|
|
836
|
+
assert.dom("[data-test-policy-issue] [data-test-policy-issue-warning]").exists("and is marked there as a warning");
|
|
837
|
+
assert.dom("[data-test-policy-issue-message]").includesText("no rule lets anyone read Student cards");
|
|
838
|
+
assert.dom("[data-test-policy-issue-message] code").exists("the identifiers in the message render as code").hasText("read", "the first is the grant’s operation");
|
|
839
|
+
assert.dom("[data-test-policy-issue-message] .message-paragraph").exists({ count: 4 }, "the message is laid out one idea per paragraph, as the compiler writes it");
|
|
840
|
+
assert.dom("[data-test-policy-issue-message]").doesNotIncludeText(BACKTICK, "and no backtick shows").includesText("read on Roster sends", "and the text reads on across a span, spaces kept");
|
|
841
|
+
assert.dom("[data-test-policy-grant-warning-message=\"grant-reaches-ungranted-type\"] code").exists("the grant’s warning renders them as code too");
|
|
842
|
+
assert.dom("[data-test-policy-grant-warning-message=\"grant-reaches-ungranted-type\"]").doesNotIncludeText(BACKTICK);
|
|
843
|
+
});
|
|
844
|
+
(0, import_qunit.test)("a policy whose issues only leave grants inactive marks no warning", async function(assert) {
|
|
845
|
+
await renderPolicyNamed("policies/inactive-only", [{
|
|
846
|
+
targetType: {
|
|
847
|
+
module: "../classroom",
|
|
848
|
+
name: "Classroom"
|
|
849
|
+
},
|
|
850
|
+
grants: [
|
|
851
|
+
{ operation: "read" },
|
|
852
|
+
{
|
|
853
|
+
operation: "delete",
|
|
854
|
+
where: MISTYPED
|
|
855
|
+
},
|
|
856
|
+
{
|
|
857
|
+
operation: "query",
|
|
858
|
+
where: UNFILTERABLE
|
|
859
|
+
}
|
|
860
|
+
]
|
|
861
|
+
}]);
|
|
862
|
+
assert.deepEqual(await grantStatuses(), [
|
|
863
|
+
"live",
|
|
864
|
+
"inactive",
|
|
865
|
+
"inactive"
|
|
866
|
+
]);
|
|
867
|
+
assert.dom("[data-test-policy-grant-inactive]").exists({ count: 2 }, "each grant an issue leaves out is marked inactive");
|
|
868
|
+
assert.dom("[data-test-policy-issue]").exists({ count: 2 }, "and each issue is listed");
|
|
869
|
+
assert.dom("[data-test-policy-grant-warning]").doesNotExist("no grant is marked with a warning");
|
|
870
|
+
assert.dom("[data-test-policy-issue-warning]").doesNotExist("and no listed issue is marked as one");
|
|
871
|
+
});
|
|
872
|
+
(0, import_qunit.test)("a view created in an index render never asks what the policy compiles to", async function(assert) {
|
|
873
|
+
await setupIntegrationTestRealm({
|
|
874
|
+
mockMatrixUtils,
|
|
875
|
+
contents: {
|
|
876
|
+
"classroom.gts": classroomModule,
|
|
877
|
+
"policies/mistyped.json": policyDocument([{
|
|
878
|
+
targetType: {
|
|
879
|
+
module: "../classroom",
|
|
880
|
+
name: "Classroom"
|
|
881
|
+
},
|
|
882
|
+
grants: [{ operation: "read" }, {
|
|
883
|
+
operation: "delete",
|
|
884
|
+
where: MISTYPED
|
|
885
|
+
}]
|
|
886
|
+
}])
|
|
887
|
+
}
|
|
888
|
+
});
|
|
889
|
+
let { operations } = await loader.import("@cardstack/base/operations");
|
|
890
|
+
getService("operations");
|
|
891
|
+
let policy = await loadPolicy("policies/mistyped");
|
|
892
|
+
let validates = 0;
|
|
893
|
+
let network = getService("network");
|
|
894
|
+
let spy = async (request) => {
|
|
895
|
+
if (new URL(request.url).pathname.endsWith("/_operations") && (await request.clone().text()).includes("\"validate\"")) validates++;
|
|
896
|
+
return null;
|
|
897
|
+
};
|
|
898
|
+
network.virtualNetwork.mount(spy, { prepend: true });
|
|
899
|
+
let context = globalThis;
|
|
900
|
+
try {
|
|
901
|
+
context.__boxelRenderContext = true;
|
|
902
|
+
try {
|
|
903
|
+
await renderCard(loader, policy, "isolated");
|
|
904
|
+
} finally {
|
|
905
|
+
context.__boxelRenderContext = void 0;
|
|
906
|
+
}
|
|
907
|
+
assert.dom("[data-test-policy-rule]").exists({ count: 1 }, "the index render lists the rules");
|
|
908
|
+
assert.dom("[data-test-policy-grant-status]").doesNotExist("with no grant marked");
|
|
909
|
+
assert.dom("[data-test-realm-policy-issues]").doesNotExist("and no issues");
|
|
910
|
+
let validation = await operations(policy).validate();
|
|
911
|
+
assert.deepEqual(validation.issues.map(({ code }) => code), ["invalid-predicate"], "the realm answers a validate of this card");
|
|
912
|
+
assert.strictEqual(validates, 1, "the only validate sent is the test's own");
|
|
913
|
+
} finally {
|
|
914
|
+
network.virtualNetwork.unmount(spy);
|
|
915
|
+
}
|
|
916
|
+
});
|
|
917
|
+
});
|
|
918
|
+
var DEFINITIONS = "http://test-realm/classroom-definitions/";
|
|
919
|
+
var CLASSROOM = {
|
|
920
|
+
module: `${DEFINITIONS}classroom`,
|
|
921
|
+
name: "Classroom"
|
|
922
|
+
};
|
|
923
|
+
var OWNER = "@testuser:localhost";
|
|
924
|
+
var MISTYPED_PREDICATE = `${teachesPredicate} and .title ==`;
|
|
925
|
+
var UNFILTERABLE_PREDICATE = "(.title | tonumber) > 0";
|
|
926
|
+
var classroomQueryModule = `
|
|
927
|
+
import { contains, containsMany, field, CardDef } from "@cardstack/base/card-api";
|
|
928
|
+
import StringField from "@cardstack/base/string";
|
|
929
|
+
import { operation } from "@cardstack/base/operations";
|
|
930
|
+
|
|
931
|
+
export class Classroom extends CardDef {
|
|
932
|
+
@field title = contains(StringField);
|
|
933
|
+
@field teacherIds = containsMany(StringField);
|
|
934
|
+
|
|
935
|
+
@operation static listMine = {
|
|
936
|
+
base: 'query',
|
|
937
|
+
query: { filter: { type: () => Classroom } },
|
|
938
|
+
};
|
|
939
|
+
}
|
|
940
|
+
`;
|
|
941
|
+
var askedPolicyRules = [{
|
|
942
|
+
targetType: CLASSROOM,
|
|
943
|
+
grants: [
|
|
944
|
+
{
|
|
945
|
+
operation: "read",
|
|
946
|
+
where: teachesPredicate
|
|
947
|
+
},
|
|
948
|
+
{
|
|
949
|
+
operation: "delete",
|
|
950
|
+
where: teachesPredicate
|
|
951
|
+
},
|
|
952
|
+
{
|
|
953
|
+
operation: "listMine",
|
|
954
|
+
where: teachesPredicate
|
|
955
|
+
},
|
|
956
|
+
{
|
|
957
|
+
operation: "query",
|
|
958
|
+
where: UNFILTERABLE_PREDICATE
|
|
959
|
+
}
|
|
960
|
+
]
|
|
961
|
+
}];
|
|
962
|
+
var ROOMS = Array.from({ length: 11 }, (_, i) => `room-${201 + i}`);
|
|
963
|
+
function definedClassroom(teacherIds) {
|
|
964
|
+
return { data: {
|
|
965
|
+
type: "card",
|
|
966
|
+
attributes: { teacherIds },
|
|
967
|
+
meta: { adoptsFrom: CLASSROOM }
|
|
968
|
+
} };
|
|
969
|
+
}
|
|
970
|
+
(0, import_qunit.module)("Integration | realm policy explain forms", function(hooks) {
|
|
971
|
+
setupRenderingTest(hooks);
|
|
972
|
+
setupCatalogTestSubset(hooks);
|
|
973
|
+
setupLocalIndexing(hooks);
|
|
974
|
+
let loader;
|
|
975
|
+
let mockMatrixUtils = setupMockMatrix(hooks, {
|
|
976
|
+
loggedInAs: OWNER,
|
|
977
|
+
activeRealms: [DEFINITIONS, testRealmURL],
|
|
978
|
+
autostart: true
|
|
979
|
+
});
|
|
980
|
+
hooks.beforeEach(function() {
|
|
981
|
+
loader = getService("loader-service").loader;
|
|
982
|
+
});
|
|
983
|
+
setupCardLogs(hooks, async () => await loader.import("@cardstack/base/card-api"));
|
|
984
|
+
async function renderAskedPolicy() {
|
|
985
|
+
await setupIntegrationTestRealm({
|
|
986
|
+
mockMatrixUtils,
|
|
987
|
+
realmURL: DEFINITIONS,
|
|
988
|
+
permissions: { "*": ["read"] },
|
|
989
|
+
contents: {
|
|
990
|
+
"realm.json": realmConfigCardJSON({ name: "Classroom definitions" }),
|
|
991
|
+
"classroom.gts": classroomQueryModule
|
|
992
|
+
}
|
|
993
|
+
});
|
|
994
|
+
await setupIntegrationTestRealm({
|
|
995
|
+
mockMatrixUtils,
|
|
996
|
+
enforcePermissions: true,
|
|
997
|
+
permissions: { [OWNER]: [
|
|
998
|
+
"read",
|
|
999
|
+
"write",
|
|
1000
|
+
"realm-owner"
|
|
1001
|
+
] },
|
|
1002
|
+
contents: {
|
|
1003
|
+
"realm.json": realmConfigCardJSON({ policy: `${testRealmURL}policies/classrooms` }),
|
|
1004
|
+
...Object.fromEntries(ROOMS.map((room, i) => [`classrooms/${room}.json`, definedClassroom(i < 3 ? [TEACHER] : [COLLEAGUE])])),
|
|
1005
|
+
"policies/classrooms.json": policyDocument(askedPolicyRules)
|
|
1006
|
+
}
|
|
1007
|
+
});
|
|
1008
|
+
getService("operations");
|
|
1009
|
+
let policy = await getService("store").get(`${testRealmURL}policies/classrooms`);
|
|
1010
|
+
await renderCard(loader, policy, "isolated");
|
|
1011
|
+
}
|
|
1012
|
+
async function chooseMode(mode) {
|
|
1013
|
+
await click(`[data-test-explain-mode="${mode}"] input`);
|
|
1014
|
+
}
|
|
1015
|
+
async function submitAndWait(answer) {
|
|
1016
|
+
await click("[data-test-explain-submit]");
|
|
1017
|
+
await waitFor(`${answer}, [data-test-explain-refusal]`, { timeout: 1e4 });
|
|
1018
|
+
}
|
|
1019
|
+
function draftRules(grants) {
|
|
1020
|
+
return JSON.stringify({ rules: [{
|
|
1021
|
+
targetType: CLASSROOM,
|
|
1022
|
+
grants
|
|
1023
|
+
}] });
|
|
1024
|
+
}
|
|
1025
|
+
(0, import_qunit.test)("the policy answers a question against a draft, and the policy in force is unchanged", async function(assert) {
|
|
1026
|
+
await renderAskedPolicy();
|
|
1027
|
+
let room205 = `${testRealmURL}classrooms/room-205`;
|
|
1028
|
+
await fillIn("[data-test-explain-actor]", TEACHER);
|
|
1029
|
+
await fillIn("[data-test-explain-target]", room205);
|
|
1030
|
+
await fillIn("[data-test-explain-operation]", "delete");
|
|
1031
|
+
await submitAndWait("[data-test-explanation]");
|
|
1032
|
+
assert.dom("[data-test-explanation-decision]").hasText("denied", "the policy in force lets a teacher delete only their own classrooms");
|
|
1033
|
+
assert.dom("[data-test-explanation-draft]").doesNotExist();
|
|
1034
|
+
await click("[data-test-explain-use-draft]");
|
|
1035
|
+
let started = JSON.parse(document.querySelector("[data-test-explain-draft]").value);
|
|
1036
|
+
assert.deepEqual(started.rules.map((rule) => rule.grants.map((g) => g.operation)), [[
|
|
1037
|
+
"read",
|
|
1038
|
+
"delete",
|
|
1039
|
+
"listMine",
|
|
1040
|
+
"query"
|
|
1041
|
+
]], "the draft starts from this card's rules");
|
|
1042
|
+
await fillIn("[data-test-explain-draft]", draftRules([{ operation: "delete" }]));
|
|
1043
|
+
await submitAndWait("[data-test-explanation]");
|
|
1044
|
+
assert.dom("[data-test-explanation-decision]").hasText("allowed", "the draft lets the teacher delete any classroom");
|
|
1045
|
+
assert.dom("[data-test-explanation-reason]").hasText("A grant in this policy allows it.");
|
|
1046
|
+
assert.dom("[data-test-explanation-draft]").exists("the answer says it was answered against the draft");
|
|
1047
|
+
assert.dom("[data-test-explanation-draft-clean]").exists();
|
|
1048
|
+
await fillIn("[data-test-explain-draft]", draftRules([{
|
|
1049
|
+
operation: "delete",
|
|
1050
|
+
where: MISTYPED_PREDICATE
|
|
1051
|
+
}]));
|
|
1052
|
+
await submitAndWait("[data-test-explanation]");
|
|
1053
|
+
assert.dom("[data-test-explanation-decision]").hasText("denied");
|
|
1054
|
+
assert.dom("[data-test-explanation-draft-issue]").exists({ count: 1 }).hasAttribute("data-test-explanation-draft-issue", "invalid-predicate").includesText("rules[0].grants[0].where", "the issue names where it is");
|
|
1055
|
+
await fillIn("[data-test-explain-draft]", JSON.stringify({ attributes: { rules: [] } }));
|
|
1056
|
+
await submitAndWait("[data-test-explain-refusal]");
|
|
1057
|
+
assert.dom("[data-test-explain-refusal]").includesText("a policy document", "the realm's refusal of the draft is shown in place of an answer");
|
|
1058
|
+
assert.dom("[data-test-explanation]").doesNotExist();
|
|
1059
|
+
await fillIn("[data-test-explain-draft]", "{ \"rules\": ");
|
|
1060
|
+
await submitAndWait("[data-test-explain-refusal]");
|
|
1061
|
+
assert.dom("[data-test-explain-refusal]").includesText("The draft isn't valid JSON", "a draft that does not parse is never sent");
|
|
1062
|
+
await click("[data-test-explain-use-draft]");
|
|
1063
|
+
await submitAndWait("[data-test-explanation]");
|
|
1064
|
+
assert.dom("[data-test-explanation-decision]").hasText("denied", "and without the draft, the policy in force answers as before");
|
|
1065
|
+
assert.dom("[data-test-explanation-draft]").doesNotExist();
|
|
1066
|
+
});
|
|
1067
|
+
(0, import_qunit.test)("the policy says what it composes into a search, and how far behind the index is", async function(assert) {
|
|
1068
|
+
await renderAskedPolicy();
|
|
1069
|
+
await chooseMode("search");
|
|
1070
|
+
assert.dom("[data-test-explain-realm]").hasValue(testRealmURL, "a search runs in this card's realm unless another is named");
|
|
1071
|
+
assert.dom("[data-test-explain-target]").doesNotExist();
|
|
1072
|
+
await fillIn("[data-test-explain-actor]", TEACHER);
|
|
1073
|
+
await fillIn("[data-test-explain-operation]", "listMine");
|
|
1074
|
+
await fillIn("[data-test-explain-type-module]", CLASSROOM.module);
|
|
1075
|
+
await fillIn("[data-test-explain-type-name]", CLASSROOM.name);
|
|
1076
|
+
await submitAndWait("[data-test-explanation]");
|
|
1077
|
+
assert.dom("[data-test-explanation-decision]").hasText("allowed");
|
|
1078
|
+
assert.dom("[data-test-explanation-reason]").hasText("Grants in this policy let this search return the cards their conditions match, and no others.");
|
|
1079
|
+
assert.dom("[data-test-explanation-search-operation]").hasText("listMine");
|
|
1080
|
+
assert.dom("[data-test-explanation-search-types]").hasText("Classroom");
|
|
1081
|
+
assert.dom("[data-test-explanation-search-fragment]").includesText(TEACHER, "what the policy composes names the teacher");
|
|
1082
|
+
assert.dom("[data-test-explanation-search-index]").hasText("Up to date.", "the index has every write");
|
|
1083
|
+
assert.dom("[data-test-explanation-grant]").exists({ count: 1 }, "the one grant on the named query").hasAttribute("data-test-explanation-grant-filterable", "true");
|
|
1084
|
+
assert.dom("[data-test-explanation-grant-label]").hasText("narrows the search");
|
|
1085
|
+
assert.dom("[data-test-explanation-grant] .tier").doesNotExist("a search runs the condition over the index, so no copy of one card is named");
|
|
1086
|
+
await fillIn("[data-test-explain-operation]", "listTheirs");
|
|
1087
|
+
await submitAndWait("[data-test-explanation]");
|
|
1088
|
+
assert.dom("[data-test-explanation-reason]").includesText("This search couldn't be resolved", "a search the type does not declare is said to be one");
|
|
1089
|
+
await fillIn("[data-test-explain-operation]", "query");
|
|
1090
|
+
assert.dom("[data-test-explain-type-module]").doesNotExist("an ad-hoc search names its types in its filter");
|
|
1091
|
+
await fillIn("[data-test-explain-search-filter]", JSON.stringify({ "item.on": CLASSROOM }));
|
|
1092
|
+
await submitAndWait("[data-test-explanation]");
|
|
1093
|
+
assert.dom("[data-test-explanation-decision]").hasText("denied");
|
|
1094
|
+
assert.dom("[data-test-explanation-reason]").includesText("No grant in this policy can narrow this search");
|
|
1095
|
+
assert.dom("[data-test-explanation-search-operation]").hasText("query");
|
|
1096
|
+
assert.dom("[data-test-explanation-search-no-fragment]").exists("the policy composes nothing");
|
|
1097
|
+
assert.dom("[data-test-explanation-grant]").hasAttribute("data-test-explanation-grant-filterable", "false");
|
|
1098
|
+
assert.dom("[data-test-explanation-grant-label]").hasText("a search can't use its condition, so it adds nothing", "the grant whose condition a search cannot use is shown as adding nothing");
|
|
1099
|
+
await click("[data-test-explain-use-draft]");
|
|
1100
|
+
await fillIn("[data-test-explain-draft]", JSON.stringify({ grants: [] }));
|
|
1101
|
+
await submitAndWait("[data-test-explain-refusal]");
|
|
1102
|
+
assert.dom("[data-test-explain-refusal]").includesText("a policy document", "a search asked of a draft the realm refuses shows the refusal");
|
|
1103
|
+
await fillIn("[data-test-explain-draft]", draftRules([{
|
|
1104
|
+
operation: "query",
|
|
1105
|
+
where: teachesPredicate
|
|
1106
|
+
}]));
|
|
1107
|
+
await submitAndWait("[data-test-explanation]");
|
|
1108
|
+
assert.dom("[data-test-explanation-decision]").hasText("allowed", "a draft whose grant a search can use admits it");
|
|
1109
|
+
assert.dom("[data-test-explanation-search-fragment]").includesText(TEACHER, "and composes a fragment naming the teacher");
|
|
1110
|
+
assert.dom("[data-test-explanation-grant]").hasAttribute("data-test-explanation-grant-filterable", "true");
|
|
1111
|
+
assert.dom("[data-test-explanation-draft-clean]").exists();
|
|
1112
|
+
});
|
|
1113
|
+
(0, import_qunit.test)("the policy explains a page of the cards in a realm at a time", async function(assert) {
|
|
1114
|
+
await renderAskedPolicy();
|
|
1115
|
+
await chooseMode("listing");
|
|
1116
|
+
await fillIn("[data-test-explain-actor]", TEACHER);
|
|
1117
|
+
await fillIn("[data-test-explain-operation]", "read");
|
|
1118
|
+
await fillIn("[data-test-explain-type-module]", CLASSROOM.module);
|
|
1119
|
+
await fillIn("[data-test-explain-type-name]", CLASSROOM.name);
|
|
1120
|
+
await submitAndWait("[data-test-explanation-listing]");
|
|
1121
|
+
let listed = () => [...document.querySelectorAll("[data-test-explanation-listed]")].map((el) => [el.getAttribute("data-test-explanation-listed"), el.querySelector("[data-test-explanation-listed-decision]")?.textContent?.trim()]);
|
|
1122
|
+
assert.dom("[data-test-explanation-listing-page]").hasText("Cards 1 to 10 of 11");
|
|
1123
|
+
assert.deepEqual(listed(), ROOMS.slice(0, 10).map((room, i) => [`${testRealmURL}classrooms/${room}`, i < 3 ? "allowed" : "denied"]), "each card on the page is explained for the teacher");
|
|
1124
|
+
assert.dom("[data-test-explanation-listing-previous]").isDisabled();
|
|
1125
|
+
assert.dom("[data-test-explanation-listing-next]").isEnabled();
|
|
1126
|
+
await fillIn("[data-test-explain-actor]", COLLEAGUE);
|
|
1127
|
+
await click("[data-test-explanation-listing-next]");
|
|
1128
|
+
await waitUntil(() => document.querySelector("[data-test-explanation-listing-page]")?.textContent?.trim() === "Cards 11 to 11 of 11", { timeout: 1e4 });
|
|
1129
|
+
assert.deepEqual(listed(), [[`${testRealmURL}classrooms/room-211`, "denied"]]);
|
|
1130
|
+
assert.dom("[data-test-explanation-listed] [data-test-explanation-actor]").hasText(TEACHER, "the next page answers for the teacher it was asked for");
|
|
1131
|
+
assert.dom("[data-test-explanation-listing-previous]").isEnabled();
|
|
1132
|
+
assert.dom("[data-test-explanation-listing-next]").isDisabled();
|
|
1133
|
+
await click("[data-test-explain-use-draft]");
|
|
1134
|
+
await fillIn("[data-test-explain-draft]", draftRules([{ operation: "read" }]));
|
|
1135
|
+
await submitAndWait("[data-test-explanation-listing]");
|
|
1136
|
+
assert.dom("[data-test-explanation-listing-page]").hasText("Cards 1 to 10 of 11", "a new question starts at the first page");
|
|
1137
|
+
assert.deepEqual(listed().map(([, decision]) => decision), Array(10).fill("allowed"), "the draft lets the teacher read every classroom");
|
|
1138
|
+
assert.dom("[data-test-explanation-draft-clean]").exists();
|
|
1139
|
+
});
|
|
1140
|
+
});
|
|
1141
|
+
//#endregion
|