From 96237d74e61e65f77cdbc1c4e81833e96df800d5 Mon Sep 17 00:00:00 2001 From: Noah Emke Date: Wed, 29 Nov 2023 23:13:04 -0500 Subject: [PATCH 01/40] Add a readme for the repo --- README.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..d65d2bb --- /dev/null +++ b/README.md @@ -0,0 +1,21 @@ +# Devcade Documentation + +This repo contains or links to all relevant documentation for the Devcade project using docsify. + +All documetation should live in the repo it applies to. If some documetation doesn't fit in any of the projects other repos, it may live here. + +# Running locally + +Install docsify-cli +``` +npm i docsify-cli -g +``` + +And serve it, the site will then be available at `http://localhost:3000/docs/` +``` +docsify serve . --open +``` + +# Deploying + +Upon pushing to the docs branch, a webhook should take care of rebuilding the okd pod. \ No newline at end of file From 1fde0e886bd806ea495235f6b50ac17703fadde9 Mon Sep 17 00:00:00 2001 From: Noah Emke Date: Thu, 30 Nov 2023 00:03:34 -0500 Subject: [PATCH 02/40] Cleaned up index.html Title got overriden and did nothing description was not used and seems to do nothing. --- index.html | 2 -- 1 file changed, 2 deletions(-) diff --git a/index.html b/index.html index 8a9943c..bdd4182 100644 --- a/index.html +++ b/index.html @@ -2,9 +2,7 @@ - Document - From 87941a15c1bf34f6420865c3bb30f466ce220e26 Mon Sep 17 00:00:00 2001 From: Noah Emke Date: Thu, 30 Nov 2023 00:22:17 -0500 Subject: [PATCH 03/40] Set the theme back to a cdn link and killed shortcut icon The site doesn't work without the cdn for docsify scripts so loading them from cdn but not the theme just doesn't make sense. The shortcut icon link seemed to do nothing so I removed it because I can. --- index.html | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/index.html b/index.html index bdd4182..ae7d690 100644 --- a/index.html +++ b/index.html @@ -4,8 +4,7 @@ - - + From 73bcfca41f1ddcec33cfdd0ef6ea4da482846f06 Mon Sep 17 00:00:00 2001 From: Noah Emke Date: Thu, 30 Nov 2023 02:04:29 -0500 Subject: [PATCH 04/40] Added pulling in of other readmes Now it will pull from the readme in each repo. edit on github fix to come soon Im gonna sleep now --- docs/_sidebar.md | 28 +++++++++++++++++----------- index.html | 10 +++++++++- 2 files changed, 26 insertions(+), 12 deletions(-) diff --git a/docs/_sidebar.md b/docs/_sidebar.md index b5d0573..d013aa2 100644 --- a/docs/_sidebar.md +++ b/docs/_sidebar.md @@ -1,12 +1,18 @@ * [Home](/) -* [Getting Started](Getting-started/) -* [Library](Library/) -* [Hardware](Hardware/) - * [Cabinet](Hardware/cabinet) - * [Gamepad](Hardware/gamepad) - * [Installing DCU](Hardware/installing-dcu) -* [Internals](Internals/) - * [API](Internals/API/) - * [Onboard](Internals/Onboard/) - * [Website](Internals/Website/) -* [Contributing Guide](contributing) \ No newline at end of file +* [Onboard Software](/onboard-repo) +* [Website](/website-repo) +* [Monogame Library](/library-repo) +* [API](/api-repo) +* [Monogame Template](/template-repo) +* [Flatpackify](/flatpackify-repo) +* [Getting Started](/Getting-started/) +* [Library](/Library/) +* [Hardware](/Hardware/) + * [Cabinet](/Hardware/cabinet) + * [Gamepad](/Hardware/gamepad) + * [Installing DCU](/Hardware/installing-dcu) +* [Internals](/Internals/) + * [API](/Internals/API/) + * [Onboard](/Internals/Onboard/) + * [Website](/Internals/Website/) +* [Contributing Guide](/contributing) \ No newline at end of file diff --git a/index.html b/index.html index ae7d690..3bae45f 100644 --- a/index.html +++ b/index.html @@ -13,8 +13,16 @@ @@ -25,7 +24,40 @@ relativePath: true, loadSidebar: true, plugins: [ - EditOnGithubPlugin.create("https://github.com/ComputerScienceHouse/devcade-docs/tree/docs/docs/") + // Custom plugin from docsify's own repo. modified to work with non-master branches + function (hook, vm) { + hook.beforeEach(markdown => { + if (/githubusercontent\.com/.test(vm.route.file)) { + url = vm.route.file + .replace('raw.githubusercontent.com', 'github.com') + // Regex captures everything before the branch in one group, and the + // branch onwards in another. Then add blob between + .replace(/(github.com\/.*\/.*\/)(.*\/.*)/, "$1edit/$2"); + } else if (/jsdelivr\.net/.test(vm.route.file)) { // We wont use this so I'm not gonna bother fixing + url = vm.route.file + .replace('cdn.jsdelivr.net/gh', 'github.com') + .replace('@master', '/blob/master'); + } else { + url = + 'https://github.com/ComputerScienceHouse/devcade-docs/blob/docs/docs/' + + vm.route.file; + } + // Switched to inserting html so it could be right aligned. + // The html is copied directly from the browser what the md would + // render plus the style float right + const editMd = //'[:memo: Edit Document](' + url + ')\n' + `

+ + memo + Edit on github + +

