diff --git a/package.json b/package.json index 2bfaa7f..acee92e 100644 --- a/package.json +++ b/package.json @@ -15,12 +15,14 @@ "dependencies": { "@mpuertadev/falconflare-client": "^0.0.5", "base-64": "^1.0.0", + "colors": "^1.4.0", "cookie-parser": "^1.4.6", "dotenv": "^16.3.1", "express": "^4.18.2", + "figlet": "^1.7.0", "helmet": "^7.1.0", - "mongoose": "^8.0.0", - "morgan": "^1.10.0", + "pino": "^9.3.2", + "pino-pretty": "^11.2.2", "pjson": "^1.0.9", "uuidv4": "^6.2.13", "yargs": "^17.7.2" diff --git a/resources/_gen/assets/css/style.scss_f120a3f402b106f64b18d498afd3d82e.content b/resources/_gen/assets/css/style.scss_f120a3f402b106f64b18d498afd3d82e.content new file mode 100644 index 0000000..72cf79e --- /dev/null +++ b/resources/_gen/assets/css/style.scss_f120a3f402b106f64b18d498afd3d82e.content @@ -0,0 +1,1170 @@ +@charset "UTF-8"; +body.light-theme, :root { + /* light theme color */ + --background: #fff; + --background-secondary: #eaeaea; + --header: #fafafa; + --color: #222; + --color-secondary: #999; + --border-color: #dcdcdc; + /* variables for js, must be the same as these in @custom-media queries */ + --phoneWidth: (max-width: 684px); + --tabletWidth: (max-width: 900px); } + +body.dark-theme { + /* dark theme colors */ + --background: #292a2d; + --background-secondary: #3b3d42; + --header: #252627; + --color: #a9a9b3; + --color-secondary: #73747b; + --border-color: #4a4b50; } + +@media (prefers-color-scheme: light) { + body:not(.dark-theme) { + /* light theme color */ + --background: #fff; + --background-secondary: #eaeaea; + --header: #fafafa; + --color: #222; + --color-secondary: #999; + --border-color: #dcdcdc; } } + +@media (prefers-color-scheme: dark) { + body:not(.light-theme) { + /* dark theme colors */ + --background: #292a2d; + --background-secondary: #3b3d42; + --header: #252627; + --color: #a9a9b3; + --color-secondary: #73747b; + --border-color: #4a4b50; } } + +/* MEDIA QUERIES */ +/* HOW TO USE */ +/*@media ($phone) {*/ +/*margin-top: 0;*/ +/*}*/ +@font-face { + font-family: 'Inter'; + font-style: normal; + font-weight: 400; + font-feature-settings: "liga", "tnum", "case", "calt", "zero", "ss01", "locl"; + src: url("../fonts/Inter-Regular.woff2") format("woff2"); + font-display: swap; } + +@font-face { + font-family: 'Inter'; + font-style: italic; + font-weight: 400; + font-feature-settings: "liga", "tnum", "case", "calt", "zero", "ss01", "locl"; + src: url("../fonts/Inter-Italic.woff2") format("woff2"); + font-display: swap; } + +@font-face { + font-family: 'Inter'; + font-style: normal; + font-weight: 600; + font-feature-settings: "liga", "tnum", "case", "calt", "zero", "ss01", "locl"; + src: url("../fonts/Inter-Medium.woff2") format("woff2"); + font-display: swap; } + +@font-face { + font-family: 'Inter'; + font-style: italic; + font-weight: 600; + font-feature-settings: "liga", "tnum", "case", "calt", "zero", "ss01", "locl"; + src: url("../fonts/Inter-MediumItalic.woff2") format("woff2"); + font-display: swap; } + +@font-face { + font-family: 'Inter'; + font-style: normal; + font-weight: 800; + font-feature-settings: "liga", "tnum", "case", "calt", "zero", "ss01", "locl"; + src: url("../fonts/Inter-Bold.woff2") format("woff2"); + font-display: swap; } + +@font-face { + font-family: 'Inter'; + font-style: italic; + font-weight: 800; + font-feature-settings: "liga", "tnum", "case", "calt", "zero", "ss01", "locl"; + src: url("../fonts/Inter-BoldItalic.woff2") format("woff2"); + font-display: swap; } + +.button-container { + display: table; + margin-left: auto; + margin-right: auto; } + +button, +.button, +a.button { + position: relative; + display: flex; + align-items: center; + justify-content: center; + padding: 8px 18px; + margin-bottom: 5px; + background: var(--background-secondary); + text-decoration: none; + text-align: center; + font-weight: 500; + border-radius: 8px; + border: 1px solid transparent; + appearance: none; + cursor: pointer; + outline: none; + /* variants */ + /* sizes */ } + button.outline, + .button.outline, + a.button.outline { + background: transparent; + border-color: var(--background-secondary); + box-shadow: none; + padding: 8px 18px; } + button.outline :hover, + .button.outline :hover, + a.button.outline :hover { + transform: none; + box-shadow: none; } + button.primary, + .button.primary, + a.button.primary { + box-shadow: 0 4px 6px rgba(50, 50, 93, 0.11), 0 1px 3px rgba(0, 0, 0, 0.08); } + button.primary:hover, + .button.primary:hover, + a.button.primary:hover { + box-shadow: 0 2px 6px rgba(50, 50, 93, 0.21), 0 1px 3px rgba(0, 0, 0, 0.08); } + button.link, + .button.link, + a.button.link { + background: none; + font-size: 1rem; } + button.small, + .button.small, + a.button.small { + font-size: .8rem; } + button.wide, + .button.wide, + a.button.wide { + min-width: 200px; + padding: 14px 24px; } + +a.read-more, +a.read-more:hover, +a.read-more:active { + display: inline-flex; + background: none; + box-shadow: none; + padding: 0; + margin: 20px 0; + font-weight: bold; } + +.code-toolbar { + margin-bottom: 20px; } + .code-toolbar .toolbar-item a { + position: relative; + display: inline-flex; + align-items: center; + justify-content: center; + padding: 3px 8px; + margin-bottom: 5px; + background: var(--background-secondary); + text-decoration: none; + text-align: center; + font-size: 13px; + font-weight: 500; + border-radius: 8px; + border: 1px solid transparent; + appearance: none; + cursor: pointer; + outline: none; } + +.header { + background: var(--header); + display: flex; + align-items: center; + justify-content: center; + position: relative; + padding: 20px; } + .header__right { + display: flex; + flex-direction: row; + align-items: center; } + @media (max-width: 684px) { + .header__right { + flex-direction: row-reverse; } } + .header__inner { + display: flex; + align-items: center; + justify-content: space-between; + margin: 0 auto; + width: 760px; + max-width: 100%; } + +.theme-toggle { + display: flex; + align-items: center; + justify-content: center; + line-height: 1; + cursor: pointer; } + +.theme-toggler { + fill: currentColor; } + +.logo { + display: flex; + align-items: center; + flex: 0 0 auto; + text-decoration: none; + font-weight: bold; } + .logo img { + height: 44px; } + .logo__mark { + display: inline-flex; + align-items: center; + margin-right: 5px; } + .logo__mark .greater-icon { + width: 0.95rem; + height: 100%; } + .logo__mark .greater-icon path { + stroke: currentColor; + stroke-width: 8px; } + .logo__text { + font-size: 1.125rem; } + .logo__cursor { + display: inline-block; + width: 10px; + height: 1rem; + background: #27aff8; + margin-left: 5px; + border-radius: 1px; + animation: cursor 1s infinite; } + +@keyframes cursor { + 0% { + opacity: 0; } + 50% { + opacity: 1; } + 100% { + opacity: 0; } } + +.menu-trigger { + display: flex; + flex-direction: row; + align-items: center; + gap: 10px; } + +@media (max-width: 684px) { + .menu-trigger { + margin-right: 10px; } } + +.menu { + --color: rgba(0, 0, 0, .12); + --shadow: 0 8px 20px var(--color); + border-right: 1px solid; + margin-right: 18px; + padding-right: 24px; + font-weight: 500; + position: absolute; + background: var(--header); + box-shadow: var(--shadow); + margin: 0; + padding: 5px; + list-style: none; + border-radius: 5px; + z-index: 99; + border: none; + top: 50px; } + @media (max-width: 684px) { + .menu { + right: 30px; } } + .menu a { + text-decoration: none; } + .menu__inner { + display: flex; + align-items: center; + justify-content: flex-end; + flex-wrap: wrap; + list-style: none; + margin: 0; + padding: 0; + flex-direction: column; + align-items: flex-start; + padding: 0; } + @media (max-width: 684px) { + .menu__inner--desktop { + display: block; } } + .menu__inner--mobile { + display: none; } + @media (max-width: 684px) { + .menu__inner--mobile { + display: block; } } + .menu__inner li { + text-align: left; + flex: 0 0 auto; } + .menu__inner li:not(:first-of-type) { + margin-left: 20px; } + .menu__inner li { + margin-left: 0 !important; + padding: 10px; } + .menu__sub-inner { + position: relative; + list-style: none; + padding: 0; + margin: 0; } + .menu__sub-inner:not(:only-child) { + margin-left: 20px; } + .menu__sub-inner-more { + position: absolute; + background: var(--header); + box-shadow: var(--shadow); + margin: 0; + padding: 5px; + list-style: none; + border-radius: 5px; + z-index: 99; + top: 35px; + left: 0; } + .menu__sub-inner-more-trigger { + display: inline-flex; + align-items: center; + user-select: none; + cursor: pointer; } + .menu__sub-inner-more-trigger-icon { + display: inline-flex; + align-items: center; + margin-left: 3px; + transform: rotate(90deg); + line-height: 1; } + .menu__sub-inner-more-trigger-icon .greater-icon { + width: 0.95rem; + height: 100%; } + .menu__sub-inner-more-trigger-icon .greater-icon path { + stroke: currentColor; + stroke-width: 5px; } + .menu__inner .menu__sub-inner-more li { + margin-left: 0; + white-space: nowrap; } + .menu__inner .menu__sub-inner-more li:hover { + background: rgba(0, 0, 0, 0.05); + border-radius: 3px; + cursor: pointer; } + .menu__sub-inner-more li a { + width: 100%; + display: inline-block; + padding: 10px; } + .menu-trigger { + height: 24px; + fill: currentColor; + margin-left: 10px; + cursor: pointer; } + +html { + box-sizing: border-box; } + +*, +*:before, +*:after { + box-sizing: inherit; } + +body { + margin: 0; + padding: 0; + font-family: 'Inter', -apple-system, BlinkMacSystemFont, "Roboto", "Segoe UI", Helvetica, Arial, sans-serif; + font-size: 1rem; + font-weight: 500; + font-feature-settings: "liga", "tnum", "case", "calt", "zero", "ss01", "locl"; + line-height: 1.54; + background-color: var(--background); + color: var(--color); + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -webkit-overflow-scrolling: touch; + -webkit-text-size-adjust: 100%; } + @media (max-width: 684px) { + body { + font-size: 1rem; } } +.post a { + color: #27aff8; } + +.menu-selected-lang { + color: #27aff8; + font-weight: 900; } + +.post-title { + color: #27aff8; } + +.current-language { + display: block !important; } + +.langChange:hover { + cursor: pointer; } + +h1, h2, h3, h4, h5, h6 { + line-height: 1.3; } + +h1 { + font-size: 2.625rem; } + +h2 { + font-size: 1.625rem; } + +h3 { + font-size: 1.375rem; } + +h4 { + font-size: 1.125rem; } + +@media (max-width: 684px) { + h1 { + font-size: 2rem; } + h2 { + font-size: 1.4rem; } + h3 { + font-size: 1.15rem; } + h4 { + font-size: 1.125rem; } } + +a { + color: inherit; } + +img { + display: block; + max-width: 100%; } + img.left { + margin-right: auto; } + img.center { + margin-left: auto; + margin-right: auto; } + img.right { + margin-left: auto; } + +figure { + display: table; + max-width: 100%; + margin: 25px 0; } + figure.left { + margin-right: auto; } + figure.center { + margin-left: auto; + margin-right: auto; } + figure.right { + margin-left: auto; } + figure figcaption { + font-size: .9rem; + margin-top: 5px; + opacity: .8; } + figure figcaption.left { + text-align: left; } + figure figcaption.center { + text-align: center; } + figure figcaption.right { + text-align: right; } + +code, kbd { + font-family: Consolas,Monaco,Andale Mono,Ubuntu Mono,monospace; + background: var(--background-secondary); + padding: 1px 6px; + margin: 0 2px; + border-radius: 5px; + font-size: .9em; + font-weight: normal; + font-feature-settings: normal; } + code code, code kbd, kbd code, kbd kbd { + background: transparent; + padding: 0; + margin: 0; } + +pre { + font-feature-settings: normal; + background: #212020; + padding: 20px; + border-radius: 8px; + font-size: .9rem; + overflow: auto; } + @media (max-width: 684px) { + pre { + white-space: pre-wrap; + word-wrap: break-word; } } + pre code { + font-feature-settings: normal; + background: none !important; + color: #ccc; + margin: 0; + padding: 0; + font-size: inherit; } + +blockquote { + border-left: 2px solid; + margin: 40px; + padding: 10px 20px; } + @media (max-width: 684px) { + blockquote { + margin: 10px; + padding: 10px; } } + blockquote:before { + content: '”'; + font-family: Georgia, serif; + font-size: 3.875rem; + position: absolute; + left: -40px; + top: -20px; } + blockquote p:first-of-type { + margin-top: 0; } + blockquote p:last-of-type { + margin-bottom: 0; } + +/* Fix for gist integration */ +table:not(.js-file-line-container) { + table-layout: fixed; + border-collapse: collapse; + width: 100%; + margin: 40px 0; + border-radius: 5px; } + +/* Fix for gist integration */ +table, th, td:not(.js-line-number) { + border: 1px solid; + padding: 10px; } + +th { + background: var(--background-secondary); } + +ul, ol { + margin-left: 40px; + padding: 0; } + @media (max-width: 684px) { + ul, ol { + margin-left: 20px; } } +ol ol { + list-style-type: lower-alpha; } + +.container { + display: flex; + flex-direction: column; + justify-content: center; } + +.content { + display: flex; + flex-direction: column; + flex: 1 auto; + align-items: center; + justify-content: center; + margin: 50px 0; } + @media (max-width: 684px) { + .content { + margin-top: 0; } } +hr { + width: 100%; + border: none; + background: var(--border-color); + height: 1px; } + +.hidden { + display: none; } + +.framed { + padding: 50px; + margin: 0 -50px 40px; + border-radius: 10px; + border: 1px solid var(--border-color); + width: 100%; + max-width: 860px; } + @media (max-width: 900px) { + .framed { + width: auto; + max-width: 680px; + margin: 20px 20px 40px; + padding: 30px; } } +blockquote.twitter-tweet { + background: rgba(44, 124, 186, 0.1); + border: none; + padding: 30px; + color: inherit; + font-size: inherit; + line-height: inherit; + border-radius: 8px; } + +.h-anchor { + margin-left: 1px; + color: var(--color-secondary); + text-decoration: none; + visibility: hidden; + opacity: 0; + transition: visibility 0s linear 0.1s, opacity 0.1s linear; } + +h1:hover a, +h2:hover a, +h3:hover a, +h4:hover a { + visibility: visible; + opacity: 1; + transition-delay: 0s; } + +.framed .h-anchor { + visibility: hidden; } + +.post { + width: 100%; + max-width: 800px; + text-align: left; + padding: 20px; + margin: 20px auto; } + @media (max-width: 900px) { + .post { + max-width: 660px; } } + .post:not(:last-of-type) { + border-bottom: 1px solid var(--border-color); } + .post-meta { + font-size: 1rem; + margin-bottom: 10px; } + @media (max-width: 684px) { + .post-meta { + font-size: .85rem; } } + .post-title { + font-size: 2.625rem; + margin: 0 0 20px; } + @media (max-width: 684px) { + .post-title { + font-size: 2rem; } } + .post-title a { + text-decoration: none; } + .post-tags { + display: block; + margin-bottom: 20px; + font-size: 1rem; + opacity: .5; } + .post-tags a { + text-decoration: none; } + .post-content { + margin-top: 30px; } + .post-cover { + margin: 40px -50px; + width: 860px; + max-width: 860px; } + .post-cover img { + margin: 0 auto; + border-radius: 8px; + box-shadow: 0 12px 40px rgba(0, 0, 0, 0.15); } + @media (max-width: 900px) { + .post-cover { + margin: 20px 0; + width: 100%; } } +.post--regulation h1 { + justify-content: center; } + +.post--regulation h2 { + justify-content: center; + margin-bottom: 10px; } + .post--regulation h2 + h2 { + margin-top: -10px; + margin-bottom: 20px; } + +.pagination { + margin-top: 50px; } + .pagination__title { + display: flex; + text-align: center; + position: relative; + margin: 100px 0 20px; } + .pagination__title-h { + text-align: center; + margin: 0 auto; + padding: 5px 10px; + background: var(--background); + color: var(--color-secondary); + font-size: .8rem; + text-transform: uppercase; + text-decoration: none; + letter-spacing: .1em; + z-index: 1; } + .pagination__title hr { + position: absolute; + left: 0; + right: 0; + width: 100%; + margin-top: 15px; + z-index: 0; } + .pagination__buttons { + display: flex; + align-items: center; + justify-content: center; } + .pagination__buttons a { + text-decoration: none; + font-weight: bold; } + +.button { + position: relative; + display: inline-flex; + align-items: center; + justify-content: center; + background: var(--background-secondary); + font-size: 1rem; + font-weight: 500; + border-radius: 8px; + max-width: 40%; + padding: 0; + cursor: pointer; + appearance: none; } + .button + .button { + margin-left: 10px; } + .button a { + display: flex; + padding: 8px 16px; + text-decoration: none; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; } + .button__text { + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; } + .button.next .button__icon { + margin-left: 8px; } + .button.previous .button__icon { + margin-right: 8px; } + +.footer { + padding: 40px 20px; + flex-grow: 0; + color: var(--color-secondary); } + .footer__inner { + display: flex; + align-items: center; + justify-content: space-between; + margin: 0 auto; + width: 760px; + max-width: 100%; } + @media (max-width: 900px) { + .footer__inner { + flex-direction: column; } } + .footer a { + color: inherit; } + .footer .copyright { + display: flex; + flex-direction: row; + align-items: center; + font-size: 1rem; } + .footer .copyright--user { + margin: auto; + text-align: center; } + .footer .copyright > *:first-child:not(:only-child) { + border-right: 1px solid; + padding-right: 10px; + margin-right: 10px; } + @media (max-width: 900px) { + .footer .copyright > *:first-child:not(:only-child) { + border: none; + padding: 0; + margin: 0; } } + @media (max-width: 900px) { + .footer .copyright { + flex-direction: column; + margin-top: 10px; } } +.cookie-consent { + position: relative; + animation: slide-in 1s ease-in-out forwards; + position: fixed; + bottom: 0; + width: 100%; + height: 70px; + display: flex; + align-items: center; + justify-content: center; + box-sizing: border-box; + padding: 8px 16px 8px 16px; + background-color: #242627; + color: white; } + +.cookie-consent-info { + display: flex; + height: 100%; + align-items: center; } + +.cookie-consent-cta { + display: flex; + height: 100%; + width: 200px; + align-items: center; } + +.cookie-consent-cta button { + width: 90px; + height: 30px; + border: none; + border-radius: 0px; + font-size: 14px; } + +.cta-accept { + margin-left: 10px; + color: white; + background-color: #26b1ff; } + +@media screen and (max-width: 934px) { + .cookie-consent { + flex-direction: column; + height: auto; } + .cookie-consent-info { + margin-bottom: 8px; } + #cookies-policy-url { + display: block; } } + +.hide-out { + display: none; } + +@keyframes slide-in { + from { + transform: translateY(100%); } + to { + transform: translateY(0); } } + +.terms { + width: 100%; + max-width: 800px; + text-align: left; + padding: 20px; + margin: 0 auto; } + .terms__list { + padding: 0; + padding-left: 20px; + margin: 0; } + .terms__list a { + text-decoration: none; } + .terms__term { + margin-bottom: 15px; } + .terms__term-count { + background: var(--background-secondary); + font-size: 12px; + margin-left: 5px; + padding: 2px 10px; + border-radius: 5px; + text-decoration: none; } + +.archive { + width: 100%; + max-width: 800px; + text-align: left; + padding: 20px; + margin: 0 auto; } + .archive__group-month { + display: flex; + align-items: flex-start; + padding: 10px 0; } + @media (max-width: 684px) { + .archive__group-month { + flex-direction: column; } } + .archive__group-month:not(:last-of-type) { + border-bottom: 1px solid var(--border-color); } + .archive__group-year { + margin-top: 40px; } + @media (max-width: 684px) { + .archive__group-year { + margin-top: 20px; } } + .archive__group-year:not(:last-of-type) { + border-bottom: 1px solid var(--border-color); } + .archive__group-year-header { + margin: 10px 0; } + .archive__group-month-header { + margin: 25px 0; + width: 200px; + opacity: .5; } + @media (max-width: 684px) { + .archive__group-month-header { + margin: 10px 0 0; } } + .archive__group-posts { + width: 100%; } + .archive__post { + padding: 20px 0; } + .archive__post:not(:last-of-type) { + border-bottom: 1px solid var(--border-color); } + .archive__post-title { + margin: 5px 0; } + .archive__post-title a { + display: block; + text-decoration: none; } + +/* PrismJS 1.15.0 +https://prismjs.com/download.html#themes=prism-tomorrow&languages=markup+css+clike+javascript+actionscript+apacheconf+applescript+c+csharp+bash+cpp+coffeescript+ruby+csp+css-extras+diff+django+docker+elixir+elm+markup-templating+erlang+fsharp+flow+git+go+graphql+less+handlebars+haskell+http+java+json+kotlin+latex+markdown+makefile+objectivec+ocaml+perl+php+php-extras+sql+processing+scss+python+jsx+typescript+reason+textile+rust+sass+stylus+scheme+pug+swift+yaml+haml+toml+twig+tsx+vim+visual-basic+wasm&plugins=line-numbers+toolbar+jsonp-highlight+command-line+copy-to-clipboard */ +/** + * prism.js tomorrow night eighties for JavaScript, CoffeeScript, CSS and HTML + * Based on https://github.com/chriskempson/tomorrow-theme + * @author Rose Pritchard + */ +code[class*="language-"], +pre[class*="language-"] { + background: none; + font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + /* line-height: 1.5; */ + -moz-tab-size: 4; + -o-tab-size: 4; + tab-size: 4; + -webkit-hyphens: none; + -moz-hyphens: none; + -ms-hyphens: none; + hyphens: none; } + +/* Code blocks */ +pre[class*="language-"] { + padding: 1em; + margin: .5em 0; + overflow: auto; } + +:not(pre) > code[class*="language-"], +pre[class*="language-"] { + background: #212020 !important; + color: inherit !important; + border-radius: 8px; } + +/* Inline code */ +:not(pre) > code[class*="language-"] { + padding: .1em; + border-radius: .3em; + white-space: normal; } + +.token.comment, +.token.block-comment, +.token.prolog, +.token.doctype, +.token.cdata { + color: rgba(255, 255, 255, 0.4); } + +.token.punctuation { + color: #a9a9b3; } + +.token.tag, +.token.attr-name, +.token.namespace, +.token.deleted { + color: #e2777a; } + +.token.function-name { + color: #6196cc; } + +.token.boolean, +.token.number, +.token.function { + color: #f08d49; } + +.token.property, +.token.class-name, +.token.constant, +.token.symbol { + color: #f8c555; } + +.token.selector, +.token.important, +.token.atrule, +.token.keyword, +.token.builtin { + color: #cc99cd; } + +.token.string, +.token.char, +.token.attr-value, +.token.regex, +.token.variable { + color: #7ec699; } + +.token.operator, +.token.entity, +.token.url { + color: #67cdcc; } + +.token.important, +.token.bold { + font-weight: bold; } + +.token.italic { + font-style: italic; } + +.token.entity { + cursor: help; } + +.token.inserted { + color: green; } + +pre[class*="language-"].line-numbers { + position: relative; + padding-left: 3.8em; + counter-reset: linenumber; } + +pre[class*="language-"].line-numbers > code { + position: relative; + white-space: inherit; } + +.line-numbers .line-numbers-rows { + position: absolute; + pointer-events: none; + top: 0; + font-size: 100%; + left: -3.8em; + width: 3em; + /* works for line-numbers below 1000 lines */ + letter-spacing: -1px; + border-right: 1px solid #999; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; } + +.line-numbers-rows > span { + pointer-events: none; + display: block; + counter-increment: linenumber; } + +.line-numbers-rows > span:before { + content: counter(linenumber); + color: #999; + display: block; + padding-right: 0.8em; + text-align: right; } + +div.code-toolbar { + position: relative; } + +div.code-toolbar > .toolbar { + position: absolute; + top: .3em; + right: .2em; + transition: opacity 0.3s ease-in-out; + opacity: 0; } + +div.code-toolbar:hover > .toolbar { + opacity: 1; } + +div.code-toolbar > .toolbar .toolbar-item { + display: inline-block; } + +div.code-toolbar > .toolbar a { + cursor: pointer; } + +div.code-toolbar > .toolbar button { + background: none; + border: 0; + color: inherit; + font: inherit; + line-height: normal; + overflow: visible; + padding: 0; + -webkit-user-select: none; + /* for button */ + -moz-user-select: none; + -ms-user-select: none; } + +div.code-toolbar > .toolbar a, +div.code-toolbar > .toolbar button, +div.code-toolbar > .toolbar span { + color: #bbb; + font-size: .8em; + padding: 0 .5em; + background: #f5f2f0; + background: rgba(224, 224, 224, 0.2); + box-shadow: 0 2px 0 0 rgba(0, 0, 0, 0.2); + border-radius: .5em; } + +div.code-toolbar > .toolbar a:hover, +div.code-toolbar > .toolbar a:focus, +div.code-toolbar > .toolbar button:hover, +div.code-toolbar > .toolbar button:focus, +div.code-toolbar > .toolbar span:hover, +div.code-toolbar > .toolbar span:focus { + color: inherit; + text-decoration: none; } + +.command-line-prompt { + border-right: 1px solid #999; + display: block; + float: left; + font-size: 100%; + letter-spacing: -1px; + margin-right: 1em; + pointer-events: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; } + +.command-line-prompt > span:before { + color: #999; + content: ' '; + display: block; + padding-right: 0.8em; } + +.command-line-prompt > span[data-user]:before { + content: "[" attr(data-user) "@" attr(data-host) "] $"; } + +.command-line-prompt > span[data-user="root"]:before { + content: "[" attr(data-user) "@" attr(data-host) "] #"; } + +.command-line-prompt > span[data-prompt]:before { + content: attr(data-prompt); } + +.collapsable-code { + position: relative; + width: 100%; + margin: 40px 0; } + .collapsable-code input[type="checkbox"] { + position: absolute; + visibility: hidden; } + .collapsable-code input[type="checkbox"]:checked ~ pre, + .collapsable-code input[type="checkbox"]:checked ~ .code-toolbar pre { + height: 0; + padding: 0; + border-top: none; } + .collapsable-code input[type="checkbox"]:checked ~ .code-toolbar { + padding: 0; + border-top: none; } + .collapsable-code input[type="checkbox"]:checked ~ .code-toolbar .toolbar { + display: none; } + .collapsable-code input[type="checkbox"]:checked ~ label { + border-radius: 10px; } + .collapsable-code input[type="checkbox"]:checked ~ label .collapsable-code__toggle:after { + content: attr(data-label-expand); } + .collapsable-code label { + position: relative; + display: flex; + justify-content: space-between; + background: var(--background-secondary); + padding: 10px; + border-top-left-radius: 10px; + border-top-right-radius: 10px; + min-width: 30px; + min-height: 30px; + margin: 0; + cursor: pointer; } + .collapsable-code__title { + flex: 1; + color: var(--color); + padding: 3px 10px; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; } + .collapsable-code__language { + background: var(--background); + color: var(--color); + border-radius: 10px; + padding: 3px 10px; } + .collapsable-code__toggle { + color: var(--color); + font-size: 16px; + padding: 3px 10px; } + .collapsable-code__toggle:after { + content: attr(data-label-collapse); } + .collapsable-code pre { + margin-top: 0; + border-top-left-radius: 0; + border-top-right-radius: 0; } + .collapsable-code pre::first-line { + line-height: 0; } + .collapsable-code code::first-line { + line-height: 0; } + .collapsable-code .code-toolbar { + margin: 0; } diff --git a/resources/_gen/assets/css/style.scss_f120a3f402b106f64b18d498afd3d82e.json b/resources/_gen/assets/css/style.scss_f120a3f402b106f64b18d498afd3d82e.json new file mode 100644 index 0000000..76fb9f2 --- /dev/null +++ b/resources/_gen/assets/css/style.scss_f120a3f402b106f64b18d498afd3d82e.json @@ -0,0 +1 @@ +{"Target":"/css/style.css","MediaType":"text/css","Data":{}} \ No newline at end of file diff --git a/src/app.js b/src/app.js index 6bed621..90bb411 100644 --- a/src/app.js +++ b/src/app.js @@ -1,13 +1,12 @@ require('dotenv').config(); const express = require('express'); const path = require('path'); -const pjson = require('pjson'); const cookieParser = require("cookie-parser"); -const morgan = require('morgan'); const helmet = require('helmet'); -const Falconflare = require('@mpuertadev/falconflare-client'); const app = express(); -const { assignId, skipStatics, skipStatusServer } = require('./middlewares/morgan'); +const logger = require('./middlewares/logger'); +const { launchLog } = require("./utils/logger.js") +const { statusRoute } = require('./routes/routes.js'); const PORT = process.env.PORT || 3000; app.use(express.json()) @@ -15,53 +14,8 @@ app.use(cookieParser()); app.use(helmet({ contentSecurityPolicy: false })); -morgan.token('user-ip', function(req) { - return process.env.ENV == "prod" ? req.headers['x-real-ip'] : req.ip; -}); -morgan.token('accepted-cookies', function(req) { - return Boolean(req.cookies['cookie-accepted']); -}); -app.use(async function getLocation(req, res, next) { - const ffclient = new Falconflare({serverUrl: process.env.FF_URL, accessKey: process.env.FF_PASSWD}) - let ipData; - try { - const ip = process.env.ENV == "prod" ? req.headers['x-real-ip'] : req.ip; - data = await ffclient.getIpData(ip); - } catch (error) { - console.error('Error fetching IP location:', error); - ipData = { country_name: 'Unknown || Error fetching', city: 'Unknown || Error fetching' }; - } - req.location = `${ipData?.city}, ${ipData?.country_name}`; - next(); -}); - -morgan.token('location', function(req) { - return req.location; -}); - -morgan.token('id', function getId(req) { - return req.id; -}); - -app.use(assignId); -app.use( - morgan('{ \n Request ID: :id \n Request IP: :user-ip \n Request location: :location \n Method: :method \n Route: :url \n Status code: :status \n Response time: :response-time \n Accepted Cookies: :accepted-cookies \n}', { - skip: function (req, res) { - return skipStatics(req, res) || skipStatusServer(req, res); - } - }) -); - -app.get('/status', (req, res) => { - res.json({ - Status: 'OK', - 'Runtime-Mode': process.env.ENV == 'pro' ? 'Production' : 'Development', - 'Application-Version': pjson.version, - 'Application-Description': 'migtarx.com BLOG', - 'Application-Author': 'miguel@mpuerta.dev', - 'Application-Owner': 'Miguel Puerta', - }); -}); +app.use(logger); +app.use('/status', statusRoute); app.use(express.static(path.join(__dirname, 'public'))); @@ -70,6 +24,6 @@ app.get('*', function(req, res){ }); app.listen(PORT, async() => { - console.log(`Server listening in port ${PORT}`); + await launchLog(PORT, "none"); }); diff --git a/src/controllers/index.js b/src/controllers/index.js new file mode 100644 index 0000000..9e2c2d7 --- /dev/null +++ b/src/controllers/index.js @@ -0,0 +1,5 @@ +const statusController = require('./status.controller'); + +module.exports = { + statusController +}; \ No newline at end of file diff --git a/src/controllers/status.controller.js b/src/controllers/status.controller.js new file mode 100644 index 0000000..db59231 --- /dev/null +++ b/src/controllers/status.controller.js @@ -0,0 +1,30 @@ +require('dotenv').config(); +const pjson = require('pjson'); +const execMode = process.env.ENV; + +module.exports = { + getStatus, + getStatusHeartBeat +}; + +function getServerStatusData(isHeartBeat = false){ + const statusInformation = { + Status: 'OK', + 'Runtime-Mode': execMode == 'prod' ? 'Production' : 'Development', + 'Application-Description': 'migtarx.com BLOG', + 'Application-Author': 'miguel@mpuerta.dev', + 'Application-Owner': 'Miguel Puerta', + } + if (!isHeartBeat) { + statusInformation['Application-Version'] = pjson.version; + } + return statusInformation; +} + +function getStatus(req, res) { + return res.json(getServerStatusData()); +} + +function getStatusHeartBeat(req, res) { + return res.json(getServerStatusData(true)); +} \ No newline at end of file diff --git a/src/middlewares/logger.js b/src/middlewares/logger.js new file mode 100644 index 0000000..be86487 --- /dev/null +++ b/src/middlewares/logger.js @@ -0,0 +1,40 @@ +const { logger } = require('../utils/logger'); +const { v4: uuidv4 } = require('uuid'); +const Falconflare = require('@mpuertadev/falconflare-client'); +const statusServerIp = process.env.STATUS_SERVER_IP +const ffclient = new Falconflare({serverUrl: process.env.FF_URL, accessKey: process.env.FF_PASSWD}) +const { isStatic } = require('../utils/utils') + +const logRequest = async (req, res, next) => { + const { method, ip } = req; + const userIp = req.headers['x-real-ip'] || ip; + const isStaticRoute = isStatic(req); + + if (userIp !== statusServerIp && !isStaticRoute){ + const url = req.originalUrl || req.url; + const ipData = await ffclient.getIpData(ip); + const userLocation = `${ipData.city}, ${ipData.country}` + const requestId = uuidv4(); + const start = process.hrtime(); + const space = " " + + res.on('finish', () => { + const [seconds, nanoseconds] = process.hrtime(start); + const durationInMilliseconds = (seconds * 1000 + nanoseconds / 1e6).toFixed(3); + const message = `\n{\n${space}ID: ${requestId}\n${space}Method: ${method}\n${space}Route: ${url}\n${space}Request IP: ${userIp}\n${space}Request Location: ${userLocation}\n${space}Status: ${res.statusCode}\n${space}Response time: ${durationInMilliseconds}ms\n}`; + if (isSuccessfulStatusCode(res.statusCode)){ + logger.info(message); + } else { + logger.warn(message); + } + }); + } + + next(); +}; + +const isSuccessfulStatusCode = (statusCode) => { + return statusCode >= 200 && statusCode < 400; +}; + +module.exports = logRequest; diff --git a/src/routes/routes.js b/src/routes/routes.js new file mode 100644 index 0000000..898b28d --- /dev/null +++ b/src/routes/routes.js @@ -0,0 +1,5 @@ +const statusRoute = require('./status.route.js'); + +module.exports = { + statusRoute +}; \ No newline at end of file diff --git a/src/routes/status.route.js b/src/routes/status.route.js new file mode 100644 index 0000000..73eefc9 --- /dev/null +++ b/src/routes/status.route.js @@ -0,0 +1,9 @@ +const express = require('express'); +const statusRouter = express.Router(); +const { statusController } = require('../controllers'); + +statusRouter.get('/', statusController.getStatus); + +statusRouter.get('/heartbeat', statusController.getStatusHeartBeat); + +module.exports = statusRouter; \ No newline at end of file diff --git a/src/utils/logger.js b/src/utils/logger.js new file mode 100644 index 0000000..6606254 --- /dev/null +++ b/src/utils/logger.js @@ -0,0 +1,29 @@ +require('dotenv').config(); +const pino = require("pino"); +const figlet = require("figlet"); +const pjson = require('pjson'); +const colors = require('colors') +const isProduction = process.env.ENV === "prod"; +const runtimeMode = isProduction ? "Production" : "Development"; + +const logger = pino({ + level: process.env.LOG_LEVEL || "info", + transport: { + target: "pino-pretty", + options: { colorize: true, translateTime: "SYS:dd/mm/yyyy - HH:MM:ss" }, + }, +}); + +async function launchLog(port, dbConnectionType) { + await figlet("MIGTARX'S BLOG", function (err, data) { + console.log(data); + }); + console.log("Version: ".cyan + pjson.version) + console.log("Server port: ".cyan + port.green) + if (dbConnectionType !== "none"){ + console.log(`Database connection: `.cyan + (dbConnectionType === 'local'? dbConnectionType.green : dbConnectionType.magenta)) + } + console.log("Runtime mode: ".cyan + (isProduction ? runtimeMode.red : runtimeMode.gray)) +} + +module.exports = {logger, launchLog}; diff --git a/src/utils/utils.js b/src/utils/utils.js new file mode 100644 index 0000000..19c1717 --- /dev/null +++ b/src/utils/utils.js @@ -0,0 +1,11 @@ +const staticExtensions = ['.css', '.png', '.ttf', '.woff', '.woff2', '.jpg', '.jpeg', '.gif', '.js', '.html', '.ico']; + +function isStatic(req){ + const url = req.originalUrl || req.url; + const isStaticRoute = staticExtensions.some(ext => url.endsWith(ext)); + return isStaticRoute; +} + +module.exports = { + isStatic +} \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 84938d6..c5ebd45 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,17 +2,10 @@ # yarn lockfile v1 -"@mongodb-js/saslprep@^1.1.5": - version "1.1.8" - resolved "https://registry.yarnpkg.com/@mongodb-js/saslprep/-/saslprep-1.1.8.tgz#d39744540be8800d17749990b0da95b4271840d1" - integrity sha512-qKwC/M/nNNaKUBMQ0nuzm47b7ZYWQHN3pcXq4IIcoSBc2hOIrflAxJduIvvqmhoz3gR2TacTAs8vlsCVPkiEdQ== - dependencies: - sparse-bitfield "^3.0.3" - -"@mpuertadev/falconflare-client@^0.0.4": - version "0.0.4" - resolved "https://npm.pkg.github.com/download/@mpuertadev/falconflare-client/0.0.4/90cc79d35b720d127906784749dc11cbc879bf79#90cc79d35b720d127906784749dc11cbc879bf79" - integrity sha512-/qRQtiic0xqwyW7BGdS+gRK9nSqdqDBhrr7cryWXpjLDL9JNLRRe4jnXoU055cKYB1OkVyx9LueRO9F+sJE7nw== +"@mpuertadev/falconflare-client@^0.0.5": + version "0.0.5" + resolved "https://npm.pkg.github.com/download/@mpuertadev/falconflare-client/0.0.5/bc82b35a933ed83428fd96462d4bbd801cfba5cf#bc82b35a933ed83428fd96462d4bbd801cfba5cf" + integrity sha512-NuyDlJb0DdZcgrGrhGo63LNkNuRjTuounRRfHRgzZqB4iYxtNHPPXcylQs6vZlDt3Wl2S2KQ4eScwJvnmQxK+g== dependencies: node-fetch "^2.7.0" @@ -21,17 +14,12 @@ resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-8.3.4.tgz#bd86a43617df0594787d38b735f55c805becf1bc" integrity sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw== -"@types/webidl-conversions@*": - version "7.0.3" - resolved "https://registry.yarnpkg.com/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz#1306dbfa53768bcbcfc95a1c8cde367975581859" - integrity sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA== - -"@types/whatwg-url@^11.0.2": - version "11.0.5" - resolved "https://registry.yarnpkg.com/@types/whatwg-url/-/whatwg-url-11.0.5.tgz#aaa2546e60f0c99209ca13360c32c78caf2c409f" - integrity sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ== +abort-controller@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" + integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== dependencies: - "@types/webidl-conversions" "*" + event-target-shim "^5.0.0" accepts@~1.3.8: version "1.3.8" @@ -58,17 +46,20 @@ array-flatten@1.1.1: resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== +atomic-sleep@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/atomic-sleep/-/atomic-sleep-1.0.0.tgz#eb85b77a601fc932cfe432c5acd364a9e2c9075b" + integrity sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ== + base-64@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/base-64/-/base-64-1.0.0.tgz#09d0f2084e32a3fd08c2475b973788eee6ae8f4a" integrity sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg== -basic-auth@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.1.tgz#b998279bf47ce38344b4f3cf916d4679bbf51e3a" - integrity sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg== - dependencies: - safe-buffer "5.1.2" +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== body-parser@1.20.2: version "1.20.2" @@ -88,10 +79,13 @@ body-parser@1.20.2: type-is "~1.6.18" unpipe "1.0.0" -bson@^6.7.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/bson/-/bson-6.8.0.tgz#5063c41ba2437c2b8ff851b50d9e36cb7aaa7525" - integrity sha512-iOJg8pr7wq2tg/zSlCCHMi3hMm5JTOxLTagf3zxhcenHsFp+c6uOs6K7W5UE7A4QIJGtqh/ZovFNMP4mOPJynQ== +buffer@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" bytes@3.1.2: version "3.1.2" @@ -130,6 +124,16 @@ color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +colorette@^2.0.7: + version "2.0.20" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" + integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== + +colors@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" + integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== + content-disposition@0.5.4: version "0.5.4" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" @@ -165,6 +169,11 @@ cookie@0.6.0: resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.6.0.tgz#2798b04b071b0ecbff0dbb62a505a8efa4e19051" integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw== +dateformat@^4.6.3: + version "4.6.3" + resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-4.6.3.tgz#556fa6497e5217fedb78821424f8a1c22fa3f4b5" + integrity sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA== + debug@2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -172,13 +181,6 @@ debug@2.6.9: dependencies: ms "2.0.0" -debug@4.x: - version "4.3.6" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.6.tgz#2ab2c38fbaffebf8aa95fdfe6d88438c7a13c52b" - integrity sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg== - dependencies: - ms "2.1.2" - define-data-property@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" @@ -188,7 +190,7 @@ define-data-property@^1.1.4: es-errors "^1.3.0" gopd "^1.0.1" -depd@2.0.0, depd@~2.0.0: +depd@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== @@ -218,6 +220,13 @@ encodeurl@~1.0.2: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== +end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + es-define-property@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" @@ -245,6 +254,16 @@ etag@~1.8.1: resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== +event-target-shim@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" + integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== + +events@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + express@^4.18.2: version "4.19.2" resolved "https://registry.yarnpkg.com/express/-/express-4.19.2.tgz#e25437827a3aa7f2a827bc8171bbbb664a356465" @@ -282,6 +301,26 @@ express@^4.18.2: utils-merge "1.0.1" vary "~1.1.2" +fast-copy@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/fast-copy/-/fast-copy-3.0.2.tgz#59c68f59ccbcac82050ba992e0d5c389097c9d35" + integrity sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ== + +fast-redact@^3.1.1: + version "3.5.0" + resolved "https://registry.yarnpkg.com/fast-redact/-/fast-redact-3.5.0.tgz#e9ea02f7e57d0cd8438180083e93077e496285e4" + integrity sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A== + +fast-safe-stringify@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" + integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== + +figlet@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/figlet/-/figlet-1.7.0.tgz#46903a04603fd19c3e380358418bb2703587a72e" + integrity sha512-gO8l3wvqo0V7wEFLXPbkX83b7MVjRrk1oRLfYlZXol8nEpb/ON9pcKLI4qpBv5YtOTfrINtqb7b40iYY2FTWFg== + finalhandler@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" @@ -362,6 +401,11 @@ helmet@^7.1.0: resolved "https://registry.yarnpkg.com/helmet/-/helmet-7.1.0.tgz#287279e00f8a3763d5dccbaf1e5ee39b8c3784ca" integrity sha512-g+HZqgfbpXdCkme/Cd/mZkV0aV3BZZZSugecH03kl38m/Kmdx8jKjBikpDj2cr+Iynv4KpYEviojNdTJActJAg== +help-me@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/help-me/-/help-me-5.0.0.tgz#b1ebe63b967b74060027c2ac61f9be12d354a6f6" + integrity sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg== + http-errors@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" @@ -380,6 +424,11 @@ iconv-lite@0.4.24: dependencies: safer-buffer ">= 2.1.2 < 3" +ieee754@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + inherits@2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" @@ -395,21 +444,16 @@ is-fullwidth-code-point@^3.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== -kareem@2.6.3: - version "2.6.3" - resolved "https://registry.yarnpkg.com/kareem/-/kareem-2.6.3.tgz#23168ec8ffb6c1abfd31b7169a6fb1dd285992ac" - integrity sha512-C3iHfuGUXK2u8/ipq9LfjFfXFxAZMQJJq7vLS45r3D9Y2xQ/m4S8zaR4zMLFWh9AsNPXmcFfUDhTEO8UIC/V6Q== +joycon@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/joycon/-/joycon-3.1.1.tgz#bce8596d6ae808f8b68168f5fc69280996894f03" + integrity sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw== media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== -memory-pager@^1.0.2: - version "1.5.0" - resolved "https://registry.yarnpkg.com/memory-pager/-/memory-pager-1.5.0.tgz#d8751655d22d384682741c972f2c3d6dfa3e66b5" - integrity sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg== - merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" @@ -437,69 +481,16 @@ mime@1.6.0: resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== -mongodb-connection-string-url@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/mongodb-connection-string-url/-/mongodb-connection-string-url-3.0.1.tgz#c13e6ac284ae401752ebafdb8cd7f16c6723b141" - integrity sha512-XqMGwRX0Lgn05TDB4PyG2h2kKO/FfWJyCzYQbIhXUxz7ETt0I/FqHjUeqj37irJ+Dl1ZtU82uYyj14u2XsZKfg== - dependencies: - "@types/whatwg-url" "^11.0.2" - whatwg-url "^13.0.0" - -mongodb@6.7.0: - version "6.7.0" - resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-6.7.0.tgz#f86e51e6530e6a2ca4a99d7cfdf6f409223ac199" - integrity sha512-TMKyHdtMcO0fYBNORiYdmM25ijsHs+Njs963r4Tro4OQZzqYigAzYQouwWRg4OIaiLRUEGUh/1UAcH5lxdSLIA== - dependencies: - "@mongodb-js/saslprep" "^1.1.5" - bson "^6.7.0" - mongodb-connection-string-url "^3.0.0" - -mongoose@^8.0.0: - version "8.5.1" - resolved "https://registry.yarnpkg.com/mongoose/-/mongoose-8.5.1.tgz#011192edf77af54dd0826a836459212da317c503" - integrity sha512-OhVcwVl91A1G6+XpjDcpkGP7l7ikZkxa0DylX7NT/lcEqAjggzSdqDxb48A+xsDxqNAr0ntSJ1yiE3+KJTOd5Q== - dependencies: - bson "^6.7.0" - kareem "2.6.3" - mongodb "6.7.0" - mpath "0.9.0" - mquery "5.0.0" - ms "2.1.3" - sift "17.1.3" - -morgan@^1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.10.0.tgz#091778abc1fc47cd3509824653dae1faab6b17d7" - integrity sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ== - dependencies: - basic-auth "~2.0.1" - debug "2.6.9" - depd "~2.0.0" - on-finished "~2.3.0" - on-headers "~1.0.2" - -mpath@0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/mpath/-/mpath-0.9.0.tgz#0c122fe107846e31fc58c75b09c35514b3871904" - integrity sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew== - -mquery@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/mquery/-/mquery-5.0.0.tgz#a95be5dfc610b23862df34a47d3e5d60e110695d" - integrity sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg== - dependencies: - debug "4.x" +minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - ms@2.1.3: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" @@ -522,6 +513,11 @@ object-inspect@^1.13.1: resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.2.tgz#dea0088467fb991e67af4058147a24824a3043ff" integrity sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g== +on-exit-leak-free@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz#fed195c9ebddb7d9e4c3842f93f281ac8dadd3b8" + integrity sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA== + on-finished@2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" @@ -529,17 +525,12 @@ on-finished@2.4.1: dependencies: ee-first "1.1.1" -on-finished@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" - integrity sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww== +once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: - ee-first "1.1.1" - -on-headers@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" - integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + wrappy "1" parseurl@~1.3.3: version "1.3.3" @@ -551,11 +542,71 @@ path-to-regexp@0.1.7: resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== +pino-abstract-transport@^1.0.0, pino-abstract-transport@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/pino-abstract-transport/-/pino-abstract-transport-1.2.0.tgz#97f9f2631931e242da531b5c66d3079c12c9d1b5" + integrity sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q== + dependencies: + readable-stream "^4.0.0" + split2 "^4.0.0" + +pino-pretty@^11.2.2: + version "11.2.2" + resolved "https://registry.yarnpkg.com/pino-pretty/-/pino-pretty-11.2.2.tgz#5e8ec69b31e90eb187715af07b1d29a544e60d39" + integrity sha512-2FnyGir8nAJAqD3srROdrF1J5BIcMT4nwj7hHSc60El6Uxlym00UbCCd8pYIterstVBFlMyF1yFV8XdGIPbj4A== + dependencies: + colorette "^2.0.7" + dateformat "^4.6.3" + fast-copy "^3.0.2" + fast-safe-stringify "^2.1.1" + help-me "^5.0.0" + joycon "^3.1.1" + minimist "^1.2.6" + on-exit-leak-free "^2.1.0" + pino-abstract-transport "^1.0.0" + pump "^3.0.0" + readable-stream "^4.0.0" + secure-json-parse "^2.4.0" + sonic-boom "^4.0.1" + strip-json-comments "^3.1.1" + +pino-std-serializers@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/pino-std-serializers/-/pino-std-serializers-7.0.0.tgz#7c625038b13718dbbd84ab446bd673dc52259e3b" + integrity sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA== + +pino@^9.3.2: + version "9.3.2" + resolved "https://registry.yarnpkg.com/pino/-/pino-9.3.2.tgz#a530d6d28f1d954b6f54416a218cbb616f52f901" + integrity sha512-WtARBjgZ7LNEkrGWxMBN/jvlFiE17LTbBoH0konmBU684Kd0uIiDwBXlcTCW7iJnA6HfIKwUssS/2AC6cDEanw== + dependencies: + atomic-sleep "^1.0.0" + fast-redact "^3.1.1" + on-exit-leak-free "^2.1.0" + pino-abstract-transport "^1.2.0" + pino-std-serializers "^7.0.0" + process-warning "^4.0.0" + quick-format-unescaped "^4.0.3" + real-require "^0.2.0" + safe-stable-stringify "^2.3.1" + sonic-boom "^4.0.1" + thread-stream "^3.0.0" + pjson@^1.0.9: version "1.0.9" resolved "https://registry.yarnpkg.com/pjson/-/pjson-1.0.9.tgz#8a9520ce76a4739f8fee91679dad6b065b1c7938" integrity sha512-4hRJH3YzkUpOlShRzhyxAmThSNnAaIlWZCAb27hd0pVUAXNUAHAO7XZbsPPvsCYwBFEScTmCCL6DGE8NyZ8BdQ== +process-warning@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/process-warning/-/process-warning-4.0.0.tgz#581e3a7a1fb456c5f4fd239f76bce75897682d5a" + integrity sha512-/MyYDxttz7DfGMMHiysAsFE4qF+pQYAA8ziO/3NcRVrQ5fSk+Mns4QZA/oRPFzvcqNoVJXQNWNAsdwBXLUkQKw== + +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== + proxy-addr@~2.0.7: version "2.0.7" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" @@ -564,10 +615,13 @@ proxy-addr@~2.0.7: forwarded "0.2.0" ipaddr.js "1.9.1" -punycode@^2.3.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" - integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" qs@6.11.0: version "6.11.0" @@ -576,6 +630,11 @@ qs@6.11.0: dependencies: side-channel "^1.0.4" +quick-format-unescaped@^4.0.3: + version "4.0.4" + resolved "https://registry.yarnpkg.com/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz#93ef6dd8d3453cbc7970dd614fad4c5954d6b5a7" + integrity sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg== + range-parser@~1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" @@ -591,26 +650,47 @@ raw-body@2.5.2: iconv-lite "0.4.24" unpipe "1.0.0" +readable-stream@^4.0.0: + version "4.5.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-4.5.2.tgz#9e7fc4c45099baeed934bff6eb97ba6cf2729e09" + integrity sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g== + dependencies: + abort-controller "^3.0.0" + buffer "^6.0.3" + events "^3.3.0" + process "^0.11.10" + string_decoder "^1.3.0" + +real-require@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/real-require/-/real-require-0.2.0.tgz#209632dea1810be2ae063a6ac084fee7e33fba78" + integrity sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg== + require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== -safe-buffer@5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-buffer@5.2.1: +safe-buffer@5.2.1, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== +safe-stable-stringify@^2.3.1: + version "2.4.3" + resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz#138c84b6f6edb3db5f8ef3ef7115b8f55ccbf886" + integrity sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g== + "safer-buffer@>= 2.1.2 < 3": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== +secure-json-parse@^2.4.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/secure-json-parse/-/secure-json-parse-2.7.0.tgz#5a5f9cd6ae47df23dba3151edd06855d47e09862" + integrity sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw== + send@0.18.0: version "0.18.0" resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" @@ -667,17 +747,17 @@ side-channel@^1.0.4: get-intrinsic "^1.2.4" object-inspect "^1.13.1" -sift@17.1.3: - version "17.1.3" - resolved "https://registry.yarnpkg.com/sift/-/sift-17.1.3.tgz#9d2000d4d41586880b0079b5183d839c7a142bf7" - integrity sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ== - -sparse-bitfield@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz#ff4ae6e68656056ba4b3e792ab3334d38273ca11" - integrity sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ== +sonic-boom@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-4.0.1.tgz#515b7cef2c9290cb362c4536388ddeece07aed30" + integrity sha512-hTSD/6JMLyT4r9zeof6UtuBDpjJ9sO08/nmS5djaA9eozT9oOlNdpXSnzcgj4FTqpk3nkLrs61l4gip9r1HCrQ== dependencies: - memory-pager "^1.0.2" + atomic-sleep "^1.0.0" + +split2@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/split2/-/split2-4.2.0.tgz#c9c5920904d148bab0b9f67145f245a86aadbfa4" + integrity sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg== statuses@2.0.1: version "2.0.1" @@ -693,6 +773,13 @@ string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" +string_decoder@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" @@ -700,18 +787,23 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" +strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +thread-stream@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/thread-stream/-/thread-stream-3.1.0.tgz#4b2ef252a7c215064507d4ef70c05a5e2d34c4f1" + integrity sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A== + dependencies: + real-require "^0.2.0" + toidentifier@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== -tr46@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-4.1.1.tgz#281a758dcc82aeb4fe38c7dfe4d11a395aac8469" - integrity sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw== - dependencies: - punycode "^2.3.0" - tr46@~0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" @@ -758,19 +850,6 @@ webidl-conversions@^3.0.0: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== -webidl-conversions@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" - integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== - -whatwg-url@^13.0.0: - version "13.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-13.0.0.tgz#b7b536aca48306394a34e44bda8e99f332410f8f" - integrity sha512-9WWbymnqj57+XEuqADHrCJ2eSXzn8WXIW/YSGaZtb2WKAInQ6CHfaUUcTyyver0p8BDg5StLQq8h1vtZuwmOig== - dependencies: - tr46 "^4.1.1" - webidl-conversions "^7.0.0" - whatwg-url@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" @@ -788,6 +867,11 @@ wrap-ansi@^7.0.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + y18n@^5.0.5: version "5.0.8" resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55"