@skillswaveca/nova-shared-libraries 1.12.2
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/.eslintignore +1 -0
- package/.eslintrc.yaml +28 -0
- package/.github/dependabot.yml +18 -0
- package/.github/workflows/pull-request.yml +25 -0
- package/.github/workflows/release.yml +72 -0
- package/README.md +69 -0
- package/docs/accelerator-7PKwHj6p.js +7 -0
- package/docs/accelerator-CTGFUnJj.js +7 -0
- package/docs/access-special-BRCQ6BOA.js +7 -0
- package/docs/accessibility-check-DDEnCM3T.js +7 -0
- package/docs/add-CC95oWZj.js +7 -0
- package/docs/add-Dok7V7iV.js +7 -0
- package/docs/add-file-CDcwFmxE.js +9 -0
- package/docs/add-file-DSIehH-a.js +8 -0
- package/docs/add-message-C2J88NtD.js +8 -0
- package/docs/add-message-C74U_c_a.js +8 -0
- package/docs/add-to-lor-Cx3ALzs6.js +10 -0
- package/docs/add-to-lor-mWdPFUuq.js +10 -0
- package/docs/add-user-7oZmllZp.js +8 -0
- package/docs/add-user-Ct61dWhf.js +8 -0
- package/docs/ai-CXRsBcvO.js +7 -0
- package/docs/ai-D1Iq7PBt.js +9 -0
- package/docs/ai-DvFNdjTJ.js +7 -0
- package/docs/alarmbell-BptBR2Jr.js +7 -0
- package/docs/alarmbell-CB5dhFiR.js +7 -0
- package/docs/alert-DlHwdVP6.js +7 -0
- package/docs/alert-V7mrtHbK.js +9 -0
- package/docs/alert-p0Ge30rc.js +8 -0
- package/docs/align-center--wiBdBfZ.js +7 -0
- package/docs/align-full-BfwFgwgv.js +7 -0
- package/docs/align-left-DaZbAxVg.js +7 -0
- package/docs/align-right-DJm8Hnyk.js +7 -0
- package/docs/angry-CLkqqzeH.js +7 -0
- package/docs/arrow-collapse-CKVijIdk.js +7 -0
- package/docs/arrow-collapse-DgaM5Q7K.js +7 -0
- package/docs/arrow-collapse-small-BfTzkoWL.js +7 -0
- package/docs/arrow-expand-Bk1J3lIZ.js +7 -0
- package/docs/arrow-expand-small-B7KVZXkf.js +7 -0
- package/docs/arrow-thin-down-ClfvHk99.js +7 -0
- package/docs/arrow-thin-left-D0lmhbm9.js +7 -0
- package/docs/arrow-thin-right-CZH1S-Ev.js +7 -0
- package/docs/arrow-thin-up-kbf0Hayy.js +7 -0
- package/docs/arrow-toggle-down-CWSCkUi8.js +7 -0
- package/docs/arrow-toggle-up-sUgzJAuI.js +7 -0
- package/docs/assignments-BpNN8uRi.js +9 -0
- package/docs/assignments-BwrFNhJf.js +14 -0
- package/docs/assignments-DJuzE5TS.js +8 -0
- package/docs/attach-CxYJqjr7.js +8 -0
- package/docs/attach-DoURgNqH.js +7 -0
- package/docs/attendance-Bh8NDNxG.js +7 -0
- package/docs/attendance-CKrWYCoi.js +8 -0
- package/docs/awards-08R3caDo.js +7 -0
- package/docs/awards-CGFZ1AmF.js +7 -0
- package/docs/binder-DqjAKrO6.js +7 -0
- package/docs/binder-sPoCLPbv.js +9 -0
- package/docs/blocked-BqqEqoxS.js +7 -0
- package/docs/blocked-CdL2qnqB.js +7 -0
- package/docs/blog-EWWLpv3J.js +11 -0
- package/docs/blog-mImHk1UE.js +11 -0
- package/docs/bold-DvEMGUJQ.js +7 -0
- package/docs/book-management-BycZ58Mx.js +8 -0
- package/docs/book-management-C5EVLmWE.js +7 -0
- package/docs/bookmark-ZSLGVyMZ.js +8 -0
- package/docs/bookmark-filled-By-e1Vik.js +7 -0
- package/docs/bookmark-filled-C5_hpJmC.js +7 -0
- package/docs/bookmark-hollow-BERVrtPe.js +7 -0
- package/docs/bookmark-hollow-DmYIKVj-.js +7 -0
- package/docs/broken-link-0mE-24kB.js +7 -0
- package/docs/broken-link-B0FAWC4d.js +7 -0
- package/docs/browser-Bkf2Pqxa.js +11 -0
- package/docs/browser-DDKpAnFL.js +7 -0
- package/docs/bullet-WEelL-Oz.js +7 -0
- package/docs/bullseye-BGaOsg34.js +9 -0
- package/docs/bullseye-BI26Yr2r.js +11 -0
- package/docs/bullseye-D8leZHHy.js +10 -0
- package/docs/calculate-7BO4aJsc.js +7 -0
- package/docs/calculate-C1k19iEm.js +17 -0
- package/docs/calendar-10jvL2iw.js +7 -0
- package/docs/calendar-CAOKFxG8.js +7 -0
- package/docs/calendar-N5k43N09.js +7 -0
- package/docs/capture-BXEbu8tr.js +7 -0
- package/docs/change-file-3zLEwSjU.js +10 -0
- package/docs/change-file-CVDVitRF.js +10 -0
- package/docs/chat-BLpVloRi.js +7 -0
- package/docs/chat-CJvurd17.js +7 -0
- package/docs/chat-DkYoPSJD.js +7 -0
- package/docs/check-6yKqAXn0.js +7 -0
- package/docs/check-BDGGpjpw.js +7 -0
- package/docs/check-box-COb-iQnp.js +8 -0
- package/docs/check-box-unchecked-CihNEcBY.js +7 -0
- package/docs/check-circle-BHCbtC9e.js +8 -0
- package/docs/check-circle-CcqlS16f.js +7 -0
- package/docs/check-circle-D-88S9HE.js +8 -0
- package/docs/check-manual-D118hJse.js +10 -0
- package/docs/check-user-CzXE-sqy.js +9 -0
- package/docs/checklist-D3dcWqlj.js +12 -0
- package/docs/checklist-VRzqF3Cn.js +7 -0
- package/docs/chevron-down-CmgQXzCG.js +7 -0
- package/docs/chevron-down-NDFaTQA4.js +7 -0
- package/docs/chevron-down-eOc83-I6.js +7 -0
- package/docs/chevron-down-medium-ZHL8V0yD.js +7 -0
- package/docs/chevron-down-small-Cxu3u8oN.js +7 -0
- package/docs/chevron-left-CTXSr5gY.js +7 -0
- package/docs/chevron-left-DGHEARqj.js +7 -0
- package/docs/chevron-left-Dv2XEN1W.js +7 -0
- package/docs/chevron-left-circle-DC2ldsYl.js +8 -0
- package/docs/chevron-right-DyJ0vK9x.js +7 -0
- package/docs/chevron-right-X9aw5FQZ.js +7 -0
- package/docs/chevron-right-circle-CfufyneZ.js +8 -0
- package/docs/chevron-right-dtXLd_t_.js +7 -0
- package/docs/chevron-up-BLvFJkrs.js +7 -0
- package/docs/chevron-up-CBgDUU-S.js +7 -0
- package/docs/chevron-up-Cz4arn0k.js +7 -0
- package/docs/class-MfNPJCE3.js +7 -0
- package/docs/classes-BrimJoaQ.js +7 -0
- package/docs/classes-DNZeYwP9.js +7 -0
- package/docs/classlist-CT7aR3Qp.js +9 -0
- package/docs/classlist-lNAGMMK9.js +7 -0
- package/docs/close-DZhoaKqc.js +7 -0
- package/docs/close-circle-BUNfgKRi.js +8 -0
- package/docs/close-default-dnnWtHBx.js +7 -0
- package/docs/close-large-bMM1w3Qq.js +7 -0
- package/docs/close-large-thick-CIk4u_x5.js +7 -0
- package/docs/close-small-BM6jWA00.js +7 -0
- package/docs/close-thick-CSMgayuW.js +7 -0
- package/docs/comment-filled-BIwNhQOh.js +7 -0
- package/docs/comment-hollow-BuEIRoVu.js +7 -0
- package/docs/contacts-0c5Ejeie.js +8 -0
- package/docs/contacts-0p7GRork.js +9 -0
- package/docs/content-BkmZJI2k.js +10 -0
- package/docs/copy-ByxRV0Fv.js +9 -0
- package/docs/copy-C0jJBW8t.js +8 -0
- package/docs/copy-CrrPol58.js +9 -0
- package/docs/course-B7-GuqH0.js +9 -0
- package/docs/course-progress-complete-D-88S9HE.js +8 -0
- package/docs/course-progress-in-progress-CMNxGcwl.js +7 -0
- package/docs/course-progress-not-started-CZkienJ8.js +7 -0
- package/docs/course-tile-sort-DBH3sD6Y.js +7 -0
- package/docs/course-tile-sort-LVnGtfEg.js +7 -0
- package/docs/coursebuilder-CksHR_dY.js +7 -0
- package/docs/coursebuilder-mK3UOKAz.js +7 -0
- package/docs/cut-BSxIDiPd.js +7 -0
- package/docs/delete-XUr3hb61.js +8 -0
- package/docs/delete-n_0tMiML.js +7 -0
- package/docs/direction-ltr-DOOIOEMV.js +7 -0
- package/docs/direction-rtl-Zq209crM.js +7 -0
- package/docs/disable-CfhAdhZ4.js +8 -0
- package/docs/discussions-BV-rVYTJ.js +8 -0
- package/docs/discussions-DcjKXpsJ.js +8 -0
- package/docs/discussions-FfXuJJ0A.js +8 -0
- package/docs/divider-DYcReEjI.js +12 -0
- package/docs/divider-big-CNFI3Pvd.js +11 -0
- package/docs/divider-solid-BwFmdIq7.js +7 -0
- package/docs/dot-GOmm6Bys.js +7 -0
- package/docs/dot-THJbh2QW.js +7 -0
- package/docs/download-B8F8Cdcb.js +8 -0
- package/docs/download-D0w9z3Z3.js +8 -0
- package/docs/download-SHKxw6bp.js +8 -0
- package/docs/draft-mP5du8rd.js +9 -0
- package/docs/draft-vZl_0H-L.js +8 -0
- package/docs/dragger-aZ6zsEfR.js +7 -0
- package/docs/drivers/assets/anchor.js +350 -0
- package/docs/drivers/assets/bass-addons.css +12 -0
- package/docs/drivers/assets/bass.css +544 -0
- package/docs/drivers/assets/fonts/EOT/SourceCodePro-Bold.eot +0 -0
- package/docs/drivers/assets/fonts/EOT/SourceCodePro-Regular.eot +0 -0
- package/docs/drivers/assets/fonts/LICENSE.txt +93 -0
- package/docs/drivers/assets/fonts/OTF/SourceCodePro-Bold.otf +0 -0
- package/docs/drivers/assets/fonts/OTF/SourceCodePro-Regular.otf +0 -0
- package/docs/drivers/assets/fonts/TTF/SourceCodePro-Bold.ttf +0 -0
- package/docs/drivers/assets/fonts/TTF/SourceCodePro-Regular.ttf +0 -0
- package/docs/drivers/assets/fonts/WOFF/OTF/SourceCodePro-Bold.otf.woff +0 -0
- package/docs/drivers/assets/fonts/WOFF/OTF/SourceCodePro-Regular.otf.woff +0 -0
- package/docs/drivers/assets/fonts/WOFF/TTF/SourceCodePro-Bold.ttf.woff +0 -0
- package/docs/drivers/assets/fonts/WOFF/TTF/SourceCodePro-Regular.ttf.woff +0 -0
- package/docs/drivers/assets/fonts/WOFF2/OTF/SourceCodePro-Bold.otf.woff2 +0 -0
- package/docs/drivers/assets/fonts/WOFF2/OTF/SourceCodePro-Regular.otf.woff2 +0 -0
- package/docs/drivers/assets/fonts/WOFF2/TTF/SourceCodePro-Bold.ttf.woff2 +0 -0
- package/docs/drivers/assets/fonts/WOFF2/TTF/SourceCodePro-Regular.ttf.woff2 +0 -0
- package/docs/drivers/assets/fonts/source-code-pro.css +23 -0
- package/docs/drivers/assets/github.css +123 -0
- package/docs/drivers/assets/site.js +168 -0
- package/docs/drivers/assets/split.css +15 -0
- package/docs/drivers/assets/split.js +782 -0
- package/docs/drivers/assets/style.css +147 -0
- package/docs/drivers/index.html +6180 -0
- package/docs/edit-XTluWOyY.js +7 -0
- package/docs/edit-bulk-CbUTb41B.js +7 -0
- package/docs/edit-not-editable-BtNDjkNt.js +9 -0
- package/docs/edit-rtSBrFnZ.js +7 -0
- package/docs/email-B77IV5dc.js +8 -0
- package/docs/email-DShyqmyr.js +7 -0
- package/docs/email-Dr_fUQo7.js +7 -0
- package/docs/email-open-CNPI-nbt.js +9 -0
- package/docs/email-open-sMmv4goK.js +8 -0
- package/docs/email-read-D4PMZMhZ.js +8 -0
- package/docs/enable-BXJKKu9V.js +8 -0
- package/docs/enrollment-D_f33z-t.js +7 -0
- package/docs/eportfolio-CmIoQSs-.js +7 -0
- package/docs/eportfolio-DiR128Ch.js +8 -0
- package/docs/equation-graphical-DEK4DR0o.js +7 -0
- package/docs/equation-graphical-chemistry-deGj_Wo1.js +7 -0
- package/docs/equation-latex-OwF3WKZs.js +7 -0
- package/docs/equation-mathml-BVFy7F04.js +8 -0
- package/docs/evaluate-all-D8Ed6wUQ.js +15 -0
- package/docs/evaluate-all-DRA08hvM.js +13 -0
- package/docs/event-log-BBnLruqh.js +7 -0
- package/docs/exemption-add-CuNjn-gE.js +8 -0
- package/docs/exemption-remove-C6gurfls.js +10 -0
- package/docs/export-B00I40zU.js +8 -0
- package/docs/export-C_qczGjD.js +8 -0
- package/docs/external-CGUtobc0.js +6 -0
- package/docs/external-D14KafxI.js +9 -0
- package/docs/external-XLH4ZIpG.js +9 -0
- package/docs/feed-CpSir1Op.js +7 -0
- package/docs/feed-Dp9gnfxV.js +12 -0
- package/docs/feedback-CYkdDNHj.js +7 -0
- package/docs/feedback-zuS0X61K.js +7 -0
- package/docs/file-archive-BqyAeRx6.js +14 -0
- package/docs/file-archive-aUsV28fR.js +14 -0
- package/docs/file-audio-C0gLVZ1J.js +7 -0
- package/docs/file-audio-DlPChJJD.js +7 -0
- package/docs/file-audio-Ez8GKNqD.js +8 -0
- package/docs/file-document-OV_yiZc9.js +7 -0
- package/docs/file-document-PtERBBjG.js +9 -0
- package/docs/file-document-RAyDjBV0.js +9 -0
- package/docs/file-image-2kUlJRfa.js +7 -0
- package/docs/file-image-DEvp4loc.js +8 -0
- package/docs/file-presentation-DnSQf6dJ.js +10 -0
- package/docs/file-presentation-Dvm4dJkX.js +11 -0
- package/docs/file-presentation-DynwRY3d.js +7 -0
- package/docs/file-video-Baynsug6.js +8 -0
- package/docs/file-video-DubiL6Pa.js +7 -0
- package/docs/file-video-Dz0Xv-nt.js +8 -0
- package/docs/filter-BXmy_W6Z.js +7 -0
- package/docs/filter-CjP2TU9o.js +11 -0
- package/docs/flag-fill-Bon2nRGs.js +7 -0
- package/docs/flag-filled-B0f2EsXm.js +7 -0
- package/docs/flag-hollow-CaU1iNOl.js +7 -0
- package/docs/flag-hollow-DfEoHVNP.js +7 -0
- package/docs/folder-D4EQiKEf.js +7 -0
- package/docs/folder-DjGOP9kC.js +7 -0
- package/docs/folder-up-level-CmUITqEa.js +8 -0
- package/docs/forms-BzBisiyk.js +8 -0
- package/docs/forms-QmRSltZO.js +7 -0
- package/docs/forward-B7OsyI-4.js +8 -0
- package/docs/fullscreen-DW5UhnuF.js +8 -0
- package/docs/fullscreen-Dos-vYUL.js +7 -0
- package/docs/game-BPXtsa4R.js +12 -0
- package/docs/game-CAeZpf2P.js +12 -0
- package/docs/game-CJBm4W_4.js +6 -0
- package/docs/gear-BXgew4r5.js +8 -0
- package/docs/gear-BefUgJUH.js +8 -0
- package/docs/gear-Dozogx0s.js +7 -0
- package/docs/glossary-BYZOnXFD.js +10 -0
- package/docs/glossary-pJwGMnFw.js +7 -0
- package/docs/google-drive-BY7aNeo4.js +7 -0
- package/docs/google-drive-C2K-Q1Sz.js +7 -0
- package/docs/google-drive-UaaDdmWX.js +7 -0
- package/docs/grabber-DDfgK4q3.js +7 -0
- package/docs/grabber-small--2Gc1-LB.js +7 -0
- package/docs/grade-BG_E-8NT.js +8 -0
- package/docs/grade-D2MISbK9.js +7 -0
- package/docs/grade-NOWaSTNa.js +8 -0
- package/docs/grade-remove-Ph1Izm-7.js +8 -0
- package/docs/grade-visible-CDb-9-br.js +7 -0
- package/docs/group-DtqVtMH3.js +8 -0
- package/docs/group-locker-ftiR0a03.js +7 -0
- package/docs/happy-LeP0nGOv.js +7 -0
- package/docs/help-CkV4Dp7d.js +9 -0
- package/docs/help-Dxodc931.js +9 -0
- package/docs/help-FOiT3jKO.js +7 -0
- package/docs/history-DARTknKW.js +8 -0
- package/docs/history-rho7wY5T.js +8 -0
- package/docs/home-BE2SQvvs.js +7 -0
- package/docs/home-D_tSkasl.js +8 -0
- package/docs/home-DbQqnxwO.js +7 -0
- package/docs/image-BCnN94lf.js +9 -0
- package/docs/image-Dmy_y4Fd.js +8 -0
- package/docs/import-D_Njyhb9.js +8 -0
- package/docs/import-YfiMqwWh.js +8 -0
- package/docs/important-2qm6frSZ.js +9 -0
- package/docs/indent-decrease-CQm4KxII.js +7 -0
- package/docs/indent-increase-BO1QVrc8.js +7 -0
- package/docs/index.html +1 -0
- package/docs/inline-module-index-0.js +9556 -0
- package/docs/insert-attributes-B4iHYS-t.js +8 -0
- package/docs/insert-emoticon-BC9tKUjH.js +11 -0
- package/docs/insights-portal-Cm3Wea4M.js +10 -0
- package/docs/insights-portal-Depbhlwj.js +8 -0
- package/docs/italic-AhBNAWI0.js +7 -0
- package/docs/link-BgD3fOWi.js +8 -0
- package/docs/link-CPDrunkx.js +7 -0
- package/docs/link-CmNVOd0t.js +7 -0
- package/docs/list-bullet-CyrIsY33.js +11 -0
- package/docs/list-ordered-BnmtMuSC.js +7 -0
- package/docs/list-view-EI9pvwuC.js +11 -0
- package/docs/location-CzWLCAQ8.js +7 -0
- package/docs/location-DcnFhfnk.js +10 -0
- package/docs/locations-B9k1Fx7T.js +13 -0
- package/docs/locations-CSxT0wIK.js +7 -0
- package/docs/lock-BWzWh9B7.js +8 -0
- package/docs/lock-E8wu8HD6.js +8 -0
- package/docs/lock-locked-D5lyHWqQ.js +7 -0
- package/docs/lock-unlock-WCjSz1i-.js +7 -0
- package/docs/lock-unlocked-CAJCLSet.js +8 -0
- package/docs/lock-unlocked-DExBKORh.js +8 -0
- package/docs/locker-B10MJtSA.js +7 -0
- package/docs/locker-Cqcf7p8D.js +10 -0
- package/docs/lol-D_JxRmpk.js +7 -0
- package/docs/lor-LgltaGp1.js +7 -0
- package/docs/lor-NF8M-dTl.js +7 -0
- package/docs/low-priority-CYw20_i6.js +9 -0
- package/docs/manage-dates-7pdHHIpP.js +8 -0
- package/docs/manage-dates-BvldV3qd.js +10 -0
- package/docs/manage-dates-edit-BL7TE5Ca.js +7 -0
- package/docs/manage-dates-offset-C36mTMRI.js +8 -0
- package/docs/manage-files-CztcMg2T.js +8 -0
- package/docs/manage-files-DjhMboB5.js +8 -0
- package/docs/manual-run-mkeXX4ZT.js +8 -0
- package/docs/media-BIt0cvtO.js +8 -0
- package/docs/media-BP3ScDqX.js +7 -0
- package/docs/meh-VZVAbZG3.js +7 -0
- package/docs/menu-Bax-k1Yb.js +9 -0
- package/docs/menu-hamburger-C2vj4eRY.js +7 -0
- package/docs/menu-hamburger-DjawJZYW.js +7 -0
- package/docs/menu-hamburger-JIneUuO7.js +7 -0
- package/docs/merge-9psevQT-.js +11 -0
- package/docs/message-new-C2a9sicZ.js +8 -0
- package/docs/messages-BfrTLnON.js +12 -0
- package/docs/messages-BlNvFjBH.js +7 -0
- package/docs/mic-B_QU0QmO.js +8 -0
- package/docs/mic-Dq5WbNIP.js +8 -0
- package/docs/mobile-DqC65aN6.js +6 -0
- package/docs/more-CfLcaduh.js +7 -0
- package/docs/move-down-D9PWLWhn.js +7 -0
- package/docs/move-down-DNE-3gT2.js +8 -0
- package/docs/move-to-Bt5a4Jcj.js +8 -0
- package/docs/move-to-CmhSXqJ1.js +8 -0
- package/docs/move-up-BaS-oCU5.js +7 -0
- package/docs/move-up-ByeMSeVd.js +8 -0
- package/docs/my-computer-DTsn7C9t.js +8 -0
- package/docs/navigate-BUpXfdU3.js +8 -0
- package/docs/navigate-D1BhWZtz.js +11 -0
- package/docs/new-line-8f0I71Mh.js +7 -0
- package/docs/new-window-B5Ln_cc3.js +8 -0
- package/docs/news-C1mrMSqE.js +7 -0
- package/docs/news-DlE9A-vs.js +9 -0
- package/docs/news-NiNcL5vl.js +8 -0
- package/docs/no-entry-C3dnCBCI.js +8 -0
- package/docs/notification-bell-D_RdfZKS.js +9 -0
- package/docs/nova-middleware/assets/anchor.js +350 -0
- package/docs/nova-middleware/assets/bass-addons.css +12 -0
- package/docs/nova-middleware/assets/bass.css +544 -0
- package/docs/nova-middleware/assets/fonts/EOT/SourceCodePro-Bold.eot +0 -0
- package/docs/nova-middleware/assets/fonts/EOT/SourceCodePro-Regular.eot +0 -0
- package/docs/nova-middleware/assets/fonts/LICENSE.txt +93 -0
- package/docs/nova-middleware/assets/fonts/OTF/SourceCodePro-Bold.otf +0 -0
- package/docs/nova-middleware/assets/fonts/OTF/SourceCodePro-Regular.otf +0 -0
- package/docs/nova-middleware/assets/fonts/TTF/SourceCodePro-Bold.ttf +0 -0
- package/docs/nova-middleware/assets/fonts/TTF/SourceCodePro-Regular.ttf +0 -0
- package/docs/nova-middleware/assets/fonts/WOFF/OTF/SourceCodePro-Bold.otf.woff +0 -0
- package/docs/nova-middleware/assets/fonts/WOFF/OTF/SourceCodePro-Regular.otf.woff +0 -0
- package/docs/nova-middleware/assets/fonts/WOFF/TTF/SourceCodePro-Bold.ttf.woff +0 -0
- package/docs/nova-middleware/assets/fonts/WOFF/TTF/SourceCodePro-Regular.ttf.woff +0 -0
- package/docs/nova-middleware/assets/fonts/WOFF2/OTF/SourceCodePro-Bold.otf.woff2 +0 -0
- package/docs/nova-middleware/assets/fonts/WOFF2/OTF/SourceCodePro-Regular.otf.woff2 +0 -0
- package/docs/nova-middleware/assets/fonts/WOFF2/TTF/SourceCodePro-Bold.ttf.woff2 +0 -0
- package/docs/nova-middleware/assets/fonts/WOFF2/TTF/SourceCodePro-Regular.ttf.woff2 +0 -0
- package/docs/nova-middleware/assets/fonts/source-code-pro.css +23 -0
- package/docs/nova-middleware/assets/github.css +123 -0
- package/docs/nova-middleware/assets/site.js +168 -0
- package/docs/nova-middleware/assets/split.css +15 -0
- package/docs/nova-middleware/assets/split.js +782 -0
- package/docs/nova-middleware/assets/style.css +147 -0
- package/docs/nova-middleware/index.html +406 -0
- package/docs/nova-model/assets/anchor.js +350 -0
- package/docs/nova-model/assets/bass-addons.css +12 -0
- package/docs/nova-model/assets/bass.css +544 -0
- package/docs/nova-model/assets/fonts/EOT/SourceCodePro-Bold.eot +0 -0
- package/docs/nova-model/assets/fonts/EOT/SourceCodePro-Regular.eot +0 -0
- package/docs/nova-model/assets/fonts/LICENSE.txt +93 -0
- package/docs/nova-model/assets/fonts/OTF/SourceCodePro-Bold.otf +0 -0
- package/docs/nova-model/assets/fonts/OTF/SourceCodePro-Regular.otf +0 -0
- package/docs/nova-model/assets/fonts/TTF/SourceCodePro-Bold.ttf +0 -0
- package/docs/nova-model/assets/fonts/TTF/SourceCodePro-Regular.ttf +0 -0
- package/docs/nova-model/assets/fonts/WOFF/OTF/SourceCodePro-Bold.otf.woff +0 -0
- package/docs/nova-model/assets/fonts/WOFF/OTF/SourceCodePro-Regular.otf.woff +0 -0
- package/docs/nova-model/assets/fonts/WOFF/TTF/SourceCodePro-Bold.ttf.woff +0 -0
- package/docs/nova-model/assets/fonts/WOFF/TTF/SourceCodePro-Regular.ttf.woff +0 -0
- package/docs/nova-model/assets/fonts/WOFF2/OTF/SourceCodePro-Bold.otf.woff2 +0 -0
- package/docs/nova-model/assets/fonts/WOFF2/OTF/SourceCodePro-Regular.otf.woff2 +0 -0
- package/docs/nova-model/assets/fonts/WOFF2/TTF/SourceCodePro-Bold.ttf.woff2 +0 -0
- package/docs/nova-model/assets/fonts/WOFF2/TTF/SourceCodePro-Regular.ttf.woff2 +0 -0
- package/docs/nova-model/assets/fonts/source-code-pro.css +23 -0
- package/docs/nova-model/assets/github.css +123 -0
- package/docs/nova-model/assets/site.js +168 -0
- package/docs/nova-model/assets/split.css +15 -0
- package/docs/nova-model/assets/split.js +782 -0
- package/docs/nova-model/assets/style.css +147 -0
- package/docs/nova-model/index.html +3244 -0
- package/docs/nova-utils/assets/anchor.js +350 -0
- package/docs/nova-utils/assets/bass-addons.css +12 -0
- package/docs/nova-utils/assets/bass.css +544 -0
- package/docs/nova-utils/assets/fonts/EOT/SourceCodePro-Bold.eot +0 -0
- package/docs/nova-utils/assets/fonts/EOT/SourceCodePro-Regular.eot +0 -0
- package/docs/nova-utils/assets/fonts/LICENSE.txt +93 -0
- package/docs/nova-utils/assets/fonts/OTF/SourceCodePro-Bold.otf +0 -0
- package/docs/nova-utils/assets/fonts/OTF/SourceCodePro-Regular.otf +0 -0
- package/docs/nova-utils/assets/fonts/TTF/SourceCodePro-Bold.ttf +0 -0
- package/docs/nova-utils/assets/fonts/TTF/SourceCodePro-Regular.ttf +0 -0
- package/docs/nova-utils/assets/fonts/WOFF/OTF/SourceCodePro-Bold.otf.woff +0 -0
- package/docs/nova-utils/assets/fonts/WOFF/OTF/SourceCodePro-Regular.otf.woff +0 -0
- package/docs/nova-utils/assets/fonts/WOFF/TTF/SourceCodePro-Bold.ttf.woff +0 -0
- package/docs/nova-utils/assets/fonts/WOFF/TTF/SourceCodePro-Regular.ttf.woff +0 -0
- package/docs/nova-utils/assets/fonts/WOFF2/OTF/SourceCodePro-Bold.otf.woff2 +0 -0
- package/docs/nova-utils/assets/fonts/WOFF2/OTF/SourceCodePro-Regular.otf.woff2 +0 -0
- package/docs/nova-utils/assets/fonts/WOFF2/TTF/SourceCodePro-Bold.ttf.woff2 +0 -0
- package/docs/nova-utils/assets/fonts/WOFF2/TTF/SourceCodePro-Regular.ttf.woff2 +0 -0
- package/docs/nova-utils/assets/fonts/source-code-pro.css +23 -0
- package/docs/nova-utils/assets/github.css +123 -0
- package/docs/nova-utils/assets/site.js +168 -0
- package/docs/nova-utils/assets/split.css +15 -0
- package/docs/nova-utils/assets/split.js +782 -0
- package/docs/nova-utils/assets/style.css +147 -0
- package/docs/nova-utils/index.html +986 -0
- package/docs/one-drive-B17qEGg3.js +10 -0
- package/docs/one-drive-DJkLjiFC.js +6 -0
- package/docs/online-C94s_rb_.js +10 -0
- package/docs/online-D-ZCoHHm.js +9 -0
- package/docs/online-rooms-1mVK1aGi.js +7 -0
- package/docs/online-rooms-CDdAm2UO.js +9 -0
- package/docs/outcomes-BBf-Ha_8.js +7 -0
- package/docs/outcomes-C0izuLnk.js +7 -0
- package/docs/password-DLPNSwzE.js +7 -0
- package/docs/password-Dh7gVC6R.js +7 -0
- package/docs/paste-B-PIibRN.js +7 -0
- package/docs/pause-ClttiH9R.js +9 -0
- package/docs/pause-CytomPFa.js +7 -0
- package/docs/pause-borderless-BI_BVCJy.js +8 -0
- package/docs/pic-C5FMoERH.js +7 -0
- package/docs/pic-CfSFIefC.js +8 -0
- package/docs/pic-Dmy_y4Fd.js +8 -0
- package/docs/pin-filled-CXkRNZ5O.js +7 -0
- package/docs/pin-filled-w3eah_ZK.js +7 -0
- package/docs/pin-hollow-DEWfTASy.js +7 -0
- package/docs/pin-hollow-DVbwzH1M.js +7 -0
- package/docs/play-DMAGMc2B.js +8 -0
- package/docs/play-DbZdG7Gq.js +7 -0
- package/docs/play-borderless-DqQ17-YW.js +7 -0
- package/docs/plus-default-DHk06f01.js +7 -0
- package/docs/plus-large-DfxPCCrT.js +7 -0
- package/docs/plus-large-thick-gmHCMimx.js +7 -0
- package/docs/preview-BgaRQpP1.js +9 -0
- package/docs/preview-DiNoAoRq.js +9 -0
- package/docs/preview-DucwBKG_.js +8 -0
- package/docs/print-YZ-X09iP.js +7 -0
- package/docs/print-p1KbTvQ3.js +8 -0
- package/docs/profile-default-CR9VzwIc.js +7 -0
- package/docs/profile-default-CrRCaKe0.js +7 -0
- package/docs/profile-default-DjZMHiLd.js +7 -0
- package/docs/profile-pic-B1r87rnD.js +8 -0
- package/docs/profile-pic-FXAOU2-x.js +7 -0
- package/docs/profile-pic-WGNyfyzw.js +7 -0
- package/docs/project-BmdrPymq.js +9 -0
- package/docs/publish-all-C91CIIOg.js +9 -0
- package/docs/publish-all-CgPj17Qp.js +9 -0
- package/docs/publish-to-lor-BzzkuSPc.js +8 -0
- package/docs/publish-to-lor-NqvGf8fs.js +10 -0
- package/docs/quicklink-C5CDhyK0.js +6 -0
- package/docs/quicklink-DpoklXCh.js +7 -0
- package/docs/quiz-submissions-BAMFpmlt.js +12 -0
- package/docs/quizzing-B5p4bkL1.js +7 -0
- package/docs/quizzing-Bn5KKwty.js +17 -0
- package/docs/quizzing-ZT1VsQDi.js +10 -0
- package/docs/read-DhyDmmkk.js +7 -0
- package/docs/read-DzsAK1Gp.js +7 -0
- package/docs/read-unread-BaKkzPgA.js +7 -0
- package/docs/read-unread-ayEnU2WS.js +7 -0
- package/docs/reading-V8BekXyi.js +9 -0
- package/docs/reading-Z7La5_yK.js +7 -0
- package/docs/redo-DqrjRBg2.js +7 -0
- package/docs/reflection-Bx089gqz.js +10 -0
- package/docs/reflection-CWFEnLpT.js +10 -0
- package/docs/refresh-CLDK3svm.js +7 -0
- package/docs/refresh-DAtZSM_N.js +7 -0
- package/docs/release-conditions-BXxl9Dlf.js +7 -0
- package/docs/release-conditions-OLqc9pTg.js +7 -0
- package/docs/remove-user-B26LnqCu.js +10 -0
- package/docs/remove-user-DNXiNHBs.js +10 -0
- package/docs/reorder-BIFjdLxG.js +7 -0
- package/docs/reorder-Y4_r1Ayt.js +7 -0
- package/docs/repeat-JHaa8nfm.js +7 -0
- package/docs/replied-D2ix7Rk6.js +8 -0
- package/docs/reply-BqzsKC85.js +7 -0
- package/docs/reply-CKQu6lmN.js +8 -0
- package/docs/reply-all-g5VAmAX4.js +8 -0
- package/docs/reporting-ChEapxxJ.js +9 -0
- package/docs/reporting-D3LvXPru.js +7 -0
- package/docs/reports-Beth_W4X.js +12 -0
- package/docs/resize-left-GFaUaulC.js +7 -0
- package/docs/resize-right-DT6LaX2w.js +7 -0
- package/docs/reverse-order-aSt4RUV4.js +7 -0
- package/docs/role-switch-DLSQpVpI.js +7 -0
- package/docs/rss-4WhjKoVd.js +7 -0
- package/docs/rss-Bkw2Vu26.js +9 -0
- package/docs/rubric-C7Bvkdy8.js +7 -0
- package/docs/rubric-DCEXGTtW.js +7 -0
- package/docs/rubric-graded-DRJ7bKvJ.js +13 -0
- package/docs/rubric-graded-UxgPY7mA.js +8 -0
- package/docs/rubrics-CbER8LnL.js +7 -0
- package/docs/sad-BoDjvLIi.js +7 -0
- package/docs/save-C6Wm6dlX.js +7 -0
- package/docs/save-jMj_12iN.js +8 -0
- package/docs/scorm-BEMJkg_y.js +6 -0
- package/docs/scorm-DSQ_wzsf.js +7 -0
- package/docs/scorm-DwyYD2cQ.js +7 -0
- package/docs/search-Ba4VfUac.js +8 -0
- package/docs/search-CcFHrjV6.js +7 -0
- package/docs/search-Cg93dHlN.js +7 -0
- package/docs/seating-CenUmq00.js +7 -0
- package/docs/seating-Diwp3OZ0.js +7 -0
- package/docs/self-assessment-DtdsDcKC.js +7 -0
- package/docs/self-assessment-YnMgOzTH.js +10 -0
- package/docs/send-WLvWpVV4.js +7 -0
- package/docs/send-kamyQxgU.js +7 -0
- package/docs/share-DGresL3N.js +7 -0
- package/docs/share-MaE8kOCt.js +8 -0
- package/docs/share-hollow-CfuLT6Gb.js +7 -0
- package/docs/share-parent-filled-CvoEBnpc.js +10 -0
- package/docs/share-parent-hollow-DyLlXxk9.js +10 -0
- package/docs/shout-B8aYlnCU.js +7 -0
- package/docs/smallscreen-CAmSoX_a.js +7 -0
- package/docs/smallscreen-CJyGrrRY.js +7 -0
- package/docs/sort-type-Ccq_znjS.js +10 -0
- package/docs/source-editor-Bp_3QBP_.js +7 -0
- package/docs/spellcheck-Besf5dkX.js +8 -0
- package/docs/spellcheck-DOYSjTvo.js +8 -0
- package/docs/stop-DWabYiNA.js +8 -0
- package/docs/stop-borderless-CxP7Xjd-.js +7 -0
- package/docs/strikethrough-DBZqp7V2.js +7 -0
- package/docs/style-BbyPYYVo.js +7 -0
- package/docs/style-CDgs5AnH.js +7 -0
- package/docs/subscribe-filled-BQyc3NsS.js +7 -0
- package/docs/subscribe-filled-DnVzUac6.js +7 -0
- package/docs/subscribe-hollow-45odrrmr.js +7 -0
- package/docs/subscribe-hollow-C6hluycF.js +7 -0
- package/docs/subscript-BjAIARSd.js +7 -0
- package/docs/superscript-Bhxn6gvd.js +7 -0
- package/docs/support-DUKjOc66.js +7 -0
- package/docs/surveys-BE8aGBrC.js +7 -0
- package/docs/surveys-DoAUhIgW.js +11 -0
- package/docs/syllabus-CkqNQZI-.js +7 -0
- package/docs/syllabus-Dp2bL_st.js +8 -0
- package/docs/syllabus-QUazS8jY.js +8 -0
- package/docs/symbol-Bc-zvfel.js +7 -0
- package/docs/table-cell-merge-BE8joEWx.js +8 -0
- package/docs/table-cell-properties-CMFT10BB.js +8 -0
- package/docs/table-cell-split-DDUBTvcc.js +7 -0
- package/docs/table-column-insert-after-DzN38SQI.js +7 -0
- package/docs/table-column-insert-before-DeAvcikX.js +7 -0
- package/docs/table-column-remove-DYiXM8Jb.js +8 -0
- package/docs/table-delete-40sq_iUx.js +8 -0
- package/docs/table-of-contents-CpoMBmA3.js +7 -0
- package/docs/table-of-contents-DmVLblsk.js +11 -0
- package/docs/table-properties-C1ZRZ4ga.js +8 -0
- package/docs/table-row-copy-C0NVkTuO.js +8 -0
- package/docs/table-row-cut-D8ApKTxR.js +7 -0
- package/docs/table-row-insert-after-ZiQdbITr.js +7 -0
- package/docs/table-row-insert-before-DOqBNAv2.js +7 -0
- package/docs/table-row-paste-above-svu4TZL-.js +7 -0
- package/docs/table-row-paste-below-DnVjYP_H.js +7 -0
- package/docs/table-row-properties-DKKmT8xi.js +8 -0
- package/docs/table-row-remove-BpX_iTdC.js +8 -0
- package/docs/tag-CLCrd3YD.js +9 -0
- package/docs/tag-Dvlrl1rN.js +7 -0
- package/docs/tag-hollow-C4R57T76.js +8 -0
- package/docs/thumbs-down-_y6J-GBx.js +7 -0
- package/docs/thumbs-up-DmpTufP-.js +14 -0
- package/docs/tile-view-DAEgJlr5.js +12 -0
- package/docs/time-j7PVTeX4.js +7 -0
- package/docs/time-y--dvj05.js +8 -0
- package/docs/tools-ApXN5SG4.js +8 -0
- package/docs/tools-CI_7JQXe.js +7 -0
- package/docs/topic-last-CBI3iGxL.js +8 -0
- package/docs/topic-last-Db8wiEGR.js +8 -0
- package/docs/turnitin-HVqx-UXy.js +8 -0
- package/docs/unapproved-DWiZCrwv.js +10 -0
- package/docs/unapproved-Dhu_8xZD.js +10 -0
- package/docs/underline-DxnwXTaI.js +7 -0
- package/docs/undo-Di_HG7p_.js +7 -0
- package/docs/undo-KeM-So3F.js +7 -0
- package/docs/unsaved-Cc_mMbdm.js +10 -0
- package/docs/unsaved-DeP04L83.js +8 -0
- package/docs/upload-AImNeKVm.js +8 -0
- package/docs/upload-BIQxUfMy.js +8 -0
- package/docs/upload-nuZBVJjg.js +8 -0
- package/docs/user-competencies-8dMwEPL6.js +7 -0
- package/docs/user-competencies-Y57bDKtV.js +19 -0
- package/docs/user-progress-CUzNTpLo.js +10 -0
- package/docs/user-progress-DQUFGV7M.js +10 -0
- package/docs/validate-TiDv-LdA.js +16 -0
- package/docs/video-assignment-C-Eh-N2b.js +10 -0
- package/docs/video-assignment-DJhOt4CY.js +11 -0
- package/docs/view-submission-list-D56QhpGG.js +13 -0
- package/docs/view-submission-list-KS3OLMnE.js +15 -0
- package/docs/viewed-notviewed-CSNppbac.js +7 -0
- package/docs/virtual-classroom-Cxhu5Mw0.js +10 -0
- package/docs/virtual-classroom-De9_fVB7.js +6 -0
- package/docs/visibility-conditional-BbN-53aD.js +9 -0
- package/docs/visibility-hide-B2KKT0mx.js +7 -0
- package/docs/visibility-hide-Bctc7bkg.js +7 -0
- package/docs/visibility-show-BD2PP0kM.js +8 -0
- package/docs/visibility-show-BwU9PNHL.js +7 -0
- package/docs/volume-CYc0W77d.js +8 -0
- package/docs/volume-DrPpJaf1.js +7 -0
- package/docs/volume-muted-CK8EQ9dK.js +12 -0
- package/docs/volume-muted-D2mJNGq6.js +7 -0
- package/docs/widgets-BEcQiVkC.js +12 -0
- package/docs/wizard-D-phsxRW.js +11 -0
- package/docs/wizard-cZqtBjee.js +11 -0
- package/docs/zoom-in-Dpu97xmF.js +7 -0
- package/docs/zoom-out-Cu3SsLeV.js +7 -0
- package/docs-base/index.html +22 -0
- package/docs-base/nova-shared-repository.js +54 -0
- package/docs-base/package-info.js +26 -0
- package/index.js +21 -0
- package/package.json +59 -0
- package/packages/drivers/README.md +5 -0
- package/packages/drivers/docs/assets/anchor.js +350 -0
- package/packages/drivers/docs/assets/bass-addons.css +12 -0
- package/packages/drivers/docs/assets/bass.css +544 -0
- package/packages/drivers/docs/assets/fonts/EOT/SourceCodePro-Bold.eot +0 -0
- package/packages/drivers/docs/assets/fonts/EOT/SourceCodePro-Regular.eot +0 -0
- package/packages/drivers/docs/assets/fonts/LICENSE.txt +93 -0
- package/packages/drivers/docs/assets/fonts/OTF/SourceCodePro-Bold.otf +0 -0
- package/packages/drivers/docs/assets/fonts/OTF/SourceCodePro-Regular.otf +0 -0
- package/packages/drivers/docs/assets/fonts/TTF/SourceCodePro-Bold.ttf +0 -0
- package/packages/drivers/docs/assets/fonts/TTF/SourceCodePro-Regular.ttf +0 -0
- package/packages/drivers/docs/assets/fonts/WOFF/OTF/SourceCodePro-Bold.otf.woff +0 -0
- package/packages/drivers/docs/assets/fonts/WOFF/OTF/SourceCodePro-Regular.otf.woff +0 -0
- package/packages/drivers/docs/assets/fonts/WOFF/TTF/SourceCodePro-Bold.ttf.woff +0 -0
- package/packages/drivers/docs/assets/fonts/WOFF/TTF/SourceCodePro-Regular.ttf.woff +0 -0
- package/packages/drivers/docs/assets/fonts/WOFF2/OTF/SourceCodePro-Bold.otf.woff2 +0 -0
- package/packages/drivers/docs/assets/fonts/WOFF2/OTF/SourceCodePro-Regular.otf.woff2 +0 -0
- package/packages/drivers/docs/assets/fonts/WOFF2/TTF/SourceCodePro-Bold.ttf.woff2 +0 -0
- package/packages/drivers/docs/assets/fonts/WOFF2/TTF/SourceCodePro-Regular.ttf.woff2 +0 -0
- package/packages/drivers/docs/assets/fonts/source-code-pro.css +23 -0
- package/packages/drivers/docs/assets/github.css +123 -0
- package/packages/drivers/docs/assets/site.js +168 -0
- package/packages/drivers/docs/assets/split.css +15 -0
- package/packages/drivers/docs/assets/split.js +782 -0
- package/packages/drivers/docs/assets/style.css +147 -0
- package/packages/drivers/docs/index.html +6180 -0
- package/packages/drivers/index.js +10 -0
- package/packages/drivers/package.json +31 -0
- package/packages/drivers/src/aws/aws-base-driver.js +34 -0
- package/packages/drivers/src/aws/dynamodb.js +230 -0
- package/packages/drivers/src/aws/secrets-manager.js +52 -0
- package/packages/drivers/src/aws/sqs.js +140 -0
- package/packages/drivers/src/config.js +13 -0
- package/packages/drivers/src/http.js +162 -0
- package/packages/drivers/src/kraken-driver.js +28 -0
- package/packages/drivers/src/nova-driver.js +32 -0
- package/packages/drivers/src/oauth.js +145 -0
- package/packages/drivers/src/wave.js +83 -0
- package/packages/drivers/test/.eslintrc.yaml +27 -0
- package/packages/drivers/test/aws/dynamodb.test.js +119 -0
- package/packages/drivers/test/aws/secrets-manager.js +146 -0
- package/packages/drivers/test/http.test.js +118 -0
- package/packages/drivers/test/oauth.test.js +211 -0
- package/packages/drivers/test/wave.test.js +109 -0
- package/packages/nova-middleware/README.md +5 -0
- package/packages/nova-middleware/docs/assets/anchor.js +350 -0
- package/packages/nova-middleware/docs/assets/bass-addons.css +12 -0
- package/packages/nova-middleware/docs/assets/bass.css +544 -0
- package/packages/nova-middleware/docs/assets/fonts/EOT/SourceCodePro-Bold.eot +0 -0
- package/packages/nova-middleware/docs/assets/fonts/EOT/SourceCodePro-Regular.eot +0 -0
- package/packages/nova-middleware/docs/assets/fonts/LICENSE.txt +93 -0
- package/packages/nova-middleware/docs/assets/fonts/OTF/SourceCodePro-Bold.otf +0 -0
- package/packages/nova-middleware/docs/assets/fonts/OTF/SourceCodePro-Regular.otf +0 -0
- package/packages/nova-middleware/docs/assets/fonts/TTF/SourceCodePro-Bold.ttf +0 -0
- package/packages/nova-middleware/docs/assets/fonts/TTF/SourceCodePro-Regular.ttf +0 -0
- package/packages/nova-middleware/docs/assets/fonts/WOFF/OTF/SourceCodePro-Bold.otf.woff +0 -0
- package/packages/nova-middleware/docs/assets/fonts/WOFF/OTF/SourceCodePro-Regular.otf.woff +0 -0
- package/packages/nova-middleware/docs/assets/fonts/WOFF/TTF/SourceCodePro-Bold.ttf.woff +0 -0
- package/packages/nova-middleware/docs/assets/fonts/WOFF/TTF/SourceCodePro-Regular.ttf.woff +0 -0
- package/packages/nova-middleware/docs/assets/fonts/WOFF2/OTF/SourceCodePro-Bold.otf.woff2 +0 -0
- package/packages/nova-middleware/docs/assets/fonts/WOFF2/OTF/SourceCodePro-Regular.otf.woff2 +0 -0
- package/packages/nova-middleware/docs/assets/fonts/WOFF2/TTF/SourceCodePro-Bold.ttf.woff2 +0 -0
- package/packages/nova-middleware/docs/assets/fonts/WOFF2/TTF/SourceCodePro-Regular.ttf.woff2 +0 -0
- package/packages/nova-middleware/docs/assets/fonts/source-code-pro.css +23 -0
- package/packages/nova-middleware/docs/assets/github.css +123 -0
- package/packages/nova-middleware/docs/assets/site.js +168 -0
- package/packages/nova-middleware/docs/assets/split.css +15 -0
- package/packages/nova-middleware/docs/assets/split.js +782 -0
- package/packages/nova-middleware/docs/assets/style.css +147 -0
- package/packages/nova-middleware/docs/index.html +406 -0
- package/packages/nova-middleware/index.js +2 -0
- package/packages/nova-middleware/package.json +21 -0
- package/packages/nova-middleware/src/distributed-logging-middleware.js +36 -0
- package/packages/nova-middleware/src/oauth-middleware.js +63 -0
- package/packages/nova-middleware/test/.eslintrc.yaml +27 -0
- package/packages/nova-middleware/test/oauth-middleware.test.js +14 -0
- package/packages/nova-model/README.md +5 -0
- package/packages/nova-model/docs/assets/anchor.js +350 -0
- package/packages/nova-model/docs/assets/bass-addons.css +12 -0
- package/packages/nova-model/docs/assets/bass.css +544 -0
- package/packages/nova-model/docs/assets/fonts/EOT/SourceCodePro-Bold.eot +0 -0
- package/packages/nova-model/docs/assets/fonts/EOT/SourceCodePro-Regular.eot +0 -0
- package/packages/nova-model/docs/assets/fonts/LICENSE.txt +93 -0
- package/packages/nova-model/docs/assets/fonts/OTF/SourceCodePro-Bold.otf +0 -0
- package/packages/nova-model/docs/assets/fonts/OTF/SourceCodePro-Regular.otf +0 -0
- package/packages/nova-model/docs/assets/fonts/TTF/SourceCodePro-Bold.ttf +0 -0
- package/packages/nova-model/docs/assets/fonts/TTF/SourceCodePro-Regular.ttf +0 -0
- package/packages/nova-model/docs/assets/fonts/WOFF/OTF/SourceCodePro-Bold.otf.woff +0 -0
- package/packages/nova-model/docs/assets/fonts/WOFF/OTF/SourceCodePro-Regular.otf.woff +0 -0
- package/packages/nova-model/docs/assets/fonts/WOFF/TTF/SourceCodePro-Bold.ttf.woff +0 -0
- package/packages/nova-model/docs/assets/fonts/WOFF/TTF/SourceCodePro-Regular.ttf.woff +0 -0
- package/packages/nova-model/docs/assets/fonts/WOFF2/OTF/SourceCodePro-Bold.otf.woff2 +0 -0
- package/packages/nova-model/docs/assets/fonts/WOFF2/OTF/SourceCodePro-Regular.otf.woff2 +0 -0
- package/packages/nova-model/docs/assets/fonts/WOFF2/TTF/SourceCodePro-Bold.ttf.woff2 +0 -0
- package/packages/nova-model/docs/assets/fonts/WOFF2/TTF/SourceCodePro-Regular.ttf.woff2 +0 -0
- package/packages/nova-model/docs/assets/fonts/source-code-pro.css +23 -0
- package/packages/nova-model/docs/assets/github.css +123 -0
- package/packages/nova-model/docs/assets/site.js +168 -0
- package/packages/nova-model/docs/assets/split.css +15 -0
- package/packages/nova-model/docs/assets/split.js +782 -0
- package/packages/nova-model/docs/assets/style.css +147 -0
- package/packages/nova-model/docs/index.html +3244 -0
- package/packages/nova-model/index.js +6 -0
- package/packages/nova-model/package.json +19 -0
- package/packages/nova-model/src/model/api-token.js +27 -0
- package/packages/nova-model/src/model/models/nova-user.js +55 -0
- package/packages/nova-model/src/model/nova-model.js +184 -0
- package/packages/nova-model/src/model/nova-schema.js +154 -0
- package/packages/nova-model/src/repo/api-token.js +12 -0
- package/packages/nova-model/src/repo/nova-model-repo.js +203 -0
- package/packages/nova-model/test/.eslintrc.yaml +27 -0
- package/packages/nova-model/test/nova-model.test.js +123 -0
- package/packages/nova-utils/README.md +5 -0
- package/packages/nova-utils/docs/assets/anchor.js +350 -0
- package/packages/nova-utils/docs/assets/bass-addons.css +12 -0
- package/packages/nova-utils/docs/assets/bass.css +544 -0
- package/packages/nova-utils/docs/assets/fonts/EOT/SourceCodePro-Bold.eot +0 -0
- package/packages/nova-utils/docs/assets/fonts/EOT/SourceCodePro-Regular.eot +0 -0
- package/packages/nova-utils/docs/assets/fonts/LICENSE.txt +93 -0
- package/packages/nova-utils/docs/assets/fonts/OTF/SourceCodePro-Bold.otf +0 -0
- package/packages/nova-utils/docs/assets/fonts/OTF/SourceCodePro-Regular.otf +0 -0
- package/packages/nova-utils/docs/assets/fonts/TTF/SourceCodePro-Bold.ttf +0 -0
- package/packages/nova-utils/docs/assets/fonts/TTF/SourceCodePro-Regular.ttf +0 -0
- package/packages/nova-utils/docs/assets/fonts/WOFF/OTF/SourceCodePro-Bold.otf.woff +0 -0
- package/packages/nova-utils/docs/assets/fonts/WOFF/OTF/SourceCodePro-Regular.otf.woff +0 -0
- package/packages/nova-utils/docs/assets/fonts/WOFF/TTF/SourceCodePro-Bold.ttf.woff +0 -0
- package/packages/nova-utils/docs/assets/fonts/WOFF/TTF/SourceCodePro-Regular.ttf.woff +0 -0
- package/packages/nova-utils/docs/assets/fonts/WOFF2/OTF/SourceCodePro-Bold.otf.woff2 +0 -0
- package/packages/nova-utils/docs/assets/fonts/WOFF2/OTF/SourceCodePro-Regular.otf.woff2 +0 -0
- package/packages/nova-utils/docs/assets/fonts/WOFF2/TTF/SourceCodePro-Bold.ttf.woff2 +0 -0
- package/packages/nova-utils/docs/assets/fonts/WOFF2/TTF/SourceCodePro-Regular.ttf.woff2 +0 -0
- package/packages/nova-utils/docs/assets/fonts/source-code-pro.css +23 -0
- package/packages/nova-utils/docs/assets/github.css +123 -0
- package/packages/nova-utils/docs/assets/site.js +168 -0
- package/packages/nova-utils/docs/assets/split.css +15 -0
- package/packages/nova-utils/docs/assets/split.js +782 -0
- package/packages/nova-utils/docs/assets/style.css +147 -0
- package/packages/nova-utils/docs/index.html +986 -0
- package/packages/nova-utils/index.js +3 -0
- package/packages/nova-utils/package.json +19 -0
- package/packages/nova-utils/src/config.js +228 -0
- package/packages/nova-utils/src/logger.js +26 -0
- package/packages/nova-utils/src/tenant-utils.js +27 -0
- package/packages/nova-utils/test/config.test.js +250 -0
- package/packages/nova-utils/test/tenant-utiils.test.js +50 -0
- package/pnpm-workspace.yaml +2 -0
- package/rollup.config.js +13 -0
- package/scripts/.eslintrc.yaml +25 -0
- package/scripts/aggregate-docs.js +81 -0
- package/scripts/bump-version.js +26 -0
- package/scripts/create-index.js +30 -0
- package/scripts/create-library-template/README.md +5 -0
- package/scripts/create-library-template/package.json +19 -0
- package/scripts/create-library.js +62 -0
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"type": "module",
|
|
3
|
+
"name": "@skillswaveca/nova-utils",
|
|
4
|
+
"description": "A collection of random utils used in nova repos",
|
|
5
|
+
"repository": "https://github.com/SkillsWave/nova-shared-libraries",
|
|
6
|
+
"version": "1.2.1",
|
|
7
|
+
"main": "index.js",
|
|
8
|
+
"scripts": {
|
|
9
|
+
"create-index": "node ../../scripts/create-index.js",
|
|
10
|
+
"generate-docs": "documentation build src/** -f html -o docs",
|
|
11
|
+
"test": "mocha --parallel 'test/**/*.test.js'"
|
|
12
|
+
},
|
|
13
|
+
"author": "SkillsWave",
|
|
14
|
+
"license": "UNLICENSED",
|
|
15
|
+
"devDependencies": {
|
|
16
|
+
},
|
|
17
|
+
"dependencies": {
|
|
18
|
+
}
|
|
19
|
+
}
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
|
|
4
|
+
import yn from 'yn';
|
|
5
|
+
import { log } from './logger.js';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Recursively merges two objects deeply, combining nested objects from both objects.
|
|
9
|
+
* It overrides the values from the first object with those from the second object.
|
|
10
|
+
* @param {Object} obj1 - The first object to merge.
|
|
11
|
+
* @param {Object} obj2 - The second object to merge, whose properties will override those of the first.
|
|
12
|
+
* @returns {Object} - The resulting merged object.
|
|
13
|
+
*/
|
|
14
|
+
export const deepMerge = (obj1, obj2) => {
|
|
15
|
+
const output = Object.assign({}, obj1);
|
|
16
|
+
for (const key in obj2) {
|
|
17
|
+
if (obj2[key]) {
|
|
18
|
+
if (typeof obj2[key] === 'object' && obj2[key] !== null && obj1[key]) {
|
|
19
|
+
output[key] = deepMerge(obj1[key], obj2[key]);
|
|
20
|
+
} else {
|
|
21
|
+
output[key] = obj2[key];
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return output;
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Flattens a nested object into a single-level object with underscore-separated keys.
|
|
30
|
+
*
|
|
31
|
+
*
|
|
32
|
+
* @param {Object} data - The nested object to flatten.
|
|
33
|
+
* @param {string} prefix - The prefix to prepend to each key in the flattened object.
|
|
34
|
+
* @returns {Object} - The flattened object with concatenated keys separated by underscores.
|
|
35
|
+
*/
|
|
36
|
+
export const flattenConfig = (data, prefix = '') => {
|
|
37
|
+
return Object.keys(data).reduce((acc, key) => {
|
|
38
|
+
const fullPath = prefix.length ? `${prefix}_${key}` : key;
|
|
39
|
+
if (typeof data[key] === 'object' && data[key] !== null && !Array.isArray(data[key])) {
|
|
40
|
+
Object.assign(acc, flattenConfig(data[key], fullPath));
|
|
41
|
+
} else {
|
|
42
|
+
acc[fullPath] = `${data[key]}`;
|
|
43
|
+
}
|
|
44
|
+
return acc;
|
|
45
|
+
}, {});
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Converts a string value to a number or boolean if applicable. It is intentionally very naive, only checking for 'true' 'false' and numbers.
|
|
50
|
+
* It is only used for converting environment variables, so it is not expected to be used for general purpose type conversion.
|
|
51
|
+
*
|
|
52
|
+
* @param value
|
|
53
|
+
* @returns {*|number|boolean}
|
|
54
|
+
*/
|
|
55
|
+
const convertToType = value => {
|
|
56
|
+
if (!isNaN(parseFloat(value)) && isFinite(value)) {
|
|
57
|
+
return parseFloat(value);
|
|
58
|
+
}
|
|
59
|
+
if (value.toLowerCase() === 'true') {
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
if (value.toLowerCase() === 'false') {
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
return value;
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Unflattens a configuration object whose keys are paths (using underscores as separators),
|
|
70
|
+
* ignoring specific top-level attributes.
|
|
71
|
+
* @param {Object} flatConfig - The flat configuration object, defaulting to process.env.
|
|
72
|
+
* @param {Array} ignoreList - List of top-level attribute keys to ignore.
|
|
73
|
+
* @returns {Object} - The reconstructed nested configuration object.
|
|
74
|
+
*/
|
|
75
|
+
export const unflattenConfig = (flatConfig = process.env, ignoreList = ['LAMBDA', 'LD', 'PATH', 'PWD', 'NODE', '', 'SHLVL']) => {
|
|
76
|
+
const result = {};
|
|
77
|
+
for (const [key, value] of Object.entries(flatConfig)) {
|
|
78
|
+
try {
|
|
79
|
+
const parts = key.split('_'); // Split the key into parts based on underscore
|
|
80
|
+
let current = result;
|
|
81
|
+
|
|
82
|
+
// Check if the first part is in the ignore list, skip if it is
|
|
83
|
+
if (ignoreList.includes(parts[0])) {
|
|
84
|
+
continue; // Skip the rest of the loop and do not add this key-value pair
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// Iterate over the parts to build the nested structure
|
|
88
|
+
parts.forEach((part, i) => {
|
|
89
|
+
if (i === parts.length - 1) {
|
|
90
|
+
// If it's the last part, set the value
|
|
91
|
+
current[part] = convertToType(value);
|
|
92
|
+
} else {
|
|
93
|
+
// If not, update current point in the structure, initializing if necessary
|
|
94
|
+
current[part] = current[part] || {};
|
|
95
|
+
current = current[part];
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
} catch (err) {
|
|
99
|
+
// we are going to ignore errors here
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return result;
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Retrieves and validates the OAuth configuration for a specified driver from environment variables.
|
|
107
|
+
* Throws an error if any required configuration is missing.
|
|
108
|
+
*
|
|
109
|
+
* @param {string} driverName - The name of the driver for which the configuration is requested.
|
|
110
|
+
* @returns {Object} The complete and validated configuration object for the specified driver.
|
|
111
|
+
* @throws {Error} If the required configuration is missing.
|
|
112
|
+
*/
|
|
113
|
+
export const getOauthDriverConfig = driverName => {
|
|
114
|
+
const unflattenedConfig = unflattenConfig();
|
|
115
|
+
const driverConfig = unflattenedConfig.drivers?.[driverName];
|
|
116
|
+
const authConfig = unflattenedConfig.auth;
|
|
117
|
+
const disabledConfig = {
|
|
118
|
+
name: driverName,
|
|
119
|
+
enabled: false,
|
|
120
|
+
};
|
|
121
|
+
|
|
122
|
+
if (!driverConfig || !authConfig) {
|
|
123
|
+
log.warn({ driverConfig, authConfig }, `Missing configuration for ${driverName}`);
|
|
124
|
+
return disabledConfig;
|
|
125
|
+
}
|
|
126
|
+
// Check for essential configuration components
|
|
127
|
+
const requiredFields = ['enabled', 'baseUrl', 'audience', 'clientId', 'clientSecretName', 'tokenHost', 'tokenPath'];
|
|
128
|
+
const missingFields = requiredFields.filter(field => typeof driverConfig[field] === 'undefined' && typeof authConfig[field] === 'undefined');
|
|
129
|
+
|
|
130
|
+
if (missingFields.length > 0) {
|
|
131
|
+
log.warn({ missingFields, driverName }, 'Missing configuration fields for');
|
|
132
|
+
return disabledConfig;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
return {
|
|
136
|
+
name: driverName,
|
|
137
|
+
enabled: yn(driverConfig.enabled, { default: false }),
|
|
138
|
+
baseUrl: driverConfig.baseUrl,
|
|
139
|
+
tokenConfig: {
|
|
140
|
+
audience: driverConfig.audience,
|
|
141
|
+
},
|
|
142
|
+
oauth: {
|
|
143
|
+
client: {
|
|
144
|
+
id: authConfig.clientId,
|
|
145
|
+
secret: authConfig.clientSecretName,
|
|
146
|
+
},
|
|
147
|
+
auth: {
|
|
148
|
+
tokenHost: authConfig.tokenHost,
|
|
149
|
+
tokenPath: authConfig.tokenPath,
|
|
150
|
+
},
|
|
151
|
+
},
|
|
152
|
+
};
|
|
153
|
+
};
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Retrieves and validates the standard configuration for a specified driver from environment variables.
|
|
157
|
+
*
|
|
158
|
+
* @param driverName
|
|
159
|
+
* @returns {{[p: string]: *}}
|
|
160
|
+
*/
|
|
161
|
+
export const getStandardDriverConfig = driverName => {
|
|
162
|
+
const driverConfig = unflattenConfig().drivers?.[driverName];
|
|
163
|
+
|
|
164
|
+
if (!driverConfig) {
|
|
165
|
+
return {
|
|
166
|
+
name: driverName,
|
|
167
|
+
enabled: false,
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
return {
|
|
171
|
+
name: driverName,
|
|
172
|
+
...driverConfig,
|
|
173
|
+
enabled: yn(driverConfig.enabled, { default: false }),
|
|
174
|
+
};
|
|
175
|
+
};
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* Reads all JSON files in a directory and returns an object with the file names as keys and the parsed JSON content as values.
|
|
179
|
+
*
|
|
180
|
+
* @param dir - The directory to read JSON files from.
|
|
181
|
+
* @returns {{}} - An object with the file names as keys and the parsed JSON content as values.
|
|
182
|
+
*/
|
|
183
|
+
const readJsonFiles = dir => {
|
|
184
|
+
return fs.readdirSync(dir)
|
|
185
|
+
.filter(file => path.extname(file) === '.json')
|
|
186
|
+
.reduce((acc, file) => {
|
|
187
|
+
acc[path.basename(file, '.json')] = JSON.parse(fs.readFileSync(path.join(dir, file), 'utf8'));
|
|
188
|
+
return acc;
|
|
189
|
+
}, {});
|
|
190
|
+
};
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* The nova stage configurator class
|
|
194
|
+
*/
|
|
195
|
+
export class NovaStageConfig {
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* Creates a new NovaStageConfig instance with the specified base configuration and stage overrides.
|
|
199
|
+
*
|
|
200
|
+
* @param {Object} baseConfig - The default configuration object that will be used as the base.
|
|
201
|
+
* @param stageConfig - The stage configuration object or the path to the directory containing stage-specific JSON files.
|
|
202
|
+
*/
|
|
203
|
+
constructor(baseConfig, stageConfig) {
|
|
204
|
+
this.baseConfig = baseConfig;
|
|
205
|
+
this.stages = typeof stageConfig === 'string' ? readJsonFiles(stageConfig) : stageConfig;
|
|
206
|
+
if (!this.baseConfig) {
|
|
207
|
+
throw new Error('NovaConfig requires a base configuration object to be provided.');
|
|
208
|
+
}
|
|
209
|
+
if (!this.stages) {
|
|
210
|
+
throw new Error('NovaConfig requires a stages configuration object to be provided.');
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* Creates a configuration object for a specific stage by merging the default configuration
|
|
216
|
+
* with any overrides defined for that stage. If no specific configuration is found for the stage,
|
|
217
|
+
* it falls back to the 'dev' stage configuration.
|
|
218
|
+
*
|
|
219
|
+
* @param {string} stage - The stage for which the configuration is needed, typically corresponds
|
|
220
|
+
* to different deployment environments (e.g., 'prod', 'dev').
|
|
221
|
+
* @returns {Object} - The merged configuration object that combines the default settings with
|
|
222
|
+
* any stage-specific overrides.
|
|
223
|
+
*/
|
|
224
|
+
createConfigForStage(stage) {
|
|
225
|
+
const stageConfig = this.stages[stage] || this.stages.dev;
|
|
226
|
+
return deepMerge(this.baseConfig(stage), stageConfig);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
2
|
+
import pino from 'pino';
|
|
3
|
+
|
|
4
|
+
const base = null;
|
|
5
|
+
const level = process.env.LOG_LEVEL || 'info';
|
|
6
|
+
const redact = {
|
|
7
|
+
paths: [
|
|
8
|
+
'context.log',
|
|
9
|
+
'context.drivers',
|
|
10
|
+
'context.config',
|
|
11
|
+
'event.Records[*].dynamodb',
|
|
12
|
+
],
|
|
13
|
+
remove: true,
|
|
14
|
+
};
|
|
15
|
+
const serializers = pino.stdSerializers;
|
|
16
|
+
const logger = pino({ base, level, redact, serializers });
|
|
17
|
+
|
|
18
|
+
export const asyncLocalStorage = new AsyncLocalStorage();
|
|
19
|
+
|
|
20
|
+
const getAsyncData = () => {
|
|
21
|
+
return asyncLocalStorage.getStore() || {};
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
export default logger;
|
|
25
|
+
|
|
26
|
+
export const log = logger.child(getAsyncData());
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Takes an array of users and splits them into a map of tenantId to users
|
|
3
|
+
*
|
|
4
|
+
* @param {array} users An array of fuss users
|
|
5
|
+
*/
|
|
6
|
+
export const mapUsersByTenant = users => {
|
|
7
|
+
const usersByTenantId = {};
|
|
8
|
+
users.forEach(user => {
|
|
9
|
+
if (!usersByTenantId[user.tenantId]) {
|
|
10
|
+
usersByTenantId[user.tenantId] = [];
|
|
11
|
+
}
|
|
12
|
+
usersByTenantId[user.tenantId].push(user);
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
return usersByTenantId;
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Takes an array of users and returns true if they all belong to the same tenant
|
|
20
|
+
*
|
|
21
|
+
* @param users
|
|
22
|
+
* @returns {boolean}
|
|
23
|
+
*/
|
|
24
|
+
export const usersBelongToSameTenant = users => {
|
|
25
|
+
const tenantIds = [...new Set(users.map(user => user.tenantId))];
|
|
26
|
+
return tenantIds.length <= 1;
|
|
27
|
+
};
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
import { expect } from 'chai';
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
deepMerge,
|
|
5
|
+
flattenConfig,
|
|
6
|
+
getOauthDriverConfig, NovaStageConfig,
|
|
7
|
+
unflattenConfig
|
|
8
|
+
} from '../src/config.js';
|
|
9
|
+
|
|
10
|
+
describe('config', function() {
|
|
11
|
+
describe('flattenConfig', () => {
|
|
12
|
+
it('should flatten a nested object', () => {
|
|
13
|
+
const nested = { a: { b: { c: 1 } } };
|
|
14
|
+
const result = flattenConfig(nested);
|
|
15
|
+
expect(result).to.deep.equal({ 'a_b_c': '1' });
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
it('should handle arrays as values without flattening them', () => {
|
|
19
|
+
const data = { a: { b: [1, 2, 3] } };
|
|
20
|
+
const result = flattenConfig(data);
|
|
21
|
+
expect(result).to.deep.equal({ 'a_b': '1,2,3' });
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
it('should handle multiple nested levels', () => {
|
|
25
|
+
const data = { a: { b: { c: { d: 1 } } } };
|
|
26
|
+
const result = flattenConfig(data);
|
|
27
|
+
expect(result).to.deep.equal({ 'a_b_c_d': '1' });
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
it('should preserve simple key-value pairs', () => {
|
|
31
|
+
const data = { a: 1, b: 2 };
|
|
32
|
+
const result = flattenConfig(data);
|
|
33
|
+
expect(result).to.deep.equal({ 'a': '1', 'b': '2' });
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
it('should correctly prepend a prefix if provided', () => {
|
|
37
|
+
const data = { a: 1 };
|
|
38
|
+
const result = flattenConfig(data, 'prefix');
|
|
39
|
+
expect(result).to.deep.equal({ 'prefix_a': '1' });
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
describe('deepMerge', () => {
|
|
44
|
+
it('should merge two simple objects', () => {
|
|
45
|
+
const obj1 = { a: 1 };
|
|
46
|
+
const obj2 = { b: 2 };
|
|
47
|
+
const result = deepMerge(obj1, obj2);
|
|
48
|
+
expect(result).to.deep.equal({ a: 1, b: 2 });
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
it('should override properties from the first object', () => {
|
|
52
|
+
const obj1 = { a: 1, b: 2 };
|
|
53
|
+
const obj2 = { b: 3 };
|
|
54
|
+
const result = deepMerge(obj1, obj2);
|
|
55
|
+
expect(result.b).to.equal(3);
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
it('should merge nested objects', () => {
|
|
59
|
+
const obj1 = { a: { x: 1 } };
|
|
60
|
+
const obj2 = { a: { y: 2 } };
|
|
61
|
+
const result = deepMerge(obj1, obj2);
|
|
62
|
+
expect(result).to.deep.equal({ a: { x: 1, y: 2 } });
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
it('should handle null values correctly', () => {
|
|
66
|
+
const obj1 = { a: null };
|
|
67
|
+
const obj2 = { a: { b: 1 } };
|
|
68
|
+
const result = deepMerge(obj1, obj2);
|
|
69
|
+
expect(result).to.deep.equal({ a: { b: 1 } });
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
it('should ignore undefined values', () => {
|
|
73
|
+
const obj1 = { a: 1 };
|
|
74
|
+
const obj2 = { b: undefined };
|
|
75
|
+
const result = deepMerge(obj1, obj2);
|
|
76
|
+
expect(result).to.have.property('a');
|
|
77
|
+
expect(result).to.not.have.property('b');
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
describe('flattenConfig', () => {
|
|
82
|
+
it('should flatten a nested object', () => {
|
|
83
|
+
const nested = { a: { b: { c: 1 } } };
|
|
84
|
+
const result = flattenConfig(nested);
|
|
85
|
+
expect(result).to.deep.equal({ 'a_b_c': '1' });
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
it('should handle arrays as values without flattening them', () => {
|
|
89
|
+
const data = { a: { b: [1, 2, 3] } };
|
|
90
|
+
const result = flattenConfig(data);
|
|
91
|
+
expect(result).to.deep.equal({ 'a_b': '1,2,3' });
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
it('should handle multiple nested levels', () => {
|
|
95
|
+
const data = { a: { b: { c: { d: 1 } } } };
|
|
96
|
+
const result = flattenConfig(data);
|
|
97
|
+
expect(result).to.deep.equal({ 'a_b_c_d': '1' });
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
it('should preserve simple key-value pairs', () => {
|
|
101
|
+
const data = { a: 1, b: 2 };
|
|
102
|
+
const result = flattenConfig(data);
|
|
103
|
+
expect(result).to.deep.equal({ 'a': '1', 'b': '2' });
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
it('should correctly prepend a prefix if provided', () => {
|
|
107
|
+
const data = { a: 1 };
|
|
108
|
+
const result = flattenConfig(data, 'prefix');
|
|
109
|
+
expect(result).to.deep.equal({ 'prefix_a': '1' });
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
describe('unflattenConfig', () => {
|
|
114
|
+
it('should correctly reconstruct a simple flattened object', () => {
|
|
115
|
+
const flat = { 'a_b_c': '1' };
|
|
116
|
+
const result = unflattenConfig(flat);
|
|
117
|
+
expect(result).to.deep.equal({ a: { b: { c: 1 } } });
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
it('should ignore specified top-level attributes', () => {
|
|
121
|
+
const flat = { 'AWS_key': 'value', 'config_version': '1.0' };
|
|
122
|
+
const result = unflattenConfig(flat, ['AWS']);
|
|
123
|
+
expect(result).to.deep.equal({ config: { version: 1.0 } });
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
it('should handle keys with multiple underscores correctly', () => {
|
|
127
|
+
const flat = { 'a_b_c_d': '1' };
|
|
128
|
+
const result = unflattenConfig(flat);
|
|
129
|
+
expect(result).to.deep.equal({ a: { b: { c: { d: 1 } } } });
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
it('should reconstruct an object without ignoring any keys when no ignore list is provided', () => {
|
|
133
|
+
const flat = { 'a_b': '1', 'c_d': '2' };
|
|
134
|
+
const result = unflattenConfig(flat);
|
|
135
|
+
expect(result).to.deep.equal({ a: { b: 1 }, c: { d: 2 } });
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
it('should handle empty values and keys correctly', () => {
|
|
139
|
+
const flat = { 'a_b': '', 'c_': '2' };
|
|
140
|
+
const result = unflattenConfig(flat);
|
|
141
|
+
expect(result).to.deep.equal({ a: { b: '' }, c: { '': 2 } });
|
|
142
|
+
});
|
|
143
|
+
});
|
|
144
|
+
describe('getOauthDriverConfig', () => {
|
|
145
|
+
beforeEach(() => {
|
|
146
|
+
process.env = flattenConfig({
|
|
147
|
+
auth: {
|
|
148
|
+
clientId: 'client-id',
|
|
149
|
+
clientSecretName: 'client-secret',
|
|
150
|
+
tokenHost: 'http://auth.example.com',
|
|
151
|
+
tokenPath: '/token',
|
|
152
|
+
},
|
|
153
|
+
drivers: {
|
|
154
|
+
wave: {
|
|
155
|
+
enabled: true,
|
|
156
|
+
baseUrl: 'http://example.com',
|
|
157
|
+
audience: 'http://api.example.com',
|
|
158
|
+
},
|
|
159
|
+
},
|
|
160
|
+
});
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
it('should return configuration for a specified driver', () => {
|
|
164
|
+
const config = getOauthDriverConfig('wave');
|
|
165
|
+
expect(config).to.deep.include({
|
|
166
|
+
name: 'wave',
|
|
167
|
+
enabled: true,
|
|
168
|
+
baseUrl: 'http://example.com',
|
|
169
|
+
tokenConfig: {
|
|
170
|
+
audience: 'http://api.example.com',
|
|
171
|
+
},
|
|
172
|
+
});
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
it('should handle non-existent drivers gracefully', () => {
|
|
176
|
+
const config = getOauthDriverConfig('nonexistent');
|
|
177
|
+
|
|
178
|
+
expect(config).to.deep.equal({ enabled: false, name: 'nonexistent' });
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
it('should include all necessary OAuth details', () => {
|
|
182
|
+
const config = getOauthDriverConfig('wave');
|
|
183
|
+
expect(config.oauth).to.deep.include({
|
|
184
|
+
client: {
|
|
185
|
+
id: 'client-id',
|
|
186
|
+
secret: 'client-secret',
|
|
187
|
+
},
|
|
188
|
+
auth: {
|
|
189
|
+
tokenHost: 'http://auth.example.com',
|
|
190
|
+
tokenPath: '/token',
|
|
191
|
+
},
|
|
192
|
+
});
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
it('should correctly handle missing parts of the configuration', () => {
|
|
196
|
+
process.env = flattenConfig({
|
|
197
|
+
drivers: {
|
|
198
|
+
wave: {
|
|
199
|
+
enabled: true,
|
|
200
|
+
},
|
|
201
|
+
},
|
|
202
|
+
});
|
|
203
|
+
const config = getOauthDriverConfig('wave');
|
|
204
|
+
expect(config).to.deep.equal({ enabled: false, name: 'wave' });
|
|
205
|
+
});
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
describe('createConfigForStage', () => {
|
|
209
|
+
const defaultConfig = { api: { url: 'http://default.com' }, featureToggle: { newFeature: false } };
|
|
210
|
+
const stages = {
|
|
211
|
+
dev: { featureToggle: { newFeature: true } },
|
|
212
|
+
prod: { api: { url: 'http://prod.com' } },
|
|
213
|
+
};
|
|
214
|
+
const stageConfig = new NovaStageConfig(() => defaultConfig, stages);
|
|
215
|
+
|
|
216
|
+
it('should merge stage specific configurations over default configurations', () => {
|
|
217
|
+
const config = stageConfig.createConfigForStage('prod');
|
|
218
|
+
expect(config).to.deep.equal({
|
|
219
|
+
api: { url: 'http://prod.com' },
|
|
220
|
+
featureToggle: { newFeature: false },
|
|
221
|
+
});
|
|
222
|
+
});
|
|
223
|
+
|
|
224
|
+
it('should fall back to dev stage if specified stage is not found', () => {
|
|
225
|
+
const config = stageConfig.createConfigForStage('test');
|
|
226
|
+
expect(config).to.deep.equal({
|
|
227
|
+
api: { url: 'http://default.com' },
|
|
228
|
+
featureToggle: { newFeature: true },
|
|
229
|
+
});
|
|
230
|
+
});
|
|
231
|
+
|
|
232
|
+
it('should return the default configuration if no stages are defined', () => {
|
|
233
|
+
const sc = new NovaStageConfig(() => defaultConfig, {});
|
|
234
|
+
const config = sc.createConfigForStage('dev');
|
|
235
|
+
expect(config).to.deep.equal(defaultConfig);
|
|
236
|
+
});
|
|
237
|
+
|
|
238
|
+
it('should handle empty default and stage configurations', () => {
|
|
239
|
+
const sc = new NovaStageConfig(() => {}, {});
|
|
240
|
+
const config = sc.createConfigForStage('empty');
|
|
241
|
+
expect(config).to.deep.equal({});
|
|
242
|
+
});
|
|
243
|
+
|
|
244
|
+
it('should not modify the original default configuration object', () => {
|
|
245
|
+
const originalDefaultConfig = { ...defaultConfig };
|
|
246
|
+
stageConfig.createConfigForStage('prod');
|
|
247
|
+
expect(defaultConfig).to.deep.equal(originalDefaultConfig);
|
|
248
|
+
});
|
|
249
|
+
});
|
|
250
|
+
});
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { expect } from 'chai';
|
|
2
|
+
import { mapUsersByTenant, usersBelongToSameTenant } from '../src/tenant-utils.js';
|
|
3
|
+
|
|
4
|
+
describe('tenant-utils', function() {
|
|
5
|
+
describe('mapUsersByTenant', function() {
|
|
6
|
+
it('should return an empty object for an empty array', function() {
|
|
7
|
+
const result = mapUsersByTenant([]);
|
|
8
|
+
expect(result).to.deep.equal({});
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
it('should correctly map users by tenantId', function() {
|
|
12
|
+
const users = [
|
|
13
|
+
{ tenantId: '1', name: 'User 1' },
|
|
14
|
+
{ tenantId: '2', name: 'User 2' },
|
|
15
|
+
{ tenantId: '1', name: 'User 3' },
|
|
16
|
+
];
|
|
17
|
+
const expected = {
|
|
18
|
+
'1': [{ tenantId: '1', name: 'User 1' }, { tenantId: '1', name: 'User 3' }],
|
|
19
|
+
'2': [{ tenantId: '2', name: 'User 2' }],
|
|
20
|
+
};
|
|
21
|
+
const result = mapUsersByTenant(users);
|
|
22
|
+
expect(result).to.deep.equal(expected);
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
describe('usersBelongToSameTenant', function() {
|
|
27
|
+
it('should return true for an empty array', function() {
|
|
28
|
+
const result = usersBelongToSameTenant([]);
|
|
29
|
+
expect(result).to.be.true;
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
it('should return true for users belonging to the same tenant', function() {
|
|
33
|
+
const users = [
|
|
34
|
+
{ tenantId: '1', name: 'User 1' },
|
|
35
|
+
{ tenantId: '1', name: 'User 2' },
|
|
36
|
+
];
|
|
37
|
+
const result = usersBelongToSameTenant(users);
|
|
38
|
+
expect(result).to.be.true;
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
it('should return false for users belonging to different tenants', function() {
|
|
42
|
+
const users = [
|
|
43
|
+
{ tenantId: '1', name: 'User 1' },
|
|
44
|
+
{ tenantId: '2', name: 'User 2' },
|
|
45
|
+
];
|
|
46
|
+
const result = usersBelongToSameTenant(users);
|
|
47
|
+
expect(result).to.be.false;
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
});
|
package/rollup.config.js
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import html from '@open-wc/rollup-plugin-html';
|
|
2
|
+
import resolve from '@rollup/plugin-node-resolve';
|
|
3
|
+
|
|
4
|
+
export default {
|
|
5
|
+
input: 'docs-base/index.html',
|
|
6
|
+
output: {
|
|
7
|
+
dir: 'docs',
|
|
8
|
+
},
|
|
9
|
+
plugins: [
|
|
10
|
+
html(),
|
|
11
|
+
resolve(), // Resolves node modules
|
|
12
|
+
],
|
|
13
|
+
};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
extends:
|
|
2
|
+
- brightspace/testing-config
|
|
3
|
+
|
|
4
|
+
rules:
|
|
5
|
+
indent:
|
|
6
|
+
- error
|
|
7
|
+
- 2
|
|
8
|
+
- SwitchCase: 1
|
|
9
|
+
no-console:
|
|
10
|
+
- off
|
|
11
|
+
sort-imports:
|
|
12
|
+
- error
|
|
13
|
+
- ignoreCase: true
|
|
14
|
+
ignoreDeclarationSort: false
|
|
15
|
+
ignoreMemberSort: false
|
|
16
|
+
memberSyntaxSortOrder:
|
|
17
|
+
- none
|
|
18
|
+
- all
|
|
19
|
+
- multiple
|
|
20
|
+
- single
|
|
21
|
+
allowSeparatedGroups: true
|
|
22
|
+
import/no-extraneous-dependencies:
|
|
23
|
+
- error
|
|
24
|
+
- devDependencies:
|
|
25
|
+
- "**/*.js"
|