From 08d8a53fbc884e25b144d2f544836a4e67ea8232 Mon Sep 17 00:00:00 2001 From: Steve Reis <stevereis93@gmail.com> Date: Tue, 8 Mar 2022 16:50:19 +0000 Subject: [PATCH] feat: Add branding and configuration for connectors --- api/assets/engines/datashield/favicon.ico | Bin 0 -> 1150 bytes api/assets/engines/datashield/logo_small.png | Bin 0 -> 6534 bytes api/assets/engines/default/custom.css | 1 + api/assets/engines/default/favicon.ico | Bin 0 -> 1142 bytes api/assets/engines/default/favicon.png | Bin 0 -> 2315 bytes api/assets/engines/default/login.md | 26 + api/assets/engines/default/logo.png | Bin 0 -> 30197 bytes api/assets/engines/default/logo_small.png | Bin 0 -> 3296 bytes api/assets/engines/default/tos.md | 200 ++++ api/package-lock.json | 919 ++++-------------- api/package.json | 10 +- api/src/engine/assets.service.ts | 56 ++ .../datashield/assets/SOPHIA_logo.png | Bin 0 -> 33259 bytes .../connectors/datashield/main.connector.ts | 10 +- .../connectors/exareme/main.connector.ts | 13 +- api/src/engine/engine.controller.ts | 64 +- api/src/engine/engine.interfaces.ts | 11 + api/src/engine/engine.module.ts | 9 +- api/src/engine/engine.resolver.ts | 25 +- api/src/engine/models/configuration.model.ts | 15 + api/src/main.ts | 5 +- api/src/schema.gql | 8 + 22 files changed, 621 insertions(+), 751 deletions(-) create mode 100644 api/assets/engines/datashield/favicon.ico create mode 100644 api/assets/engines/datashield/logo_small.png create mode 100644 api/assets/engines/default/custom.css create mode 100644 api/assets/engines/default/favicon.ico create mode 100644 api/assets/engines/default/favicon.png create mode 100644 api/assets/engines/default/login.md create mode 100644 api/assets/engines/default/logo.png create mode 100644 api/assets/engines/default/logo_small.png create mode 100644 api/assets/engines/default/tos.md create mode 100644 api/src/engine/assets.service.ts create mode 100644 api/src/engine/connectors/datashield/assets/SOPHIA_logo.png create mode 100644 api/src/engine/models/configuration.model.ts diff --git a/api/assets/engines/datashield/favicon.ico b/api/assets/engines/datashield/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..6dc560a9b2782c7432b8f3866447a9d2bbb5bf56 GIT binary patch literal 1150 zcmZuxZAep57(R2Fl#QlElzQ*oX6(bY4{xTXKhi0vrKb5YEVHHC9A$#chSNUGFhg5@ zlunlwkv{~Bz%cP^PK99hr+)M+h@_x@Aw=}2pyy044DpWVzUMyg^St+*_nbRIMEFUi z1a}#6L=tk45TXV^f!X8{2th6`W)q?3Z8zRZ2(TOA(u+wX>-RQs^Mm$`0uoI*U>C6C zMfokXAb#QNNhP!L<h1<t%?ga$L!6ad5OhKj;Tf?4us}P2_=~rTUF_ncG-mm+fwze| z!2L$<Dq<~=2MF&IVi~w{&4YZ_;7rI;`p&1o|CL?xeo&5{OENg)%Qc=n7MgmXB+S1D z;|A2ebmX~>!<whq!00%$GM2#2^$l@z{k_cc7|Z&HW{{iE-bqzKdl#NlTQv-bKfrxI zddpbC`iFyfZ-7~SCgp7r&6vA2@!g9<;NGL|w844U0{vfL5s2aKQBqnjr6H<SG3ipn zuhL&j>_V;(I0>BKts=9&Rnd|doRDko=jNjB2s~z8n?Z#AX_rrRmNEff4(7KG{|&y5 znBmI>gx*y0w#YN=(ujxl1nWv?1HMvdufStPk2APgj|sWY;9RI(1+OX0UyS`IfWM3O z6Va%6)mFhR4AvYs6EXA_-X<PS?#WJNR-eWh8zpXVv_D!v4O}!f#Wlr$d>gCj%`syB z{m47g&XNe^_5*8p{-bMERG~*Nx%vJ{^iKk=4QRyp05?A{i@A-XP9yaHfCV51pf$>% zyRGt8>9L+Q==@j{Bb)B_$foaI$6j)na}fMua(AW{S{FRDze0a#tixVa;|%Dq$Az*t zT`H{g8@urElXA3Lq3$cpN}6ygptA${+q~3I&s0&UHqJtdBf1vzHpymsOjvIx_;sKe z8hZY+fzZ2m_zpUe`w6WRb11^u%f#3XZUeZy-6!~I+{(ow9!squ67<ZCH8|4BiG*^% cUaASdHue!h5fE=8JSXbFe+LkL2|B^|A4VuA^8f$< literal 0 HcmV?d00001 diff --git a/api/assets/engines/datashield/logo_small.png b/api/assets/engines/datashield/logo_small.png new file mode 100644 index 0000000000000000000000000000000000000000..19885d0405d59e2447045061a3d85fdf88dc7af1 GIT binary patch literal 6534 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 C6@pj* literal 0 HcmV?d00001 diff --git a/api/assets/engines/default/custom.css b/api/assets/engines/default/custom.css new file mode 100644 index 0000000..4c7bd7b --- /dev/null +++ b/api/assets/engines/default/custom.css @@ -0,0 +1 @@ +/* CUSTOM DEFAULT CSS, SHOULD STAY EMTPY */ \ No newline at end of file diff --git a/api/assets/engines/default/favicon.ico b/api/assets/engines/default/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..c7e01973cdb8883fe2608a684a32f37d9cb8da7a GIT binary patch literal 1142 zcmZQzU<5(|0R|wcz>vVgz#zuJz|a}s=g!L|#RX*YdV0770coHL1_2IcAgQ6t9}J`z zi-X*q7;m1`sRwd63p^r=85p>QL70(Y)*J~21}5_WpAc7|<k5>3yUy4wIqK58->YP2 zK<wsl&oyzTOH&l)XN%1(xOQ3R#Cfxwr>vJ8aRw{!kKPpSu{zFpaf;mBY{8lNEM55z zE~wtVqIvS1@y?Uh%a3`?K9*3mCtP+;HsADo#)-uY?d6~ENWZ?JaQBMV`ODtNE+_1` zm^1%m#>~@oUB}z9c2&ErF4kCB#5cWwp}&NoyPTn``txn+H#fB&-SWM1J?7Zuxa}9R zSD&w(b*6sm*@<<BdlR>}xvp(BT-qWqwT7Xqf}yke`?JIk4<nx3jl6y<<HXg}E$5OK zoywkYtf=~6dH2cb`Fkh%Z0OWlRIfF^LuXE}#H98gFLFOV&UkV+`qH(qGdBu%T+Cg6 zsbTu5nv5MOaa#%s_f2wM(`>l3*<^9A^7IaaS(AP~OM3qx<nf*0D>q_~UrFA3rDD$U z<i`E+75htKw&X``X$aZeXTG9cZgvyUe3RKzzCW~nd)xf+?SPwi3NGGh*nS~v>6wC- zgDC~Ovr~7JM{j8g+tRN(uT5)qkKyde-yS)>zaQ}Eme;jg*}X^envc|19_&cj(HXyE zs_(`rx(hlbCpU}sw|>2E`u2|Ple-Zo&zXd6s!QHEJ!8+Jm@SI}R?qiXHt)+r=XdwL z?p-wo#)9hn{DAedQ?{%~-LmTY>z3EI&F)-Q=bM(#Go{LA>D1!ATOU7`xp`UZ#5rS7 z1Whivf8YM-IcOA{fTLAtR{qfomOIbbEC!~E175|DRIxVRY-x((f^6}*xq0U~6M;!* zZ%L3}Faw)r!s5F(=EZ5SGB$ns4+fvg7#P!kftlaq8Q2<rLWDu&k1AFTs49ryYlS$3 zERgjtU;zsM|CF1k{BxI3_(!H8aXW(kL3sbX6yAVX&t+KBzx@9Y&CKBY`GYe<(vyFG zA4W1s`b@ofb)ttDlht-H7obOedb&7<RLn_E0D_dHw8Yfp=MSDFF)-)J#o5&{Iw~d# z1{w;)$2bLfMY)M-D5$SraN@v%C2JO~TDETC%B5=;uU?*?a3UckCn+l}FEKMUH#s}~ z{eu$^p1gVV>e;)8FQ2}B{Q9}PzzG2n86hb#IYCKLSz&4M`4dh|m@;S5tZDNm&YU`T z^6csH0Ve`NVuGT=;sPT>V}rB9!|xxsaO27yrK891-@111;?1jfFQ2|}-9B-V$c@Cw zYW_2=a;*;c%-o#j%+m7w$l1B(^Aisqay4MwdDMHFUUEXjz9dzjgsWK_o?lxNyIoFY uL*iq#j(kb8{F}RSfA`JZUG|=_h~edD&#cNL3uXcXfx*+&&t;ucLK6V$3SS`r literal 0 HcmV?d00001 diff --git a/api/assets/engines/default/favicon.png b/api/assets/engines/default/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..ba0f5bb206064defacb684699552d048c8290ee6 GIT binary patch literal 2315 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 literal 0 HcmV?d00001 diff --git a/api/assets/engines/default/login.md b/api/assets/engines/default/login.md new file mode 100644 index 0000000..7f8f5ec --- /dev/null +++ b/api/assets/engines/default/login.md @@ -0,0 +1,26 @@ +<p align="center"> + <img src="$ASSETS_URL$/logo.png" /> +</p> + +<br/> + +The Medical Informatics Platform +================================ + +### About + +The Medical Informatics Platform (MIP) is the most advanced, fully operational, open source platform for sharing of decentralized clinical data. + +Clinical data that cannot be shared, transferred and stored in a centralized way can be federated and collaboratively analysed. + +Data Owners have full control of accessibility and sharing of their data through a tightly controlled accreditation, access control and user management system. + +Documentation about the project can be found on [GitHub](https://github.com/hbpmedical/mip-docs). + +For more detailed information: [EBRAINS website](https://ebrains.eu/service/medical-informatics-platform/). + +* * * + +### Get access to the MIP + +To access the MIP an EBRAINS account is required. If you do not have one yet, you can **[register an account on EBRAINS](https://ebrains.eu/register)**. \ No newline at end of file diff --git a/api/assets/engines/default/logo.png b/api/assets/engines/default/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..0287b49807a9cf5f4e172f2d1f050331d3bd56cc GIT binary patch literal 30197 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≈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 A&;S4c literal 0 HcmV?d00001 diff --git a/api/assets/engines/default/logo_small.png b/api/assets/engines/default/logo_small.png new file mode 100644 index 0000000000000000000000000000000000000000..1adc2e10f5c6b802fa4479df95ff8c75735e42ce GIT binary patch literal 3296 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 literal 0 HcmV?d00001 diff --git a/api/assets/engines/default/tos.md b/api/assets/engines/default/tos.md new file mode 100644 index 0000000..349e0e0 --- /dev/null +++ b/api/assets/engines/default/tos.md @@ -0,0 +1,200 @@ +HBP Medical Informatics Platform +================================ + +Terms and Conditions for Service +-------------------------------- + +1. Ownership and Operation of Website + + The Website is owned and operated by the Ecole Polytechnique Fédérale de Lausanne, Human Brain Project Coordination Office (EPFL-HBPPCO), Switzerland hereinafter described as EPFL-HBPPCO or “Service Providerâ€. + +2. Scope of the Terms of Service + + The following terms and conditions of this Agreement govern all use of the collab.humanbrainproject.eu website and all content, services and products available at or through the website, including, but not limited to, collab.humanbrainproject.eu and services.humanbrainproject.eu. The following terms do _not_ apply to services and web based applications offered by third-parties through the Collaboratory App extension system. + + +**Access to this HBP Medical Informatics Platform ("Platform") is provided to you under these terms and conditions for service and any amendments or supplements to them (collectively referred to as the "Terms & Conditions") that may be posted on the Platform from time to time. Your use of the Platform, or any other services or content provided through the Platform, shall be deemed to constitute your consent to be legally bound by the Terms & Conditions, which shall be enforceable in the same way as if you had signed the Terms & Conditions.** + +_If you do not accept the Terms & Conditions when applying for registration or thereafter, when using the Platform, you are not permitted to access or use the Platform or to submit or post any materials on it._ + +Besides the law applicable to these Terms & Conditions, this Platform and data available on this Platform are also subject to European legislations and regulations as well as to the ethical principles of Horizon 2020, the EU Framework programme for research and innovation ([https://ec.europa.eu/programmes/horizon2020/](https://ec.europa.eu/programmes/horizon2020/)). + +The Medical Informatics Platform is a privacy preserving platform that complies with the European regulation, based on Privacy By Design and by Default. The reference text is the REGULATION (EU) 2016/679 OF THE EUROPEAN PARLIAMENT AND OF THE COUNCIL of 27 April 2016, on the protection of natural persons with regard to the processing of personal data and on the free movement of such data, and repealing Directive 95/46/EC (General Data Protection Regulation) (henceforth ‘GDPR’). + +1. Put at Disposal and Operation of Platform + + The Platform is put at disposal and operated by the CHUV, Lausanne, as the Coordinator of the HBP Sub-Project 8 ("Coordinator"). + +2. Scope of the Terms & Conditions + + These Terms & Conditions govern all use of the Platform and all content, services and products available at or through the Platform. + +3. Definition of Terms + + The following definitions include terms used in European legislations and regulations and introduce new ones, specific to this Platform. + + 1. Approved Use means the access to and use of the Platform for non-commercial and non-competitive use for any Users’ research activities in the field of HBP and approved by the Scientific Committee. + 1. Beneficiary means any party to the HBP Agreements. + 1. MIP is the name given to the Medical Informatics Platform developed by the HBP. + 1. Consortium means the group that consists of all the parties being part of the HBP Agreements but does not include the European Commission ("EC") + 1. Data Providers. Individuals and/or institutions that produce and make available Data Sets on the Platform to the Data Users. + 1. Coordinator means the intermediary between the Consortium and the EC as stated in the HBP Agreements. + 1. Data Set. Digital data, either raw or derived, including but not limited to research and scientific data as well as metadata provided to the Platform by Data Providers. Data Set may contain software and algorithms. + 1. Data Subject. A natural or legal person whose personal data (i.e. all information relating to an identified or identifiable person) is processed. + 1. Data User. Individual and/or institution to which access to Data Sets on the Platform is granted, subject to the acceptance of the Terms & Conditions by such individuals and/or the institutions, and which are the Beneficiaries, the EC, EU Institutions and other EU bodies as well as the EU Member States. + 1. HBP is the Human Brain Project under the FET Integrated Project (FP7 Grant Agreement no. 604102, i.e. its ramp-up phase), and any following continuation of the project under Horizon 2020. + 1. HBP Agreements mean the agreements concluded in respect of the HBP, such as FP7 Grant Agreement no. 604102, the Consortium Agreement under the FP7 Grant Agreement no. 604102, the Framework Partnership Agreement no. 650003, and their subsequent agreements. + 1. Personal Data is defined as any information relating to an identified or identifiable natural or legal person, including institutions. An identifiable person is a person who can be identified, directly or indirectly, by reference to an identification number or factors specific to his or her physical, physiological, mental, economic, cultural or social identity. Personal Data does not include publicly available information that has not been combined with non- Personal Data, nor does it include information that has been anonymized. +4. Access to Platform + + The Platform intends to provide functionality designed to enable and enhance collaboration and team science in the field of the HBP. All this research shall, as far as possible, be monitored to ensure the ethical use of data and responsible research and innovation with active roles for scientists, philosophers, ethicists, policy makers and members of society. + + Access to the Platform is reserved to Data Users for activities falling under the Approved Use only. Beneficiaries must also comply with the HBP Agreements in their use of the Platform. + + 1. Login Credentials + + When you first register to use the Platform, you will be prompted to create a user name and password. You must keep your password secret and not give it to anyone else or let them use your account. You must inform us immediately if you suspect any unauthorized use of or access to your password or account. + + The Coordinator and the Beneficiaries that participated in the specific action related to the Platform will not be responsible if you suffer any harm or loss because you do not keep your password secret. + + 2. Registration Data and Process + + Registration will take place the first time you wish to access the Platform. The following registration information is required directly or by proxy prior to accessing the Platform: + + * name + * e-mail address; and + * motivation for using the platform. +5. Contributor's Confirmations and Liabilities + + Data Providers confirm that they have signed the Data Sharing Agreement and complied with the legal and ethical requirements, ensuring the data shared is compliant with all EU and member-state regulation and practices. + + The Coordinator may at its discretion review compliance of the Data Providers with these confirmations and liabilities. Non-compliant Data Sets may be removed from the Platform. + +6. Terms on Use + +7. Rights of Access and Rights of Use + + Use of (including access to) the MIP by the Users is restricted to the Approved Use. + + Data Sets are provided for use by the Data Users only. Any rights to sub-license are excluded, if not expressly agreed with the Contributor. + + The Data User is permitted to produce and distribute derived works from Data Sets provided that those derivatives are released for the Approved Use. Any other uses for the Data Sets or its derived products will require explicit permission from the Contributor. + + Software and algorithms contained in Data Sets are made available pursuant to the terms of their respective license agreements. For a use outside the HBP, a Contributor may require that the Data Sets are subject to licensing and/or must be kept confidential as provided for by these Terms & Conditions. This requirement must be expressly indicated in each Data Set. In such a case, licensing terms will be directly agreed between the Contributor and the involved Data Users. + +8. Other Limitations of Use + + The following additional limitations apply to the use of the Data Sets by the Data Users: + + 1. Data Users may receive access to de-identified or aggregated Data Sets and in such cases, they will not attempt to establish the identity of, or attempt to contact any of the Data Subjects; + 2. Data Users may not carry out any calculations, operations or transactions that may interrupt, destroy or restrict the functionality of the operation of the Platform or of any program, computer or means of telecommunications; + 3. Data Users may not use the Data Sets for high risk activities such as the operation of nuclear facilities, air traffic control, or life support systems, where the use or failure of the Services could lead to death, personal injury, or environmental damage. + 4. Data Users commit to require from anyone of their team who utilizes the Data Sets, or anyone with whom they share the Data Sets, to accept and comply with these Terms & Conditions; and + 5. Data Users commit to comply with any additional rules and regulations imposed by their institutions and their institutional review board in accessing and using the Data Sets. + +9. Citations + + Each Data User agrees to properly cite the Data Sets, including the Data Set Identifier, in any publications or in the metadata of any derived data products that are produced using the Data Sets. + + Citations shall take the following general form: Creator, Year of Data Set Publication, Title of Data Set, Data Set Identifier. Where a paper on the Data Set of its Contributor is available, then this should be cited. Where a date of issue of the Data Set is available, this date should be cited. + +9. Acknowledgements + + Data Users agree to include the following acknowledgment in any of their disseminations and publications, where the Data Sets contributed significantly to their content + + Data in this publication were provided by the HBP and/or received from services operated by the HBP. This project/research received funding from the European Union's Horizon 2020 Framework Programme for Research and Innovation under the Framework Partnership Agreement No. 650003 (HBP FPA and corresponding Specific Grant Agreement number). + + In addition, Data Users agree to include any additional acknowledgment of institutional support or specific funding awards provided in the metadata accompanying any Data Set, including those requested by the Contributor, in any dissemination where the Data Set contributes significantly to its content. + +9. Report of Misuse + + Any and all Data Users commit to report any use or disclosure of the Data Sets non-compliant with these Terms & Conditions of which they become aware as soon as possible, but at the latest within 15 days of becoming aware of such use or disclosure. + + Reports/disclosures should be submitted to the HBP Point of Registration at [https://www.hbp-pore.eu](https://www.hbp-pore.eu). + + Non-compliant Data Sets may be removed from the Platform. + + +General Data Protection Regulation +================================== + +1. Personal Data Policy + + The following privacy rules apply to any form of processing (including but not limited to collection, use and disclosure) of Personal Data through the Platform. + + This Personal Data Policy applies exclusively to this Platform and hence not to any other website the Platform refers to. + +2. Passive Collection of Personal Data + + While you use the Platform, Personal Data may be recorded passively (i.e. without you actively providing them to us), e.g. through use of your Internet Protocol ("IP") addresses and cookies ("Passive Collection"). + + * Internet Protocol + + An IP address is a number which is allocated to your device by your internet service provider in order to enable you to access the Internet. Data is saved automatically when you browse the Platform, whereby it is possible that information indirectly related to your person is collected and combined with your person. + + This information is used to enhance your experience in using the Platform and is not shared with external parties except as aggregated statistics. In the case of aggregated statistics, no personal information or behavioral data is visible. + + * Cookies + + To make this site work properly, we sometimes place small data files called cookies on your device. + + A cookie is a small text file that the Platform saves on your device when you visit the Platform. It enables the Platform to remember your actions and preferences (such as login, language, font size and other display preferences) over a period of time, so you do not have to keep re-entering them whenever you come back to the Platform. + + We may use cookies to remember: + + * if you have agreed (or not) to our use of cookies on the Platform; and + * your display preferences, such as contrast color settings or font size. + + Furthermore, please note that we use Google Analytics to monitor the traffic to our website. For more information read the Google Analytics policy (cf. [https://support.google.com/analytics/answer/6004245](https://support.google.com/analytics/answer/6004245) ). + + Enabling these cookies is not strictly necessary for the Platform to work but it will provide you with a better browsing experience. You can delete or block these cookies, but if you do that some features of the Platform may not work as intended. + + The cookie-related information is not used to identify you personally. These cookies are not used for any purpose other than those described here. + + You can control and/or delete cookies as you wish. For details, see www.aboutcookies.org. You can delete all cookies that are already on your device and you can set most browsers to prevent them from being placed. If you do this, however, you may have to manually adjust some preferences every time you visit the Platform and some services and functionalities may not work. + +3. Control on Personal Data + + You will always be able to check any of your Personal Data. This means that you can always (i) obtain information about your Personal Data on the Platform; (ii) request us to correct or update your Personal Data and (iii) request us to delete or block your Personal Data. + + Where we disclose Personal Data to domestic or international service providers (commissioned data processing) for the purpose of maintenance of the Platform, the service providers are not deemed third parties and are bound by contract to comply with Swiss Data Protection law and this Personal Data Policy. + + We will take appropriate measures to protect Personal Data from loss, misuse and unauthorized access, unauthorized disclosure, changes, deletion or destruction. Nevertheless, please note that the Internet and with that the Platform is never entirely secure or error-free. When sending your Personal Data electronically via the Platform, a secured internet connection (SSL) will be used for the transmission to your device. It is, however, your responsibility to take corresponding safeguard measures in the use of password etc. + +4. Copyright + + The content, organization, graphics, design, compilation, magnetic translation, digital conversion and other matters related to the Platform are protected under applicable copyrights, trademarks and other proprietary (including but not limited to intellectual property) rights. + + Subject to statutory allowances, extracts of material from the site may be accessed, downloaded and printed for your personal and non-commercial use within the Approved Use only. + +5. Confidentiality + + Data Sets uploaded to the Platform are considered non-confidential in all cases. + +6. Termination and Liability + + The Coordinator shall have the right to terminate access and use of the Data Sets immediately by written notice upon the Data User's breach of, or non-compliance with, any of the terms of the Terms & Conditions. + + The Data User may be held entirely responsible for any misuse that was caused or encouraged by the Data User's failure to abide by the Terms & Conditions. Consequences from failure to abide by the Terms & Conditions may include legal proceedings. + +7. Disclaimer + + The Data Sets, and any part thereof, as well as the Platform are provided for the Approved Use only. + + The Platform and the Data Sets are provided on an "as is" and "as available" basis. Please note that the Platform and the Data Sets may contain bugs, viruses, errors, problems or other limitations. To the extent permitted by law, the Coordinator and the Beneficiaries that participated in the specific action related to the Platform exclude any warranties (whether expressed or implied) for the Platform and the Data Sets. This includes, but is not limited to the disclaimer of any implied warranties of merchantability and fitness for a particular purpose of the Platform or of any Data Set. + + Data Sets may contain advice, opinions, statements or other information by various authors or entities. Reliance upon any such advice, opinion, statement or other information is at your own risk. + + The Coordinator and the Beneficiaries that participated in the specific action related to the Platform disclaims, to the extent permitted by law, all liability and responsibility arising from any use of the Platform or the Data Sets. In particular, but not as a limitation thereof, the Coordinator is and the Beneficiaries that participated in the specific action related to the Platform are not liable for any damages (including damages for loss of business, loss of profits, litigation, or the like), whether based on breach of contract, breach of warranty, tort (including negligence), product liability or otherwise, even if advised of the possibility of such damages. The acknowledgment of exclusion of liability is an essential condition for the Coordinator and the Beneficiaries that participated in the specific action related to the Platform granting access to the Platform and to the Data Sets. This Platform and its services and/or information are provided to Data Users with these limitations only. + + The Coordinator reserves the right to discontinue at any time, temporarily or permanently, your ability to access the Platform as well as to upload Data Sets and/or access them with or without notice, at its sole discretion and for any reason whatsoever. + +8. Applicable Law and Jurisdiction + + The substantive laws of Switzerland, excluding any conflict of law rules, shall apply to any dispute arising out of the access and use of the Platform and of the Data Sets pursuant to these Terms & Conditions. The ordinary courts of Lausanne, Switzerland, shall have exclusive jurisdiction, subject to appeal, if any. + + Law and jurisdiction applicable to the Data Providers, the Data Users and the Beneficiaries pursuant to the HBP Agreements are expressly reserved. + +9. Contact Us + + In case you have any queries, comments or concerns about these Terms & Conditions, please contact: platform@humanbrainproject.eu \ No newline at end of file diff --git a/api/package-lock.json b/api/package-lock.json index 44bfc96..ce58c93 100644 --- a/api/package-lock.json +++ b/api/package-lock.json @@ -1,12 +1,12 @@ { "name": "gateway", - "version": "1.0.1", + "version": "1.0.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "gateway", - "version": "1.0.1", + "version": "1.0.2", "license": "UNLICENSED", "dependencies": { "@nestjs/axios": "^0.0.1", @@ -23,7 +23,8 @@ "jsonata": "^1.8.5", "reflect-metadata": "^0.1.13", "rimraf": "^3.0.2", - "rxjs": "^7.2.0" + "rxjs": "^7.2.0", + "ts-md5": "^1.2.11" }, "devDependencies": { "@eclass/semantic-release-docker": "^2.0.0", @@ -9402,22 +9403,19 @@ "version": "1.1.2", "dev": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/npm/node_modules/@isaacs/string-locale-compare": { "version": "1.1.0", "dev": true, "inBundle": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/npm/node_modules/@npmcli/arborist": { "version": "2.9.0", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "@isaacs/string-locale-compare": "^1.0.1", "@npmcli/installed-package-contents": "^1.0.7", @@ -9463,15 +9461,13 @@ "version": "1.3.0", "dev": true, "inBundle": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/npm/node_modules/@npmcli/config": { "version": "2.3.0", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "ini": "^2.0.0", "mkdirp-infer-owner": "^2.0.0", @@ -9488,7 +9484,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "ansi-styles": "^4.3.0" }, @@ -9501,7 +9496,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "@gar/promisify": "^1.0.1", "semver": "^7.3.5" @@ -9512,7 +9506,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "@npmcli/promise-spawn": "^1.3.2", "lru-cache": "^6.0.0", @@ -9529,7 +9522,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "npm-bundled": "^1.1.1", "npm-normalize-package-bin": "^1.0.1" @@ -9546,7 +9538,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "@npmcli/name-from-folder": "^1.0.1", "glob": "^7.1.6", @@ -9562,7 +9553,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "cacache": "^15.0.5", "pacote": "^11.1.11", @@ -9574,7 +9564,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "mkdirp": "^1.0.4", "rimraf": "^3.0.2" @@ -9587,22 +9576,19 @@ "version": "1.0.1", "dev": true, "inBundle": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/npm/node_modules/@npmcli/node-gyp": { "version": "1.0.2", "dev": true, "inBundle": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/npm/node_modules/@npmcli/package-json": { "version": "1.0.1", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "json-parse-even-better-errors": "^2.3.1" } @@ -9612,7 +9598,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "infer-owner": "^1.0.4" } @@ -9622,7 +9607,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "@npmcli/node-gyp": "^1.0.2", "@npmcli/promise-spawn": "^1.3.2", @@ -9635,7 +9619,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 6" } @@ -9644,15 +9627,13 @@ "version": "1.1.1", "dev": true, "inBundle": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/npm/node_modules/agent-base": { "version": "6.0.2", "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "debug": "4" }, @@ -9665,7 +9646,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "debug": "^4.1.0", "depd": "^1.1.2", @@ -9680,7 +9660,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" @@ -9694,7 +9673,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -9711,7 +9689,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -9721,7 +9698,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -9736,36 +9712,31 @@ "version": "0.3.2", "dev": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/npm/node_modules/ansistyles": { "version": "0.1.3", "dev": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/npm/node_modules/aproba": { "version": "2.0.0", "dev": true, "inBundle": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/npm/node_modules/archy": { "version": "1.0.0", "dev": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/npm/node_modules/are-we-there-yet": { "version": "1.1.6", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "delegates": "^1.0.0", "readable-stream": "^3.6.0" @@ -9778,15 +9749,13 @@ "version": "2.0.6", "dev": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/npm/node_modules/asn1": { "version": "0.2.4", "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "safer-buffer": "~2.1.0" } @@ -9796,7 +9765,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.8" } @@ -9805,15 +9773,13 @@ "version": "0.4.0", "dev": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/npm/node_modules/aws-sign2": { "version": "0.7.0", "dev": true, "inBundle": true, "license": "Apache-2.0", - "peer": true, "engines": { "node": "*" } @@ -9822,22 +9788,19 @@ "version": "1.11.0", "dev": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/npm/node_modules/balanced-match": { "version": "1.0.2", "dev": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/npm/node_modules/bcrypt-pbkdf": { "version": "1.0.2", "dev": true, "inBundle": true, "license": "BSD-3-Clause", - "peer": true, "dependencies": { "tweetnacl": "^0.14.3" } @@ -9847,7 +9810,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "cmd-shim": "^4.0.1", "mkdirp": "^1.0.3", @@ -9865,7 +9827,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -9875,7 +9836,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -9885,15 +9845,13 @@ "version": "1.0.3", "dev": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/npm/node_modules/cacache": { "version": "15.3.0", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "@npmcli/fs": "^1.0.0", "@npmcli/move-file": "^1.0.1", @@ -9922,15 +9880,13 @@ "version": "0.12.0", "dev": true, "inBundle": true, - "license": "Apache-2.0", - "peer": true + "license": "Apache-2.0" }, "node_modules/npm/node_modules/chalk": { "version": "4.1.2", "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -9947,7 +9903,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "engines": { "node": ">=10" } @@ -9957,7 +9912,6 @@ "dev": true, "inBundle": true, "license": "BSD-2-Clause", - "peer": true, "dependencies": { "ip-regex": "^4.1.0" }, @@ -9970,7 +9924,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -9980,7 +9933,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "string-width": "^2.0.0", "strip-ansi": "^3.0.1" @@ -9994,7 +9946,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "object-assign": "^4.1.0", "string-width": "^4.2.0" @@ -10011,7 +9962,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -10021,7 +9971,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -10031,7 +9980,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -10046,7 +9994,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-regex": "^5.0.0" }, @@ -10059,7 +10006,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.8" } @@ -10069,7 +10015,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "mkdirp-infer-owner": "^2.0.0" }, @@ -10082,7 +10027,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -10092,7 +10036,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "color-name": "~1.1.4" }, @@ -10104,15 +10047,13 @@ "version": "1.1.4", "dev": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/npm/node_modules/color-support": { "version": "1.1.3", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "bin": { "color-support": "bin.js" } @@ -10123,7 +10064,6 @@ "inBundle": true, "license": "MIT", "optional": true, - "peer": true, "engines": { "node": ">=0.1.90" } @@ -10133,7 +10073,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "strip-ansi": "^3.0.0", "wcwidth": "^1.0.0" @@ -10144,7 +10083,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "delayed-stream": "~1.0.0" }, @@ -10156,36 +10094,31 @@ "version": "1.0.1", "dev": true, "inBundle": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/npm/node_modules/concat-map": { "version": "0.0.1", "dev": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/npm/node_modules/console-control-strings": { "version": "1.1.0", "dev": true, "inBundle": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/npm/node_modules/core-util-is": { "version": "1.0.2", "dev": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/npm/node_modules/dashdash": { "version": "1.14.1", "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "assert-plus": "^1.0.0" }, @@ -10198,7 +10131,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "ms": "2.1.2" }, @@ -10215,15 +10147,13 @@ "version": "2.1.2", "dev": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/npm/node_modules/debuglog": { "version": "1.0.1", "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": "*" } @@ -10233,7 +10163,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "clone": "^1.0.2" } @@ -10243,7 +10172,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.4.0" } @@ -10252,15 +10180,13 @@ "version": "1.0.0", "dev": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/npm/node_modules/depd": { "version": "1.1.2", "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -10270,7 +10196,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "asap": "^2.0.0", "wrappy": "1" @@ -10281,7 +10206,6 @@ "dev": true, "inBundle": true, "license": "BSD-3-Clause", - "peer": true, "engines": { "node": ">=0.3.1" } @@ -10291,7 +10215,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "jsbn": "~0.1.0", "safer-buffer": "^2.1.0" @@ -10301,8 +10224,7 @@ "version": "8.0.0", "dev": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/npm/node_modules/encoding": { "version": "0.1.13", @@ -10310,7 +10232,6 @@ "inBundle": true, "license": "MIT", "optional": true, - "peer": true, "dependencies": { "iconv-lite": "^0.6.2" } @@ -10320,7 +10241,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -10329,15 +10249,13 @@ "version": "2.0.3", "dev": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/npm/node_modules/extend": { "version": "3.0.2", "dev": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/npm/node_modules/extsprintf": { "version": "1.3.0", @@ -10346,36 +10264,31 @@ "node >=0.6.0" ], "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/npm/node_modules/fast-deep-equal": { "version": "3.1.3", "dev": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/npm/node_modules/fast-json-stable-stringify": { "version": "2.1.0", "dev": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/npm/node_modules/fastest-levenshtein": { "version": "1.0.12", "dev": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/npm/node_modules/forever-agent": { "version": "0.6.1", "dev": true, "inBundle": true, "license": "Apache-2.0", - "peer": true, "engines": { "node": "*" } @@ -10385,7 +10298,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "minipass": "^3.0.0" }, @@ -10397,22 +10309,19 @@ "version": "1.0.0", "dev": true, "inBundle": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/npm/node_modules/function-bind": { "version": "1.1.1", "dev": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/npm/node_modules/gauge": { "version": "3.0.1", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "aproba": "^1.0.3 || ^2.0.0", "color-support": "^1.1.2", @@ -10433,7 +10342,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "assert-plus": "^1.0.0" } @@ -10443,7 +10351,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -10463,15 +10370,13 @@ "version": "4.2.8", "dev": true, "inBundle": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/npm/node_modules/har-schema": { "version": "2.0.0", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "engines": { "node": ">=4" } @@ -10481,7 +10386,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "ajv": "^6.12.3", "har-schema": "^2.0.0" @@ -10495,7 +10399,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "function-bind": "^1.1.1" }, @@ -10508,7 +10411,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -10517,15 +10419,13 @@ "version": "2.0.1", "dev": true, "inBundle": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/npm/node_modules/hosted-git-info": { "version": "4.0.2", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "lru-cache": "^6.0.0" }, @@ -10537,15 +10437,13 @@ "version": "4.1.0", "dev": true, "inBundle": true, - "license": "BSD-2-Clause", - "peer": true + "license": "BSD-2-Clause" }, "node_modules/npm/node_modules/http-proxy-agent": { "version": "4.0.1", "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "@tootallnate/once": "1", "agent-base": "6", @@ -10560,7 +10458,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "assert-plus": "^1.0.0", "jsprim": "^1.2.2", @@ -10576,7 +10473,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "agent-base": "6", "debug": "4" @@ -10590,7 +10486,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "ms": "^2.0.0" } @@ -10601,7 +10496,6 @@ "inBundle": true, "license": "MIT", "optional": true, - "peer": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -10614,7 +10508,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "minimatch": "^3.0.4" } @@ -10624,7 +10517,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.8.19" } @@ -10634,7 +10526,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -10643,15 +10534,13 @@ "version": "1.0.4", "dev": true, "inBundle": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/npm/node_modules/inflight": { "version": "1.0.6", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -10661,15 +10550,13 @@ "version": "2.0.4", "dev": true, "inBundle": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/npm/node_modules/ini": { "version": "2.0.0", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "engines": { "node": ">=10" } @@ -10679,7 +10566,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "npm-package-arg": "^8.1.5", "promzard": "^0.3.0", @@ -10697,15 +10583,13 @@ "version": "1.1.5", "dev": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/npm/node_modules/ip-regex": { "version": "4.3.0", "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -10715,7 +10599,6 @@ "dev": true, "inBundle": true, "license": "BSD-2-Clause", - "peer": true, "dependencies": { "cidr-regex": "^3.1.1" }, @@ -10728,7 +10611,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "has": "^1.0.3" }, @@ -10741,7 +10623,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4" } @@ -10750,63 +10631,54 @@ "version": "1.0.1", "dev": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/npm/node_modules/is-typedarray": { "version": "1.0.0", "dev": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/npm/node_modules/isexe": { "version": "2.0.0", "dev": true, "inBundle": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/npm/node_modules/isstream": { "version": "0.1.2", "dev": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/npm/node_modules/jsbn": { "version": "0.1.1", "dev": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/npm/node_modules/json-parse-even-better-errors": { "version": "2.3.1", "dev": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/npm/node_modules/json-schema": { "version": "0.2.3", "dev": true, - "inBundle": true, - "peer": true + "inBundle": true }, "node_modules/npm/node_modules/json-schema-traverse": { "version": "0.4.1", "dev": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/npm/node_modules/json-stringify-nice": { "version": "1.1.4", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "funding": { "url": "https://github.com/sponsors/isaacs" } @@ -10815,8 +10687,7 @@ "version": "5.0.1", "dev": true, "inBundle": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/npm/node_modules/jsonparse": { "version": "1.3.1", @@ -10825,8 +10696,7 @@ "node >= 0.2.0" ], "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/npm/node_modules/jsprim": { "version": "1.4.1", @@ -10836,7 +10706,6 @@ ], "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", @@ -10848,22 +10717,19 @@ "version": "3.1.1", "dev": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/npm/node_modules/just-diff-apply": { "version": "3.0.0", "dev": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/npm/node_modules/libnpmaccess": { "version": "4.0.3", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "aproba": "^2.0.0", "minipass": "^3.1.1", @@ -10879,7 +10745,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "@npmcli/disparity-colors": "^1.0.1", "@npmcli/installed-package-contents": "^1.0.7", @@ -10899,7 +10764,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "@npmcli/arborist": "^2.3.0", "@npmcli/ci-detect": "^1.3.0", @@ -10922,7 +10786,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "@npmcli/arborist": "^2.5.0" } @@ -10932,7 +10795,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "aproba": "^2.0.0", "npm-registry-fetch": "^11.0.0" @@ -10946,7 +10808,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "aproba": "^2.0.0", "npm-registry-fetch": "^11.0.0" @@ -10960,7 +10821,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "@npmcli/run-script": "^1.8.3", "npm-package-arg": "^8.1.0", @@ -10975,7 +10835,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "normalize-package-data": "^3.0.2", "npm-package-arg": "^8.1.2", @@ -10992,7 +10851,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "npm-registry-fetch": "^11.0.0" }, @@ -11005,7 +10863,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "aproba": "^2.0.0", "npm-registry-fetch": "^11.0.0" @@ -11019,7 +10876,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "@npmcli/git": "^2.0.7", "@npmcli/run-script": "^1.8.4", @@ -11033,7 +10889,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "yallist": "^4.0.0" }, @@ -11046,7 +10901,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "agentkeepalive": "^4.1.3", "cacache": "^15.2.0", @@ -11074,7 +10928,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -11084,7 +10937,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "mime-db": "1.49.0" }, @@ -11097,7 +10949,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -11110,7 +10961,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "yallist": "^4.0.0" }, @@ -11123,7 +10973,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "minipass": "^3.0.0" }, @@ -11136,7 +10985,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "minipass": "^3.1.0", "minipass-sized": "^1.0.3", @@ -11154,7 +11002,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "minipass": "^3.0.0" }, @@ -11167,7 +11014,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "jsonparse": "^1.3.1", "minipass": "^3.0.0" @@ -11178,7 +11024,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "minipass": "^3.0.0" }, @@ -11191,7 +11036,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "minipass": "^3.0.0" }, @@ -11204,7 +11048,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "minipass": "^3.0.0", "yallist": "^4.0.0" @@ -11218,7 +11061,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "bin": { "mkdirp": "bin/cmd.js" }, @@ -11231,7 +11073,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "chownr": "^2.0.0", "infer-owner": "^1.0.4", @@ -11245,22 +11086,19 @@ "version": "2.1.3", "dev": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/npm/node_modules/mute-stream": { "version": "0.0.8", "dev": true, "inBundle": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/npm/node_modules/negotiator": { "version": "0.6.2", "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -11270,7 +11108,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "env-paths": "^2.2.0", "glob": "^7.1.4", @@ -11294,15 +11131,13 @@ "version": "1.2.0", "dev": true, "inBundle": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/npm/node_modules/node-gyp/node_modules/gauge": { "version": "2.7.4", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "aproba": "^1.0.3", "console-control-strings": "^1.0.0", @@ -11319,7 +11154,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "number-is-nan": "^1.0.0" }, @@ -11332,7 +11166,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "are-we-there-yet": "~1.1.2", "console-control-strings": "~1.1.0", @@ -11345,7 +11178,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -11360,7 +11192,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "abbrev": "1" }, @@ -11376,7 +11207,6 @@ "dev": true, "inBundle": true, "license": "BSD-2-Clause", - "peer": true, "dependencies": { "hosted-git-info": "^4.0.1", "is-core-module": "^2.5.0", @@ -11392,7 +11222,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "chalk": "^4.0.0" }, @@ -11405,7 +11234,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "npm-normalize-package-bin": "^1.0.1" } @@ -11415,7 +11243,6 @@ "dev": true, "inBundle": true, "license": "BSD-2-Clause", - "peer": true, "dependencies": { "semver": "^7.1.1" }, @@ -11427,15 +11254,13 @@ "version": "1.0.1", "dev": true, "inBundle": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/npm/node_modules/npm-package-arg": { "version": "8.1.5", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "hosted-git-info": "^4.0.1", "semver": "^7.3.4", @@ -11450,7 +11275,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "glob": "^7.1.6", "ignore-walk": "^3.0.3", @@ -11469,7 +11293,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "npm-install-checks": "^4.0.0", "npm-normalize-package-bin": "^1.0.1", @@ -11482,7 +11305,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "npm-registry-fetch": "^11.0.0" }, @@ -11495,7 +11317,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "make-fetch-happen": "^9.0.1", "minipass": "^3.1.3", @@ -11512,15 +11333,13 @@ "version": "1.0.1", "dev": true, "inBundle": true, - "license": "BSD-2-Clause", - "peer": true + "license": "BSD-2-Clause" }, "node_modules/npm/node_modules/npmlog": { "version": "5.0.1", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "are-we-there-yet": "^2.0.0", "console-control-strings": "^1.1.0", @@ -11533,7 +11352,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "delegates": "^1.0.0", "readable-stream": "^3.6.0" @@ -11547,7 +11365,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -11557,7 +11374,6 @@ "dev": true, "inBundle": true, "license": "Apache-2.0", - "peer": true, "engines": { "node": "*" } @@ -11567,7 +11383,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -11577,7 +11392,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "wrappy": "1" } @@ -11587,7 +11401,6 @@ "dev": true, "inBundle": true, "license": "(WTFPL OR MIT)", - "peer": true, "bin": { "opener": "bin/opener-bin.js" } @@ -11597,7 +11410,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "aggregate-error": "^3.0.0" }, @@ -11613,7 +11425,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "@npmcli/git": "^2.1.0", "@npmcli/installed-package-contents": "^1.0.6", @@ -11647,7 +11458,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "json-parse-even-better-errors": "^2.3.0", "just-diff": "^3.0.1", @@ -11659,7 +11469,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -11668,22 +11477,19 @@ "version": "2.1.0", "dev": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/npm/node_modules/proc-log": { "version": "1.0.0", "dev": true, "inBundle": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/npm/node_modules/promise-all-reject-late": { "version": "1.0.1", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "funding": { "url": "https://github.com/sponsors/isaacs" } @@ -11693,7 +11499,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "funding": { "url": "https://github.com/sponsors/isaacs" } @@ -11702,15 +11507,13 @@ "version": "1.0.1", "dev": true, "inBundle": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/npm/node_modules/promise-retry": { "version": "2.0.1", "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "err-code": "^2.0.2", "retry": "^0.12.0" @@ -11724,7 +11527,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "read": "1" } @@ -11733,15 +11535,13 @@ "version": "1.8.0", "dev": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/npm/node_modules/punycode": { "version": "2.1.1", "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -11750,7 +11550,6 @@ "version": "0.12.0", "dev": true, "inBundle": true, - "peer": true, "bin": { "qrcode-terminal": "bin/qrcode-terminal.js" } @@ -11760,7 +11559,6 @@ "dev": true, "inBundle": true, "license": "BSD-3-Clause", - "peer": true, "engines": { "node": ">=0.6" } @@ -11770,7 +11568,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "mute-stream": "~0.0.4" }, @@ -11782,15 +11579,13 @@ "version": "2.0.0", "dev": true, "inBundle": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/npm/node_modules/read-package-json": { "version": "4.1.1", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "glob": "^7.1.1", "json-parse-even-better-errors": "^2.3.0", @@ -11806,7 +11601,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "json-parse-even-better-errors": "^2.3.0", "npm-normalize-package-bin": "^1.0.1" @@ -11820,7 +11614,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -11835,7 +11628,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "debuglog": "^1.0.1", "dezalgo": "^1.0.0", @@ -11848,7 +11640,6 @@ "dev": true, "inBundle": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", @@ -11880,7 +11671,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.6", @@ -11895,7 +11685,6 @@ "dev": true, "inBundle": true, "license": "BSD-3-Clause", - "peer": true, "dependencies": { "psl": "^1.1.28", "punycode": "^2.1.1" @@ -11909,7 +11698,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 4" } @@ -11919,7 +11707,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "glob": "^7.1.3" }, @@ -11948,22 +11735,19 @@ } ], "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/npm/node_modules/safer-buffer": { "version": "2.1.2", "dev": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/npm/node_modules/semver": { "version": "7.3.5", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "lru-cache": "^6.0.0" }, @@ -11978,22 +11762,19 @@ "version": "2.0.0", "dev": true, "inBundle": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/npm/node_modules/signal-exit": { "version": "3.0.3", "dev": true, "inBundle": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/npm/node_modules/smart-buffer": { "version": "4.2.0", "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 6.0.0", "npm": ">= 3.0.0" @@ -12004,7 +11785,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "ip": "^1.1.5", "smart-buffer": "^4.1.0" @@ -12019,7 +11799,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "agent-base": "^6.0.2", "debug": "^4.3.1", @@ -12034,7 +11813,6 @@ "dev": true, "inBundle": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -12044,15 +11822,13 @@ "version": "2.3.0", "dev": true, "inBundle": true, - "license": "CC-BY-3.0", - "peer": true + "license": "CC-BY-3.0" }, "node_modules/npm/node_modules/spdx-expression-parse": { "version": "3.0.1", "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -12062,15 +11838,13 @@ "version": "3.0.10", "dev": true, "inBundle": true, - "license": "CC0-1.0", - "peer": true + "license": "CC0-1.0" }, "node_modules/npm/node_modules/sshpk": { "version": "1.16.1", "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -12096,7 +11870,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "minipass": "^3.1.1" }, @@ -12109,7 +11882,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "safe-buffer": "~5.2.0" } @@ -12119,7 +11891,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^4.0.0" @@ -12133,7 +11904,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4" } @@ -12143,7 +11913,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-regex": "^3.0.0" }, @@ -12155,15 +11924,13 @@ "version": "1.0.1", "dev": true, "inBundle": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/npm/node_modules/strip-ansi": { "version": "3.0.1", "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-regex": "^2.0.0" }, @@ -12176,7 +11943,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -12189,7 +11955,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", @@ -12206,29 +11971,25 @@ "version": "0.2.0", "dev": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/npm/node_modules/tiny-relative-date": { "version": "1.3.0", "dev": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/npm/node_modules/treeverse": { "version": "1.0.4", "dev": true, "inBundle": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/npm/node_modules/tunnel-agent": { "version": "0.6.0", "dev": true, "inBundle": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "safe-buffer": "^5.0.1" }, @@ -12240,15 +12001,13 @@ "version": "0.14.5", "dev": true, "inBundle": true, - "license": "Unlicense", - "peer": true + "license": "Unlicense" }, "node_modules/npm/node_modules/typedarray-to-buffer": { "version": "3.1.5", "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "is-typedarray": "^1.0.0" } @@ -12258,7 +12017,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "unique-slug": "^2.0.0" } @@ -12268,7 +12026,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "imurmurhash": "^0.1.4" } @@ -12278,7 +12035,6 @@ "dev": true, "inBundle": true, "license": "BSD-2-Clause", - "peer": true, "dependencies": { "punycode": "^2.1.0" } @@ -12287,15 +12043,13 @@ "version": "1.0.2", "dev": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/npm/node_modules/uuid": { "version": "3.4.0", "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "bin": { "uuid": "bin/uuid" } @@ -12305,7 +12059,6 @@ "dev": true, "inBundle": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" @@ -12316,7 +12069,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "builtins": "^1.0.3" } @@ -12329,7 +12081,6 @@ ], "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", @@ -12340,15 +12091,13 @@ "version": "1.0.0", "dev": true, "inBundle": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/npm/node_modules/wcwidth": { "version": "1.0.1", "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "defaults": "^1.0.3" } @@ -12358,7 +12107,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "isexe": "^2.0.0" }, @@ -12374,7 +12122,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "string-width": "^1.0.2 || 2" } @@ -12383,15 +12130,13 @@ "version": "1.0.2", "dev": true, "inBundle": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/npm/node_modules/write-file-atomic": { "version": "3.0.3", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "imurmurhash": "^0.1.4", "is-typedarray": "^1.0.0", @@ -12403,8 +12148,7 @@ "version": "4.0.0", "dev": true, "inBundle": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/nwsapi": { "version": "2.2.0", @@ -14981,6 +14725,11 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/ts-md5": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/ts-md5/-/ts-md5-1.2.11.tgz", + "integrity": "sha512-vAwy9rEuRE6a8xa1MavIVkLFyyU0ydk4CLMFA5vOVccmQKLOuGb/BHm3oEN7XHf2FoqS+z0pSvhaad/ombd1Vg==" + }, "node_modules/ts-node": { "version": "10.4.0", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.4.0.tgz", @@ -23249,20 +22998,17 @@ "@gar/promisify": { "version": "1.1.2", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "@isaacs/string-locale-compare": { "version": "1.1.0", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "@npmcli/arborist": { "version": "2.9.0", "bundled": true, "dev": true, - "peer": true, "requires": { "@isaacs/string-locale-compare": "^1.0.1", "@npmcli/installed-package-contents": "^1.0.7", @@ -23301,14 +23047,12 @@ "@npmcli/ci-detect": { "version": "1.3.0", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "@npmcli/config": { "version": "2.3.0", "bundled": true, "dev": true, - "peer": true, "requires": { "ini": "^2.0.0", "mkdirp-infer-owner": "^2.0.0", @@ -23321,7 +23065,6 @@ "version": "1.0.1", "bundled": true, "dev": true, - "peer": true, "requires": { "ansi-styles": "^4.3.0" } @@ -23330,7 +23073,6 @@ "version": "1.0.0", "bundled": true, "dev": true, - "peer": true, "requires": { "@gar/promisify": "^1.0.1", "semver": "^7.3.5" @@ -23340,7 +23082,6 @@ "version": "2.1.0", "bundled": true, "dev": true, - "peer": true, "requires": { "@npmcli/promise-spawn": "^1.3.2", "lru-cache": "^6.0.0", @@ -23356,7 +23097,6 @@ "version": "1.0.7", "bundled": true, "dev": true, - "peer": true, "requires": { "npm-bundled": "^1.1.1", "npm-normalize-package-bin": "^1.0.1" @@ -23366,7 +23106,6 @@ "version": "1.0.4", "bundled": true, "dev": true, - "peer": true, "requires": { "@npmcli/name-from-folder": "^1.0.1", "glob": "^7.1.6", @@ -23378,7 +23117,6 @@ "version": "1.1.1", "bundled": true, "dev": true, - "peer": true, "requires": { "cacache": "^15.0.5", "pacote": "^11.1.11", @@ -23389,7 +23127,6 @@ "version": "1.1.2", "bundled": true, "dev": true, - "peer": true, "requires": { "mkdirp": "^1.0.4", "rimraf": "^3.0.2" @@ -23398,20 +23135,17 @@ "@npmcli/name-from-folder": { "version": "1.0.1", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "@npmcli/node-gyp": { "version": "1.0.2", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "@npmcli/package-json": { "version": "1.0.1", "bundled": true, "dev": true, - "peer": true, "requires": { "json-parse-even-better-errors": "^2.3.1" } @@ -23420,7 +23154,6 @@ "version": "1.3.2", "bundled": true, "dev": true, - "peer": true, "requires": { "infer-owner": "^1.0.4" } @@ -23429,7 +23162,6 @@ "version": "1.8.6", "bundled": true, "dev": true, - "peer": true, "requires": { "@npmcli/node-gyp": "^1.0.2", "@npmcli/promise-spawn": "^1.3.2", @@ -23440,20 +23172,17 @@ "@tootallnate/once": { "version": "1.1.2", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "abbrev": { "version": "1.1.1", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "agent-base": { "version": "6.0.2", "bundled": true, "dev": true, - "peer": true, "requires": { "debug": "4" } @@ -23462,7 +23191,6 @@ "version": "4.1.4", "bundled": true, "dev": true, - "peer": true, "requires": { "debug": "^4.1.0", "depd": "^1.1.2", @@ -23473,7 +23201,6 @@ "version": "3.1.0", "bundled": true, "dev": true, - "peer": true, "requires": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" @@ -23483,7 +23210,6 @@ "version": "6.12.6", "bundled": true, "dev": true, - "peer": true, "requires": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -23494,14 +23220,12 @@ "ansi-regex": { "version": "2.1.1", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "ansi-styles": { "version": "4.3.0", "bundled": true, "dev": true, - "peer": true, "requires": { "color-convert": "^2.0.1" } @@ -23509,32 +23233,27 @@ "ansicolors": { "version": "0.3.2", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "ansistyles": { "version": "0.1.3", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "aproba": { "version": "2.0.0", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "archy": { "version": "1.0.0", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "are-we-there-yet": { "version": "1.1.6", "bundled": true, "dev": true, - "peer": true, "requires": { "delegates": "^1.0.0", "readable-stream": "^3.6.0" @@ -23543,14 +23262,12 @@ "asap": { "version": "2.0.6", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "asn1": { "version": "0.2.4", "bundled": true, "dev": true, - "peer": true, "requires": { "safer-buffer": "~2.1.0" } @@ -23558,38 +23275,32 @@ "assert-plus": { "version": "1.0.0", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "asynckit": { "version": "0.4.0", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "aws-sign2": { "version": "0.7.0", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "aws4": { "version": "1.11.0", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "balanced-match": { "version": "1.0.2", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "bcrypt-pbkdf": { "version": "1.0.2", "bundled": true, "dev": true, - "peer": true, "requires": { "tweetnacl": "^0.14.3" } @@ -23598,7 +23309,6 @@ "version": "2.2.1", "bundled": true, "dev": true, - "peer": true, "requires": { "cmd-shim": "^4.0.1", "mkdirp": "^1.0.3", @@ -23611,14 +23321,12 @@ "binary-extensions": { "version": "2.2.0", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, - "peer": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -23627,14 +23335,12 @@ "builtins": { "version": "1.0.3", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "cacache": { "version": "15.3.0", "bundled": true, "dev": true, - "peer": true, "requires": { "@npmcli/fs": "^1.0.0", "@npmcli/move-file": "^1.0.1", @@ -23659,14 +23365,12 @@ "caseless": { "version": "0.12.0", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "chalk": { "version": "4.1.2", "bundled": true, "dev": true, - "peer": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -23675,14 +23379,12 @@ "chownr": { "version": "2.0.0", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "cidr-regex": { "version": "3.1.1", "bundled": true, "dev": true, - "peer": true, "requires": { "ip-regex": "^4.1.0" } @@ -23690,14 +23392,12 @@ "clean-stack": { "version": "2.2.0", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "cli-columns": { "version": "3.1.2", "bundled": true, "dev": true, - "peer": true, "requires": { "string-width": "^2.0.0", "strip-ansi": "^3.0.1" @@ -23707,7 +23407,6 @@ "version": "0.6.0", "bundled": true, "dev": true, - "peer": true, "requires": { "colors": "^1.1.2", "object-assign": "^4.1.0", @@ -23717,20 +23416,17 @@ "ansi-regex": { "version": "5.0.0", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "is-fullwidth-code-point": { "version": "3.0.0", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "string-width": { "version": "4.2.2", "bundled": true, "dev": true, - "peer": true, "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -23741,7 +23437,6 @@ "version": "6.0.0", "bundled": true, "dev": true, - "peer": true, "requires": { "ansi-regex": "^5.0.0" } @@ -23751,14 +23446,12 @@ "clone": { "version": "1.0.4", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "cmd-shim": { "version": "4.1.0", "bundled": true, "dev": true, - "peer": true, "requires": { "mkdirp-infer-owner": "^2.0.0" } @@ -23766,14 +23459,12 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "color-convert": { "version": "2.0.1", "bundled": true, "dev": true, - "peer": true, "requires": { "color-name": "~1.1.4" } @@ -23781,27 +23472,23 @@ "color-name": { "version": "1.1.4", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "color-support": { "version": "1.1.3", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "colors": { "version": "1.4.0", "bundled": true, "dev": true, - "optional": true, - "peer": true + "optional": true }, "columnify": { "version": "1.5.4", "bundled": true, "dev": true, - "peer": true, "requires": { "strip-ansi": "^3.0.0", "wcwidth": "^1.0.0" @@ -23811,7 +23498,6 @@ "version": "1.0.8", "bundled": true, "dev": true, - "peer": true, "requires": { "delayed-stream": "~1.0.0" } @@ -23819,32 +23505,27 @@ "common-ancestor-path": { "version": "1.0.1", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "core-util-is": { "version": "1.0.2", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "dashdash": { "version": "1.14.1", "bundled": true, "dev": true, - "peer": true, "requires": { "assert-plus": "^1.0.0" } @@ -23853,7 +23534,6 @@ "version": "4.3.2", "bundled": true, "dev": true, - "peer": true, "requires": { "ms": "2.1.2" }, @@ -23861,22 +23541,19 @@ "ms": { "version": "2.1.2", "bundled": true, - "dev": true, - "peer": true + "dev": true } } }, "debuglog": { "version": "1.0.1", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "defaults": { "version": "1.0.3", "bundled": true, "dev": true, - "peer": true, "requires": { "clone": "^1.0.2" } @@ -23884,26 +23561,22 @@ "delayed-stream": { "version": "1.0.0", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "delegates": { "version": "1.0.0", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "depd": { "version": "1.1.2", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "dezalgo": { "version": "1.0.3", "bundled": true, "dev": true, - "peer": true, "requires": { "asap": "^2.0.0", "wrappy": "1" @@ -23912,14 +23585,12 @@ "diff": { "version": "5.0.0", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "ecc-jsbn": { "version": "0.1.2", "bundled": true, "dev": true, - "peer": true, "requires": { "jsbn": "~0.1.0", "safer-buffer": "^2.1.0" @@ -23928,15 +23599,13 @@ "emoji-regex": { "version": "8.0.0", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "encoding": { "version": "0.1.13", "bundled": true, "dev": true, "optional": true, - "peer": true, "requires": { "iconv-lite": "^0.6.2" } @@ -23944,56 +23613,47 @@ "env-paths": { "version": "2.2.1", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "err-code": { "version": "2.0.3", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "extend": { "version": "3.0.2", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "extsprintf": { "version": "1.3.0", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "fast-deep-equal": { "version": "3.1.3", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "fast-json-stable-stringify": { "version": "2.1.0", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "fastest-levenshtein": { "version": "1.0.12", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "forever-agent": { "version": "0.6.1", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "fs-minipass": { "version": "2.1.0", "bundled": true, "dev": true, - "peer": true, "requires": { "minipass": "^3.0.0" } @@ -24001,20 +23661,17 @@ "fs.realpath": { "version": "1.0.0", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "function-bind": { "version": "1.1.1", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "gauge": { "version": "3.0.1", "bundled": true, "dev": true, - "peer": true, "requires": { "aproba": "^1.0.3 || ^2.0.0", "color-support": "^1.1.2", @@ -24031,7 +23688,6 @@ "version": "0.1.7", "bundled": true, "dev": true, - "peer": true, "requires": { "assert-plus": "^1.0.0" } @@ -24040,7 +23696,6 @@ "version": "7.2.0", "bundled": true, "dev": true, - "peer": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -24053,20 +23708,17 @@ "graceful-fs": { "version": "4.2.8", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "har-schema": { "version": "2.0.0", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "har-validator": { "version": "5.1.5", "bundled": true, "dev": true, - "peer": true, "requires": { "ajv": "^6.12.3", "har-schema": "^2.0.0" @@ -24076,7 +23728,6 @@ "version": "1.0.3", "bundled": true, "dev": true, - "peer": true, "requires": { "function-bind": "^1.1.1" } @@ -24084,20 +23735,17 @@ "has-flag": { "version": "4.0.0", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "has-unicode": { "version": "2.0.1", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "hosted-git-info": { "version": "4.0.2", "bundled": true, "dev": true, - "peer": true, "requires": { "lru-cache": "^6.0.0" } @@ -24105,14 +23753,12 @@ "http-cache-semantics": { "version": "4.1.0", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "http-proxy-agent": { "version": "4.0.1", "bundled": true, "dev": true, - "peer": true, "requires": { "@tootallnate/once": "1", "agent-base": "6", @@ -24123,7 +23769,6 @@ "version": "1.2.0", "bundled": true, "dev": true, - "peer": true, "requires": { "assert-plus": "^1.0.0", "jsprim": "^1.2.2", @@ -24134,7 +23779,6 @@ "version": "5.0.0", "bundled": true, "dev": true, - "peer": true, "requires": { "agent-base": "6", "debug": "4" @@ -24144,7 +23788,6 @@ "version": "1.2.1", "bundled": true, "dev": true, - "peer": true, "requires": { "ms": "^2.0.0" } @@ -24154,7 +23797,6 @@ "bundled": true, "dev": true, "optional": true, - "peer": true, "requires": { "safer-buffer": ">= 2.1.2 < 3.0.0" } @@ -24163,7 +23805,6 @@ "version": "3.0.4", "bundled": true, "dev": true, - "peer": true, "requires": { "minimatch": "^3.0.4" } @@ -24171,26 +23812,22 @@ "imurmurhash": { "version": "0.1.4", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "indent-string": { "version": "4.0.0", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "infer-owner": { "version": "1.0.4", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "inflight": { "version": "1.0.6", "bundled": true, "dev": true, - "peer": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -24199,20 +23836,17 @@ "inherits": { "version": "2.0.4", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "ini": { "version": "2.0.0", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "init-package-json": { "version": "2.0.5", "bundled": true, "dev": true, - "peer": true, "requires": { "npm-package-arg": "^8.1.5", "promzard": "^0.3.0", @@ -24226,20 +23860,17 @@ "ip": { "version": "1.1.5", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "ip-regex": { "version": "4.3.0", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "is-cidr": { "version": "4.0.2", "bundled": true, "dev": true, - "peer": true, "requires": { "cidr-regex": "^3.1.1" } @@ -24248,7 +23879,6 @@ "version": "2.7.0", "bundled": true, "dev": true, - "peer": true, "requires": { "has": "^1.0.3" } @@ -24256,80 +23886,67 @@ "is-fullwidth-code-point": { "version": "2.0.0", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "is-lambda": { "version": "1.0.1", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "is-typedarray": { "version": "1.0.0", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "isexe": { "version": "2.0.0", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "isstream": { "version": "0.1.2", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "jsbn": { "version": "0.1.1", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "json-parse-even-better-errors": { "version": "2.3.1", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "json-schema": { "version": "0.2.3", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "json-schema-traverse": { "version": "0.4.1", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "json-stringify-nice": { "version": "1.1.4", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "json-stringify-safe": { "version": "5.0.1", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "jsonparse": { "version": "1.3.1", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "jsprim": { "version": "1.4.1", "bundled": true, "dev": true, - "peer": true, "requires": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", @@ -24340,20 +23957,17 @@ "just-diff": { "version": "3.1.1", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "just-diff-apply": { "version": "3.0.0", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "libnpmaccess": { "version": "4.0.3", "bundled": true, "dev": true, - "peer": true, "requires": { "aproba": "^2.0.0", "minipass": "^3.1.1", @@ -24365,7 +23979,6 @@ "version": "2.0.4", "bundled": true, "dev": true, - "peer": true, "requires": { "@npmcli/disparity-colors": "^1.0.1", "@npmcli/installed-package-contents": "^1.0.7", @@ -24381,7 +23994,6 @@ "version": "2.0.1", "bundled": true, "dev": true, - "peer": true, "requires": { "@npmcli/arborist": "^2.3.0", "@npmcli/ci-detect": "^1.3.0", @@ -24400,7 +24012,6 @@ "version": "1.1.0", "bundled": true, "dev": true, - "peer": true, "requires": { "@npmcli/arborist": "^2.5.0" } @@ -24409,7 +24020,6 @@ "version": "6.0.3", "bundled": true, "dev": true, - "peer": true, "requires": { "aproba": "^2.0.0", "npm-registry-fetch": "^11.0.0" @@ -24419,7 +24029,6 @@ "version": "2.0.3", "bundled": true, "dev": true, - "peer": true, "requires": { "aproba": "^2.0.0", "npm-registry-fetch": "^11.0.0" @@ -24429,7 +24038,6 @@ "version": "2.0.1", "bundled": true, "dev": true, - "peer": true, "requires": { "@npmcli/run-script": "^1.8.3", "npm-package-arg": "^8.1.0", @@ -24440,7 +24048,6 @@ "version": "4.0.2", "bundled": true, "dev": true, - "peer": true, "requires": { "normalize-package-data": "^3.0.2", "npm-package-arg": "^8.1.2", @@ -24453,7 +24060,6 @@ "version": "3.1.2", "bundled": true, "dev": true, - "peer": true, "requires": { "npm-registry-fetch": "^11.0.0" } @@ -24462,7 +24068,6 @@ "version": "2.0.4", "bundled": true, "dev": true, - "peer": true, "requires": { "aproba": "^2.0.0", "npm-registry-fetch": "^11.0.0" @@ -24472,7 +24077,6 @@ "version": "1.2.1", "bundled": true, "dev": true, - "peer": true, "requires": { "@npmcli/git": "^2.0.7", "@npmcli/run-script": "^1.8.4", @@ -24485,7 +24089,6 @@ "version": "6.0.0", "bundled": true, "dev": true, - "peer": true, "requires": { "yallist": "^4.0.0" } @@ -24494,7 +24097,6 @@ "version": "9.1.0", "bundled": true, "dev": true, - "peer": true, "requires": { "agentkeepalive": "^4.1.3", "cacache": "^15.2.0", @@ -24517,14 +24119,12 @@ "mime-db": { "version": "1.49.0", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "mime-types": { "version": "2.1.32", "bundled": true, "dev": true, - "peer": true, "requires": { "mime-db": "1.49.0" } @@ -24533,7 +24133,6 @@ "version": "3.0.4", "bundled": true, "dev": true, - "peer": true, "requires": { "brace-expansion": "^1.1.7" } @@ -24542,7 +24141,6 @@ "version": "3.1.5", "bundled": true, "dev": true, - "peer": true, "requires": { "yallist": "^4.0.0" } @@ -24551,7 +24149,6 @@ "version": "1.0.2", "bundled": true, "dev": true, - "peer": true, "requires": { "minipass": "^3.0.0" } @@ -24560,7 +24157,6 @@ "version": "1.4.1", "bundled": true, "dev": true, - "peer": true, "requires": { "encoding": "^0.1.12", "minipass": "^3.1.0", @@ -24572,7 +24168,6 @@ "version": "1.0.5", "bundled": true, "dev": true, - "peer": true, "requires": { "minipass": "^3.0.0" } @@ -24581,7 +24176,6 @@ "version": "1.0.1", "bundled": true, "dev": true, - "peer": true, "requires": { "jsonparse": "^1.3.1", "minipass": "^3.0.0" @@ -24591,7 +24185,6 @@ "version": "1.2.4", "bundled": true, "dev": true, - "peer": true, "requires": { "minipass": "^3.0.0" } @@ -24600,7 +24193,6 @@ "version": "1.0.3", "bundled": true, "dev": true, - "peer": true, "requires": { "minipass": "^3.0.0" } @@ -24609,7 +24201,6 @@ "version": "2.1.2", "bundled": true, "dev": true, - "peer": true, "requires": { "minipass": "^3.0.0", "yallist": "^4.0.0" @@ -24618,14 +24209,12 @@ "mkdirp": { "version": "1.0.4", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "mkdirp-infer-owner": { "version": "2.0.0", "bundled": true, "dev": true, - "peer": true, "requires": { "chownr": "^2.0.0", "infer-owner": "^1.0.4", @@ -24635,26 +24224,22 @@ "ms": { "version": "2.1.3", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "mute-stream": { "version": "0.0.8", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "negotiator": { "version": "0.6.2", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "node-gyp": { "version": "7.1.2", "bundled": true, "dev": true, - "peer": true, "requires": { "env-paths": "^2.2.0", "glob": "^7.1.4", @@ -24671,14 +24256,12 @@ "aproba": { "version": "1.2.0", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "gauge": { "version": "2.7.4", "bundled": true, "dev": true, - "peer": true, "requires": { "aproba": "^1.0.3", "console-control-strings": "^1.0.0", @@ -24694,7 +24277,6 @@ "version": "1.0.0", "bundled": true, "dev": true, - "peer": true, "requires": { "number-is-nan": "^1.0.0" } @@ -24703,7 +24285,6 @@ "version": "4.1.2", "bundled": true, "dev": true, - "peer": true, "requires": { "are-we-there-yet": "~1.1.2", "console-control-strings": "~1.1.0", @@ -24715,7 +24296,6 @@ "version": "1.0.2", "bundled": true, "dev": true, - "peer": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -24728,7 +24308,6 @@ "version": "5.0.0", "bundled": true, "dev": true, - "peer": true, "requires": { "abbrev": "1" } @@ -24737,7 +24316,6 @@ "version": "3.0.3", "bundled": true, "dev": true, - "peer": true, "requires": { "hosted-git-info": "^4.0.1", "is-core-module": "^2.5.0", @@ -24749,7 +24327,6 @@ "version": "2.1.5", "bundled": true, "dev": true, - "peer": true, "requires": { "chalk": "^4.0.0" } @@ -24758,7 +24335,6 @@ "version": "1.1.2", "bundled": true, "dev": true, - "peer": true, "requires": { "npm-normalize-package-bin": "^1.0.1" } @@ -24767,7 +24343,6 @@ "version": "4.0.0", "bundled": true, "dev": true, - "peer": true, "requires": { "semver": "^7.1.1" } @@ -24775,14 +24350,12 @@ "npm-normalize-package-bin": { "version": "1.0.1", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "npm-package-arg": { "version": "8.1.5", "bundled": true, "dev": true, - "peer": true, "requires": { "hosted-git-info": "^4.0.1", "semver": "^7.3.4", @@ -24793,7 +24366,6 @@ "version": "2.2.2", "bundled": true, "dev": true, - "peer": true, "requires": { "glob": "^7.1.6", "ignore-walk": "^3.0.3", @@ -24805,7 +24377,6 @@ "version": "6.1.1", "bundled": true, "dev": true, - "peer": true, "requires": { "npm-install-checks": "^4.0.0", "npm-normalize-package-bin": "^1.0.1", @@ -24817,7 +24388,6 @@ "version": "5.0.4", "bundled": true, "dev": true, - "peer": true, "requires": { "npm-registry-fetch": "^11.0.0" } @@ -24826,7 +24396,6 @@ "version": "11.0.0", "bundled": true, "dev": true, - "peer": true, "requires": { "make-fetch-happen": "^9.0.1", "minipass": "^3.1.3", @@ -24839,14 +24408,12 @@ "npm-user-validate": { "version": "1.0.1", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "npmlog": { "version": "5.0.1", "bundled": true, "dev": true, - "peer": true, "requires": { "are-we-there-yet": "^2.0.0", "console-control-strings": "^1.1.0", @@ -24858,7 +24425,6 @@ "version": "2.0.0", "bundled": true, "dev": true, - "peer": true, "requires": { "delegates": "^1.0.0", "readable-stream": "^3.6.0" @@ -24869,26 +24435,22 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "oauth-sign": { "version": "0.9.0", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "object-assign": { "version": "4.1.1", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "once": { "version": "1.4.0", "bundled": true, "dev": true, - "peer": true, "requires": { "wrappy": "1" } @@ -24896,14 +24458,12 @@ "opener": { "version": "1.5.2", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "p-map": { "version": "4.0.0", "bundled": true, "dev": true, - "peer": true, "requires": { "aggregate-error": "^3.0.0" } @@ -24912,7 +24472,6 @@ "version": "11.3.5", "bundled": true, "dev": true, - "peer": true, "requires": { "@npmcli/git": "^2.1.0", "@npmcli/installed-package-contents": "^1.0.6", @@ -24939,7 +24498,6 @@ "version": "1.1.1", "bundled": true, "dev": true, - "peer": true, "requires": { "json-parse-even-better-errors": "^2.3.0", "just-diff": "^3.0.1", @@ -24949,44 +24507,37 @@ "path-is-absolute": { "version": "1.0.1", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "performance-now": { "version": "2.1.0", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "proc-log": { "version": "1.0.0", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "promise-all-reject-late": { "version": "1.0.1", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "promise-call-limit": { "version": "1.0.1", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "promise-inflight": { "version": "1.0.1", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "promise-retry": { "version": "2.0.1", "bundled": true, "dev": true, - "peer": true, "requires": { "err-code": "^2.0.2", "retry": "^0.12.0" @@ -24996,7 +24547,6 @@ "version": "0.3.0", "bundled": true, "dev": true, - "peer": true, "requires": { "read": "1" } @@ -25004,32 +24554,27 @@ "psl": { "version": "1.8.0", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "punycode": { "version": "2.1.1", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "qrcode-terminal": { "version": "0.12.0", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "qs": { "version": "6.5.2", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "read": { "version": "1.0.7", "bundled": true, "dev": true, - "peer": true, "requires": { "mute-stream": "~0.0.4" } @@ -25037,14 +24582,12 @@ "read-cmd-shim": { "version": "2.0.0", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "read-package-json": { "version": "4.1.1", "bundled": true, "dev": true, - "peer": true, "requires": { "glob": "^7.1.1", "json-parse-even-better-errors": "^2.3.0", @@ -25056,7 +24599,6 @@ "version": "2.0.3", "bundled": true, "dev": true, - "peer": true, "requires": { "json-parse-even-better-errors": "^2.3.0", "npm-normalize-package-bin": "^1.0.1" @@ -25066,7 +24608,6 @@ "version": "3.6.0", "bundled": true, "dev": true, - "peer": true, "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -25077,7 +24618,6 @@ "version": "1.1.0", "bundled": true, "dev": true, - "peer": true, "requires": { "debuglog": "^1.0.1", "dezalgo": "^1.0.0", @@ -25089,7 +24629,6 @@ "version": "2.88.2", "bundled": true, "dev": true, - "peer": true, "requires": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", @@ -25117,7 +24656,6 @@ "version": "2.3.3", "bundled": true, "dev": true, - "peer": true, "requires": { "asynckit": "^0.4.0", "combined-stream": "^1.0.6", @@ -25128,7 +24666,6 @@ "version": "2.5.0", "bundled": true, "dev": true, - "peer": true, "requires": { "psl": "^1.1.28", "punycode": "^2.1.1" @@ -25139,14 +24676,12 @@ "retry": { "version": "0.12.0", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "rimraf": { "version": "3.0.2", "bundled": true, "dev": true, - "peer": true, "requires": { "glob": "^7.1.3" } @@ -25154,20 +24689,17 @@ "safe-buffer": { "version": "5.2.1", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "safer-buffer": { "version": "2.1.2", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "semver": { "version": "7.3.5", "bundled": true, "dev": true, - "peer": true, "requires": { "lru-cache": "^6.0.0" } @@ -25175,26 +24707,22 @@ "set-blocking": { "version": "2.0.0", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "signal-exit": { "version": "3.0.3", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "smart-buffer": { "version": "4.2.0", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "socks": { "version": "2.6.1", "bundled": true, "dev": true, - "peer": true, "requires": { "ip": "^1.1.5", "smart-buffer": "^4.1.0" @@ -25204,7 +24732,6 @@ "version": "6.1.0", "bundled": true, "dev": true, - "peer": true, "requires": { "agent-base": "^6.0.2", "debug": "^4.3.1", @@ -25215,7 +24742,6 @@ "version": "3.1.1", "bundled": true, "dev": true, - "peer": true, "requires": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -25224,14 +24750,12 @@ "spdx-exceptions": { "version": "2.3.0", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "spdx-expression-parse": { "version": "3.0.1", "bundled": true, "dev": true, - "peer": true, "requires": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -25240,14 +24764,12 @@ "spdx-license-ids": { "version": "3.0.10", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "sshpk": { "version": "1.16.1", "bundled": true, "dev": true, - "peer": true, "requires": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -25264,7 +24786,6 @@ "version": "8.0.1", "bundled": true, "dev": true, - "peer": true, "requires": { "minipass": "^3.1.1" } @@ -25273,7 +24794,6 @@ "version": "1.3.0", "bundled": true, "dev": true, - "peer": true, "requires": { "safe-buffer": "~5.2.0" } @@ -25282,7 +24802,6 @@ "version": "2.1.1", "bundled": true, "dev": true, - "peer": true, "requires": { "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^4.0.0" @@ -25291,14 +24810,12 @@ "ansi-regex": { "version": "3.0.0", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "strip-ansi": { "version": "4.0.0", "bundled": true, "dev": true, - "peer": true, "requires": { "ansi-regex": "^3.0.0" } @@ -25308,14 +24825,12 @@ "stringify-package": { "version": "1.0.1", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "strip-ansi": { "version": "3.0.1", "bundled": true, "dev": true, - "peer": true, "requires": { "ansi-regex": "^2.0.0" } @@ -25324,7 +24839,6 @@ "version": "7.2.0", "bundled": true, "dev": true, - "peer": true, "requires": { "has-flag": "^4.0.0" } @@ -25333,7 +24847,6 @@ "version": "6.1.11", "bundled": true, "dev": true, - "peer": true, "requires": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", @@ -25346,26 +24859,22 @@ "text-table": { "version": "0.2.0", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "tiny-relative-date": { "version": "1.3.0", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "treeverse": { "version": "1.0.4", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "tunnel-agent": { "version": "0.6.0", "bundled": true, "dev": true, - "peer": true, "requires": { "safe-buffer": "^5.0.1" } @@ -25373,14 +24882,12 @@ "tweetnacl": { "version": "0.14.5", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "typedarray-to-buffer": { "version": "3.1.5", "bundled": true, "dev": true, - "peer": true, "requires": { "is-typedarray": "^1.0.0" } @@ -25389,7 +24896,6 @@ "version": "1.1.1", "bundled": true, "dev": true, - "peer": true, "requires": { "unique-slug": "^2.0.0" } @@ -25398,7 +24904,6 @@ "version": "2.0.2", "bundled": true, "dev": true, - "peer": true, "requires": { "imurmurhash": "^0.1.4" } @@ -25407,7 +24912,6 @@ "version": "4.4.1", "bundled": true, "dev": true, - "peer": true, "requires": { "punycode": "^2.1.0" } @@ -25415,20 +24919,17 @@ "util-deprecate": { "version": "1.0.2", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "uuid": { "version": "3.4.0", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "validate-npm-package-license": { "version": "3.0.4", "bundled": true, "dev": true, - "peer": true, "requires": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" @@ -25438,7 +24939,6 @@ "version": "3.0.0", "bundled": true, "dev": true, - "peer": true, "requires": { "builtins": "^1.0.3" } @@ -25447,7 +24947,6 @@ "version": "1.10.0", "bundled": true, "dev": true, - "peer": true, "requires": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", @@ -25457,14 +24956,12 @@ "walk-up-path": { "version": "1.0.0", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "wcwidth": { "version": "1.0.1", "bundled": true, "dev": true, - "peer": true, "requires": { "defaults": "^1.0.3" } @@ -25473,7 +24970,6 @@ "version": "2.0.2", "bundled": true, "dev": true, - "peer": true, "requires": { "isexe": "^2.0.0" } @@ -25482,7 +24978,6 @@ "version": "1.1.3", "bundled": true, "dev": true, - "peer": true, "requires": { "string-width": "^1.0.2 || 2" } @@ -25490,14 +24985,12 @@ "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true, - "peer": true + "dev": true }, "write-file-atomic": { "version": "3.0.3", "bundled": true, "dev": true, - "peer": true, "requires": { "imurmurhash": "^0.1.4", "is-typedarray": "^1.0.0", @@ -25508,8 +25001,7 @@ "yallist": { "version": "4.0.0", "bundled": true, - "dev": true, - "peer": true + "dev": true } } }, @@ -27428,6 +26920,11 @@ } } }, + "ts-md5": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/ts-md5/-/ts-md5-1.2.11.tgz", + "integrity": "sha512-vAwy9rEuRE6a8xa1MavIVkLFyyU0ydk4CLMFA5vOVccmQKLOuGb/BHm3oEN7XHf2FoqS+z0pSvhaad/ombd1Vg==" + }, "ts-node": { "version": "10.4.0", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.4.0.tgz", diff --git a/api/package.json b/api/package.json index 5dbfdbc..ed2611e 100644 --- a/api/package.json +++ b/api/package.json @@ -37,7 +37,8 @@ "jsonata": "^1.8.5", "reflect-metadata": "^0.1.13", "rimraf": "^3.0.2", - "rxjs": "^7.2.0" + "rxjs": "^7.2.0", + "ts-md5": "^1.2.11" }, "devDependencies": { "@eclass/semantic-release-docker": "^2.0.0", @@ -123,7 +124,12 @@ [ "@saithodev/semantic-release-backmerge", { - "branches": [{"from": "main", "to": "develop"}] + "branches": [ + { + "from": "main", + "to": "develop" + } + ] } ] ], diff --git a/api/src/engine/assets.service.ts b/api/src/engine/assets.service.ts new file mode 100644 index 0000000..b01c5c3 --- /dev/null +++ b/api/src/engine/assets.service.ts @@ -0,0 +1,56 @@ +import { Inject, Injectable } from '@nestjs/common'; +import * as fs from 'fs'; +import { join } from 'path/posix'; +import { ENGINE_MODULE_OPTIONS } from './engine.constants'; +import { IEngineOptions } from './engine.interfaces'; + +@Injectable() +export class AssetsService { + constructor( + @Inject(ENGINE_MODULE_OPTIONS) + private readonly engineOptions: IEngineOptions, + ) {} + + /** + * Get internal asset file from filename + * @param filename + * @returns string if file is found undefined otherwise + */ + getAssetFile(filename: string): string | undefined { + // Construct file path based on the connector id + let filePath = join( + process.cwd(), + 'assets/engines', + this.engineOptions.type, + filename, + ); + + // if file doesn't exist for the current connector fallback to default + if (!fs.existsSync(filePath)) { + filePath = join( + process.cwd(), + 'assets/engines/default', + filename.toLowerCase(), + ); + } + + return fs.existsSync(filePath) ? filePath : undefined; + } + + /** + * Get markdown enhanced with custom variable + * `$ASSETS_URL$` will be transform with backend url + * @param filename name of the asset + * @param baseurl url of the backend service + * @returns string markdown + */ + getMarkdown(filename: string, baseurl: string): string { + const filePath = this.getAssetFile(filename); + + if (!filePath) return ''; + + const md = fs.readFileSync(filePath).toString(); + + return md.replace(/\$ASSETS_URL\$/g, baseurl); + } +} diff --git a/api/src/engine/connectors/datashield/assets/SOPHIA_logo.png b/api/src/engine/connectors/datashield/assets/SOPHIA_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..f6eb8e35ce3cb90fe7588eb7ee73d8321360f449 GIT binary patch literal 33259 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ℜ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 Kma3F63H*PQue!_t literal 0 HcmV?d00001 diff --git a/api/src/engine/connectors/datashield/main.connector.ts b/api/src/engine/connectors/datashield/main.connector.ts index 010e000..4451989 100644 --- a/api/src/engine/connectors/datashield/main.connector.ts +++ b/api/src/engine/connectors/datashield/main.connector.ts @@ -5,7 +5,11 @@ import { Request } from 'express'; import { firstValueFrom, Observable } from 'rxjs'; import { MIME_TYPES } from 'src/common/interfaces/utilities.interface'; import { ENGINE_MODULE_OPTIONS } from 'src/engine/engine.constants'; -import { IEngineOptions, IEngineService } from 'src/engine/engine.interfaces'; +import { + IConfiguration, + IEngineOptions, + IEngineService, +} from 'src/engine/engine.interfaces'; import { Domain } from 'src/engine/models/domain.model'; import { Algorithm } from 'src/engine/models/experiment/algorithm.model'; import { @@ -32,6 +36,10 @@ export default class DataShieldService implements IEngineService { @Inject(REQUEST) private readonly req: Request, ) {} + getConfiguration(): IConfiguration { + return {}; + } + logout(): void { throw new Error('Method not implemented.'); } diff --git a/api/src/engine/connectors/exareme/main.connector.ts b/api/src/engine/connectors/exareme/main.connector.ts index 2c9e02a..22a5d85 100644 --- a/api/src/engine/connectors/exareme/main.connector.ts +++ b/api/src/engine/connectors/exareme/main.connector.ts @@ -11,7 +11,11 @@ import { Request } from 'express'; import { IncomingMessage } from 'http'; import { firstValueFrom, map, Observable } from 'rxjs'; import { ENGINE_MODULE_OPTIONS } from 'src/engine/engine.constants'; -import { IEngineOptions, IEngineService } from 'src/engine/engine.interfaces'; +import { + IConfiguration, + IEngineOptions, + IEngineService, +} from 'src/engine/engine.interfaces'; import { Domain } from 'src/engine/models/domain.model'; import { Algorithm } from 'src/engine/models/experiment/algorithm.model'; import { @@ -51,6 +55,13 @@ export default class ExaremeService implements IEngineService { : req.headers; } + getConfiguration(): IConfiguration { + return { + contactLink: 'https://ebrains.eu/support/', + galaxy: true, + }; + } + async logout() { const path = `${this.options.baseurl}logout`; diff --git a/api/src/engine/engine.controller.ts b/api/src/engine/engine.controller.ts index 70619c2..6338a6b 100644 --- a/api/src/engine/engine.controller.ts +++ b/api/src/engine/engine.controller.ts @@ -1,57 +1,59 @@ import { Controller, - Delete, Get, Inject, + NotFoundException, Param, - Patch, Post, + Req, + Res, UseInterceptors, } from '@nestjs/common'; +import { Request, Response } from 'express'; +import { join } from 'path/posix'; import { Observable } from 'rxjs'; +import { AssetsService } from './assets.service'; import { ENGINE_SERVICE } from './engine.constants'; import { IEngineService } from './engine.interfaces'; import { ErrorsInterceptor } from './interceptors/errors.interceptor'; + @UseInterceptors(ErrorsInterceptor) @Controller() export class EngineController { constructor( @Inject(ENGINE_SERVICE) private readonly engineService: IEngineService, + private readonly assetsService: AssetsService, ) {} - @Get('/algorithms') - getAlgorithms(): Observable<string> | string { - return this.engineService.getAlgorithmsREST(); - } - - @Get('/experiments') - getExperiments(): Observable<string> | string { - return this.engineService.getExperiments(); - } + @Get('assets/:name') + getFile( + @Req() request: Request, + @Res() response: Response, + @Param('name') filename: string, + ) { + if (filename.endsWith('.md')) { + const baseurl = + request.protocol + + '://' + + join(request.get('host'), process.env.BASE_URL_CONTEXT ?? '', 'assets'); // not full url, should consider "/services" + const text = this.assetsService.getMarkdown(filename, baseurl); + response.setHeader('Content-Type', 'text/markdown'); + return response.send(text); + } - @Get('/experiments/:id') - getExperiment(@Param('id') id: string): Observable<string> | string { - return this.engineService.getExperimentREST(id); - } + const filepath = this.assetsService.getAssetFile(filename); - @Delete('/experiments/:id') - deleteExperiment(@Param('id') id: string): Observable<string> | string { - return this.engineService.deleteExperiment(id); + // Test if the file exist, if not send 404 + if (filepath) { + return response.sendFile(filepath); + } else { + throw new NotFoundException(); + } } - @Patch('/experiments/:id') - editExperiment(@Param('id') id: string): Observable<string> | string { - return this.engineService.editExperimentREST(id); - } - - @Post('experiments/transient') - startExperimentTransient(): Observable<string> | string { - return this.engineService.startExperimentTransient(); - } - - @Post('experiments') - startExperiment(): Observable<string> | string { - return this.engineService.startExperiment(); + @Get('/algorithms') + getAlgorithms(): Observable<string> | string { + return this.engineService.getAlgorithmsREST(); } @Get('activeUser') diff --git a/api/src/engine/engine.interfaces.ts b/api/src/engine/engine.interfaces.ts index a320765..69da9f6 100644 --- a/api/src/engine/engine.interfaces.ts +++ b/api/src/engine/engine.interfaces.ts @@ -1,4 +1,5 @@ import { Observable } from 'rxjs'; +import { Configuration } from './models/configuration.model'; import { Domain } from './models/domain.model'; import { Algorithm } from './models/experiment/algorithm.model'; import { @@ -14,8 +15,18 @@ export interface IEngineOptions { baseurl: string; } +export type IConfiguration = Pick<Configuration, 'contactLink' | 'galaxy'>; + export interface IEngineService { //GraphQL + + /** + * Allow specific configuration for the engine + * + * `connectorId` is always overwrite by the engine module + */ + getConfiguration?(): IConfiguration; + getDomains(ids: string[]): Domain[] | Promise<Domain[]>; createExperiment( diff --git a/api/src/engine/engine.module.ts b/api/src/engine/engine.module.ts index f00097a..3a8404a 100644 --- a/api/src/engine/engine.module.ts +++ b/api/src/engine/engine.module.ts @@ -4,6 +4,7 @@ import { REQUEST } from '@nestjs/core'; import { GraphQLModule } from '@nestjs/graphql'; import { Request } from 'express'; import { join } from 'path'; +import { AssetsService } from './assets.service'; import { ENGINE_MODULE_OPTIONS, ENGINE_SERVICE } from './engine.constants'; import { EngineController } from './engine.controller'; import { IEngineOptions, IEngineService } from './engine.interfaces'; @@ -44,7 +45,12 @@ export class EngineModule { }, }), ], - providers: [optionsProvider, engineProvider, EngineResolver], + providers: [ + optionsProvider, + engineProvider, + EngineResolver, + AssetsService, + ], controllers: [EngineController], exports: [optionsProvider, engineProvider], }; @@ -67,7 +73,6 @@ export class EngineModule { `There is a problem with the connector '${options.type}'`, ); this.logger.verbose(e); - process.exit(); // We can't continue without an engine, shutdown the process... } } } diff --git a/api/src/engine/engine.resolver.ts b/api/src/engine/engine.resolver.ts index fc2a736..a67967c 100644 --- a/api/src/engine/engine.resolver.ts +++ b/api/src/engine/engine.resolver.ts @@ -1,8 +1,9 @@ import { Inject, UseInterceptors } from '@nestjs/common'; import { Args, Mutation, Query, Resolver } from '@nestjs/graphql'; -import { ENGINE_SERVICE } from './engine.constants'; -import { IEngineService } from './engine.interfaces'; +import { ENGINE_MODULE_OPTIONS, ENGINE_SERVICE } from './engine.constants'; +import { IEngineOptions, IEngineService } from './engine.interfaces'; import { ErrorsInterceptor } from './interceptors/errors.interceptor'; +import { Configuration } from './models/configuration.model'; import { Domain } from './models/domain.model'; import { Algorithm } from './models/experiment/algorithm.model'; import { @@ -12,14 +13,34 @@ import { import { ExperimentCreateInput } from './models/experiment/input/experiment-create.input'; import { ExperimentEditInput } from './models/experiment/input/experiment-edit.input'; import { ListExperiments } from './models/experiment/list-experiments.model'; +import { Md5 } from 'ts-md5'; @UseInterceptors(ErrorsInterceptor) @Resolver() export class EngineResolver { constructor( @Inject(ENGINE_SERVICE) private readonly engineService: IEngineService, + @Inject(ENGINE_MODULE_OPTIONS) + private readonly engineOptions: IEngineOptions, ) {} + @Query(() => Configuration) + configuration(): Configuration { + const config = this.engineService.getConfiguration?.(); + + const data = { + ...(config ?? {}), + connectorId: this.engineOptions.type, + }; + + const version = Md5.hashStr(JSON.stringify(data)); + + return { + ...data, + version, + }; + } + @Query(() => [Domain]) async domains( @Args('ids', { nullable: true, type: () => [String], defaultValue: [] }) diff --git a/api/src/engine/models/configuration.model.ts b/api/src/engine/models/configuration.model.ts new file mode 100644 index 0000000..69edf36 --- /dev/null +++ b/api/src/engine/models/configuration.model.ts @@ -0,0 +1,15 @@ +import { Field, ObjectType } from '@nestjs/graphql'; +@ObjectType() +export class Configuration { + @Field() + connectorId: string; + + @Field({ nullable: true, defaultValue: false }) + galaxy?: boolean; + + @Field({ nullable: true }) + contactLink?: string; + + @Field() + version: string; +} diff --git a/api/src/main.ts b/api/src/main.ts index ec0635c..97c880c 100644 --- a/api/src/main.ts +++ b/api/src/main.ts @@ -1,10 +1,12 @@ import { NestFactory } from '@nestjs/core'; +import { NestExpressApplication } from '@nestjs/platform-express'; +import { join } from 'path/posix'; import { AppModule } from './main/app.module'; const CORS_URL = process.env.CORS_URL ?? process.env.ENGINE_BASE_URL; async function bootstrap() { - const app = await NestFactory.create(AppModule, { + const app = await NestFactory.create<NestExpressApplication>(AppModule, { cors: { credentials: true, origin: [ @@ -14,6 +16,7 @@ async function bootstrap() { ], }, }); + await app.listen(process.env.GATEWAY_PORT); } bootstrap(); diff --git a/api/src/schema.gql b/api/src/schema.gql index 854bd5e..48bd85b 100644 --- a/api/src/schema.gql +++ b/api/src/schema.gql @@ -2,6 +2,13 @@ # THIS FILE WAS AUTOMATICALLY GENERATED (DO NOT MODIFY) # ------------------------------------------------------ +type Configuration { + connectorId: String! + galaxy: Boolean + contactLink: String + version: String! +} + type Dataset { id: String! label: String @@ -200,6 +207,7 @@ type ListExperiments { } type Query { + configuration: Configuration! domains(ids: [String!] = []): [Domain!]! experimentList(name: String = "", page: Float = 0): ListExperiments! experiment(id: String!): Experiment! -- GitLab