diff --git a/.eslintrc.js b/.eslintrc.js index 3ffa0d73..f4507d7e 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,7 +1,7 @@ module.exports = { - plugins: ['unicorn', 'cypress'], + plugins: ['unicorn'], env: { - 'cypress/globals': true, + jest: true, }, extends: ['next', 'next/core-web-vitals', 'semistandard', 'prettier'], rules: { @@ -16,11 +16,5 @@ module.exports = { 'react-hooks/rules-of-hooks': 'warn', 'react/jsx-no-comment-textnodes': 'warn', 'react/no-children-prop': 'warn', - 'cypress/no-assigning-return-values': 'error', - 'cypress/no-unnecessary-waiting': 'error', - 'cypress/assertion-before-screenshot': 'warn', - 'cypress/no-force': 'warn', - 'cypress/no-async-tests': 'error', - 'cypress/no-pause': 'error', }, } diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index a9833331..e45b39e7 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -6,6 +6,7 @@ on: jobs: build-storybook: + needs: [format, lint] runs-on: ubuntu-latest steps: - name: Checkout diff --git a/.github/workflows/patch.yml b/.github/workflows/patch.yml index 657bcae6..4b657943 100644 --- a/.github/workflows/patch.yml +++ b/.github/workflows/patch.yml @@ -13,7 +13,7 @@ jobs: steps: - uses: actions/checkout@v2 with: - token: ${{ secrets.GH_ORG_PAT }} + token: ${{ secrets.GITHUB_TOKEN }} - uses: actions/setup-node@v2 with: node-version: '16.x' diff --git a/.gitignore b/.gitignore index c8ea5469..f0d8ac02 100644 --- a/.gitignore +++ b/.gitignore @@ -20,4 +20,5 @@ build-storybook.log .env .env.* !.env.example -data \ No newline at end of file +data +public/videos/ diff --git a/.storybook/manager.js b/.storybook/manager.js new file mode 100644 index 00000000..baf80b25 --- /dev/null +++ b/.storybook/manager.js @@ -0,0 +1,6 @@ +import { addons } from '@storybook/manager-api'; +import theme from './theme'; + +addons.setConfig({ + theme: theme, +}); diff --git a/.storybook/theme.js b/.storybook/theme.js new file mode 100644 index 00000000..eb437465 --- /dev/null +++ b/.storybook/theme.js @@ -0,0 +1,9 @@ +import { create } from '@storybook/theming/create' + +export default create({ + base: 'light', + brandTitle: 'Glance UI', + brandUrl: 'https://odu-emse.github.io/Glance-Frontend', + brandImage: 'https://raw.githubusercontent.com/odu-emse/Glance-Frontend/dfcceb573bbd40592e48d87f660489c66866838f/public/images/GLANCE_1.png', + brandTarget: '_self', +}) \ No newline at end of file diff --git a/README.md b/README.md index 457f7c4e..209cfab5 100644 --- a/README.md +++ b/README.md @@ -1,110 +1,35 @@ -# EMSE - Asynchronous Learning Management Platform | UI +
+ +
-Hello! +--- -This repository contains all the files that are required for the operation of the AMLP user interface. The UI is a web application that facilitates interactions with the API. The UI is built using ReactJS and is ran in a Docker container. +## Setting up your enviorment -This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app). +If you are tasked with working on the Glance project, you can follow these steps to setup your development enviorment. -## Pre-requisites +1. This project is built on **NodeJS v16** so you will need to make sure your computer has this version installed and setup. https://nodejs.org/en/blog/release/v16.16.0 +2. Clone the repository to your computer and then promptly run `npm install` to build the dependancies. +3. Create the `.env` file using the provided `.env.example` as reference. You must provide all of the settings. +4. Run `npm run dev` to start the testing server. Otherwise run `npm run storybook` to run the Storybook pane. -- Docker - > Docker is an open platform for developing, shipping, and running applications. Docker enables you to separate your applications from your infrastructure so you can deliver software quickly. With Docker, you can manage your infrastructure in the same ways you manage your applications. By taking advantage of Docker’s methodologies for shipping, testing, and deploying code quickly, you can significantly reduce the delay between writing code and running it in production. - - [Install Docker for your OS](https://docs.docker.com/desktop/) -- make - > Make is a tool which controls the generation of executables and other non-source files of a program from the program's source files. Make gets its knowledge of how to build your program from a file called the makefile, which lists each of the non-source files and how to compute it from other files. When you write a program, you should write a makefile for it, so that it is possible to use Make to build and install the program. - - [Install GNU win32 on Windows](http://gnuwin32.sourceforge.net +--- -## Environmental Variables +## Contributing to the project -After cloning the repository, create a .env file with the appropriate variables that you received from your supervisor or through documentation. This file will contain the necessary variables like, our JWT configuration and our edge functions' URL. +All of our tickets are managed via [YouTrack](https://emse.myjetbrains.com/youtrack/agiles/120-2/current). -```shell -$ cd emsePortal && touch .env -``` +When creating a new branch it should be named the ticket number prefixed with the word ALMP. Ex. ALMP-123, ALMP-32, ALMP-345 -## Caveats when working on UI +Pull requests should describe the changes which have been made in the title and description. -To run the UI, first please make sure you have all the necessary Pre-Requisite are installed. Without these, the application will not be able to run or compile. +All new work is to be commited to the `development` branch and **NOT** `main`. -Second, you should verify if you are working across the entire stack (need to modify both the UI and the API to complete your issue), or is it specific for only the UI. If the later, you should only run commands that have `dev` in the name. If you require to work across the entire stack, please follow the set-up steps in the API's README.md file, and use all the `local` commands. +Please keep your branches up to date with the upstream branch. -As a short hand explanation, `local` commands expect you to have the API running on your machine, while `dev` commands reach out to our staging server API. +--- -## Common Commands +## Style Guide -### Start container - -To start up the application using our staging API, use the following command: - -```shell -$ make up-dev -``` - -If you want to run the application using your local instance of the API, use the following command: - -```shell -$ make up-local -``` - -### Build image - -While currently there isn't a huge difference in what these two commands do, they are here for future scaling support and to make it easier to switch between the two. In short, if you are using the staging API, you should use the `make build-dev` command, otherwise, use the `make build-local` command. Stick to either one throughout your entire development process, to avoid duplicate images and containers being built. - -```shell -$ make build-dev -``` - -```shell -$ make build-local -``` - -### Remove image - -```shell -$ make rm-dev -``` - -```shell -$ make rm-local -``` - -### Enter container - -This command is useful when you want to look into the Docker container and it's current files that are shared across your own OS. - -```shell -$ make enter-dev -``` - -```shell -$ make enter-local -``` - -## Helper Commands - -### Clean system - -This command should only be used if you know what you are doing. It will remove all images, containers, cached files, and other files that are not needed for Docker's basic operation. - -```shell -$ make prune -``` - -### List containers - -```shell -$ make rncn -``` - -### List images - -```shell -$ make img -``` - -### Stop all containers - -```shell -$ make down -``` +The front end is disctated by the style guide. You can access this document here: +[Glance EMSE Style Guide](https://www.figma.com/file/vTRSf0PF69Gc6w3VC6UKnJ/Style-Guide?node-id=0%3A1&t=Wjq1q3ai1KiWNRsh-1) diff --git a/components/common/accordion/accordion.stories.tsx b/components/common/accordion/accordion.stories.tsx deleted file mode 100644 index c9e27d30..00000000 --- a/components/common/accordion/accordion.stories.tsx +++ /dev/null @@ -1,101 +0,0 @@ -import { ComponentMeta, ComponentStory } from '@storybook/react' -import * as React from 'react' -import { Accordion } from './accordion' - -export default { - title: 'Common/Accordion', - component: Accordion, - argTypes: { - title: { control: 'text' }, - lessons: { control: 'LessonLinkProps[]' }, - }, -} as ComponentMeta
- {lessons?.length &&
- lessons.map((lesson, lessonIndex) => (
-
Loading...
diff --git a/components/common/community/threads/comments/comments_hierarchy.tsx b/components/common/community/threads/comments/comments_hierarchy.tsx index b0016740..d81c4d82 100644 --- a/components/common/community/threads/comments/comments_hierarchy.tsx +++ b/components/common/community/threads/comments/comments_hierarchy.tsx @@ -1,6 +1,7 @@ import * as React from 'react' import { Thread } from '../thread/thread' import { ThreadType } from '../../../../../types' +import { ReactNode } from 'react' /** * This function generates an array of DOM thread components based on a parent comment tree. @@ -9,22 +10,24 @@ import { ThreadType } from '../../../../../types' * @param {Object} parentComment - The parent comment tree. * @returns {Array} An array of DOM thread components. */ -const commentGen = (parentComment) => { +const commentGen = (parentComment: ThreadType): Array{body.slice(0, 150)}
+ {topics.length > 0 && ( +
+
+ {description} +
+ )} +- {description} + {error ? `Wrong ${type}` : 'This is a test message'}
)}w.length?N:w}),c.value=a.join(f)}else c.value=a.join(u.slice(h,h+c.count));h+=c.count,c.added||(g+=c.count)}}var _=n[y-1];return y>1&&typeof _.value==\"string\"&&(_.added||_.removed)&&a.equals(\"\",_.value)&&(n[y-2].value+=_.value,n.pop()),n}function s(a){return{newPos:a.newPos,components:a.components.slice(0)}}}}),BD=te({\"node_modules/diff/lib/diff/array.js\"(e){\"use strict\";ne(),Object.defineProperty(e,\"__esModule\",{value:!0}),e.diffArrays=a,e.arrayDiff=void 0;var r=t(TD());function t(n){return n&&n.__esModule?n:{default:n}}var s=new r.default;e.arrayDiff=s,s.tokenize=function(n){return n.slice()},s.join=s.removeEmpty=function(n){return n};function a(n,u,i){return s.diff(n,u,i)}}}),Un=te({\"src/document/doc-builders.js\"(e,r){\"use strict\";ne();function t(C){return{type:\"concat\",parts:C}}function s(C){return{type:\"indent\",contents:C}}function a(C,o){return{type:\"align\",contents:o,n:C}}function n(C){let o=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};return{type:\"group\",id:o.id,contents:C,break:Boolean(o.shouldBreak),expandedStates:o.expandedStates}}function u(C){return a(Number.NEGATIVE_INFINITY,C)}function i(C){return a({type:\"root\"},C)}function l(C){return a(-1,C)}function p(C,o){return n(C[0],Object.assign(Object.assign({},o),{},{expandedStates:C}))}function y(C){return{type:\"fill\",parts:C}}function h(C,o){let d=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};return{type:\"if-break\",breakContents:C,flatContents:o,groupId:d.groupId}}function g(C,o){return{type:\"indent-if-break\",contents:C,groupId:o.groupId,negate:o.negate}}function c(C){return{type:\"line-suffix\",contents:C}}var f={type:\"line-suffix-boundary\"},F={type:\"break-parent\"},_={type:\"trim\"},w={type:\"line\",hard:!0},E={type:\"line\",hard:!0,literal:!0},N={type:\"line\"},x={type:\"line\",soft:!0},I=t([w,F]),P=t([E,F]),$={type:\"cursor\",placeholder:Symbol(\"cursor\")};function D(C,o){let d=[];for(let v=0;v u(h,g,p,y,c),p)}function u(i,l,p,y){let{stripTrailingHardline:h=!1}=arguments.length>4&&arguments[4]!==void 0?arguments[4]:{},g=s(Object.assign(Object.assign(Object.assign({},p),l),{},{parentParser:p.parser,originalText:i}),{passThrough:!0}),c=tu().parse(i,g),{ast:f}=c;i=c.text;let F=f.comments;delete f.comments,a.attach(F,f,i,g),g[Symbol.for(\"comments\")]=F||[],g[Symbol.for(\"tokens\")]=f.tokens||[];let _=y(f,g);return a.ensureAllCommentsPrinted(F),h?typeof _==\"string\"?_.replace(/(?:\\r?\\n)*$/,\"\"):t(_):_}r.exports={printSubtree:n}}}),Wm=te({\"src/main/ast-to-doc.js\"(e,r){\"use strict\";ne();var t=$m(),{builders:{hardline:s,addAlignmentToDoc:a},utils:{propagateBreaks:n}}=qe(),{printComments:u}=et(),i=Vm();function l(h,g){let c=arguments.length>2&&arguments[2]!==void 0?arguments[2]:0,{printer:f}=g;f.preprocess&&(h=f.preprocess(h,g));let F=new Map,_=new t(h),w=E();return c>0&&(w=a([s,w],c,g.tabWidth)),n(w),w;function E(x,I){return x===void 0||x===_?N(I):Array.isArray(x)?_.call(()=>N(I),...x):_.call(()=>N(I),x)}function N(x){let I=_.getValue(),P=I&&typeof I==\"object\"&&x===void 0;if(P&&F.has(I))return F.get(I);let $=y(_,g,E,x);return P&&F.set(I,$),$}}function p(h,g){let{originalText:c,[Symbol.for(\"comments\")]:f,locStart:F,locEnd:_}=g,w=F(h),E=_(h),N=new Set;for(let x of f)F(x)>=w&&_(x)<=E&&(x.printed=!0,N.add(x));return{doc:c.slice(w,E),printedComments:N}}function y(h,g,c,f){let F=h.getValue(),{printer:_}=g,w,E;if(_.hasPrettierIgnore&&_.hasPrettierIgnore(h))({doc:w,printedComments:E}=p(F,g));else{if(F)try{w=i.printSubtree(h,c,g,l)}catch(N){if(globalThis.PRETTIER_DEBUG)throw N}w||(w=_.print(h,g,c,f))}return(!_.willPrintOwnComments||!_.willPrintOwnComments(h,g))&&(w=u(h,w,g,E)),w}r.exports=l}}),Hm=te({\"src/main/range-util.js\"(e,r){\"use strict\";ne();var t=Zt(),s=et(),a=f=>{let{parser:F}=f;return F===\"json\"||F===\"json5\"||F===\"json-stringify\"};function n(f,F){let _=[f.node,...f.parentNodes],w=new Set([F.node,...F.parentNodes]);return _.find(E=>y.has(E.type)&&w.has(E))}function u(f){let F=f.length-1;for(;;){let _=f[F];if(_&&(_.type===\"Program\"||_.type===\"File\"))F--;else break}return f.slice(0,F+1)}function i(f,F,_){let{locStart:w,locEnd:E}=_,N=f.node,x=F.node;if(N===x)return{startNode:N,endNode:x};let I=w(f.node);for(let $ of u(F.parentNodes))if(w($)>=I)x=$;else break;let P=E(F.node);for(let $ of u(f.parentNodes)){if(E($)<=P)N=$;else break;if(N===x)break}return{startNode:N,endNode:x}}function l(f,F,_,w){let E=arguments.length>4&&arguments[4]!==void 0?arguments[4]:[],N=arguments.length>5?arguments[5]:void 0,{locStart:x,locEnd:I}=_,P=x(f),$=I(f);if(!(F>$||F w);let I=f.slice(w,E).search(/\\S/),P=I===-1;if(!P)for(w+=I;E>w&&!/\\S/.test(f[E-1]);--E);let $=l(_,w,F,(C,o)=>g(F,C,o),[],\"rangeStart\"),D=P?$:l(_,E,F,C=>g(F,C),[],\"rangeEnd\");if(!$||!D)return{rangeStart:0,rangeEnd:0};let T,m;if(a(F)){let C=n($,D);T=C,m=C}else({startNode:T,endNode:m}=i($,D,F));return{rangeStart:Math.min(N(T),N(m)),rangeEnd:Math.max(x(T),x(m))}}r.exports={calculateRange:c,findNodeAtOffset:l}}}),Gm=te({\"src/main/core.js\"(e,r){\"use strict\";ne();var{diffArrays:t}=BD(),{printer:{printDocToString:s},debug:{printDocToDebug:a}}=qe(),{getAlignmentSize:n}=Ue(),{guessEndOfLine:u,convertEndOfLineToChars:i,countEndOfLineChars:l,normalizeEndOfLine:p}=Jn(),y=uo().normalize,h=Rm(),g=et(),c=tu(),f=Wm(),F=Hm(),_=\"\\uFEFF\",w=Symbol(\"cursor\");function E(m,C,o){let d=C.comments;return d&&(delete C.comments,g.attach(d,C,m,o)),o[Symbol.for(\"comments\")]=d||[],o[Symbol.for(\"tokens\")]=C.tokens||[],o.originalText=m,d}function N(m,C){let o=arguments.length>2&&arguments[2]!==void 0?arguments[2]:0;if(!m||m.trim().length===0)return{formatted:\"\",cursorOffset:-1,comments:[]};let{ast:d,text:v}=c.parse(m,C);if(C.cursorOffset>=0){let k=F.findNodeAtOffset(d,C.cursorOffset,C);k&&k.node&&(C.cursorNode=k.node)}let S=E(v,d,C),b=f(d,C,o),B=s(b,C);if(g.ensureAllCommentsPrinted(S),o>0){let k=B.formatted.trim();B.cursorNodeStart!==void 0&&(B.cursorNodeStart-=B.formatted.indexOf(k)),B.formatted=k+i(C.endOfLine)}if(C.cursorOffset>=0){let k,M,R,q,J;if(C.cursorNode&&B.cursorNodeText?(k=C.locStart(C.cursorNode),M=v.slice(k,C.locEnd(C.cursorNode)),R=C.cursorOffset-k,q=B.cursorNodeStart,J=B.cursorNodeText):(k=0,M=v,R=C.cursorOffset,q=0,J=B.formatted),M===J)return{formatted:B.formatted,cursorOffset:q+R,comments:S};let L=[...M];L.splice(R,0,w);let Q=[...J],V=t(L,Q),j=q;for(let Y of V)if(Y.removed){if(Y.value.includes(w))break}else j+=Y.count;return{formatted:B.formatted,cursorOffset:j,comments:S}}return{formatted:B.formatted,cursorOffset:-1,comments:S}}function x(m,C){let{ast:o,text:d}=c.parse(m,C),{rangeStart:v,rangeEnd:S}=F.calculateRange(d,C,o),b=d.slice(v,S),B=Math.min(v,d.lastIndexOf(`\n`,v)+1),k=d.slice(B,v).match(/^\\s*/)[0],M=n(k,C.tabWidth),R=N(b,Object.assign(Object.assign({},C),{},{rangeStart:0,rangeEnd:Number.POSITIVE_INFINITY,cursorOffset:C.cursorOffset>v&&C.cursorOffset<=S?C.cursorOffset-v:-1,endOfLine:\"lf\"}),M),q=R.formatted.trimEnd(),{cursorOffset:J}=C;J>S?J+=q.length-b.length:R.cursorOffset>=0&&(J=R.cursorOffset+v);let L=d.slice(0,v)+q+d.slice(S);if(C.endOfLine!==\"lf\"){let Q=i(C.endOfLine);J>=0&&Q===`\\r\n`&&(J+=l(L.slice(0,J),`\n`)),L=L.replace(/\\n/g,Q)}return{formatted:L,cursorOffset:J,comments:R.comments}}function I(m,C,o){return typeof C!=\"number\"||Number.isNaN(C)||C<0||C>m.length?o:C}function P(m,C){let{cursorOffset:o,rangeStart:d,rangeEnd:v}=C;return o=I(m,o,-1),d=I(m,d,0),v=I(m,v,m.length),Object.assign(Object.assign({},C),{},{cursorOffset:o,rangeStart:d,rangeEnd:v})}function $(m,C){let{cursorOffset:o,rangeStart:d,rangeEnd:v,endOfLine:S}=P(m,C),b=m.charAt(0)===_;if(b&&(m=m.slice(1),o--,d--,v--),S===\"auto\"&&(S=u(m)),m.includes(\"\\r\")){let B=k=>l(m.slice(0,Math.max(k,0)),`\\r\n`);o-=B(o),d-=B(d),v-=B(v),m=p(m)}return{hasBOM:b,text:m,options:P(m,Object.assign(Object.assign({},C),{},{cursorOffset:o,rangeStart:d,rangeEnd:v,endOfLine:S}))}}function D(m,C){let o=c.resolveParser(C);return!o.hasPragma||o.hasPragma(m)}function T(m,C){let{hasBOM:o,text:d,options:v}=$(m,y(C));if(v.rangeStart>=v.rangeEnd&&d!==\"\"||v.requirePragma&&!D(d,v))return{formatted:m,cursorOffset:C.cursorOffset,comments:[]};let S;return v.rangeStart>0||v.rangeEnd{};r.exports=t}}),Ma=te({\"node_modules/semver/internal/constants.js\"(e,r){ne();var t=\"2.0.0\",s=256,a=Number.MAX_SAFE_INTEGER||9007199254740991,n=16;r.exports={SEMVER_SPEC_VERSION:t,MAX_LENGTH:s,MAX_SAFE_INTEGER:a,MAX_SAFE_COMPONENT_LENGTH:n}}}),VD=te({\"node_modules/semver/internal/re.js\"(e,r){ne();var{MAX_SAFE_COMPONENT_LENGTH:t}=Ma(),s=qa();e=r.exports={};var a=e.re=[],n=e.src=[],u=e.t={},i=0,l=(p,y,h)=>{let g=i++;s(p,g,y),u[p]=g,n[g]=y,a[g]=new RegExp(y,h?\"g\":void 0)};l(\"NUMERICIDENTIFIER\",\"0|[1-9]\\\\d*\"),l(\"NUMERICIDENTIFIERLOOSE\",\"[0-9]+\"),l(\"NONNUMERICIDENTIFIER\",\"\\\\d*[a-zA-Z-][a-zA-Z0-9-]*\"),l(\"MAINVERSION\",`(${n[u.NUMERICIDENTIFIER]})\\\\.(${n[u.NUMERICIDENTIFIER]})\\\\.(${n[u.NUMERICIDENTIFIER]})`),l(\"MAINVERSIONLOOSE\",`(${n[u.NUMERICIDENTIFIERLOOSE]})\\\\.(${n[u.NUMERICIDENTIFIERLOOSE]})\\\\.(${n[u.NUMERICIDENTIFIERLOOSE]})`),l(\"PRERELEASEIDENTIFIER\",`(?:${n[u.NUMERICIDENTIFIER]}|${n[u.NONNUMERICIDENTIFIER]})`),l(\"PRERELEASEIDENTIFIERLOOSE\",`(?:${n[u.NUMERICIDENTIFIERLOOSE]}|${n[u.NONNUMERICIDENTIFIER]})`),l(\"PRERELEASE\",`(?:-(${n[u.PRERELEASEIDENTIFIER]}(?:\\\\.${n[u.PRERELEASEIDENTIFIER]})*))`),l(\"PRERELEASELOOSE\",`(?:-?(${n[u.PRERELEASEIDENTIFIERLOOSE]}(?:\\\\.${n[u.PRERELEASEIDENTIFIERLOOSE]})*))`),l(\"BUILDIDENTIFIER\",\"[0-9A-Za-z-]+\"),l(\"BUILD\",`(?:\\\\+(${n[u.BUILDIDENTIFIER]}(?:\\\\.${n[u.BUILDIDENTIFIER]})*))`),l(\"FULLPLAIN\",`v?${n[u.MAINVERSION]}${n[u.PRERELEASE]}?${n[u.BUILD]}?`),l(\"FULL\",`^${n[u.FULLPLAIN]}$`),l(\"LOOSEPLAIN\",`[v=\\\\s]*${n[u.MAINVERSIONLOOSE]}${n[u.PRERELEASELOOSE]}?${n[u.BUILD]}?`),l(\"LOOSE\",`^${n[u.LOOSEPLAIN]}$`),l(\"GTLT\",\"((?:<|>)?=?)\"),l(\"XRANGEIDENTIFIERLOOSE\",`${n[u.NUMERICIDENTIFIERLOOSE]}|x|X|\\\\*`),l(\"XRANGEIDENTIFIER\",`${n[u.NUMERICIDENTIFIER]}|x|X|\\\\*`),l(\"XRANGEPLAIN\",`[v=\\\\s]*(${n[u.XRANGEIDENTIFIER]})(?:\\\\.(${n[u.XRANGEIDENTIFIER]})(?:\\\\.(${n[u.XRANGEIDENTIFIER]})(?:${n[u.PRERELEASE]})?${n[u.BUILD]}?)?)?`),l(\"XRANGEPLAINLOOSE\",`[v=\\\\s]*(${n[u.XRANGEIDENTIFIERLOOSE]})(?:\\\\.(${n[u.XRANGEIDENTIFIERLOOSE]})(?:\\\\.(${n[u.XRANGEIDENTIFIERLOOSE]})(?:${n[u.PRERELEASELOOSE]})?${n[u.BUILD]}?)?)?`),l(\"XRANGE\",`^${n[u.GTLT]}\\\\s*${n[u.XRANGEPLAIN]}$`),l(\"XRANGELOOSE\",`^${n[u.GTLT]}\\\\s*${n[u.XRANGEPLAINLOOSE]}$`),l(\"COERCE\",`(^|[^\\\\d])(\\\\d{1,${t}})(?:\\\\.(\\\\d{1,${t}}))?(?:\\\\.(\\\\d{1,${t}}))?(?:$|[^\\\\d])`),l(\"COERCERTL\",n[u.COERCE],!0),l(\"LONETILDE\",\"(?:~>?)\"),l(\"TILDETRIM\",`(\\\\s*)${n[u.LONETILDE]}\\\\s+`,!0),e.tildeTrimReplace=\"$1~\",l(\"TILDE\",`^${n[u.LONETILDE]}${n[u.XRANGEPLAIN]}$`),l(\"TILDELOOSE\",`^${n[u.LONETILDE]}${n[u.XRANGEPLAINLOOSE]}$`),l(\"LONECARET\",\"(?:\\\\^)\"),l(\"CARETTRIM\",`(\\\\s*)${n[u.LONECARET]}\\\\s+`,!0),e.caretTrimReplace=\"$1^\",l(\"CARET\",`^${n[u.LONECARET]}${n[u.XRANGEPLAIN]}$`),l(\"CARETLOOSE\",`^${n[u.LONECARET]}${n[u.XRANGEPLAINLOOSE]}$`),l(\"COMPARATORLOOSE\",`^${n[u.GTLT]}\\\\s*(${n[u.LOOSEPLAIN]})$|^$`),l(\"COMPARATOR\",`^${n[u.GTLT]}\\\\s*(${n[u.FULLPLAIN]})$|^$`),l(\"COMPARATORTRIM\",`(\\\\s*)${n[u.GTLT]}\\\\s*(${n[u.LOOSEPLAIN]}|${n[u.XRANGEPLAIN]})`,!0),e.comparatorTrimReplace=\"$1$2$3\",l(\"HYPHENRANGE\",`^\\\\s*(${n[u.XRANGEPLAIN]})\\\\s+-\\\\s+(${n[u.XRANGEPLAIN]})\\\\s*$`),l(\"HYPHENRANGELOOSE\",`^\\\\s*(${n[u.XRANGEPLAINLOOSE]})\\\\s+-\\\\s+(${n[u.XRANGEPLAINLOOSE]})\\\\s*$`),l(\"STAR\",\"(<|>)?=?\\\\s*\\\\*\"),l(\"GTE0\",\"^\\\\s*>=\\\\s*0\\\\.0\\\\.0\\\\s*$\"),l(\"GTE0PRE\",\"^\\\\s*>=\\\\s*0\\\\.0\\\\.0-0\\\\s*$\")}}),WD=te({\"node_modules/semver/internal/parse-options.js\"(e,r){ne();var t=[\"includePrerelease\",\"loose\",\"rtl\"],s=a=>a?typeof a!=\"object\"?{loose:!0}:t.filter(n=>a[n]).reduce((n,u)=>(n[u]=!0,n),{}):{};r.exports=s}}),HD=te({\"node_modules/semver/internal/identifiers.js\"(e,r){ne();var t=/^[0-9]+$/,s=(n,u)=>{let i=t.test(n),l=t.test(u);return i&&l&&(n=+n,u=+u),n===u?0:i&&!l?-1:l&&!i?1:ns(u,n);r.exports={compareIdentifiers:s,rcompareIdentifiers:a}}}),GD=te({\"node_modules/semver/classes/semver.js\"(e,r){ne();var t=qa(),{MAX_LENGTH:s,MAX_SAFE_INTEGER:a}=Ma(),{re:n,t:u}=VD(),i=WD(),{compareIdentifiers:l}=HD(),p=class{constructor(y,h){if(h=i(h),y instanceof p){if(y.loose===!!h.loose&&y.includePrerelease===!!h.includePrerelease)return y;y=y.version}else if(typeof y!=\"string\")throw new TypeError(`Invalid Version: ${y}`);if(y.length>s)throw new TypeError(`version is longer than ${s} characters`);t(\"SemVer\",y,h),this.options=h,this.loose=!!h.loose,this.includePrerelease=!!h.includePrerelease;let g=y.trim().match(h.loose?n[u.LOOSE]:n[u.FULL]);if(!g)throw new TypeError(`Invalid Version: ${y}`);if(this.raw=y,this.major=+g[1],this.minor=+g[2],this.patch=+g[3],this.major>a||this.major<0)throw new TypeError(\"Invalid major version\");if(this.minor>a||this.minor<0)throw new TypeError(\"Invalid minor version\");if(this.patch>a||this.patch<0)throw new TypeError(\"Invalid patch version\");g[4]?this.prerelease=g[4].split(\".\").map(c=>{if(/^[0-9]+$/.test(c)){let f=+c;if(f>=0&&f=0;)typeof this.prerelease[g]==\"number\"&&(this.prerelease[g]++,g=-2);g===-1&&this.prerelease.push(0)}h&&(l(this.prerelease[0],h)===0?isNaN(this.prerelease[1])&&(this.prerelease=[h,0]):this.prerelease=[h,0]);break;default:throw new Error(`invalid increment argument: ${y}`)}return this.format(),this.raw=this.version,this}};r.exports=p}}),zn=te({\"node_modules/semver/functions/compare.js\"(e,r){ne();var t=GD(),s=(a,n,u)=>new t(a,u).compare(new t(n,u));r.exports=s}}),UD=te({\"node_modules/semver/functions/lt.js\"(e,r){ne();var t=zn(),s=(a,n,u)=>t(a,n,u)<0;r.exports=s}}),JD=te({\"node_modules/semver/functions/gte.js\"(e,r){ne();var t=zn(),s=(a,n,u)=>t(a,n,u)>=0;r.exports=s}}),zD=te({\"src/utils/arrayify.js\"(e,r){\"use strict\";ne(),r.exports=(t,s)=>Object.entries(t).map(a=>{let[n,u]=a;return Object.assign({[s]:n},u)})}}),XD=te({\"node_modules/outdent/lib/index.js\"(e,r){\"use strict\";ne(),Object.defineProperty(e,\"__esModule\",{value:!0}),e.outdent=void 0;function t(){for(var E=[],N=0;N