@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,10 @@
|
|
|
1
|
+
export * from './src/wave.js';
|
|
2
|
+
export * from './src/oauth.js';
|
|
3
|
+
export * from './src/nova-driver.js';
|
|
4
|
+
export * from './src/kraken-driver.js';
|
|
5
|
+
export * from './src/http.js';
|
|
6
|
+
export * from './src/config.js';
|
|
7
|
+
export * from './src/aws/sqs.js';
|
|
8
|
+
export * from './src/aws/secrets-manager.js';
|
|
9
|
+
export * from './src/aws/dynamodb.js';
|
|
10
|
+
export * from './src/aws/aws-base-driver.js';
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
{
|
|
2
|
+
"type": "module",
|
|
3
|
+
"name": "@skillswaveca/nova-drivers",
|
|
4
|
+
"description": "Some helper drivers for AWS services",
|
|
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
|
+
"chai": "^5.1.0",
|
|
17
|
+
"eslint": "^9.0.0",
|
|
18
|
+
"mocha": "^10.4.0"
|
|
19
|
+
},
|
|
20
|
+
"dependencies": {
|
|
21
|
+
"simple-oauth2": "^5.0.0",
|
|
22
|
+
"@aws-sdk/client-dynamodb": "^3.572.0",
|
|
23
|
+
"@aws-sdk/client-secrets-manager": "^3.572.0",
|
|
24
|
+
"@aws-sdk/client-sqs": "^3.572.0",
|
|
25
|
+
"@aws-sdk/lib-dynamodb": "^3.572.0",
|
|
26
|
+
"aws-xray-sdk-core": "^3.6.0",
|
|
27
|
+
"lodash.chunk": "^4.2.0",
|
|
28
|
+
"node-fetch": "^3.1.0",
|
|
29
|
+
"pino": "^9.0.0"
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import xray from 'aws-xray-sdk-core';
|
|
2
|
+
import { NovaDriver } from '../nova-driver.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Base driver for AWS services. You can extend this driver with any AWS service to set the client and automatically capture AWS X-Ray traces.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* import { AwsBaseDriver } from '@brightspace-ui-labs/nova/drivers';
|
|
9
|
+
*
|
|
10
|
+
* class MyAwsServiceDriver extends AwsBaseDriver {
|
|
11
|
+
* constructor(opts) {
|
|
12
|
+
* super(AwsServiceClient, opts);
|
|
13
|
+
* }
|
|
14
|
+
* }
|
|
15
|
+
*/
|
|
16
|
+
export class AwsBaseDriver extends NovaDriver {
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Constructor for the AWS base driver.
|
|
20
|
+
* @param clientType
|
|
21
|
+
* @param opts
|
|
22
|
+
* @param configOverrides
|
|
23
|
+
*/
|
|
24
|
+
constructor(clientType, opts, configOverrides) {
|
|
25
|
+
super(configOverrides);
|
|
26
|
+
this.__client = new clientType(opts);
|
|
27
|
+
this.isProd = this.config.prod;
|
|
28
|
+
if (this.config.xray.enabled) xray.captureAWSv3Client(this.__client);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
get client() {
|
|
32
|
+
return this.__client;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
import assert from 'assert';
|
|
2
|
+
|
|
3
|
+
import { DynamoDBClient } from '@aws-sdk/client-dynamodb';
|
|
4
|
+
|
|
5
|
+
import { BatchGetCommand, DeleteCommand, DynamoDBDocumentClient, GetCommand, PutCommand, QueryCommand, UpdateCommand } from '@aws-sdk/lib-dynamodb';
|
|
6
|
+
|
|
7
|
+
import { AwsBaseDriver } from './aws-base-driver.js';
|
|
8
|
+
import { log } from '../../../nova-utils/src/logger.js';
|
|
9
|
+
|
|
10
|
+
const DDB_WARN_TIME = 500; // milliseconds
|
|
11
|
+
const DDB_WARN_RECURSION_LEVELS = 2; // recursion levels
|
|
12
|
+
const ATTEMPTS = 3;
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* A class which provides a simplified interface for interacting with DynamoDB.
|
|
16
|
+
*
|
|
17
|
+
* @extends AwsBaseDriver
|
|
18
|
+
*/
|
|
19
|
+
export class DynamoDbDriver extends AwsBaseDriver {
|
|
20
|
+
constructor(opts, config = {}) {
|
|
21
|
+
super(DynamoDBClient, opts);
|
|
22
|
+
this.log = config.log || log;
|
|
23
|
+
const marshallOptions = {
|
|
24
|
+
convertClassInstanceToMap: true,
|
|
25
|
+
removeUndefinedValues: true,
|
|
26
|
+
};
|
|
27
|
+
this.__client = DynamoDBDocumentClient.from(this.__client, { marshallOptions });
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Recursive function to handle paged data in query results.
|
|
32
|
+
*
|
|
33
|
+
* Note: This function shouldn't be used in a production like environment. If your dynamodb query is returning this much data
|
|
34
|
+
* you should consider revising your keys to better represent your access patterns.
|
|
35
|
+
*
|
|
36
|
+
* @param {Object} params - DynamoDB query params.
|
|
37
|
+
* @param {Array} results - Array to store the results.
|
|
38
|
+
* @param {number} limit - Limit for the number of results.
|
|
39
|
+
* @param {number} level - Current recursion level.
|
|
40
|
+
* @param {number} startTime - Start time of the recursive function.
|
|
41
|
+
* @param {Object} startingParams - Initial params for the query.
|
|
42
|
+
* @returns {Promise<Array>} The results array.
|
|
43
|
+
*/
|
|
44
|
+
async getAllResultsRecursive(params, results, limit, level = 0, startTime = 0, startingParams) {
|
|
45
|
+
if (level === 0) {
|
|
46
|
+
startTime = Date.now();
|
|
47
|
+
startingParams = Object.assign({}, params);
|
|
48
|
+
}
|
|
49
|
+
level++;
|
|
50
|
+
|
|
51
|
+
if (limit) {
|
|
52
|
+
params.Limit = limit - results.length;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const data = await this.query(params);
|
|
56
|
+
|
|
57
|
+
if (data?.Items?.length > 0) {
|
|
58
|
+
results.push(...data.Items);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
if (data.LastEvaluatedKey) {
|
|
62
|
+
params.ExclusiveStartKey = data.LastEvaluatedKey;
|
|
63
|
+
} else if (params.ExclusiveStartKey) {
|
|
64
|
+
delete params.ExclusiveStartKey;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
if (data.LastEvaluatedKey && (!limit || results.length < limit)) {
|
|
68
|
+
return await this.getAllResultsRecursive(params, results, limit, level, startTime, startingParams);
|
|
69
|
+
} else {
|
|
70
|
+
const endTime = Date.now();
|
|
71
|
+
const timeTaken = endTime - startTime;
|
|
72
|
+
if ((level >= DDB_WARN_RECURSION_LEVELS) || (timeTaken >= DDB_WARN_TIME)) {
|
|
73
|
+
this.log.warn({ startingParams, timeTaken, recursionLevel: level }, `getAllResultsRecursive: ${level} ${(level === 1) ? 'query' : 'queries'} for startingParams; took ${timeTaken} ms`);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
return limit ? results.slice(0, limit) : results;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* This function returns the array of recursively retrieved results based
|
|
82
|
+
* on a DynamoDB query with the given parameters. It uses the
|
|
83
|
+
* getAllResultsRecursive function and returns all pages of results.
|
|
84
|
+
*
|
|
85
|
+
* Note: This function shouldn't be used in a production like environment. If your dynamodb query is returning this much data
|
|
86
|
+
* you should consider revising your keys to better represent your access patterns.
|
|
87
|
+
*
|
|
88
|
+
* @param {Object} params - DynamoDB query params
|
|
89
|
+
* @returns {Array<*>} recursively retrieved results from dynamoDb query
|
|
90
|
+
*/
|
|
91
|
+
async getAllResults(params) {
|
|
92
|
+
const results = [];
|
|
93
|
+
await this.getAllResultsRecursive(params, results);
|
|
94
|
+
return results?.Items || results;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Retrieves a limited number of paged results for a given DynamoDB query.
|
|
99
|
+
*
|
|
100
|
+
* @param {Object} params - The parameters for the DynamoDB query.
|
|
101
|
+
* @param {number} limit - The maximum number of items to fetch.
|
|
102
|
+
* @returns {Promise<Object>} A promise that resolves to an object containing the results array and possibly a LastEvaluatedKey.
|
|
103
|
+
*/
|
|
104
|
+
async getPagedResults(params, limit) {
|
|
105
|
+
const results = [];
|
|
106
|
+
await this.getAllResultsRecursive(params, results, limit);
|
|
107
|
+
return {
|
|
108
|
+
Items: results?.Items || results,
|
|
109
|
+
LastEvaluatedKey: params.ExclusiveStartKey,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Performs a batch get operation on DynamoDB.
|
|
115
|
+
*
|
|
116
|
+
* @param {Object} params - The parameters for the batch get operation.
|
|
117
|
+
* @returns {Promise<Object>} A promise that resolves to the results of the batch get operation.
|
|
118
|
+
*/
|
|
119
|
+
async batchGet(params) {
|
|
120
|
+
const results = {};
|
|
121
|
+
let callParams = Object.assign({}, params);
|
|
122
|
+
let attempts = 0;
|
|
123
|
+
|
|
124
|
+
/* eslint-disable no-await-in-loop */
|
|
125
|
+
while (attempts < ATTEMPTS) {
|
|
126
|
+
attempts += 1;
|
|
127
|
+
|
|
128
|
+
const { Responses, UnprocessedKeys } = await this._call(callParams, BatchGetCommand);
|
|
129
|
+
|
|
130
|
+
Object.entries(Responses).forEach(([tableName, responses]) => {
|
|
131
|
+
results[tableName] = (results[tableName] || []).concat(responses);
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
if (Object.keys(UnprocessedKeys).length > 0) {
|
|
135
|
+
callParams = Object.assign({}, callParams, {
|
|
136
|
+
RequestItems: UnprocessedKeys,
|
|
137
|
+
});
|
|
138
|
+
} else {
|
|
139
|
+
return { Responses: results };
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
/* eslint-enable no-await-in-loop */
|
|
143
|
+
|
|
144
|
+
throw new Error({
|
|
145
|
+
message: 'unable to fetch all requested items after too many retries',
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* Deletes an item from DynamoDB.
|
|
151
|
+
*
|
|
152
|
+
* @param {Object} params - The parameters for the delete operation.
|
|
153
|
+
* @returns {Promise<Object>} A promise that resolves to the result of the delete operation.
|
|
154
|
+
*/
|
|
155
|
+
delete(params) {
|
|
156
|
+
return this._call(params, DeleteCommand);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* Retrieves an item from DynamoDB.
|
|
161
|
+
*
|
|
162
|
+
* @param {Object} params - The parameters for the get operation.
|
|
163
|
+
* @returns {Promise<Object>} A promise that resolves to the retrieved item.
|
|
164
|
+
*/
|
|
165
|
+
get(params) {
|
|
166
|
+
return this._call(params, GetCommand);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* Inserts or replaces an item in DynamoDB.
|
|
171
|
+
*
|
|
172
|
+
* @param {Object} params - The parameters for the put operation.
|
|
173
|
+
* @returns {Promise<Object>} A promise that resolves to the result of the put operation.
|
|
174
|
+
*/
|
|
175
|
+
put(params) {
|
|
176
|
+
return this._call(params, PutCommand);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
* Queries DynamoDB and returns the matching items.
|
|
181
|
+
*
|
|
182
|
+
* @param {Object} params - The parameters for the query operation.
|
|
183
|
+
* @returns {Promise<Object>} A promise that resolves to the results of the query.
|
|
184
|
+
*/
|
|
185
|
+
query(params) {
|
|
186
|
+
return this._call(params, QueryCommand);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* Updates an existing item in DynamoDB.
|
|
191
|
+
*
|
|
192
|
+
* @param {Object} params - The parameters for the update operation.
|
|
193
|
+
* @returns {Promise<Object>} A promise that resolves to the result of the update operation.
|
|
194
|
+
*/
|
|
195
|
+
update(params) {
|
|
196
|
+
return this._call(params, UpdateCommand);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* A private helper method to abstract common logic for making calls to DynamoDB.
|
|
201
|
+
*
|
|
202
|
+
* @param {Object} params - The parameters for the DynamoDB operation.
|
|
203
|
+
* @param {Function} method - The DynamoDB operation to perform.
|
|
204
|
+
* @returns {Promise<Object>} A promise that resolves to the result of the DynamoDB operation.
|
|
205
|
+
* @private
|
|
206
|
+
*/
|
|
207
|
+
async _call(params, method) {
|
|
208
|
+
assert(params, 'missing params');
|
|
209
|
+
assert(method, 'missing method');
|
|
210
|
+
|
|
211
|
+
this.log.trace({ params }, `making DynamoDB call: ${method.name}`);
|
|
212
|
+
try {
|
|
213
|
+
return await this.__client.send(new method(params));
|
|
214
|
+
} catch (error) {
|
|
215
|
+
const message = `failed to make DynamoDB call: ${method.name}`;
|
|
216
|
+
this.log.error({
|
|
217
|
+
params,
|
|
218
|
+
error: {
|
|
219
|
+
message: error.message,
|
|
220
|
+
stack: error.stack,
|
|
221
|
+
code: error.code,
|
|
222
|
+
statusCode: error.statusCode,
|
|
223
|
+
requestId: error.requestId,
|
|
224
|
+
},
|
|
225
|
+
}, message);
|
|
226
|
+
|
|
227
|
+
throw error;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { GetSecretValueCommand, SecretsManagerClient } from '@aws-sdk/client-secrets-manager';
|
|
2
|
+
import { AwsBaseDriver } from './aws-base-driver.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* SecretsManager class to simplify fetching secrets from AWS Secret Manager.
|
|
6
|
+
*/
|
|
7
|
+
export class SecretsManager extends AwsBaseDriver {
|
|
8
|
+
constructor() {
|
|
9
|
+
super(SecretsManagerClient, {
|
|
10
|
+
region: process.env.AWS_REGION || 'us-east-1',
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* This function wraps the AWS-provided action "GetSecretValue", and converts it into
|
|
16
|
+
* a thenable promise. The function will attempt to return any secret matching the
|
|
17
|
+
* provided secret name, assuming the proper IAM role is in place.
|
|
18
|
+
*
|
|
19
|
+
* Currently, we rethrow the exception by default.
|
|
20
|
+
*
|
|
21
|
+
* For more info:
|
|
22
|
+
* See https://docs.aws.amazon.com/secretsmanager/latest/apireference/API_GetSecretValue.html
|
|
23
|
+
*
|
|
24
|
+
* @param {*} secretName - The name of the secret stored in AWS Secret Manager.
|
|
25
|
+
* @param {string} [keyId] - An optional key to retrieve a specific value from an AWS secret object.
|
|
26
|
+
* @returns - The secret value. If the secret was created via the web interface, this string
|
|
27
|
+
* is a JSON. Otherwise (e.g. via the API), this string is the secret itself.
|
|
28
|
+
*/
|
|
29
|
+
async getSecret(secretName, keyId) {
|
|
30
|
+
if (!secretName) throw new Error('Missing secret name to fetch secret');
|
|
31
|
+
|
|
32
|
+
try {
|
|
33
|
+
const data = await this.client.send(new GetSecretValueCommand({ SecretId: secretName }));
|
|
34
|
+
const DEFAULT_SECRET_KEY = 'secretValue';
|
|
35
|
+
const ALL_KEYS = 'allKeys';
|
|
36
|
+
const secretData = JSON.parse(data.SecretString);
|
|
37
|
+
const secretKey = keyId ?? DEFAULT_SECRET_KEY;
|
|
38
|
+
|
|
39
|
+
if (keyId === ALL_KEYS) return secretData;
|
|
40
|
+
if (secretData[secretKey]) return secretData[secretKey];
|
|
41
|
+
if (!keyId && this.isProdEnvironment && secretData.prod) return secretData.prod;
|
|
42
|
+
if (!keyId && secretData.dev) return secretData.dev;
|
|
43
|
+
|
|
44
|
+
throw new Error(`${keyId || 'env value'} does not exist`);
|
|
45
|
+
} catch (error) {
|
|
46
|
+
this.log.error({ secretName, message: error.message }, 'Failed getting secret');
|
|
47
|
+
throw new Error(`SecretsManager: ${error.message}`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export const secretsManager = new SecretsManager();
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import assert from 'assert';
|
|
2
|
+
import chunk from 'lodash.chunk';
|
|
3
|
+
|
|
4
|
+
import { SendMessageBatchCommand, SQS } from '@aws-sdk/client-sqs';
|
|
5
|
+
|
|
6
|
+
import { AwsBaseDriver } from './aws-base-driver.js';
|
|
7
|
+
import { log } from '../../../nova-utils/src/logger.js';
|
|
8
|
+
|
|
9
|
+
const BATCH_SIZE = 10;
|
|
10
|
+
const RETRY_COUNT = 2;
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* SQSDriver class to simplify sending messages to an SQS queue.
|
|
14
|
+
*/
|
|
15
|
+
export class SQSDriver extends AwsBaseDriver {
|
|
16
|
+
constructor() {
|
|
17
|
+
super(SQS);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Send messages to an SQS queue.
|
|
22
|
+
* @param queueUrl The URL of the SQS queue.
|
|
23
|
+
* @param items The items to send to the SQS queue.
|
|
24
|
+
* @param retryCount The number of times to retry sending the messages to the SQS queue.
|
|
25
|
+
* @returns {Promise<Awaited<*|ChangeMessageVisibilityBatchResultEntry[]|DeleteMessageBatchResultEntry[]|SendMessageBatchResultEntry[]|*[]|undefined>[]>}
|
|
26
|
+
*/
|
|
27
|
+
send(queueUrl, items, retryCount) {
|
|
28
|
+
const messages = [].concat(items);
|
|
29
|
+
return this._sendBatch(queueUrl, messages, retryCount);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* @private
|
|
34
|
+
* Get the entries for a batch of messages.
|
|
35
|
+
*
|
|
36
|
+
* @param batch
|
|
37
|
+
* @returns {*}
|
|
38
|
+
* @private
|
|
39
|
+
*/
|
|
40
|
+
_getEntriesForBatch(batch) {
|
|
41
|
+
return batch.map(({ body, delaySeconds, messageAttributes, dedupId, groupId }, index) => {
|
|
42
|
+
const entry = {
|
|
43
|
+
Id: index.toString(),
|
|
44
|
+
MessageBody: JSON.stringify(body),
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
if (delaySeconds) {
|
|
48
|
+
entry.DelaySeconds = delaySeconds;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
if (messageAttributes) {
|
|
52
|
+
entry.MessageAttributes = Object.keys(messageAttributes).reduce((acc, key) => {
|
|
53
|
+
const value = messageAttributes[key];
|
|
54
|
+
return Object.assign(acc, {
|
|
55
|
+
[key]: {
|
|
56
|
+
DataType: `String.${typeof value}`,
|
|
57
|
+
StringValue: value.toString(),
|
|
58
|
+
},
|
|
59
|
+
});
|
|
60
|
+
}, {});
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
if (dedupId) {
|
|
64
|
+
entry.MessageDeduplicationId = dedupId;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
if (groupId) {
|
|
68
|
+
entry.MessageGroupId = groupId;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
return entry;
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* @private
|
|
77
|
+
*
|
|
78
|
+
* Send a batch of messages to an SQS queue.
|
|
79
|
+
*
|
|
80
|
+
* @param queueUrl
|
|
81
|
+
* @param messages
|
|
82
|
+
* @param retryCount
|
|
83
|
+
* @returns {Promise<Awaited<*|ChangeMessageVisibilityBatchResultEntry[]|DeleteMessageBatchResultEntry[]|SendMessageBatchResultEntry[]|*[]|undefined>[]>}
|
|
84
|
+
* @private
|
|
85
|
+
*/
|
|
86
|
+
_sendBatch(queueUrl, messages, retryCount = RETRY_COUNT) {
|
|
87
|
+
assert(queueUrl, 'missing queueUrl');
|
|
88
|
+
assert(messages, 'missing messages');
|
|
89
|
+
|
|
90
|
+
const chunks = chunk(messages, BATCH_SIZE);
|
|
91
|
+
return Promise.all(chunks.map(async batch => {
|
|
92
|
+
const params = {
|
|
93
|
+
QueueUrl: queueUrl,
|
|
94
|
+
Entries: this._getEntriesForBatch(batch),
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
log.info({ params }, 'sending SQS messages');
|
|
98
|
+
try {
|
|
99
|
+
const data = await this.client.send(new SendMessageBatchCommand(params));
|
|
100
|
+
const successful = data.Successful || [];
|
|
101
|
+
|
|
102
|
+
if (data.Failed && data.Failed.length) {
|
|
103
|
+
if (!retryCount) {
|
|
104
|
+
throw new Error({
|
|
105
|
+
message: 'failed to send messages to SQS queue due to retry limit reached',
|
|
106
|
+
details: {
|
|
107
|
+
failed: data.Failed,
|
|
108
|
+
params,
|
|
109
|
+
},
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
const failedMessages = data.Failed.map(failed => {
|
|
114
|
+
if (failed.SenderFault) {
|
|
115
|
+
throw new Error({
|
|
116
|
+
message: 'failed to send messages to SQS queue due to sender fault',
|
|
117
|
+
details: {
|
|
118
|
+
failed,
|
|
119
|
+
params,
|
|
120
|
+
},
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
return batch[failed.Id];
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
return this._sendBatch(queueUrl, failedMessages, retryCount - 1)
|
|
127
|
+
.then(result => successful.concat(result[0]));
|
|
128
|
+
}
|
|
129
|
+
return successful;
|
|
130
|
+
} catch (err) {
|
|
131
|
+
log.error({ params, err }, 'failed to send messages to SQS queue');
|
|
132
|
+
throw new Error({
|
|
133
|
+
message: 'failed to send messages to SQS queue',
|
|
134
|
+
cause: err,
|
|
135
|
+
details: { params },
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
}));
|
|
139
|
+
}
|
|
140
|
+
}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
// eslint-disable-next-line no-shadow
|
|
2
|
+
import fetch from 'node-fetch';
|
|
3
|
+
import { NovaDriver } from './nova-driver.js';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* HttpDriver class to simplify making HTTP requests.
|
|
7
|
+
*
|
|
8
|
+
* @extends NovaDriver
|
|
9
|
+
*/
|
|
10
|
+
export class HttpDriver extends NovaDriver {
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* HttpDriver constructor.
|
|
14
|
+
*
|
|
15
|
+
* @param {string} baseUrl - The base URL for the HTTP driver.
|
|
16
|
+
* @param {Object} configOverrides - Configuration overrides for the HTTP driver.
|
|
17
|
+
*/
|
|
18
|
+
constructor(baseUrl, configOverrides = {}) {
|
|
19
|
+
super(configOverrides);
|
|
20
|
+
this.baseUrl = baseUrl;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* This doesn't need to be async, but it is for other drivers that might need to do async work to get the headers
|
|
25
|
+
* @returns {Promise<{"Content-Type": string}>}
|
|
26
|
+
*/
|
|
27
|
+
async getHeaders() {
|
|
28
|
+
return {
|
|
29
|
+
'Content-Type': 'application/json',
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Send a POST request.
|
|
35
|
+
*
|
|
36
|
+
* @param {string} path - The path for the POST request.
|
|
37
|
+
* @param {Object} body - The body of the POST request.
|
|
38
|
+
* @param {Object} headers - The headers for the POST request.
|
|
39
|
+
* @returns {Promise<Object>} The response from the POST request.
|
|
40
|
+
*/
|
|
41
|
+
async post(path, body, headers = {}) {
|
|
42
|
+
return await this._request('POST', path, body, headers);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Send a PUT request.
|
|
47
|
+
*
|
|
48
|
+
* @param {string} path - The path for the PUT request.
|
|
49
|
+
* @param {Object} body - The body of the PUT request.
|
|
50
|
+
* @param {Object} headers - The headers for the PUT request.
|
|
51
|
+
* @returns {Promise<Object>} The response from the PUT request.
|
|
52
|
+
*/
|
|
53
|
+
async put(path, body, headers = {}) {
|
|
54
|
+
return await this._request('PUT', path, body, headers);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Send a PATCH request.
|
|
59
|
+
*
|
|
60
|
+
* @param {string} path - The path for the PATCH request.
|
|
61
|
+
* @param {Object} body - The body of the PATCH request.
|
|
62
|
+
* @param {Object} headers - The headers for the PATCH request.
|
|
63
|
+
* @returns {Promise<Object>} The response from the PATCH request.
|
|
64
|
+
*/
|
|
65
|
+
async patch(path, body, headers = {}) {
|
|
66
|
+
return await this._request('PATCH', path, body, headers);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Send a GET request.
|
|
71
|
+
*
|
|
72
|
+
* @param {string} path - The path for the GET request.
|
|
73
|
+
* @param {Object} headers - The headers for the GET request.
|
|
74
|
+
* @returns {Promise<Object>} The response from the GET request.
|
|
75
|
+
*/
|
|
76
|
+
async get(path, headers = {}) {
|
|
77
|
+
return await this._request('GET', path, {}, headers);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Send a DELETE request.
|
|
82
|
+
* @param {string} path - The path for the DELETE request.
|
|
83
|
+
* @param {Object} headers - The headers for the DELETE request.
|
|
84
|
+
* @returns {Promise<Object>} The response from the DELETE request.
|
|
85
|
+
*/
|
|
86
|
+
async delete(path, headers = {}) {
|
|
87
|
+
return await this._request('DELETE', path, {}, headers);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* @private
|
|
92
|
+
* Handle the response from the HTTP request.
|
|
93
|
+
*
|
|
94
|
+
* @param {string} url - The URL of the request.
|
|
95
|
+
* @param {Object} options - The options used for the request.
|
|
96
|
+
* @param {Object} response - The response from the request.
|
|
97
|
+
* @returns {Promise<Object>} The processed response.
|
|
98
|
+
*/
|
|
99
|
+
async _handleResponse(url, options, response) {
|
|
100
|
+
if (!response) {
|
|
101
|
+
return { success: false, error: 'No response' };
|
|
102
|
+
}
|
|
103
|
+
const success = response.status >= 200 && response.status <= 299;
|
|
104
|
+
let body;
|
|
105
|
+
let error;
|
|
106
|
+
|
|
107
|
+
if (success) {
|
|
108
|
+
this.log.trace({ url: url, method: options.method, status: response.status }, 'HTTP request successful');
|
|
109
|
+
body = await response.json();
|
|
110
|
+
} else {
|
|
111
|
+
this.log.error({ url: url, method: options.method, status: response.status }, 'HTTP request failed');
|
|
112
|
+
error = await response.text();
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
return { success, body, error };
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* @private
|
|
120
|
+
*
|
|
121
|
+
* Send a HTTP request.
|
|
122
|
+
* @param {string} method - The HTTP method for the request.
|
|
123
|
+
* @param {string} path - The path for the request.
|
|
124
|
+
* @param {Object} body - The body of the request.
|
|
125
|
+
* @param {Object} headers - The headers for the request.
|
|
126
|
+
* @returns {Promise<Object>} The response from the request.
|
|
127
|
+
*/
|
|
128
|
+
async _request(method, path, body = {}, headers = {}) {
|
|
129
|
+
if (!this.enabled) {
|
|
130
|
+
this.log.warn({ baseUrl: this.baseUrl }, 'Driver is disabled');
|
|
131
|
+
return { success: false, error: 'Driver is disabled' };
|
|
132
|
+
}
|
|
133
|
+
const url = `${this.baseUrl}${path}`;
|
|
134
|
+
const options = {
|
|
135
|
+
method,
|
|
136
|
+
headers: {
|
|
137
|
+
...await this.getHeaders(),
|
|
138
|
+
...headers,
|
|
139
|
+
},
|
|
140
|
+
};
|
|
141
|
+
|
|
142
|
+
if (this.novaRequestId) {
|
|
143
|
+
options.headers = { ...options.headers, 'x-nova-request-id': this.novaRequestId };
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
if (method === 'POST' || method === 'PUT' || method === 'PATCH') {
|
|
147
|
+
options.body = JSON.stringify(body);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
try {
|
|
151
|
+
const response = await this._fetch(url, options);
|
|
152
|
+
return await this._handleResponse(url, options, response);
|
|
153
|
+
} catch (error) {
|
|
154
|
+
this.log.error({ url: url, method: method, error, message: error.message }, 'HTTP request failed');
|
|
155
|
+
return { success: false, error: error.message };
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
_fetch(...args) {
|
|
160
|
+
return fetch(...args);
|
|
161
|
+
}
|
|
162
|
+
}
|