\n\n`; + return ( + editMd + + markdown + ); + }); + }, ] } From ef12b830fa274e38fd74725d3d5cb4e64468a381 Mon Sep 17 00:00:00 2001 From: Noah Emke Date: Thu, 30 Nov 2023 14:06:12 -0500 Subject: [PATCH 06/40] Replaced shortcut icon Apparently it did did do things, I just didn't notice Probably caching being a bitch --- index.html | 1 + 1 file changed, 1 insertion(+) diff --git a/index.html b/index.html index 01e8309..3d2debd 100644 --- a/index.html +++ b/index.html @@ -5,6 +5,7 @@ + From a2e1665a1212fd43a41eb879259113841eece028 Mon Sep 17 00:00:00 2001 From: Noah Emke Date: Thu, 30 Nov 2023 14:21:18 -0500 Subject: [PATCH 07/40] Cleanup - Removed a blenk line - Removed the local dark style --- _media/dark.css | 844 ------------------------------------------------ index.html | 3 +- 2 files changed, 1 insertion(+), 846 deletions(-) delete mode 100644 _media/dark.css diff --git a/_media/dark.css b/_media/dark.css deleted file mode 100644 index 4a911be..0000000 --- a/_media/dark.css +++ /dev/null @@ -1,844 +0,0 @@ -@import url("https://fonts.googleapis.com/css?family=Roboto+Mono|Source+Sans+Pro:300,400,600"); -* { - -webkit-font-smoothing: antialiased; - -webkit-overflow-scrolling: touch; - -webkit-tap-highlight-color: rgba(0,0,0,0); - -webkit-text-size-adjust: none; - -webkit-touch-callout: none; - box-sizing: border-box; -} -body:not(.ready) { - overflow: hidden; -} -body:not(.ready) [data-cloak], -body:not(.ready) .app-nav, -body:not(.ready) > nav { - display: none; -} -div#app { - font-size: 30px; - font-weight: lighter; - margin: 40vh auto; - text-align: center; -} -div#app:empty::before { - content: 'Loading...'; -} -img.emoji { - height: 1.2em; - vertical-align: middle; -} -span.emoji { - font-family: "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; - font-size: 1.2em; - vertical-align: middle; -} -.progress { - background-color: #ea6f5a; - background-color: var(--theme-color, #ea6f5a); - height: 2px; - left: 0px; - position: fixed; - right: 0px; - top: 0px; - transition: width 0.2s, opacity 0.4s; - width: 0%; - z-index: 999999; -} -.search a:hover { - color: #ea6f5a; - color: var(--theme-color, #ea6f5a); -} -.search .search-keyword { - color: #ea6f5a; - color: var(--theme-color, #ea6f5a); - font-style: normal; - font-weight: bold; -} -html, -body { - height: 100%; -} -body { - -moz-osx-font-smoothing: grayscale; - -webkit-font-smoothing: antialiased; - color: #c8c8c8; - font-family: 'Source Sans Pro', 'Helvetica Neue', Arial, sans-serif; - font-size: 15px; - letter-spacing: 0; - margin: 0; - overflow-x: hidden; -} -img { - max-width: 100%; -} -a[disabled] { - cursor: not-allowed; - opacity: 0.6; -} -kbd { - border: solid 1px #ccc; - border-radius: 3px; - display: inline-block; - font-size: 12px !important; - line-height: 12px; - margin-bottom: 3px; - padding: 3px 5px; - vertical-align: middle; -} -li input[type='checkbox'] { - margin: 0 0.2em 0.25em 0; - vertical-align: middle; -} -.app-nav { - margin: 25px 60px 0 0; - position: absolute; - right: 0; - text-align: right; - z-index: 10; -/* navbar dropdown */ -} -.app-nav.no-badge { - margin-right: 25px; -} -.app-nav p { - margin: 0; -} -.app-nav > a { - margin: 0 1rem; - padding: 5px 0; -} -.app-nav ul, -.app-nav li { - display: inline-block; - list-style: none; - margin: 0; -} -.app-nav a { - color: inherit; - font-size: 16px; - text-decoration: none; - transition: color 0.3s; -} -.app-nav a:hover { - color: #ea6f5a; - color: var(--theme-color, #ea6f5a); -} -.app-nav a.active { - border-bottom: 2px solid #ea6f5a; - border-bottom: 2px solid var(--theme-color, #ea6f5a); - color: #ea6f5a; - color: var(--theme-color, #ea6f5a); -} -.app-nav li { - display: inline-block; - margin: 0 1rem; - padding: 5px 0; - position: relative; - cursor: pointer; -} -.app-nav li ul { - background-color: #fff; - border: 1px solid #ddd; - border-bottom-color: #ccc; - border-radius: 4px; - box-sizing: border-box; - display: none; - max-height: calc(100vh - 61px); - overflow-y: auto; - padding: 10px 0; - position: absolute; - right: -15px; - text-align: left; - top: 100%; - white-space: nowrap; -} -.app-nav li ul li { - display: block; - font-size: 14px; - line-height: 1rem; - margin: 0; - margin: 8px 14px; - white-space: nowrap; -} -.app-nav li ul a { - display: block; - font-size: inherit; - margin: 0; - padding: 0; -} -.app-nav li ul a.active { - border-bottom: 0; -} -.app-nav li:hover ul { - display: block; -} -.github-corner { - border-bottom: 0; - position: fixed; - right: 0; - text-decoration: none; - top: 0; - z-index: 1; -} -.github-corner:hover .octo-arm { - animation: octocat-wave 560ms ease-in-out; -} -.github-corner svg { - color: #3f3f3f; - fill: #ea6f5a; - fill: var(--theme-color, #ea6f5a); - height: 80px; - width: 80px; -} -main { - display: block; - position: relative; - width: 100vw; - height: 100%; - z-index: 0; -} -main.hidden { - display: none; -} -.anchor { - display: inline-block; - text-decoration: none; - transition: all 0.3s; -} -.anchor span { - color: #c8c8c8; -} -.anchor:hover { - text-decoration: underline; -} -.sidebar { - border-right: 1px solid rgba(0,0,0,0.07); - overflow-y: auto; - padding: 40px 0 0; - position: absolute; - top: 0; - bottom: 0; - left: 0; - transition: transform 250ms ease-out; - width: 300px; - z-index: 20; -} -.sidebar > h1 { - margin: 0 auto 1rem; - font-size: 1.5rem; - font-weight: 300; - text-align: center; -} -.sidebar > h1 a { - color: inherit; - text-decoration: none; -} -.sidebar > h1 .app-nav { - display: block; - position: static; -} -.sidebar .sidebar-nav { - line-height: 2em; - padding-bottom: 40px; -} -.sidebar li.collapse .app-sub-sidebar { - display: none; -} -.sidebar ul { - margin: 0 0 0 15px; - padding: 0; -} -.sidebar li > p { - font-weight: 700; - margin: 0; -} -.sidebar ul, -.sidebar ul li { - list-style: none; -} -.sidebar ul li a { - border-bottom: none; - display: block; -} -.sidebar ul li ul { - padding-left: 20px; -} -.sidebar::-webkit-scrollbar { - width: 4px; -} -.sidebar::-webkit-scrollbar-thumb { - background: transparent; - border-radius: 4px; -} -.sidebar:hover::-webkit-scrollbar-thumb { - background: rgba(136,136,136,0.4); -} -.sidebar:hover::-webkit-scrollbar-track { - background: rgba(136,136,136,0.1); -} -.sidebar-toggle { - background-color: transparent; - background-color: rgba(63,63,63,0.8); - border: 0; - outline: none; - padding: 10px; - position: absolute; - bottom: 0; - left: 0; - text-align: center; - transition: opacity 0.3s; - width: 284px; - z-index: 30; - cursor: pointer; -} -.sidebar-toggle:hover .sidebar-toggle-button { - opacity: 0.4; -} -.sidebar-toggle span { - background-color: #ea6f5a; - background-color: var(--theme-color, #ea6f5a); - display: block; - margin-bottom: 4px; - width: 16px; - height: 2px; -} -body.sticky .sidebar, -body.sticky .sidebar-toggle { - position: fixed; -} -.content { - padding-top: 60px; - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 300px; - transition: left 250ms ease; -} -.markdown-section { - margin: 0 auto; - max-width: 80%; - padding: 30px 15px 40px 15px; - position: relative; -} -.markdown-section > * { - box-sizing: border-box; - font-size: inherit; -} -.markdown-section > :first-child { - margin-top: 0 !important; -} -.markdown-section hr { - border: none; - border-bottom: 1px solid #eee; - margin: 2em 0; -} -.markdown-section iframe { - border: 1px solid #eee; -/* fix horizontal overflow on iOS Safari */ - width: 1px; - min-width: 100%; -} -.markdown-section table { - border-collapse: collapse; - border-spacing: 0; - display: block; - margin-bottom: 1rem; - overflow: auto; - width: 100%; -} -.markdown-section th { - border: 1px solid #ddd; - font-weight: bold; - padding: 6px 13px; -} -.markdown-section td { - border: 1px solid #ddd; - padding: 6px 13px; -} -.markdown-section tr { - border-top: 1px solid #ccc; -} -.markdown-section tr:nth-child(2n) { - background-color: #f8f8f8; -} -.markdown-section p.tip { - background-color: #f8f8f8; - border-bottom-right-radius: 2px; - border-left: 4px solid #f66; - border-top-right-radius: 2px; - margin: 2em 0; - padding: 12px 24px 12px 30px; - position: relative; -} -.markdown-section p.tip:before { - background-color: #f66; - border-radius: 100%; - color: #3f3f3f; - content: '!'; - font-family: 'Dosis', 'Source Sans Pro', 'Helvetica Neue', Arial, sans-serif; - font-size: 14px; - font-weight: bold; - left: -12px; - line-height: 20px; - position: absolute; - height: 20px; - width: 20px; - text-align: center; - top: 14px; -} -.markdown-section p.tip code { - background-color: #efefef; -} -.markdown-section p.tip em { - color: #c8c8c8; -} -.markdown-section p.warn { - background: rgba(234,111,90,0.1); - border-radius: 2px; - padding: 1rem; -} -.markdown-section ul.task-list > li { - list-style-type: none; -} -body.close .sidebar { - transform: translateX(-300px); -} -body.close .sidebar-toggle { - width: auto; -} -body.close .content { - left: 0; -} -@media print { - .github-corner, - .sidebar-toggle, - .sidebar, - .app-nav { - display: none; - } -} -@media screen and (max-width: 768px) { - .github-corner, - .sidebar-toggle, - .sidebar { - position: fixed; - } - .app-nav { - margin-top: 16px; - } - .app-nav li ul { - top: 30px; - } - main { - height: auto; - min-height: 100vh; - overflow-x: hidden; - } - .sidebar { - left: -300px; - transition: transform 250ms ease-out; - } - .content { - left: 0; - max-width: 100vw; - position: static; - padding-top: 20px; - transition: transform 250ms ease; - } - .app-nav, - .github-corner { - transition: transform 250ms ease-out; - } - .sidebar-toggle { - background-color: transparent; - width: auto; - padding: 30px 30px 10px 10px; - } - body.close .sidebar { - transform: translateX(300px); - } - body.close .sidebar-toggle { - background-color: rgba(63,63,63,0.8); - transition: 1s background-color; - width: 284px; - padding: 10px; - } - body.close .content { - transform: translateX(300px); - } - body.close .app-nav, - body.close .github-corner { - display: none; - } - .github-corner:hover .octo-arm { - animation: none; - } - .github-corner .octo-arm { - animation: octocat-wave 560ms ease-in-out; - } -} -@keyframes octocat-wave { - 0%, 100% { - transform: rotate(0); - } - 20%, 60% { - transform: rotate(-25deg); - } - 40%, 80% { - transform: rotate(10deg); - } -} -section.cover { - position: relative; - align-items: center; - background-position: center center; - background-repeat: no-repeat; - background-size: cover; - min-height: 100vh; - width: 100%; - display: none; -} -section.cover.show { - display: flex; -} -section.cover.has-mask .mask { - background-color: #3f3f3f; - opacity: 0.8; - position: absolute; - top: 0; - bottom: 0; - width: 100%; -} -section.cover .cover-main { - flex: 1; - margin: 0 16px; - text-align: center; - position: relative; -} -section.cover a { - color: inherit; - text-decoration: none; -} -section.cover a:hover { - text-decoration: none; -} -section.cover p { - line-height: 1.5rem; - margin: 1em 0; -} -section.cover h1 { - color: inherit; - font-size: 2.5rem; - font-weight: 300; - margin: 0.625rem 0 2.5rem; - position: relative; - text-align: center; -} -section.cover h1 a { - display: block; -} -section.cover h1 small { - bottom: -0.4375rem; - font-size: 1rem; - position: absolute; -} -section.cover blockquote { - font-size: 1.5rem; - text-align: center; -} -section.cover ul { - line-height: 1.8; - list-style-type: none; - margin: 1em auto; - max-width: 500px; - padding: 0; -} -section.cover .cover-main > p:last-child a { - border-color: #ea6f5a; - border-color: var(--theme-color, #ea6f5a); - border-radius: 2rem; - border-style: solid; - border-width: 1px; - box-sizing: border-box; - color: #ea6f5a; - color: var(--theme-color, #ea6f5a); - display: inline-block; - font-size: 1.05rem; - letter-spacing: 0.1rem; - margin: 0.5rem 1rem; - padding: 0.75em 2rem; - text-decoration: none; - transition: all 0.15s ease; -} -section.cover .cover-main > p:last-child a:last-child { - background-color: #ea6f5a; - background-color: var(--theme-color, #ea6f5a); - color: #fff; -} -section.cover .cover-main > p:last-child a:last-child:hover { - color: inherit; - opacity: 0.8; -} -section.cover .cover-main > p:last-child a:hover { - color: inherit; -} -section.cover blockquote > p > a { - border-bottom: 2px solid #ea6f5a; - border-bottom: 2px solid var(--theme-color, #ea6f5a); - transition: color 0.3s; -} -section.cover blockquote > p > a:hover { - color: #ea6f5a; - color: var(--theme-color, #ea6f5a); -} -body { - background-color: #3f3f3f; -} -/* sidebar */ -.sidebar { - background-color: #3f3f3f; - color: #c8c8c8; -} -.sidebar li { - margin: 6px 15px 6px 0; -} -.sidebar ul li a { - color: #c8c8c8; - font-size: 14px; - overflow: hidden; - text-decoration: none; - text-overflow: ellipsis; - white-space: nowrap; -} -.sidebar ul li a:hover { - text-decoration: underline; -} -.sidebar ul li ul { - padding: 0; -} -.sidebar ul li.active > a { - color: #ea6f5a; - color: var(--theme-color, #ea6f5a); - font-weight: 600; -} -/* markdown content found on pages */ -.markdown-section h1, -.markdown-section h2, -.markdown-section h3, -.markdown-section h4, -.markdown-section strong { - font-weight: 1000; -} -.markdown-section a { - color: #ea6f5a; - color: var(--theme-color, #ea6f5a); - font-weight: 600; -} -.markdown-section h1 { - font-size: 2rem; - margin: 0 0 1rem; -} -.markdown-section h2 { - font-size: 1.75rem; - margin: 45px 0 0.8rem; -} -.markdown-section h3 { - font-size: 1.5rem; - margin: 40px 0 0.6rem; -} -.markdown-section h4 { - font-size: 1.25rem; -} -.markdown-section h5 { - font-size: 1rem; -} -.markdown-section h6 { - color: #777; - font-size: 1rem; -} -.markdown-section figure, -.markdown-section p, -.markdown-section ul, -.markdown-section ol { - margin: 1.2em 0; -} -.markdown-section p, -.markdown-section ul, -.markdown-section ol { - line-height: 1.6rem; - word-spacing: 0.05rem; -} -.markdown-section ul, -.markdown-section ol { - padding-left: 1.5rem; -} -.markdown-section blockquote { - border-left: 4px solid #ea6f5a; - border-left: 4px solid var(--theme-color, #ea6f5a); - color: #858585; - margin: 2em 0; - padding-left: 20px; -} -.markdown-section blockquote p { - font-weight: 600; - margin-left: 0; -} -.markdown-section iframe { - margin: 1em 0; -} -.markdown-section em { - color: #7f8c8d; -} -.markdown-section code { - background-color: #282828; - border-radius: 2px; - color: #657b83; - font-family: 'Roboto Mono', Monaco, courier, monospace; - margin: 0 2px; - padding: 3px 5px; - white-space: pre-wrap; -} -.markdown-section > :not(h1):not(h2):not(h3):not(h4):not(h5):not(h6) code { - font-size: 0.8rem; -} -.markdown-section pre { - -moz-osx-font-smoothing: initial; - -webkit-font-smoothing: initial; - background-color: #282828; - font-family: 'Roboto Mono', Monaco, courier, monospace; - line-height: 1.5rem; - margin: 1.2em 0; - overflow: auto; - padding: 0 1.4rem; - position: relative; - word-wrap: normal; -} -/* code highlight */ -.token.comment, -.token.prolog, -.token.doctype, -.token.cdata { - color: #8e908c; -} -.token.namespace { - opacity: 0.7; -} -.token.boolean, -.token.number { - color: #c76b29; -} -.token.punctuation { - color: #525252; -} -.token.property { - color: #c08b30; -} -.token.tag { - color: #2973b7; -} -.token.string { - color: #ea6f5a; - color: var(--theme-color, #ea6f5a); -} -.token.selector { - color: #6679cc; -} -.token.attr-name { - color: #2973b7; -} -.token.entity, -.token.url, -.language-css .token.string, -.style .token.string { - color: #22a2c9; -} -.token.attr-value, -.token.control, -.token.directive, -.token.unit { - color: #ea6f5a; - color: var(--theme-color, #ea6f5a); -} -.token.keyword { - color: #e96900; -} -.token.statement, -.token.regex, -.token.atrule { - color: #22a2c9; -} -.token.placeholder, -.token.variable { - color: #3d8fd1; -} -.token.deleted { - text-decoration: line-through; -} -.token.inserted { - border-bottom: 1px dotted #202746; - text-decoration: none; -} -.token.italic { - font-style: italic; -} -.token.important, -.token.bold { - font-weight: bold; -} -.token.important { - color: #c94922; -} -.token.entity { - cursor: help; -} -.markdown-section pre > code { - -moz-osx-font-smoothing: initial; - -webkit-font-smoothing: initial; - background-color: #282828; - border-radius: 2px; - color: #657b83; - display: block; - font-family: 'Roboto Mono', Monaco, courier, monospace; - font-size: 0.8rem; - line-height: inherit; - margin: 0 2px; - max-width: inherit; - overflow: inherit; - padding: 2.2em 5px; - white-space: inherit; -} -.markdown-section code::after, -.markdown-section code::before { - letter-spacing: 0.05rem; -} -code .token { - -moz-osx-font-smoothing: initial; - -webkit-font-smoothing: initial; - min-height: 1.5rem; - position: relative; - left: auto; -} -pre::after { - color: #ccc; - content: attr(data-lang); - font-size: 0.6rem; - font-weight: 600; - height: 15px; - line-height: 15px; - padding: 5px 10px 0; - position: absolute; - right: 0; - text-align: right; - top: 0; -} -.markdown-section p.tip { - background-color: #282828; - color: #657b83; -} -input[type='search'] { - background: #4f4f4f; - border-color: #4f4f4f; - color: #c8c8c8; -} diff --git a/index.html b/index.html index 3d2debd..67a77e8 100644 --- a/index.html +++ b/index.html @@ -5,8 +5,7 @@ - - +
From e1dfe45aff4a9fbeb6fd1811bda589599a3a1e8b Mon Sep 17 00:00:00 2001 From: Noah Emke Date: Thu, 30 Nov 2023 14:21:44 -0500 Subject: [PATCH 08/40] Added editing instructions to readme --- README.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index d65d2bb..5fc580f 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,19 @@ # Devcade Documentation -This repo contains or links to all relevant documentation for the Devcade project using docsify. +This repo contains or links to all relevant documentation for the Devcade project using docsify. Hosted at: https://devcade.csh.rit.edu/docs#/ All documetation should live in the repo it applies to. If some documetation doesn't fit in any of the projects other repos, it may live here. +# Editing the docs + +If something doesn't look right, you can edit any of the docs by going to the hosted site, finding the article that needs editing, and using the "Edit on github" button in the top right corner. Alternatively, you can go to the repo directly and find the relevant doc file. Once there, please make the appropriate edits and open a PR with your changes. + +If a new page needs to be added to the sidebar, you should add it to the _sidebar file located at docs/_sidebar.md + +If a new repo needs to be linked in, add an alias to the alias section of the index.html file. + +For further changes to the docsify site overall, refer to the [docsify documentation](https://docsify.js.org/#/?id=docsify). + # Running locally Install docsify-cli From 13f0529a9b263519a5522b817cf2072f89e89793 Mon Sep 17 00:00:00 2001 From: Noah Emke Date: Thu, 30 Nov 2023 14:40:57 -0500 Subject: [PATCH 09/40] Swap logo Thinner one with text I think looks better --- docs/_media/DevcadeLogoThin.png | Bin 0 -> 121002 bytes index.html | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 docs/_media/DevcadeLogoThin.png diff --git a/docs/_media/DevcadeLogoThin.png b/docs/_media/DevcadeLogoThin.png new file mode 100644 index 0000000000000000000000000000000000000000..28a453d2b9792c041b13929aa7564f2ea00b5ff7 GIT binary patch literal 121002 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

NcQRv!Z-_GrzwAd)0PVO5`QI( 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 literal 0 HcmV?d00001 diff --git a/index.html b/index.html index 67a77e8..08747b1 100644 --- a/index.html +++ b/index.html @@ -12,7 +12,7 @@ @@ -67,4 +74,5 @@ - + + \ No newline at end of file From 67a1cdfe39e51e5e24cd058dcc2a94e8658348f1 Mon Sep 17 00:00:00 2001 From: Ella Soccoli Date: Sat, 4 May 2024 13:26:22 -0400 Subject: [PATCH 21/40] Updated the using the game template page, and a couple very small misc changes --- docs/Getting-started/README.md | 12 ++++++------ docs/Getting-started/using-template.md | 14 ++++++++++++++ docs/README.md | 2 +- index.html | 4 ++-- 4 files changed, 23 insertions(+), 9 deletions(-) diff --git a/docs/Getting-started/README.md b/docs/Getting-started/README.md index ad1107f..cba1a07 100644 --- a/docs/Getting-started/README.md +++ b/docs/Getting-started/README.md @@ -1,14 +1,14 @@ ### Making a Game -If you want to make a game for a devcade system, there are a couple of considerations. +If you want to make a game for a Devcade system, there are a couple of considerations. -First is what language you want to make the game in. The devcade project currently supports C# using monogame and Rust using Bevy. These are supported due to the templates and libraries made to help you properly use the devcade systems. Theoretically you can make a game in anything and as long as it is packaged properly it *can* run on devcade but you would have to manually handle all of the things that the library of a supported framework would give you such as interpreting inputs as devcade controls, reading and writing to pipes for save data, aspect ratio, and more. +First is what language you want to make the game in. The Devcade project currently supports C# using MonoGame and Rust using Bevy. These are supported due to the templates and libraries made to help you properly use the Devcade systems. Theoretically you can make a game in anything and as long as it is packaged properly it *can* run on Devcade but you would have to manually handle all of the things that the library of a supported framework would give you, such as interpreting inputs as devcade controls, reading and writing to pipes for save data, aspect ratio, and more. -If using monogame, you will probably want to use [this template](https://github.com/ComputerScienceHouse/Devcade-game-template) and check out [this docs page](../Library/) for some more info on using the library. It should be included in the template, but if not using it, the library can be installed from nuget. +If using MonoGame, you will probably want to use [this template](https://github.com/ComputerScienceHouse/devcade-game-template) and check out [this docs page](../Library/) for some more info on using the library. It should be included in the template, but if not using it, the library can be installed from NuGet. If using Rust, check out [cargo-devcade](https://github.com/mstrodl/cargo-devcade#readme) for more info and guides. -As you get started you will want to keep in mind the details of the devcade system you are designing for. For the CSH devcade cabinet you will want to note that the display is a 9:21 ultrawide turned vertical measuring 1080x2560, the cabinet itself does not have a GPU and is running an 8th gen intel processor with integrated graphics, and the controls are laid out as follows: +As you get started you will want to keep in mind the details of the Devcade system you are designing for. For the CSH Devcade cabinet you will want to note that the display is a 9:21 ultrawide monitor turned vertical, measuring 1080x2560. The cabinet itself does not have a graphics card and is running an 8th gen Intel processor with integrated graphics. The controls are laid out as follows: ``` Player 1 Player 2 @@ -18,13 +18,13 @@ As you get started you will want to keep in mind the details of the devcade syst v B1 B2 B3 B4 v B1 B2 B3 B4 ``` -If you would like a more in depth guide through a monogame example, check out the [First Devcade Game](Getting-started/first-game) page. This will help you make your first game for Devcade, including getting you familiar with some [Monogame](https://www.monogame.net/) basics. +If you would like a more in depth guide through a MonoGame example, check out the [First Devcade Game](Getting-started/first-game) page. This will help you make your first game for Devcade, including getting you familiar with some [Monogame](https://www.monogame.net/) basics. Once youve got something playable you want to put on the cabinet, you should build and zip your game in a manner such that it is self contained and should require no runtimes or other resources. Then head over to the website, log in, and go to the upload page. There should also be instructions on that page for packaging your game. Upload the zip, banner image, and icon image and give it a name and description. If all is good you should be able to hit upload and it should work. Pressing both menu buttons will refresh the games list on the cabinet and hopefully you will see you game! ### Using the API -If you want to work with the Devcade API, check out the [API](Internals/API/) page. This will give you all the information you need to make requests to the API, and which end points to use. +If you want to work with the Devcade API, check out the [API](Internals/API/) page. This will give you all the information you need to make requests to the API, and which endpoints to use. ### Building a Devcade Cabinet diff --git a/docs/Getting-started/using-template.md b/docs/Getting-started/using-template.md index e69de29..3174aa3 100644 --- a/docs/Getting-started/using-template.md +++ b/docs/Getting-started/using-template.md @@ -0,0 +1,14 @@ +# Using the Devcade Game Template + +If you decide that you want to make a Devcade game in C# and MonoGame, then you can consider using our game template as a starting point. This template provides you with a mostly empty MonoGame project, but it has some useful libraries imported and some of the setup code is provided for you. + +## What the Template Provides + +- The C# library for Devcade is pre-installed from NuGet +- Easily modifiable code to set the game's aspect ratio and resolution +- Method call to detect user input every frame so that the program properly keeps track of what inputs are being provided +- Build scripts to easily publish the game to the format that the system expects + +## Additional Info + +For more information about the MonoGame game template, how it works, and what it provides, check [this repo](/template-repo) \ No newline at end of file diff --git a/docs/README.md b/docs/README.md index 5a6e1e6..cfd03cc 100644 --- a/docs/README.md +++ b/docs/README.md @@ -21,7 +21,7 @@ We officially support and have resources for Monogame games written in C# and ha - [Monogame Library](/library-repo) - [Flatpackify](/flatpackify-repo) -- [Rust Library](https://docs.rs/devcaders/latest/devcaders/)(Community supported) +- [Rust Library](https://docs.rs/devcaders/latest/devcaders/) (Community supported) ?> Devcade can theoretically run any executable as long as the game is formatted properly, runs on linux, and works with a few other restrictions but you will have to figure some stuff out yourself that would be done for you in one of our libraries and we make no guarantees on getting it to work. diff --git a/index.html b/index.html index 2170374..6a3507c 100644 --- a/index.html +++ b/index.html @@ -17,10 +17,10 @@ logo: '/_media/DevcadeLogoThin.png', alias: { '/website-repo': 'https://raw.githubusercontent.com/ComputerScienceHouse/devcade-website/main/', - '/library-repo': 'https://raw.githubusercontent.com/ComputerScienceHouse/Devcade-library/main/', + '/library-repo': 'https://raw.githubusercontent.com/ComputerScienceHouse/devcade-library/main/', '/onboard-repo': 'https://raw.githubusercontent.com/ComputerScienceHouse/devcade-onboard/main/', '/api-repo': 'https://raw.githubusercontent.com/ComputerScienceHouse/devcade-api/master/', - '/template-repo': 'https://raw.githubusercontent.com/ComputerScienceHouse/Devcade-game-template/main/', + '/template-repo': 'https://raw.githubusercontent.com/ComputerScienceHouse/devcade-game-template/main/', '/flatpakify-repo': 'https://raw.githubusercontent.com/ComputerScienceHouse/devcade-flatpakify/master/' }, relativePath: true, From d4aa4057363aa48843e6239c68829bbf1f71189c Mon Sep 17 00:00:00 2001 From: Noah Emke Date: Sun, 5 May 2024 07:01:38 -0400 Subject: [PATCH 22/40] Add heading, summary, and hardware back to install guide --- docs/Hardware/installing-dcu.md | 35 ++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/docs/Hardware/installing-dcu.md b/docs/Hardware/installing-dcu.md index 234c31e..fcfc14c 100644 --- a/docs/Hardware/installing-dcu.md +++ b/docs/Hardware/installing-dcu.md @@ -1,3 +1,36 @@ +# Setting Up a New Cabinet + +## Table of Contents +- [Summary](#summary) +- [Hardware](#hardware) +- TODO: Add more headings to TOC + +## Summary + +The Devcade project should theoretically run on just about any linux distro if set up properly. Our distro of choice has been the latest Debian. + +In the past, we have taken advantage of Debian's preseed functionality to install the OS, and set up our launcher, [devcade-onboard](https://github.com/computersciencehouse/devcade-onboard). This (now outdated) preseed file is located in the devcade-onboard git repo and also hosted at https://devcade.csh.rit.edu/preseed and is based off of the file given as an example in the [Debian Wiki](https://wiki.debian.org/DebianInstaller/Preseed). While it is outdated now, it may be used again in the future to partially or completely automate these steps. + +The setup is reletively simple to perform manually as well. It mostly consists of the following: +- Install an OS +- Install necessary packages and runtimes +- Cloning some Git repos +- And doing a bit of configuration + +## Hardware + +Devcade and it's games ought to run on nearly any x86 hardware released in the last 10 years, but we recommend the following as a starting point: + +**CPU:** Intel Core i5 (5th gen or better) + +**RAM:** 8GB + +**GPU:** N/A + +This should act as a modest starting point and depending on the games you run on your cabinet or those that users are making for your cabinet, you can always upgrade these later as needed. + +--- + Install Debian 12 (Bookworm) - Set the hostname to `dcu.csh.rit.edu` - Set the password for the `root` user @@ -101,4 +134,4 @@ Once in that directory, add the following code to `rc.xml`: ``` This should be added somewhere inside the ` ... ` element. There should be other keybinds so just put it right after one if you don't know exactly where to put it. -Once that is done, you should have a fully set up system! \ No newline at end of file +Once that is done, you should have a fully set up system! From 11a226743205d22199ac7d9a7cbea9dc21df34fa Mon Sep 17 00:00:00 2001 From: Noah Emke Date: Sun, 5 May 2024 07:31:43 -0400 Subject: [PATCH 23/40] Re-add contributing guide to sidebar --- docs/_sidebar.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/_sidebar.md b/docs/_sidebar.md index d04bb8c..d6ff7e4 100644 --- a/docs/_sidebar.md +++ b/docs/_sidebar.md @@ -16,3 +16,4 @@ * [API](/api-repo) * [Monogame Game Template](/template-repo) * [Flatpakify](/flatpakify-repo) +* [Contributing Guide](/contributing) From 31ee800089124b84f766336491066336d39d72d0 Mon Sep 17 00:00:00 2001 From: Noah Emke Date: Mon, 6 May 2024 02:47:19 -0400 Subject: [PATCH 24/40] Change up home page Now more of a 'heres where to start' instead of just a list of some of whats already on the sidebar --- docs/README.md | 15 ++++++++++++--- docs/_sidebar.md | 1 + 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/docs/README.md b/docs/README.md index cfd03cc..6ae7d72 100644 --- a/docs/README.md +++ b/docs/README.md @@ -12,9 +12,14 @@ The arcade cabinet was first shown off at the 2022 Rochester Makerfaire and many Learn more about Devcade at the [main website](https://devcade.csh.rit.edu). ## Quick start +New to the project and not sure where to start? Depending on what you want to do, heres a couple of jumping off points to get you started. If you know what you're looking for or just want to explore, feel free to take a look at the sidebar and jump around. ### Making a game -We officially support and have resources for Monogame games written in C# and have community support for Bevy games written in Rust. Some other engines and frameworks have been explored but don't yet have full support. +If you're thinking about making a game for Devcade, or adapting a game you are already working on, you should take a look at the TODO [Making Games]() section. From there you'll find an overview of the process for making a game for Devcade and getting it on the cabinet, as well as information thats relevant no matter what game you're making. From there you can also explore the language specific templates and libraries. + +TODO: move the rest of this on making a game to the making games or language specific pages + +We officially support and have resources for Monogame games written in C# and have community support for Bevy games written in Rust. Many other engines and frameworks have been explored and proven to work, but don't yet have full support. - [Getting Started](/Getting-started/) - [Monogame Template](/template-repo) @@ -26,11 +31,15 @@ We officially support and have resources for Monogame games written in C# and ha ?> Devcade can theoretically run any executable as long as the game is formatted properly, runs on linux, and works with a few other restrictions but you will have to figure some stuff out yourself that would be done for you in one of our libraries and we make no guarantees on getting it to work. ### Working on the project -For information on how the project works and implementation details, check out the sections on each part of the project: +For information on how the whole project works and implementation details, check out the TODO [How it Works]() section for an overview of how it operates. Additionally, each part of the project has a page under this section with more details even if it is also mentioned elsewhere. You can also jump to them all from right here: - [Onboard Software](/onboard-repo) - [Website](/website-repo) +- [Monogame Library](/library-repo) - [API](/api-repo) +- [Monogame Game Template](/template-repo) +- [Flatpakify](/flatpakify-repo) +- [Documentation](/../) ### Building your own -Ideally, anyone should be able to take this information and set up their own Devcade! Unfortunately, thats not a quick and easy process yet but keep an eye out, we're working on it! \ No newline at end of file +Ideally, anyone should be able to take the information in this site and set up their own Devcade! While thats not a quick and easy process quite yet without the infrastructure we have already set up, we do have some guides and instructions set up. Check out the TODO [Building a Devcade]() section for an overview there and more details in the guides underneath that section. diff --git a/docs/_sidebar.md b/docs/_sidebar.md index d6ff7e4..b6144e7 100644 --- a/docs/_sidebar.md +++ b/docs/_sidebar.md @@ -16,4 +16,5 @@ * [API](/api-repo) * [Monogame Game Template](/template-repo) * [Flatpakify](/flatpakify-repo) +* [Documentation](/../) * [Contributing Guide](/contributing) From bfcb691dcfb14a62c4fcdcee1ecfdda793b763fc Mon Sep 17 00:00:00 2001 From: Noah Emke Date: Mon, 6 May 2024 04:04:25 -0400 Subject: [PATCH 25/40] Move repo readmes under new how it works --- docs/_sidebar.md | 19 ++++++++----------- docs/how-it-works.md | 3 +++ 2 files changed, 11 insertions(+), 11 deletions(-) create mode 100644 docs/how-it-works.md diff --git a/docs/_sidebar.md b/docs/_sidebar.md index b6144e7..fbfec6a 100644 --- a/docs/_sidebar.md +++ b/docs/_sidebar.md @@ -6,15 +6,12 @@ * [Cabinet](/Hardware/cabinet) * [Gamepad](/Hardware/gamepad) * [Installing DCU](/Hardware/installing-dcu) -* [Internals](/Internals/) - * [API](/Internals/API/) - * [Onboard](/Internals/Onboard/) - * [Website](/Internals/Website/) -* [Onboard Software](/onboard-repo) -* [Website](/website-repo) -* [Monogame Library](/library-repo) -* [API](/api-repo) -* [Monogame Game Template](/template-repo) -* [Flatpakify](/flatpakify-repo) -* [Documentation](/../) +* [How it Works](/how-it-works.md) + * [Onboard Software](/onboard-repo) + * [Website](/website-repo) + * [Monogame Library](/library-repo) + * [API](/api-repo) + * [Monogame Game Template](/template-repo) + * [Flatpakify](/flatpakify-repo) + * [Documentation](/../) * [Contributing Guide](/contributing) diff --git a/docs/how-it-works.md b/docs/how-it-works.md new file mode 100644 index 0000000..04766e4 --- /dev/null +++ b/docs/how-it-works.md @@ -0,0 +1,3 @@ +# How Devcade Works + +TODO This will be an overview of the inner workings of the project. How it all fits together, an overview of all the parts and repos. Maybe how all the infrastructure works together, maybe thats better in building a devcade. From 9786ffed0840decad550e67ea0c7c8223bc1bbca Mon Sep 17 00:00:00 2001 From: Noah Emke Date: Mon, 6 May 2024 04:19:42 -0400 Subject: [PATCH 26/40] Fix link to new How it works --- docs/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/README.md b/docs/README.md index 6ae7d72..b51ebe1 100644 --- a/docs/README.md +++ b/docs/README.md @@ -31,7 +31,7 @@ We officially support and have resources for Monogame games written in C# and ha ?> Devcade can theoretically run any executable as long as the game is formatted properly, runs on linux, and works with a few other restrictions but you will have to figure some stuff out yourself that would be done for you in one of our libraries and we make no guarantees on getting it to work. ### Working on the project -For information on how the whole project works and implementation details, check out the TODO [How it Works]() section for an overview of how it operates. Additionally, each part of the project has a page under this section with more details even if it is also mentioned elsewhere. You can also jump to them all from right here: +For information on how the whole project works and implementation details, check out the TODO [How it Works](/how-it-works.md) section for an overview of how it operates. Additionally, each part of the project has a page under this section with more details even if it is also mentioned elsewhere. You can also jump to them all from right here: - [Onboard Software](/onboard-repo) - [Website](/website-repo) From e41fbed5bf9e9a30581c1731c41b2c0867aa7cd0 Mon Sep 17 00:00:00 2001 From: Noah Emke Date: Mon, 6 May 2024 14:11:41 -0400 Subject: [PATCH 27/40] Filled out the How it Works section --- docs/how-it-works.md | 40 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/docs/how-it-works.md b/docs/how-it-works.md index 04766e4..367d9d3 100644 --- a/docs/how-it-works.md +++ b/docs/how-it-works.md @@ -1,3 +1,41 @@ # How Devcade Works -TODO This will be an overview of the inner workings of the project. How it all fits together, an overview of all the parts and repos. Maybe how all the infrastructure works together, maybe thats better in building a devcade. +Devcade is a project with many moving parts and a couple of ways that data moves around. In this section I will attempt to explain and overview how it all fits together and works at a high level. For more details on the workings or usage on any individual part, check out its detdicated page. + +## All the parts +### Onboard +The software running on the Devcade cabinet itself is known as the [onboard](/onboard-repo) and is further broken into two parts. First is the frontend, which primarily acts as the interface to the user and is reletively simple. It displays the list of games, plays animations, allows the user to scroll and select games or filters, etc. What it doesn't do however, is the rest of the actions needed to make anything more than visuals happen. That is handled by the backend. +The backend is a seperate program within the same repository that runs in the background of the Devcade cabinet handling all of the dirty work. It talks to the frontend and any running game through a couple of sockets so that the parts that take user input can tell the backend what actually importaint actions to take. It performs all the actions like downloading data such as games and metadata from the API, launching games, and uploading data. Details of these actions, interactions, and interfaces should be found in its dedicated page. + +### Website +The [Devcade website](/website-repo) is, as you might expect, the [main public website](https://devcade.csh.rit.edu) for the project. It serves a couple of purposes, to act as a public landing page with basic information on what the project is and why its cool, and to be the direct interface for users looking through all the games or uploading new games. The former is a simple goal performed with mostly static sections of the site but the latter is lots of back and forth with the API. +The website also handles accounts in a couple of forms to restrict some games from view, and to keep track of who uploaded a game. The way we have it set up at the moment it integrates with our organizations existing SSO auth as well as offering an option to log in with google. + +### Game Libraries +Games running on Devcade sometimes need to interact with the cabinet or other infrastructure while running. This might include simply mapping controls in a more convinient manner, saving or loading data from our servers, or in some cases, other cabinet specific actions such as reading ID cards from an NFC reader or other future actions. Currently we only have an official [library for MonoGame](/library-repo) in C# but there are some other community supported ones and you also don't necesarily need to use one to get your game working on Devcade. + +### API +The [API](/api-repo) is the inbetween point between the infrastructure running in the background and the website, onboard, and anything else that wants to interact with the data we store. We have it set up at the ['api/'](https://devcade.csh.rit.edu/api/) route within the main websites domain and in addition to its repository readme, it also hosts [swagger docs](https://devcade.csh.rit.edu/api/docs/) for all of the routs it provides. + +The sources of data that this API talks to and provides an interface for are a database and S3. The postgresql database stores metadata about games, tags, and users while the S3 buckets store games themselfs, game images and banners, as well as any save data from gaems utilizing that feature. + +### Game Templates +While not nessecarily part of the vital operation of Devcade, we do provide templates for people to use when making games for the project. At the moment we just have one for [MonoGame](/template-repo). They set up some things for the user such as the library and aspect ratio. + +### Flatpakify +[Flatpakify](/flatpakify-repo) is a tool developed to help users package their games into flatpaks. This is required in order for games to be uploaded and run on Devcade but can be an unfamiliar process to many. This tool helps to simplify that process by doing most of it for you, given the right input. + +### Documentation +Thats what you are reading here. You probably know why its here, but in addition to providing useful information that doesn't otherwise have a home, it also brings the READMEs of all of the other repos together into one convinient spot for viewing, [including its own](/../). + +## The standard flow of operation + +In the normal course of operation of a functioning setup, just about everything is initiated by the Devcade cabinet itself. The software running on the cabinet, known as the [onboard](/onboard-repo), starts up as the computer turns on and the frontend immediately asks the backend to reach out to the [API](/api-repo) for all of the data needed to show a user all of the games available. The API grabs the data needed from the database and S3 and sends it back. The backend then recieves it, caches some of it that wasnt already, and passes it to the frontend. + +The user may then select a game and play it from the now populated frontend. The frontend tells the backend to launch this game and if it is already downloaded it will get the hash of the game from the API and check if the downloaded version is current. If not, or if it was never downloaded in the first place, it downloads the game from the API. At this point the backend runs the game. From here the game might ask the backend for some actions through the games library such as sving data. The backend would once again, make the API requests and pass them around. Once the game closes, we return to the base state of the frontend displaying the games and waiting for input. + +## The game makers flow + +For a developer looking to make a game, the rest of the project comes into play. They might start with the [template](/template-repo) which gets them started for working with Devcade and includes the [library](/library-repo). With this they build out their game, maybe using some library functions along the way. Once they are ready to put the game on Devcade, they head to the [website](/website-repo), log in, and create a new game. Following the instructions, they compile their game and follow [Flatpakify](/flatpakify-repo)s instructions to package it togother. This gets uploaded to the website and further through the API to find its spot on the servers. + +Once that new game has been uploaded, the next time someone refreshes the onboard and it gets a fresh list of games, it will be displayed and playable! From 2085ba259be16f5dcdb4b70ba531b6fc1ab789bd Mon Sep 17 00:00:00 2001 From: Ella Soccoli Date: Mon, 6 May 2024 15:30:02 -0400 Subject: [PATCH 28/40] Misc spelling and grammar fixes, also rewrote a paragraph on one of the pages to make it more readable --- docs/Getting-started/README.md | 12 +++++++----- docs/Getting-started/first-game.md | 2 +- docs/Hardware/README.md | 2 +- docs/Hardware/Troubleshooting.md | 2 +- docs/Hardware/installing-dcu.md | 3 ++- docs/Library/Using Godot/README.md | 6 +++--- docs/README.md | 2 +- docs/contributing.md | 12 ++++++------ 8 files changed, 22 insertions(+), 19 deletions(-) diff --git a/docs/Getting-started/README.md b/docs/Getting-started/README.md index cba1a07..99a3377 100644 --- a/docs/Getting-started/README.md +++ b/docs/Getting-started/README.md @@ -1,14 +1,16 @@ ### Making a Game -If you want to make a game for a Devcade system, there are a couple of considerations. +If you are looking to make a Devcade game, there are a couple considerations to keep in mind. -First is what language you want to make the game in. The Devcade project currently supports C# using MonoGame and Rust using Bevy. These are supported due to the templates and libraries made to help you properly use the Devcade systems. Theoretically you can make a game in anything and as long as it is packaged properly it *can* run on Devcade but you would have to manually handle all of the things that the library of a supported framework would give you, such as interpreting inputs as devcade controls, reading and writing to pipes for save data, aspect ratio, and more. +#### Choosing a Language +Firstly, you should think about what language you want to develop the game in. The Devcade project currently supports C# using MonoGame, as well as Rust using Bevy. We provide libraries for these languages to help make parts of the development process easier. These libraries assist with things such as interpreting Devcade inputs, reading and writing to pipes for save data, setting the proper aspect ratio, and more. -If using MonoGame, you will probably want to use [this template](https://github.com/ComputerScienceHouse/devcade-game-template) and check out [this docs page](../Library/) for some more info on using the library. It should be included in the template, but if not using it, the library can be installed from NuGet. +Although these are the only two languages that we "officially" support, you are not limited to only those two languages. You could theoretically make a Devcade game in whatever language you want, and it will run on Devcade as long as you build it for the appropriate system specifications. However, something to keep in mind is that since we do not have a library for other languages, you would have to figure out how to handle the things our libraries handle yourself. -If using Rust, check out [cargo-devcade](https://github.com/mstrodl/cargo-devcade#readme) for more info and guides. +If you do make a game using something other than MonoGame or Bevy, we encourage you to write up some instructions on how to do the things that a library might provide for you, and open a pull request to the docs site to add your documentation. We would be happy to review it, and we would love to help you get it merged. -As you get started you will want to keep in mind the details of the Devcade system you are designing for. For the CSH Devcade cabinet you will want to note that the display is a 9:21 ultrawide monitor turned vertical, measuring 1080x2560. The cabinet itself does not have a graphics card and is running an 8th gen Intel processor with integrated graphics. The controls are laid out as follows: +#### Devcade Controls +As you get started, you will want to keep in mind the details of the Devcade system you are designing for. For the CSH Devcade cabinet, you will want to note that the display is a 9:21 ultrawide monitor turned vertical (measuring 1080x2560). The computer that the CSH Devcade cabinet is running on has an 8th gen Intel processor and integrated graphics. The controls are laid out as follows: ``` Player 1 Player 2 diff --git a/docs/Getting-started/first-game.md b/docs/Getting-started/first-game.md index 930a589..f35f892 100644 --- a/docs/Getting-started/first-game.md +++ b/docs/Getting-started/first-game.md @@ -4,5 +4,5 @@ So, you want to make a Devcade game? Well you chose the right place. ### What makes a Devcade game? -Most Devcade games are made with the Monogame framework. +Most Devcade games are developed in C# using the MonoGame framework. If you'd prefer to write your game in Rust, check [the guide on `cargo-devcade`](https://github.com/mstrodl/cargo-devcade#readme)! diff --git a/docs/Hardware/README.md b/docs/Hardware/README.md index a60b865..99874bb 100644 --- a/docs/Hardware/README.md +++ b/docs/Hardware/README.md @@ -1,6 +1,6 @@ # Hardware -There are a few main components to the Hardware involved for running Devcade: +There are a few main components to the hardware involved for running Devcade: * The [DCU, or Devcade Compute Unit](Hardware/installing-dcu) * The [Arcade Cabinet](Hardware/cabinet) * The [Gamepad](Hardware/gamepad) \ No newline at end of file diff --git a/docs/Hardware/Troubleshooting.md b/docs/Hardware/Troubleshooting.md index fdb082b..62b0927 100644 --- a/docs/Hardware/Troubleshooting.md +++ b/docs/Hardware/Troubleshooting.md @@ -12,7 +12,7 @@ Buttons will swap places on reboot. In the case we have observed the following b ### Causes: -The cause for this issue is currently presumed to be that the control boards were somehow at some point set to nintendo switch mode which switches the "x" and "y" buttons as well as the "triggers". When this is interpreted by the system this results in the wrong buttons being assigned to the devcade buttons. +The cause for this issue is currently presumed to be that the control boards were somehow at some point set to nintendo switch mode which switches the "x" and "y" buttons as well as the "triggers". When this is interpreted by the system this results in the wrong buttons being assigned to the Devcade buttons. ### Fixes: diff --git a/docs/Hardware/installing-dcu.md b/docs/Hardware/installing-dcu.md index fcfc14c..d111f52 100644 --- a/docs/Hardware/installing-dcu.md +++ b/docs/Hardware/installing-dcu.md @@ -32,7 +32,8 @@ This should act as a modest starting point and depending on the games you run on --- Install Debian 12 (Bookworm) -- Set the hostname to `dcu.csh.rit.edu` +- Set the hostname + - The CSH Devcade cabinet has the hostname `dcu.csh.rit.edu` - Set the password for the `root` user - Create a user named `devcade` and set a password - When you get to disk configutation, select the option to use the entire disk, and put everythin in one partition diff --git a/docs/Library/Using Godot/README.md b/docs/Library/Using Godot/README.md index 755ba65..ab603c8 100644 --- a/docs/Library/Using Godot/README.md +++ b/docs/Library/Using Godot/README.md @@ -36,13 +36,13 @@ JOY_AXIS_TRIGGER_RIGHT = 5 # Bottom Right Second Most Blue Button Some general advice to follow when developing and uploading a game to Devcade. -- **Insure that there is a way to exit you game!** ssh-ing in to close a game is not fun. +- **Ensure that there is a way to exit you game!** ssh-ing in to close a game is not fun. - The convention is to close your game after both center buttons are pressed. - Keep in mind that Devcade has a 1080x2560px (9x21 ratio) display and a refresh rate of 75 Hz - Export you game for Linux x86_64 and remove the file extension such that it looks like this: `[your game's name]`. - With Godot, consider packing the [.pck](https://docs.godotengine.org/en/stable/tutorials/export/exporting_pcks.html) file into the executable. - - its currently unknown if not packing the .pck file has any effect so if you don't pack the file proceed at your own risk. -- Insure that you game file is zipped with [7Zip](https://www.7-zip.org/) in a folder called `publish`. + - Its currently unknown whether not packing the .pck file has any effect, so if you don't pack the file proceed at your own risk. +- Ensure that you game file is zipped with [7Zip](https://www.7-zip.org/) in a folder called `publish`. - The title of your executable should be the **exact same** as the name you give your game when uploading. This is currently critical to the execution of your game. This page was last updated 10/2/2023 \ No newline at end of file diff --git a/docs/README.md b/docs/README.md index b51ebe1..3aee14e 100644 --- a/docs/README.md +++ b/docs/README.md @@ -2,7 +2,7 @@ On this website you can find any documentation you need for working with the Devcade project, whether you want to make a game, leverage the API, or build your own machine. -?> Note: If something doesn't look right, feel free to suggest an addition or change with the "Edit on github" button up in the corner. +?> Note: If something doesn't look right, feel free to suggest an addition or change with the "Edit on GitHub" button up in the corner. ## What is Devcade? Devcade is a fully custom arcade machine made by members at RIT's [Computer Science House](https://csh.rit.edu). Devcade is an arcade built for developers, by developers. The arcade cabinet, software, and games for Devcade were all built by CSHers starting from the 2022 Fall semester. diff --git a/docs/contributing.md b/docs/contributing.md index d90679d..0d50514 100644 --- a/docs/contributing.md +++ b/docs/contributing.md @@ -1,20 +1,20 @@ # Contributing to Devcade So, you'd like to contribute to Devcade? Thats great, we'd love the help! -This document should serve as a bit of a guide to help you get started with the project as a whole, as well as to the documentation site more specifically if thats what you're here for. Note that most of the things mentioned here are guidelines, they should be followed but not following them isn't going to end the world either. This project is split into a handful of parts and therefore a handful of separate repositories so, while this will give you an overview and a more general guide, you should refer to the documentation of each part for more specifics. For reference, each of the repos are linked below: +This document should serve as a bit of a guide to help you get started with the project as a whole, as well as to the documentation site more specifically if thats what you're here for. Note that most of the things mentioned here are guidelines. We strongly recommend that you follow them, but not following them isn't going to end the world either. This project is split into a handful of parts and therefore a handful of separate repositories, so while this will give you an overview and a more general guide, you should refer to the documentation of each part for more specifics. For reference, each of the repos are linked below: # Parts of the project - [Onboard](https://github.com/ComputerScienceHouse/devcade-onboard) - The launcher and menu for the arcade cabinet itself. - [Website](https://github.com/ComputerScienceHouse/devcade-website) - The homepage of the project and the place to upload and manage games. -- [Library](https://github.com/ComputerScienceHouse/Devcade-library) - The C# library for games to use in order to interact with the cabinet. +- [Library](https://github.com/ComputerScienceHouse/devcade-library) - The C# library for games to use in order to interact with the cabinet. - [API](https://github.com/ComputerScienceHouse/devcade-api) - The API the website and onboard use to interact with the database and games storage. -- [Template](https://github.com/ComputerScienceHouse/Devcade-game-template) - The Monogame template for a Devcade game. +- [Template](https://github.com/ComputerScienceHouse/devcade-game-template) - The MonoGame template for a Devcade game. - [Flatpakify](https://github.com/ComputerScienceHouse/devcade-flatpakify) - The helper tool to bundle games into flatpaks. - [Documentation](https://github.com/ComputerScienceHouse/devcade-docs) - The docs site to consolidate and host all relevant documentation. # Useful resources - If you aren't reading this from there already, you should check out our [documentation site](https://devcade.csh.rit.edu/docs#/). It's where we host all of the relevant documentation for each part of the project as well as any documentation or guides that don't fit in any single repository. -- If you've found a bug or just want to request a feature, please create an issue on github on the relevant repo. +- If you've found a bug or just want to request a feature, please create an issue on GitHub on the relevant repo. - We don't have many public avenues of communication yet but in the meantime if you have questions or want to reach out, feel free to email us at devcade@csh.rit.edu. # Testing @@ -60,10 +60,10 @@ Given that this project involves several languages across its repos, there are a Style and formatting standards for other languages have not been established yet or are not used in the project. If a language is used or introduced that does not have a style guide here, try to follow what exists already if applicable until a standard it settled on. # Code of conduct -Currently this project has no direct code of conduct but it should inherit a couple by default. As always be kind to others as a base line but as a project within the Computer Science House(CSH) organization, and by extension within the Rochester Institute of Technology(RIT), the following codes of conduct should be relevant to varying degrees: +Currently this project has no direct code of conduct but it should inherit a couple by default. As always be kind to others as a base line but as a project within the Computer Science House (CSH) organization, and by extension within the Rochester Institute of Technology (RIT), the following codes of conduct should be relevant to varying degrees: - [RIT Code of Ethical Conduct and Compliance](https://www.rit.edu/policies/c000) - [RIT Code of Conduct for Computer Use](https://www.rit.edu/policies/c082) - [CSH Code of Conduct](https://coc.csh.rit.edu/) # Where to ask for help -If you want to contribute or are otherwise interested but are stuck somewhere, your first place of inquiry should be in the comments of any relevant PR or issue on github. If this is not applicable or for another method of contact, reach out to devcade@csh.rit.edu. \ No newline at end of file +If you want to contribute or are otherwise interested but are stuck somewhere, your first place of inquiry should be in the comments of any relevant PR or issue on GitHub. If this is not applicable or for another method of contact, reach out to devcade@csh.rit.edu. \ No newline at end of file From 39b1f750d89c5abf7fbc6b506bef0331dae837d1 Mon Sep 17 00:00:00 2001 From: Ella Soccoli Date: Tue, 4 Feb 2025 15:39:24 -0500 Subject: [PATCH 29/40] Added docsify to the package.json, updated readme --- .gitignore | 3 +- README.md | 10 +- package-lock.json | 2446 +++++++++++++++++++++++++++++++++++++++++++++ package.json | 5 + 4 files changed, 2459 insertions(+), 5 deletions(-) create mode 100644 package-lock.json create mode 100644 package.json diff --git a/.gitignore b/.gitignore index fc1e5cf..f98d0f1 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,5 @@ envs.py .venv venv/ users.sqlite3 -launch.json \ No newline at end of file +launch.json +node_modules diff --git a/README.md b/README.md index 7a0939f..d840aca 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,8 @@ # Devcade Documentation -This repo contains or links to all relevant documentation for the Devcade project using docsify. Hosted at: https://devcade.csh.rit.edu/docs#/ +This repo contains or links to all relevant documentation for the Devcade project using docsify. + +The official site is hosted at https://devcade.csh.rit.edu/docs#/ All documentation should live in the repo it applies to. If some documentation doesn't fit in any of the projects other repos, it may live here. @@ -16,9 +18,9 @@ For further changes to the docsify site overall, refer to the [docsify documenta # Running locally -Install docsify-cli +Install dependencies ``` -npm i docsify-cli -g +npm i ``` And serve it, the site will then be available at `http://localhost:3000/docs/` @@ -28,4 +30,4 @@ docsify serve . --open # Deploying -Upon pushing to the docs branch, a webhook should take care of rebuilding the okd pod. \ No newline at end of file +Upon pushing to the docs branch, a webhook should take care of rebuilding the okd pod. diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..dcac23d --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2446 @@ +{ + "name": "devcade-docs", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "devDependencies": { + "docsify-cli": "^4.4.4" + } + }, + "node_modules/@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "defer-to-connect": "^1.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.1.0" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", + "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-align": "^3.0.0", + "camelcase": "^5.3.1", + "chalk": "^3.0.0", + "cli-boxes": "^2.2.0", + "string-width": "^4.1.0", + "term-size": "^2.1.0", + "type-fest": "^0.8.1", + "widest-line": "^3.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/boxen/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/boxen/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/boxen/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/boxen/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/boxen/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "dev": true, + "license": "MIT", + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-request/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cacheable-request/node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cli-boxes": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true, + "license": "MIT" + }, + "node_modules/configstore": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/connect-livereload": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/connect-livereload/-/connect-livereload-0.6.1.tgz", + "integrity": "sha512-3R0kMOdL7CjJpU66fzAkCe6HNtd3AavCS4m+uW4KtJjrdGPT0SQEZieAYd+cm+lJoBznNQ4lqipYWkhBMgk00g==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/cp-file": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cp-file/-/cp-file-7.0.0.tgz", + "integrity": "sha512-0Cbj7gyvFVApzpK/uhCtQ/9kE9UnYpxMzaq5nQQC/Dh4iaj5fxp7iEFIullrYwzj8nf0qnsI1Qsx34hAeAebvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "nested-error-stacks": "^2.0.0", + "p-event": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/docsify": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/docsify/-/docsify-4.13.1.tgz", + "integrity": "sha512-BsDypTBhw0mfslw9kZgAspCMZSM+sUIIDg5K/t1hNLkvbem9h64ZQc71e1IpY+iWsi/KdeqfazDfg52y2Lmm0A==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "marked": "^1.2.9", + "medium-zoom": "^1.0.6", + "opencollective-postinstall": "^2.0.2", + "prismjs": "^1.27.0", + "strip-indent": "^3.0.0", + "tinydate": "^1.3.0", + "tweezer.js": "^1.4.0" + } + }, + "node_modules/docsify-cli": { + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/docsify-cli/-/docsify-cli-4.4.4.tgz", + "integrity": "sha512-NAZgg6b0BsDuq/Pe+P19Qb2J1d+ZVbS0eGkeCNxyu4F9/CQSsRqZqAvPJ9/0I+BCHn4sgftA2jluqhQVzKzrSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^2.4.2", + "connect": "^3.6.0", + "connect-history-api-fallback": "^1.6.0", + "connect-livereload": "^0.6.0", + "cp-file": "^7.0.0", + "docsify": "^4.12.2", + "docsify-server-renderer": ">=4.10.0", + "enquirer": "^2.3.6", + "fs-extra": "^8.1.0", + "get-port": "^5.0.0", + "livereload": "^0.9.2", + "lru-cache": "^5.1.1", + "open": "^6.4.0", + "serve-static": "^1.12.1", + "update-notifier": "^4.1.0", + "yargonaut": "^1.1.2", + "yargs": "^15.3.0" + }, + "bin": { + "docsify": "bin/docsify" + }, + "engines": { + "node": ">= 10", + "npm": ">= 6" + } + }, + "node_modules/docsify-server-renderer": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/docsify-server-renderer/-/docsify-server-renderer-4.13.1.tgz", + "integrity": "sha512-XNJeCK3zp+mVO7JZFn0bH4hNBAMMC1MbuCU7CBsjLHYn4NHrjIgCBGmylzEan3/4Qm6kbSzQx8XzUK5T7GQxHw==", + "deprecated": "docsify-server-renderer 4.x and below is no longer supported while we investigate the future of SSR and SSG for Docsify", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.3", + "docsify": "^4.12.4", + "node-fetch": "^2.6.6", + "resolve-pathname": "^3.0.0" + } + }, + "node_modules/docsify-server-renderer/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/docsify-server-renderer/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/duplexer3": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", + "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true, + "license": "MIT" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enquirer": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", + "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-colors": "^4.1.1", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/escape-goat": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", + "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true, + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/figlet": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/figlet/-/figlet-1.8.0.tgz", + "integrity": "sha512-chzvGjd+Sp7KUvPHZv6EXV5Ir3Q7kYNpCr4aHrRW79qFtTefmQZNny+W1pW9kf5zeE6dikku2W50W/wAH2xWgw==", + "dev": true, + "license": "MIT", + "bin": { + "figlet": "bin/index.js" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-port": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz", + "integrity": "sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/global-dirs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.1.0.tgz", + "integrity": "sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ini": "1.3.7" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-ansi/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-yarn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-errors/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz", + "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ci-info": "^2.0.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-installed-globally": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", + "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "global-dirs": "^2.0.1", + "is-path-inside": "^3.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-npm": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz", + "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/is-yarn-global": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", + "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.0" + } + }, + "node_modules/latest-version": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", + "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", + "dev": true, + "license": "MIT", + "dependencies": { + "package-json": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/livereload": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/livereload/-/livereload-0.9.3.tgz", + "integrity": "sha512-q7Z71n3i4X0R9xthAryBdNGVGAO2R5X+/xXpmKeuPMrteg+W2U8VusTKV3YiJbXZwKsOlFlHe+go6uSNjfxrZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^3.5.0", + "livereload-js": "^3.3.1", + "opts": ">= 1.2.0", + "ws": "^7.4.3" + }, + "bin": { + "livereload": "bin/livereload.js" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/livereload-js": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-3.4.1.tgz", + "integrity": "sha512-5MP0uUeVCec89ZbNOT/i97Mc+q3SxXmiUGhRFOTmhrGPn//uWVQdCvcLJDy64MSBR5MidFdOR7B9viumoavy6g==", + "dev": true, + "license": "MIT" + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/marked": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/marked/-/marked-1.2.9.tgz", + "integrity": "sha512-H8lIX2SvyitGX+TRdtS06m1jHMijKN/XjfH6Ooii9fvxMlh8QdqBfBDkGUpMWH2kQNrtixjzYUa3SH8ROTgRRw==", + "dev": true, + "license": "MIT", + "bin": { + "marked": "bin/marked" + }, + "engines": { + "node": ">= 8.16.2" + } + }, + "node_modules/medium-zoom": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/medium-zoom/-/medium-zoom-1.1.0.tgz", + "integrity": "sha512-ewyDsp7k4InCUp3jRmwHBRFGyjBimKps/AJLjRSox+2q/2H4p/PNpQf+pwONWlJiOudkBXtbdmVbFjqyybfTmQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/nested-error-stacks": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.1.1.tgz", + "integrity": "sha512-9iN1ka/9zmX1ZvLV9ewJYEk9h7RyRRtqdK0woXcqohu8EWIerfPUjYJPg0ULy0UqP7cslmdGc8xKDJcojlKiaw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "dev": true, + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/open": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", + "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-wsl": "^1.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/opencollective-postinstall": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz", + "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==", + "dev": true, + "license": "MIT", + "bin": { + "opencollective-postinstall": "index.js" + } + }, + "node_modules/opts": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/opts/-/opts-2.0.2.tgz", + "integrity": "sha512-k41FwbcLnlgnFh69f4qdUfvDQ+5vaSDnVPFI/y5XuhKRq97EnVVneO9F1ESVCdiVu4fCS2L8usX3mU331hB7pg==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/p-event": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/p-event/-/p-event-4.2.0.tgz", + "integrity": "sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-timeout": "^3.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-timeout": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", + "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/parent-require": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parent-require/-/parent-require-1.0.0.tgz", + "integrity": "sha512-2MXDNZC4aXdkkap+rBBMv0lUsfJqvX5/2FiYYnfCnorZt3Pk06/IOR5KeaoghgS2w07MLWgjbsnyaq6PdHn2LQ==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/prismjs": { + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", + "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pump": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", + "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/pupa": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", + "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-goat": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/registry-auth-token": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.2.tgz", + "integrity": "sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==", + "dev": true, + "license": "MIT", + "dependencies": { + "rc": "1.2.8" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/registry-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", + "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", + "dev": true, + "license": "MIT", + "dependencies": { + "rc": "^1.2.8" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true, + "license": "ISC" + }, + "node_modules/resolve-pathname": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", + "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==", + "dev": true, + "license": "MIT" + }, + "node_modules/responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "lowercase-keys": "^1.0.0" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/semver-diff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", + "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/send": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/send/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-static/node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true, + "license": "ISC" + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true, + "license": "ISC" + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/term-size": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", + "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tinydate": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/tinydate/-/tinydate-1.3.0.tgz", + "integrity": "sha512-7cR8rLy2QhYHpsBDBVYnnWXm8uRTr38RoZakFSW7Bs7PzfMPNZthuMLkwqZv7MTu8lhQ91cOFYS5a7iFj2oR3w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tweezer.js": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/tweezer.js/-/tweezer.js-1.5.0.tgz", + "integrity": "sha512-aSiJz7rGWNAQq7hjMK9ZYDuEawXupcCWgl3woQQSoDP2Oh8O4srWb/uO1PzzHIsrPEOqrjJ2sUb9FERfzuBabQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" + } + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "crypto-random-string": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-notifier": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.3.tgz", + "integrity": "sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boxen": "^4.2.0", + "chalk": "^3.0.0", + "configstore": "^5.0.1", + "has-yarn": "^2.1.0", + "import-lazy": "^2.1.0", + "is-ci": "^2.0.0", + "is-installed-globally": "^0.3.1", + "is-npm": "^4.0.0", + "is-yarn-global": "^0.3.0", + "latest-version": "^5.0.0", + "pupa": "^2.0.1", + "semver-diff": "^3.1.1", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/yeoman/update-notifier?sponsor=1" + } + }, + "node_modules/update-notifier/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/update-notifier/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/update-notifier/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/update-notifier/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/update-notifier/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/update-notifier/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prepend-http": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which-module": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "string-width": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yargonaut": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/yargonaut/-/yargonaut-1.1.4.tgz", + "integrity": "sha512-rHgFmbgXAAzl+1nngqOcwEljqHGG9uUZoPjsdZEs1w5JW9RXYzrSvH/u70C1JE5qFi0qjsdhnUX/dJRpWqitSA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "chalk": "^1.1.1", + "figlet": "^1.1.1", + "parent-require": "^1.0.0" + } + }, + "node_modules/yargonaut/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yargonaut/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yargonaut/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yargonaut/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yargonaut/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..d478bab --- /dev/null +++ b/package.json @@ -0,0 +1,5 @@ +{ + "devDependencies": { + "docsify-cli": "^4.4.4" + } +} From aef6c46e9229fddfe0033087a915dad7222299cf Mon Sep 17 00:00:00 2001 From: Noah Emke Date: Sat, 22 Mar 2025 13:59:26 -0500 Subject: [PATCH 30/40] Spellcheck how-it-works.md --- .gitignore | 1 + docs/how-it-works.md | 24 ++++++++++++------------ 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/.gitignore b/.gitignore index f98d0f1..60907d6 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ venv/ users.sqlite3 launch.json node_modules +.vscode/ diff --git a/docs/how-it-works.md b/docs/how-it-works.md index 367d9d3..365f1ae 100644 --- a/docs/how-it-works.md +++ b/docs/how-it-works.md @@ -1,41 +1,41 @@ # How Devcade Works -Devcade is a project with many moving parts and a couple of ways that data moves around. In this section I will attempt to explain and overview how it all fits together and works at a high level. For more details on the workings or usage on any individual part, check out its detdicated page. +Devcade is a project with many moving parts and a couple of ways that data moves around. In this section I will attempt to explain and overview how it all fits together and works at a high level. For more details on the workings or usage on any individual part, check out its dedicated page. ## All the parts ### Onboard -The software running on the Devcade cabinet itself is known as the [onboard](/onboard-repo) and is further broken into two parts. First is the frontend, which primarily acts as the interface to the user and is reletively simple. It displays the list of games, plays animations, allows the user to scroll and select games or filters, etc. What it doesn't do however, is the rest of the actions needed to make anything more than visuals happen. That is handled by the backend. -The backend is a seperate program within the same repository that runs in the background of the Devcade cabinet handling all of the dirty work. It talks to the frontend and any running game through a couple of sockets so that the parts that take user input can tell the backend what actually importaint actions to take. It performs all the actions like downloading data such as games and metadata from the API, launching games, and uploading data. Details of these actions, interactions, and interfaces should be found in its dedicated page. +The software running on the Devcade cabinet itself is known as the [onboard](/onboard-repo) and is further broken into two parts. First is the frontend, which primarily acts as the interface to the user and is relatively simple. It displays the list of games, plays animations, allows the user to scroll and select games or filters, etc. What it doesn't do however, is the rest of the actions needed to make anything more than visuals happen. That is handled by the backend. +The backend is a separate program within the same repository that runs in the background of the Devcade cabinet handling all of the dirty work. It talks to the frontend and any running game through a couple of sockets so that the parts that take user input can tell the backend what actually important actions to take. It performs all the actions like downloading data such as games and metadata from the API, launching games, and uploading data. Details of these actions, interactions, and interfaces should be found in its dedicated page. ### Website The [Devcade website](/website-repo) is, as you might expect, the [main public website](https://devcade.csh.rit.edu) for the project. It serves a couple of purposes, to act as a public landing page with basic information on what the project is and why its cool, and to be the direct interface for users looking through all the games or uploading new games. The former is a simple goal performed with mostly static sections of the site but the latter is lots of back and forth with the API. The website also handles accounts in a couple of forms to restrict some games from view, and to keep track of who uploaded a game. The way we have it set up at the moment it integrates with our organizations existing SSO auth as well as offering an option to log in with google. ### Game Libraries -Games running on Devcade sometimes need to interact with the cabinet or other infrastructure while running. This might include simply mapping controls in a more convinient manner, saving or loading data from our servers, or in some cases, other cabinet specific actions such as reading ID cards from an NFC reader or other future actions. Currently we only have an official [library for MonoGame](/library-repo) in C# but there are some other community supported ones and you also don't necesarily need to use one to get your game working on Devcade. +Games running on Devcade sometimes need to interact with the cabinet or other infrastructure while running. This might include simply mapping controls in a more convenient manner, saving or loading data from our servers, or in some cases, other cabinet specific actions such as reading ID cards from an NFC reader or other future actions. Currently we only have an official [library for MonoGame](/library-repo) in C# but there are some other community supported ones and you also don't necessarily need to use one to get your game working on Devcade. ### API -The [API](/api-repo) is the inbetween point between the infrastructure running in the background and the website, onboard, and anything else that wants to interact with the data we store. We have it set up at the ['api/'](https://devcade.csh.rit.edu/api/) route within the main websites domain and in addition to its repository readme, it also hosts [swagger docs](https://devcade.csh.rit.edu/api/docs/) for all of the routs it provides. +The [API](/api-repo) is the point between the infrastructure running in the background and the website, onboard, and anything else that wants to interact with the data we store. We have it set up at the ['api/'](https://devcade.csh.rit.edu/api/) route within the main websites domain and in addition to its repository readme, it also hosts [swagger docs](https://devcade.csh.rit.edu/api/docs/) for all of the routes it provides. -The sources of data that this API talks to and provides an interface for are a database and S3. The postgresql database stores metadata about games, tags, and users while the S3 buckets store games themselfs, game images and banners, as well as any save data from gaems utilizing that feature. +The sources of data that this API talks to and provides an interface for are a database and S3. The postgresql database stores metadata about games, tags, and users while the S3 buckets store games themselves, game images and banners, as well as any save data from games utilizing that feature. ### Game Templates -While not nessecarily part of the vital operation of Devcade, we do provide templates for people to use when making games for the project. At the moment we just have one for [MonoGame](/template-repo). They set up some things for the user such as the library and aspect ratio. +While not necessarily part of the vital operation of Devcade, we do provide templates for people to use when making games for the project. At the moment we just have one for [MonoGame](/template-repo). They set up some things for the user such as the library and aspect ratio. ### Flatpakify -[Flatpakify](/flatpakify-repo) is a tool developed to help users package their games into flatpaks. This is required in order for games to be uploaded and run on Devcade but can be an unfamiliar process to many. This tool helps to simplify that process by doing most of it for you, given the right input. +[Flatpakify](/flatpakify-repo) is a tool developed to help users package their games into Flatpaks. This is required in order for games to be uploaded and run on Devcade but can be an unfamiliar process to many. This tool helps to simplify that process by doing most of it for you, given the right input. ### Documentation -Thats what you are reading here. You probably know why its here, but in addition to providing useful information that doesn't otherwise have a home, it also brings the READMEs of all of the other repos together into one convinient spot for viewing, [including its own](/../). +Thats what you are reading here. You probably know why its here, but in addition to providing useful information that doesn't otherwise have a home, it also brings the READMEs of all of the other repos together into one convenient spot for viewing, [including its own](/../). ## The standard flow of operation -In the normal course of operation of a functioning setup, just about everything is initiated by the Devcade cabinet itself. The software running on the cabinet, known as the [onboard](/onboard-repo), starts up as the computer turns on and the frontend immediately asks the backend to reach out to the [API](/api-repo) for all of the data needed to show a user all of the games available. The API grabs the data needed from the database and S3 and sends it back. The backend then recieves it, caches some of it that wasnt already, and passes it to the frontend. +In the normal course of operation of a functioning setup, just about everything is initiated by the Devcade cabinet itself. The software running on the cabinet, known as the [onboard](/onboard-repo), starts up as the computer turns on and the frontend immediately asks the backend to reach out to the [API](/api-repo) for all of the data needed to show a user all of the games available. The API grabs the data needed from the database and S3 and sends it back. The backend then receives it, caches some of it that wasn't already, and passes it to the frontend. -The user may then select a game and play it from the now populated frontend. The frontend tells the backend to launch this game and if it is already downloaded it will get the hash of the game from the API and check if the downloaded version is current. If not, or if it was never downloaded in the first place, it downloads the game from the API. At this point the backend runs the game. From here the game might ask the backend for some actions through the games library such as sving data. The backend would once again, make the API requests and pass them around. Once the game closes, we return to the base state of the frontend displaying the games and waiting for input. +The user may then select a game and play it from the now populated frontend. The frontend tells the backend to launch this game and if it is already downloaded it will get the hash of the game from the API and check if the downloaded version is current. If not, or if it was never downloaded in the first place, it downloads the game from the API. At this point the backend runs the game. From here the game might ask the backend for some actions through the games library such as saving data. The backend would once again, make the API requests and pass them around. Once the game closes, we return to the base state of the frontend displaying the games and waiting for input. ## The game makers flow -For a developer looking to make a game, the rest of the project comes into play. They might start with the [template](/template-repo) which gets them started for working with Devcade and includes the [library](/library-repo). With this they build out their game, maybe using some library functions along the way. Once they are ready to put the game on Devcade, they head to the [website](/website-repo), log in, and create a new game. Following the instructions, they compile their game and follow [Flatpakify](/flatpakify-repo)s instructions to package it togother. This gets uploaded to the website and further through the API to find its spot on the servers. +For a developer looking to make a game, the rest of the project comes into play. They might start with the [template](/template-repo) which gets them started for working with Devcade and includes the [library](/library-repo). With this they build out their game, maybe using some library functions along the way. Once they are ready to put the game on Devcade, they head to the [website](/website-repo), log in, and create a new game. Following the instructions, they compile their game and follow [Flatpakify](/flatpakify-repo)s instructions to package it together. This gets uploaded to the website and further through the API to find its spot on the servers. Once that new game has been uploaded, the next time someone refreshes the onboard and it gets a fresh list of games, it will be displayed and playable! From 2ab3310d297679bf08b309ae81f7e7446d5e1950 Mon Sep 17 00:00:00 2001 From: Noah Emke Date: Sat, 22 Mar 2025 15:16:06 -0500 Subject: [PATCH 31/40] various added info --- docs/how-it-works.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/how-it-works.md b/docs/how-it-works.md index 365f1ae..124cd0a 100644 --- a/docs/how-it-works.md +++ b/docs/how-it-works.md @@ -1,6 +1,6 @@ # How Devcade Works -Devcade is a project with many moving parts and a couple of ways that data moves around. In this section I will attempt to explain and overview how it all fits together and works at a high level. For more details on the workings or usage on any individual part, check out its dedicated page. +Devcade is a project with many moving parts and a couple of ways that data moves around. In this section I will attempt to explain and overview how it all fits together and works at a high level. For more details on the workings or usage on any individual part, check out its dedicated page which is pulled directly from the readme of its repo. ## All the parts ### Onboard @@ -9,7 +9,7 @@ The backend is a separate program within the same repository that runs in the ba ### Website The [Devcade website](/website-repo) is, as you might expect, the [main public website](https://devcade.csh.rit.edu) for the project. It serves a couple of purposes, to act as a public landing page with basic information on what the project is and why its cool, and to be the direct interface for users looking through all the games or uploading new games. The former is a simple goal performed with mostly static sections of the site but the latter is lots of back and forth with the API. -The website also handles accounts in a couple of forms to restrict some games from view, and to keep track of who uploaded a game. The way we have it set up at the moment it integrates with our organizations existing SSO auth as well as offering an option to log in with google. +The website also handles accounts in a couple of forms to restrict some games from view, and to keep track of who uploaded a game. The way we have it set up at the moment it integrates with our organizations existing SSO auth as well as offering an option to log in with google for RIT accounts. At this time there is no login for the general public outside of the Rochester Institute of Technology. ### Game Libraries Games running on Devcade sometimes need to interact with the cabinet or other infrastructure while running. This might include simply mapping controls in a more convenient manner, saving or loading data from our servers, or in some cases, other cabinet specific actions such as reading ID cards from an NFC reader or other future actions. Currently we only have an official [library for MonoGame](/library-repo) in C# but there are some other community supported ones and you also don't necessarily need to use one to get your game working on Devcade. @@ -23,7 +23,7 @@ The sources of data that this API talks to and provides an interface for are a d While not necessarily part of the vital operation of Devcade, we do provide templates for people to use when making games for the project. At the moment we just have one for [MonoGame](/template-repo). They set up some things for the user such as the library and aspect ratio. ### Flatpakify -[Flatpakify](/flatpakify-repo) is a tool developed to help users package their games into Flatpaks. This is required in order for games to be uploaded and run on Devcade but can be an unfamiliar process to many. This tool helps to simplify that process by doing most of it for you, given the right input. +[Flatpakify](/flatpakify-repo) is a tool developed to help users package their games into Flatpaks. This is required in order for games to be uploaded and run on Devcade but can be an unfamiliar process to many. This tool helps to simplify that process by doing most of it for you, given the right input. It is originally designed to work with C# projects but with some workarounds it can be used on other projects as well. ### Documentation Thats what you are reading here. You probably know why its here, but in addition to providing useful information that doesn't otherwise have a home, it also brings the READMEs of all of the other repos together into one convenient spot for viewing, [including its own](/../). From aa53fcc408713357e87dcef41bf4f473fa413b5b Mon Sep 17 00:00:00 2001 From: Noah Emke Date: Sat, 22 Mar 2025 15:39:24 -0500 Subject: [PATCH 32/40] Move how it works to an overview sub page --- docs/_sidebar.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/_sidebar.md b/docs/_sidebar.md index fbfec6a..ba2ea0c 100644 --- a/docs/_sidebar.md +++ b/docs/_sidebar.md @@ -6,7 +6,8 @@ * [Cabinet](/Hardware/cabinet) * [Gamepad](/Hardware/gamepad) * [Installing DCU](/Hardware/installing-dcu) -* [How it Works](/how-it-works.md) +* How it Works + * [Overview](/how-it-works.md) * [Onboard Software](/onboard-repo) * [Website](/website-repo) * [Monogame Library](/library-repo) From d5f86dd29f06683ebb7913a1d584f86b5d874a6f Mon Sep 17 00:00:00 2001 From: Noah Emke Date: Sat, 22 Mar 2025 18:51:07 -0500 Subject: [PATCH 33/40] Fill out most of cabinet.md --- docs/Hardware/README.md | 6 ------ docs/Hardware/cabinet.md | 28 +++++++++++++++++++++++++++- docs/_sidebar.md | 2 +- 3 files changed, 28 insertions(+), 8 deletions(-) delete mode 100644 docs/Hardware/README.md diff --git a/docs/Hardware/README.md b/docs/Hardware/README.md deleted file mode 100644 index 99874bb..0000000 --- a/docs/Hardware/README.md +++ /dev/null @@ -1,6 +0,0 @@ -# Hardware - -There are a few main components to the hardware involved for running Devcade: -* The [DCU, or Devcade Compute Unit](Hardware/installing-dcu) -* The [Arcade Cabinet](Hardware/cabinet) -* The [Gamepad](Hardware/gamepad) \ No newline at end of file diff --git a/docs/Hardware/cabinet.md b/docs/Hardware/cabinet.md index f68da6c..5df9b35 100644 --- a/docs/Hardware/cabinet.md +++ b/docs/Hardware/cabinet.md @@ -1 +1,27 @@ -# Cabinet \ No newline at end of file +# Cabinet +SUBJECT TO CHANGE SOON + +## Construction +The physical cabinet that makes up the structure of Devcade is modeled after a traditional arcade cabinet and is constructed of primarily MDF and plywood panels with a plexiglass panel to protect the screen. The entire rear of the cabinet is on hinges to act as an access door to the inside of the cabinet. + +There are 3 holes in each side, 2 of them allow for dowels cut in half to be inserted through both sides to hold the plexiglass in place. The third hole on each side has not been implemented fully but has been intended as an expansion slot, where a usb port would be mounted in the hole and the cutout around the hole is used to index and hold, with magnets or latches, any future expansions or accessories. + +Originally, magnets were also embedded in the sides to + +Finally is the slot built in for the controller. The controller is a custom piece of its own with enough wiring and parts to warrant its own page. + +TODO image + +## Manufacturing +Our current Devcade cabinet was made with a combination of power tools and a CNC router. While this is helpful to get perfect curves and shapes as designed, it is not required and this woodworking could likely be done with much simpler tools. + +TODO CAD drawings + +## Assembly +Assembly of the cabinet is a bit cumbersome, primarily due to the size and weight, but shouldn't be particularly difficult technically. It is held together with lots of L brackets, thick ones are ideal, and assembled in 2 halves, top and bottom, before being stacked and screwed together. + +Start by applying and screwing in the brackets to the sides, 2 on top, 2 on front, and 2 on bottom. Then line the sides up on the bottom and screw in the other side of the brackets before applying the front and screwing that in as well. Lastly, add on and screw in the support on the top. + +For the top half we will repeat much of the same process. Apply brackets to the sides, 2 on top and 2 on bottom, add the top (likely easier to construct this half upside down, applying the sides to the top resting on the ground). Lift this whole top half and apply it to the bottom. Screw it together and you are basically done. Apply and secure the plexi and insert the controller. + +TODO assembly pdf \ No newline at end of file diff --git a/docs/_sidebar.md b/docs/_sidebar.md index ba2ea0c..6d84b3a 100644 --- a/docs/_sidebar.md +++ b/docs/_sidebar.md @@ -2,7 +2,7 @@ * [Getting Started](/Getting-started/) * [Making Your First Game](/Getting-started/first-game.md) * [Using the Game Template](/Getting-started/using-template.md) -* [Hardware](/Hardware/) +* Hardware * [Cabinet](/Hardware/cabinet) * [Gamepad](/Hardware/gamepad) * [Installing DCU](/Hardware/installing-dcu) From a45b7bcd472edf02c28efe3a19562aa227ec2827 Mon Sep 17 00:00:00 2001 From: Noah Emke Date: Sat, 22 Mar 2025 19:28:32 -0500 Subject: [PATCH 34/40] Fixed lack of newline after bullet point --- docs/contributing.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/contributing.md b/docs/contributing.md index 0d50514..82aca3b 100644 --- a/docs/contributing.md +++ b/docs/contributing.md @@ -28,6 +28,7 @@ If you have made changes to the project and would like to contribute them upstre - A summary of any changes being submitted - Any issues these changes address or other reasons for the changes - Any known new issues created by the changes or other additional changes that need to be implemented for these changes to be effective + Once submitted and ready for review, one or more members of the Devcade core team will review it and respond accordingly. Do note however that all of the core team are college students with classwork, other projects, and lives outside of this. So please understand if PRs aren't always reviewed in a timely manner. # Reporting bugs or requesting features From f6831824406cc4d92635e4a67c99fddf696fb416 Mon Sep 17 00:00:00 2001 From: Ella Soccoli Date: Sun, 23 Mar 2025 14:27:31 -0400 Subject: [PATCH 35/40] Renamed the 'getting started' section to 'making games' --- docs/Getting-started/first-game.md | 8 -------- .../README.md | 8 ++++---- docs/Making-games/first-game.md | 14 ++++++++++++++ .../using-template.md | 0 docs/README.md | 19 ++++--------------- docs/_sidebar.md | 6 +++--- 6 files changed, 25 insertions(+), 30 deletions(-) delete mode 100644 docs/Getting-started/first-game.md rename docs/{Getting-started => Making-games}/README.md (89%) create mode 100644 docs/Making-games/first-game.md rename docs/{Getting-started => Making-games}/using-template.md (100%) diff --git a/docs/Getting-started/first-game.md b/docs/Getting-started/first-game.md deleted file mode 100644 index f35f892..0000000 --- a/docs/Getting-started/first-game.md +++ /dev/null @@ -1,8 +0,0 @@ -# Making Your First Devcade Game - -So, you want to make a Devcade game? Well you chose the right place. - -### What makes a Devcade game? - -Most Devcade games are developed in C# using the MonoGame framework. -If you'd prefer to write your game in Rust, check [the guide on `cargo-devcade`](https://github.com/mstrodl/cargo-devcade#readme)! diff --git a/docs/Getting-started/README.md b/docs/Making-games/README.md similarity index 89% rename from docs/Getting-started/README.md rename to docs/Making-games/README.md index 99a3377..3c63529 100644 --- a/docs/Getting-started/README.md +++ b/docs/Making-games/README.md @@ -3,6 +3,7 @@ If you are looking to make a Devcade game, there are a couple considerations to keep in mind. #### Choosing a Language + Firstly, you should think about what language you want to develop the game in. The Devcade project currently supports C# using MonoGame, as well as Rust using Bevy. We provide libraries for these languages to help make parts of the development process easier. These libraries assist with things such as interpreting Devcade inputs, reading and writing to pipes for save data, setting the proper aspect ratio, and more. Although these are the only two languages that we "officially" support, you are not limited to only those two languages. You could theoretically make a Devcade game in whatever language you want, and it will run on Devcade as long as you build it for the appropriate system specifications. However, something to keep in mind is that since we do not have a library for other languages, you would have to figure out how to handle the things our libraries handle yourself. @@ -10,18 +11,17 @@ Although these are the only two languages that we "officially" support, you are If you do make a game using something other than MonoGame or Bevy, we encourage you to write up some instructions on how to do the things that a library might provide for you, and open a pull request to the docs site to add your documentation. We would be happy to review it, and we would love to help you get it merged. #### Devcade Controls + As you get started, you will want to keep in mind the details of the Devcade system you are designing for. For the CSH Devcade cabinet, you will want to note that the display is a 9:21 ultrawide monitor turned vertical (measuring 1080x2560). The computer that the CSH Devcade cabinet is running on has an 8th gen Intel processor and integrated graphics. The controls are laid out as follows: ``` Player 1 Player 2 - + ^ A1 A2 A3 A4 ^ A1 A2 A3 A4 - Menu Menu + Menu Menu v B1 B2 B3 B4 v B1 B2 B3 B4 ``` -If you would like a more in depth guide through a MonoGame example, check out the [First Devcade Game](Getting-started/first-game) page. This will help you make your first game for Devcade, including getting you familiar with some [Monogame](https://www.monogame.net/) basics. - Once youve got something playable you want to put on the cabinet, you should build and zip your game in a manner such that it is self contained and should require no runtimes or other resources. Then head over to the website, log in, and go to the upload page. There should also be instructions on that page for packaging your game. Upload the zip, banner image, and icon image and give it a name and description. If all is good you should be able to hit upload and it should work. Pressing both menu buttons will refresh the games list on the cabinet and hopefully you will see you game! ### Using the API diff --git a/docs/Making-games/first-game.md b/docs/Making-games/first-game.md new file mode 100644 index 0000000..d8b4dee --- /dev/null +++ b/docs/Making-games/first-game.md @@ -0,0 +1,14 @@ +# Making Your First Devcade Game + +So, you want to make a Devcade game? Well you chose the right place. + +We officially support and have resources for Monogame games written in C# and have community support for Bevy games written in Rust. Many other engines and frameworks have been explored and proven to work, but don't yet have full support. + +- [Getting Started](/Getting-started/) +- [Monogame Template](/template-repo) +- [Monogame Library](/library-repo) +- [Flatpackify](/flatpackify-repo) + +- [Rust Library](https://docs.rs/devcaders/latest/devcaders/) (Community supported) + +?> Devcade can theoretically run any executable as long as the game is formatted properly, runs on linux, and works with a few other restrictions but you will have to figure some stuff out yourself that would be done for you in one of our libraries and we make no guarantees on getting it to work. diff --git a/docs/Getting-started/using-template.md b/docs/Making-games/using-template.md similarity index 100% rename from docs/Getting-started/using-template.md rename to docs/Making-games/using-template.md diff --git a/docs/README.md b/docs/README.md index 3aee14e..3a55050 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,13 +1,13 @@ # Devcade Documentation -On this website you can find any documentation you need for working with the Devcade project, whether you want to make a game, leverage the API, or build your own machine. +Welcome to the Devcade documentation! On this site you can find any documentation you need for working with the Devcade project, whether you want to make a game, leverage the API, or build your own machine. ?> Note: If something doesn't look right, feel free to suggest an addition or change with the "Edit on GitHub" button up in the corner. ## What is Devcade? Devcade is a fully custom arcade machine made by members at RIT's [Computer Science House](https://csh.rit.edu). Devcade is an arcade built for developers, by developers. The arcade cabinet, software, and games for Devcade were all built by CSHers starting from the 2022 Fall semester. -The arcade cabinet was first shown off at the 2022 Rochester Makerfaire and many more times since. This cabinet is the first of its kind, but hopefully not the last. +The arcade cabinet was first shown off at the 2022 Rochester Makerfaire and many more times since. This cabinet is the first of its kind, but hopefully not the last. Learn more about Devcade at the [main website](https://devcade.csh.rit.edu). @@ -15,28 +15,17 @@ Learn more about Devcade at the [main website](https://devcade.csh.rit.edu). New to the project and not sure where to start? Depending on what you want to do, heres a couple of jumping off points to get you started. If you know what you're looking for or just want to explore, feel free to take a look at the sidebar and jump around. ### Making a game -If you're thinking about making a game for Devcade, or adapting a game you are already working on, you should take a look at the TODO [Making Games]() section. From there you'll find an overview of the process for making a game for Devcade and getting it on the cabinet, as well as information thats relevant no matter what game you're making. From there you can also explore the language specific templates and libraries. +If you're thinking about making a game for Devcade, or adapting a game you are already working on, you should take a look at the TODO [Making Games](/Making-games/) section. From there you'll find an overview of the process for making a game for Devcade and getting it on the cabinet, as well as information thats relevant no matter what game you're making. From there you can also explore the language specific templates and libraries. TODO: move the rest of this on making a game to the making games or language specific pages -We officially support and have resources for Monogame games written in C# and have community support for Bevy games written in Rust. Many other engines and frameworks have been explored and proven to work, but don't yet have full support. - -- [Getting Started](/Getting-started/) -- [Monogame Template](/template-repo) -- [Monogame Library](/library-repo) -- [Flatpackify](/flatpackify-repo) - -- [Rust Library](https://docs.rs/devcaders/latest/devcaders/) (Community supported) - -?> Devcade can theoretically run any executable as long as the game is formatted properly, runs on linux, and works with a few other restrictions but you will have to figure some stuff out yourself that would be done for you in one of our libraries and we make no guarantees on getting it to work. - ### Working on the project For information on how the whole project works and implementation details, check out the TODO [How it Works](/how-it-works.md) section for an overview of how it operates. Additionally, each part of the project has a page under this section with more details even if it is also mentioned elsewhere. You can also jump to them all from right here: - [Onboard Software](/onboard-repo) - [Website](/website-repo) - [Monogame Library](/library-repo) -- [API](/api-repo) +- [API](/api-repo) - [Monogame Game Template](/template-repo) - [Flatpakify](/flatpakify-repo) - [Documentation](/../) diff --git a/docs/_sidebar.md b/docs/_sidebar.md index 6d84b3a..2c8aadd 100644 --- a/docs/_sidebar.md +++ b/docs/_sidebar.md @@ -1,7 +1,7 @@ * [Home](/) -* [Getting Started](/Getting-started/) - * [Making Your First Game](/Getting-started/first-game.md) - * [Using the Game Template](/Getting-started/using-template.md) +* [Making Games](/Making-games/) + * [Making Your First Game](/Making-games/first-game.md) + * [Using the Game Template](/Making-games/using-template.md) * Hardware * [Cabinet](/Hardware/cabinet) * [Gamepad](/Hardware/gamepad) From 8f6ad1c6dca0d5b00bd0a89886f2cf6f5a5d882f Mon Sep 17 00:00:00 2001 From: Ella Soccoli Date: Sun, 23 Mar 2025 14:36:27 -0400 Subject: [PATCH 36/40] Moved the control diagram from Making games to gamepad --- docs/Hardware/gamepad.md | 14 +++++++++++++- docs/Making-games/README.md | 10 +--------- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/docs/Hardware/gamepad.md b/docs/Hardware/gamepad.md index 843d07a..23920dc 100644 --- a/docs/Hardware/gamepad.md +++ b/docs/Hardware/gamepad.md @@ -1 +1,13 @@ -# Gamepad \ No newline at end of file +# Gamepad + +// TODO: Expand on this more + +The controls are laid out as follows: + +``` + Player 1 Player 2 + + ^ A1 A2 A3 A4 ^ A1 A2 A3 A4 + Menu Menu + v B1 B2 B3 B4 v B1 B2 B3 B4 +``` diff --git a/docs/Making-games/README.md b/docs/Making-games/README.md index 3c63529..db61382 100644 --- a/docs/Making-games/README.md +++ b/docs/Making-games/README.md @@ -12,15 +12,7 @@ If you do make a game using something other than MonoGame or Bevy, we encourage #### Devcade Controls -As you get started, you will want to keep in mind the details of the Devcade system you are designing for. For the CSH Devcade cabinet, you will want to note that the display is a 9:21 ultrawide monitor turned vertical (measuring 1080x2560). The computer that the CSH Devcade cabinet is running on has an 8th gen Intel processor and integrated graphics. The controls are laid out as follows: - -``` - Player 1 Player 2 - - ^ A1 A2 A3 A4 ^ A1 A2 A3 A4 - Menu Menu - v B1 B2 B3 B4 v B1 B2 B3 B4 -``` +As you get started, you will want to keep in mind the details of the Devcade system you are designing for. For the CSH Devcade cabinet, you will want to note that the display is a 9:21 ultrawide monitor turned vertical (measuring 1080x2560). The computer that the CSH Devcade cabinet is running on has an 8th gen Intel processor and integrated graphics. Once youve got something playable you want to put on the cabinet, you should build and zip your game in a manner such that it is self contained and should require no runtimes or other resources. Then head over to the website, log in, and go to the upload page. There should also be instructions on that page for packaging your game. Upload the zip, banner image, and icon image and give it a name and description. If all is good you should be able to hit upload and it should work. Pressing both menu buttons will refresh the games list on the cabinet and hopefully you will see you game! From 7379f805b00c49cce20ad8aab2a52df48ac96a7a Mon Sep 17 00:00:00 2001 From: Ella Soccoli Date: Sun, 23 Mar 2025 15:20:08 -0400 Subject: [PATCH 37/40] Split up contributing guide into the general contributing.md and a separate file for style guides --- docs/{ => Contributing}/contributing.md | 23 ++--------------------- docs/Contributing/style-guides.md | 18 ++++++++++++++++++ docs/Making-games/first-game.md | 1 - docs/_sidebar.md | 4 +++- 4 files changed, 23 insertions(+), 23 deletions(-) rename docs/{ => Contributing}/contributing.md (81%) create mode 100644 docs/Contributing/style-guides.md diff --git a/docs/contributing.md b/docs/Contributing/contributing.md similarity index 81% rename from docs/contributing.md rename to docs/Contributing/contributing.md index 82aca3b..3affa48 100644 --- a/docs/contributing.md +++ b/docs/Contributing/contributing.md @@ -1,5 +1,5 @@ # Contributing to Devcade -So, you'd like to contribute to Devcade? Thats great, we'd love the help! +So, you'd like to contribute to Devcade? Thats great, we'd love the help! This document should serve as a bit of a guide to help you get started with the project as a whole, as well as to the documentation site more specifically if thats what you're here for. Note that most of the things mentioned here are guidelines. We strongly recommend that you follow them, but not following them isn't going to end the world either. This project is split into a handful of parts and therefore a handful of separate repositories, so while this will give you an overview and a more general guide, you should refer to the documentation of each part for more specifics. For reference, each of the repos are linked below: @@ -41,25 +41,6 @@ If you have noticed a bug, issue, incorrect or outdated documentation, or just w - If applicable, include any screenshots or other resources relevant to the issue - If submitting a suggestion, explain why the feature should be added -# Style guides -Given that this project involves several languages across its repos, there are a couple of style guides to go along with each language. Depending on what language you are working in, we hope that you would do your best to keep to the following guidelines: - -## Rust -- All rust codebases should use rustfmt, in most cases through cargo fmt with default settings. -- Ideally all functions and structs should have /// doc comments. - -## C# -- Any C# codebases should use top syntax for curly braces, also known as same line or one true brace style where opening curly braces are placed on the same line as the function or control statement separated by one space. -- Indentation should be done with 4 space characters -- Ideally all classes, methods, and properties should have XML /// doc comments - -## Python -- All python codebases should use Pylint defaults -- Ideally docstrings should be used for all methods and classes - -## Other -Style and formatting standards for other languages have not been established yet or are not used in the project. If a language is used or introduced that does not have a style guide here, try to follow what exists already if applicable until a standard it settled on. - # Code of conduct Currently this project has no direct code of conduct but it should inherit a couple by default. As always be kind to others as a base line but as a project within the Computer Science House (CSH) organization, and by extension within the Rochester Institute of Technology (RIT), the following codes of conduct should be relevant to varying degrees: - [RIT Code of Ethical Conduct and Compliance](https://www.rit.edu/policies/c000) @@ -67,4 +48,4 @@ Currently this project has no direct code of conduct but it should inherit a cou - [CSH Code of Conduct](https://coc.csh.rit.edu/) # Where to ask for help -If you want to contribute or are otherwise interested but are stuck somewhere, your first place of inquiry should be in the comments of any relevant PR or issue on GitHub. If this is not applicable or for another method of contact, reach out to devcade@csh.rit.edu. \ No newline at end of file +If you want to contribute or are otherwise interested but are stuck somewhere, your first place of inquiry should be in the comments of any relevant PR or issue on GitHub. If this is not applicable or for another method of contact, reach out to devcade@csh.rit.edu. diff --git a/docs/Contributing/style-guides.md b/docs/Contributing/style-guides.md new file mode 100644 index 0000000..5235962 --- /dev/null +++ b/docs/Contributing/style-guides.md @@ -0,0 +1,18 @@ +# Style guides +Given that this project involves several languages across its repos, there are a couple of style guides to go along with each language. Depending on what language you are working in, we hope that you would do your best to keep to the following guidelines: + +### Rust +- All rust codebases should use rustfmt, in most cases through cargo fmt with default settings. +- Ideally all functions and structs should have /// doc comments. + +### C# +- Any C# codebases should use top syntax for curly braces, also known as same line or one true brace style where opening curly braces are placed on the same line as the function or control statement separated by one space. +- Indentation should be done with 4 space characters +- Ideally all classes, methods, and properties should have XML /// doc comments + +### Python +- All python codebases should use Pylint defaults +- Ideally docstrings should be used for all methods and classes + +### Other +Style and formatting standards for other languages have not been established yet or are not used in the project. If a language is used or introduced that does not have a style guide here, try to follow what exists already if applicable until a standard it settled on. diff --git a/docs/Making-games/first-game.md b/docs/Making-games/first-game.md index d8b4dee..f397129 100644 --- a/docs/Making-games/first-game.md +++ b/docs/Making-games/first-game.md @@ -8,7 +8,6 @@ We officially support and have resources for Monogame games written in C# and ha - [Monogame Template](/template-repo) - [Monogame Library](/library-repo) - [Flatpackify](/flatpackify-repo) - - [Rust Library](https://docs.rs/devcaders/latest/devcaders/) (Community supported) ?> Devcade can theoretically run any executable as long as the game is formatted properly, runs on linux, and works with a few other restrictions but you will have to figure some stuff out yourself that would be done for you in one of our libraries and we make no guarantees on getting it to work. diff --git a/docs/_sidebar.md b/docs/_sidebar.md index 2c8aadd..ac31ed6 100644 --- a/docs/_sidebar.md +++ b/docs/_sidebar.md @@ -15,4 +15,6 @@ * [Monogame Game Template](/template-repo) * [Flatpakify](/flatpakify-repo) * [Documentation](/../) -* [Contributing Guide](/contributing) +* Contributing Guide + * [How to Contribute](/Contributing/contributing.md) + * [Code Style](/Contributing/style-guides.md) From a1ae7c940ca2fa0d13af9eeb8ca5faba2fcaf2b8 Mon Sep 17 00:00:00 2001 From: Ella Soccoli Date: Sun, 23 Mar 2025 15:48:16 -0400 Subject: [PATCH 38/40] Expanded the gamepad page --- docs/Hardware/gamepad.md | 19 +++++++++++++++++-- docs/_sidebar.md | 4 ++-- docs/{how-it-works.md => software.md} | 0 3 files changed, 19 insertions(+), 4 deletions(-) rename docs/{how-it-works.md => software.md} (100%) diff --git a/docs/Hardware/gamepad.md b/docs/Hardware/gamepad.md index 23920dc..c1b9206 100644 --- a/docs/Hardware/gamepad.md +++ b/docs/Hardware/gamepad.md @@ -1,8 +1,23 @@ # Gamepad -// TODO: Expand on this more +The control panel on the Devcade machine contains two sets of controls, which allows for the development of two-player games. These two controllers are typically referred to as Player 1 and Player 2. Each of the two sets of controls contains an analog joystick that accepts input in the form of a 1 or a 0 in each of the 8 main directions (up, down, left, right, & the 4 diagonals). In addition, each player has 2 rows of 4 arcade buttons, which are named A1-A4 (for the top row), and B1-B4 (for the bottom row). The different buttons are also assigned a specific color to make it easier to differentiate between them while using the cabinet. Lastly, there is one menu button for each player, positioned such that the two menu buttons are next to each other in the center of the control panel. -The controls are laid out as follows: +### Button Names to Color Mapping + +##### Top Row + +The top row of buttons for both players follow the following color scheme: + +A1 - Red
+A2 - Blue
+A3 - Green
+A4 - White
+ +##### Bottom Row + +For the bottom row of buttons, all 4 of them are purple for Player 1, and all of them are yellow for Player 2. The joystick for each player also has a ball top of the same color as the bottom row of buttons for that player. + +### Control Panel Diagram ``` Player 1 Player 2 diff --git a/docs/_sidebar.md b/docs/_sidebar.md index ac31ed6..a89a9a7 100644 --- a/docs/_sidebar.md +++ b/docs/_sidebar.md @@ -6,8 +6,8 @@ * [Cabinet](/Hardware/cabinet) * [Gamepad](/Hardware/gamepad) * [Installing DCU](/Hardware/installing-dcu) -* How it Works - * [Overview](/how-it-works.md) +* Software + * [Overview](/software.md) * [Onboard Software](/onboard-repo) * [Website](/website-repo) * [Monogame Library](/library-repo) diff --git a/docs/how-it-works.md b/docs/software.md similarity index 100% rename from docs/how-it-works.md rename to docs/software.md From 0d887f45243c0d592489ada171424c4e71dda7cc Mon Sep 17 00:00:00 2001 From: Ella Soccoli Date: Sun, 23 Mar 2025 16:24:33 -0400 Subject: [PATCH 39/40] Improved the first game page --- docs/Making-games/first-game.md | 32 ++++++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/docs/Making-games/first-game.md b/docs/Making-games/first-game.md index f397129..418e9ce 100644 --- a/docs/Making-games/first-game.md +++ b/docs/Making-games/first-game.md @@ -4,10 +4,30 @@ So, you want to make a Devcade game? Well you chose the right place. We officially support and have resources for Monogame games written in C# and have community support for Bevy games written in Rust. Many other engines and frameworks have been explored and proven to work, but don't yet have full support. -- [Getting Started](/Getting-started/) -- [Monogame Template](/template-repo) -- [Monogame Library](/library-repo) -- [Flatpackify](/flatpackify-repo) -- [Rust Library](https://docs.rs/devcaders/latest/devcaders/) (Community supported) - ?> Devcade can theoretically run any executable as long as the game is formatted properly, runs on linux, and works with a few other restrictions but you will have to figure some stuff out yourself that would be done for you in one of our libraries and we make no guarantees on getting it to work. + +If any of these seem useful to you, or if you want to learn more about what each thing provides, check out the links below. + +### MonoGame Template + +The MonoGame template is a Github repository that contains a mostly empty Monogame project that you can use as a starting point for making a Devcade game. This project contains the Monogame library already initialized and added to the project, as well as code blocks that will set the aspect ratio of the game window to the aspect ratio of the current Devcade monitor. + +More details here: [Monogame Template](/template-repo) + +### Monogame Library + +The Monogame library contains two main utility classes that make it easier to adapt a Monogame game to Devcade. The first one is a static input manager class that makes it easier for your game to capture inputs from Devcade's control panel. The other one is a helper class to allow games to read and write data to pipes, allowing you to have save data that persists after the game is closed. + +More details here: [Monogame Library](/library-repo) + +### Rust Library + +Similarly to the Monogame library, the Rust library provides utility functions to make it easier to capture input from Devcade's control panel from a Bevy game. + +More details here: [Rust Library](https://docs.rs/devcaders/latest/devcaders/) (Community supported) + +### Flatpakify + +Flatpakify is a repository that makes it easy to package the publish folder of a Monogame project into a Flatpak that is compatible with Devcade. + +More details here: [Flatpakify](/flatpakify-repo) From c2c9d7283df6cc74429804e83689147f7bb53102 Mon Sep 17 00:00:00 2001 From: Ella Soccoli Date: Sun, 23 Mar 2025 16:53:33 -0400 Subject: [PATCH 40/40] Did some reorganization and de-redundancy-ifying the docs --- .../{installing-dcu.md => install-guide.md} | 0 docs/Making-games/README.md | 22 ++++++++++--- docs/Making-games/first-game.md | 33 ------------------- docs/Making-games/using-template.md | 14 -------- docs/_sidebar.md | 10 +++--- 5 files changed, 22 insertions(+), 57 deletions(-) rename docs/Hardware/{installing-dcu.md => install-guide.md} (100%) delete mode 100644 docs/Making-games/first-game.md delete mode 100644 docs/Making-games/using-template.md diff --git a/docs/Hardware/installing-dcu.md b/docs/Hardware/install-guide.md similarity index 100% rename from docs/Hardware/installing-dcu.md rename to docs/Hardware/install-guide.md diff --git a/docs/Making-games/README.md b/docs/Making-games/README.md index db61382..57d2514 100644 --- a/docs/Making-games/README.md +++ b/docs/Making-games/README.md @@ -1,18 +1,32 @@ -### Making a Game +# First Game -If you are looking to make a Devcade game, there are a couple considerations to keep in mind. +So, you want to make a Devcade game? Well you chose the right place. #### Choosing a Language -Firstly, you should think about what language you want to develop the game in. The Devcade project currently supports C# using MonoGame, as well as Rust using Bevy. We provide libraries for these languages to help make parts of the development process easier. These libraries assist with things such as interpreting Devcade inputs, reading and writing to pipes for save data, setting the proper aspect ratio, and more. +We officially support and have resources for Monogame games written in C# and have community support for Bevy games written in Rust. Many other engines and frameworks have been explored and proven to work, but don't yet have full support. + Although these are the only two languages that we "officially" support, you are not limited to only those two languages. You could theoretically make a Devcade game in whatever language you want, and it will run on Devcade as long as you build it for the appropriate system specifications. However, something to keep in mind is that since we do not have a library for other languages, you would have to figure out how to handle the things our libraries handle yourself. If you do make a game using something other than MonoGame or Bevy, we encourage you to write up some instructions on how to do the things that a library might provide for you, and open a pull request to the docs site to add your documentation. We would be happy to review it, and we would love to help you get it merged. +#### Resources + +Here are links to resources that we provide for Monogame and Bevy: + +- [Monogame Template](/template-repo) +- [Monogame Library](/library-repo) +- [Flatpakify](/flatpakify-repo) +- [Rust Library](https://docs.rs/devcaders/latest/devcaders/) (Community supported) + #### Devcade Controls -As you get started, you will want to keep in mind the details of the Devcade system you are designing for. For the CSH Devcade cabinet, you will want to note that the display is a 9:21 ultrawide monitor turned vertical (measuring 1080x2560). The computer that the CSH Devcade cabinet is running on has an 8th gen Intel processor and integrated graphics. +As you get started, you will want to keep in mind the details of the Devcade system you are designing for. For the CSH Devcade cabinet, you will want to note that the display is a 9:21 ultrawide monitor turned vertical (measuring 1080x2560). The computer that the CSH Devcade cabinet is running on has an 8th gen Intel processor and integrated graphics. + +For more specific information about the cabinet hardware, check out the [Hardware](/Hardware/) section + +### Uploading to Devcade Once youve got something playable you want to put on the cabinet, you should build and zip your game in a manner such that it is self contained and should require no runtimes or other resources. Then head over to the website, log in, and go to the upload page. There should also be instructions on that page for packaging your game. Upload the zip, banner image, and icon image and give it a name and description. If all is good you should be able to hit upload and it should work. Pressing both menu buttons will refresh the games list on the cabinet and hopefully you will see you game! diff --git a/docs/Making-games/first-game.md b/docs/Making-games/first-game.md deleted file mode 100644 index 418e9ce..0000000 --- a/docs/Making-games/first-game.md +++ /dev/null @@ -1,33 +0,0 @@ -# Making Your First Devcade Game - -So, you want to make a Devcade game? Well you chose the right place. - -We officially support and have resources for Monogame games written in C# and have community support for Bevy games written in Rust. Many other engines and frameworks have been explored and proven to work, but don't yet have full support. - -?> Devcade can theoretically run any executable as long as the game is formatted properly, runs on linux, and works with a few other restrictions but you will have to figure some stuff out yourself that would be done for you in one of our libraries and we make no guarantees on getting it to work. - -If any of these seem useful to you, or if you want to learn more about what each thing provides, check out the links below. - -### MonoGame Template - -The MonoGame template is a Github repository that contains a mostly empty Monogame project that you can use as a starting point for making a Devcade game. This project contains the Monogame library already initialized and added to the project, as well as code blocks that will set the aspect ratio of the game window to the aspect ratio of the current Devcade monitor. - -More details here: [Monogame Template](/template-repo) - -### Monogame Library - -The Monogame library contains two main utility classes that make it easier to adapt a Monogame game to Devcade. The first one is a static input manager class that makes it easier for your game to capture inputs from Devcade's control panel. The other one is a helper class to allow games to read and write data to pipes, allowing you to have save data that persists after the game is closed. - -More details here: [Monogame Library](/library-repo) - -### Rust Library - -Similarly to the Monogame library, the Rust library provides utility functions to make it easier to capture input from Devcade's control panel from a Bevy game. - -More details here: [Rust Library](https://docs.rs/devcaders/latest/devcaders/) (Community supported) - -### Flatpakify - -Flatpakify is a repository that makes it easy to package the publish folder of a Monogame project into a Flatpak that is compatible with Devcade. - -More details here: [Flatpakify](/flatpakify-repo) diff --git a/docs/Making-games/using-template.md b/docs/Making-games/using-template.md deleted file mode 100644 index 3174aa3..0000000 --- a/docs/Making-games/using-template.md +++ /dev/null @@ -1,14 +0,0 @@ -# Using the Devcade Game Template - -If you decide that you want to make a Devcade game in C# and MonoGame, then you can consider using our game template as a starting point. This template provides you with a mostly empty MonoGame project, but it has some useful libraries imported and some of the setup code is provided for you. - -## What the Template Provides - -- The C# library for Devcade is pre-installed from NuGet -- Easily modifiable code to set the game's aspect ratio and resolution -- Method call to detect user input every frame so that the program properly keeps track of what inputs are being provided -- Build scripts to easily publish the game to the format that the system expects - -## Additional Info - -For more information about the MonoGame game template, how it works, and what it provides, check [this repo](/template-repo) \ No newline at end of file diff --git a/docs/_sidebar.md b/docs/_sidebar.md index a89a9a7..0137165 100644 --- a/docs/_sidebar.md +++ b/docs/_sidebar.md @@ -1,11 +1,9 @@ * [Home](/) -* [Making Games](/Making-games/) - * [Making Your First Game](/Making-games/first-game.md) - * [Using the Game Template](/Making-games/using-template.md) +* [Making your First Game](/Making-games/) * Hardware - * [Cabinet](/Hardware/cabinet) - * [Gamepad](/Hardware/gamepad) - * [Installing DCU](/Hardware/installing-dcu) + * [Cabinet](/Hardware/cabinet.md) + * [Gamepad](/Hardware/gamepad.md) + * [Installing DCU](/Hardware/install-guide.md) * Software * [Overview](/software.md) * [Onboard Software](/onboard-repo)