diff --git a/.env.ci b/.env.ci new file mode 100644 index 0000000..5110ca9 --- /dev/null +++ b/.env.ci @@ -0,0 +1,63 @@ +#/-------------------[DOTENV_PUBLIC_KEY]--------------------/ +#/ public-key encryption for .env files / +#/ [how it works](https://dotenvx.com/encryption) / +#/----------------------------------------------------------/ +DOTENV_PUBLIC_KEY_CI="028df5c697f6fa08aee5d356d77e434b515b099e57dedf9a9ff9489af08463b845" + +# .env.ci +# ci +BACKEND_DOCKER_HOST="encrypted:BGjzq31NZI55ZlbrqQyic6MlWm1CnhCnNsShiSAh/Ss8HkI6LIXXwPESLweJACFSX1uNzku+RXsJBzuwL/e6x7zkpfdtW03PdrKZMbDhRs1RjS+EMjgs6sdRj/Y1ja3rmWE0vo20sppfw6ZjL1KhAw==" +BACKEND_HOST="encrypted:BC9NTlvnj/GVd6n8F5ryIFgXYGRya7B7vwX5m0vPz8WePjQih/vzWT1j0+MiTNTuh5O7PGPSEOh/8aqclQrmH0hNdZqqtVD1D5ozt4nkK6tr5xZczgKJBCCqBkMZuVLYWSdOssCUh4y+LnV8/Dg9GUMBfjwVGA==" +FRONTEND_HOST="encrypted:BGSRFIAfMgnrPwMXJ9K94uC/L/RtHbFHjJxx8tTAtJbOxZZprEKPGm8iZ2UdsJX+5y4MnK3gygXcLAQvQrgz5Anb1KD9Szvjpw1tL4OWlCEwQ8sasWLgN4vx7IWY3CiWDpJLC0H8q+ZrEbTPsb8ONsZtQlTvYg==" +KRATOS_PUBLIC_HOST="encrypted:BHfmmvBEWte98hfTZAPQjk6m7dA+qp5IiHWSEHmokBdS3b3U26IiNdzo47XDRJnUVq4kbSr0THa3K0ryrGQMNK36XTqOCzp/+IW3mNC+eJil5eoi3IaFnyCjoXkOy7xKniQZnw1T9CjcHkrMkARjyPsGa3BtYQ==" +SELF_SERVICE_UI_HOST="encrypted:BJwCZAnjVt4xmTe9JC0EHSjicLsDJ0Cg+ooxpGUdbi154zqkjwV4K1M12YanNml1fkt/vvn3rUKGr9vQqAP9YbG+Xdy2iRt5VRNRNkRNsn773nDH4TTgG+YgFgwU/ONEheZmpDITm5YPedOEbAoxIhbJmEYEqQ==" +ORY_ACTION_API_KEY="encrypted:BFqXtLdudhJPjLCrj+FwTX0llYRnzoV33om4lmiov/9NbjXFIWVqAX3WZUtlONz0qhY4EmQZgPAwY3DBDlnCEilixLMpBO5yg8eW+EubTgzRM0Nh68SWypHxGwD+p29nbhlcUB+9YN3Qkmlg1WkbPtyMjkLn" + +kratos_cookies_domain="encrypted:BD8e5pkJyycRgxg5SgWt12AoeXgBz9+9AyJ+EhvVO71M3LnJSIhTctd8QTTxRM1onQI/2dz0LkLKbhHLSJM54pJAaUvQ+KJJrGvQSrxTVGQJHBZ8yzcukwH1j9bOE5BW8bddaiZw5Gr4gg==" +kratos_courier_smtp_connection_uri="encrypted:BDYE1Jh9MgWV5Y05N0StxNuP5hkflrn4gndfNVifybRSncWaVa2aYoZI6bdFRacC7O3t2+9U0VElgZ4E5EzxOFV1AFAx0kE4Qh85jeZ2lOMdkfpGZ9f3vphWLAbrflUDWaz2cirGjsbn3zqCHfwdtdG62xn/ulfComJXCHtQUQdwuJQVOdSEPBkz8W6hqlRPbMRV2C4d9fpu" +kratos_dsn="encrypted:BHyPjk5w8f+PiZ2UVbggabDoY6J6LPfAsR4oQtHKNsjBZJfsnCw+H3RB59CK2hrxbGPUHvVTgf63ZfM3WBEFfhHCjuTT4zzIZ6CnpsyKiSANUw6ciscClDSvO4+bH9MNSwTIXoHUZg==" +kratos_identity_schemas_default="encrypted:BJZH5RqP5PMsmlVRyyKr9ewUkZ0XIsuJkM9WGR/L791p3y8/lqv1dcg28zQU8vmfxHixjkXYUnGdYh4JerJfouvxweZX75DFBfkzx943bHKukaXLtLVFtXtubMXblKehj9Ie3wcCQ6i7qB6KeTKBexiRmn7xlljrkYcTRWuBX3GmvCGL0WEspQGkZ7E4uoXl6L2TeQ==" +kratos_log_level="encrypted:BNiD4icxHOWBsViplVnQPh6XN2fQbpubM0Zh7x6RxPWdoeYT/BY7rxMO1XL0Cl44PkbrYEVFml6bQoywLv4WkDVAcdksnAWF7gUk75R7JUfAyu6KzAT3zIrOKx9+VWTq7dsCq3cU" +kratos_selfservice_allowed_return_urls="encrypted:BGgNRINRzIOoYWDnqCEEXWJkjj25ty4mUt+0EsyiIxnTkesXII+5y6ZJVYlmE9Hj7y626yiQMXEcdQYNXZXTlMHYar+a5XL9FtQfZkDlLsjsCgz8P8dCBsJdjo5IqWqSg+ynMegyhlde98BXSlTt59nP+8AdstQSWMFSiCOtFaGu4js1hPZ2lzw=" +kratos_selfservice_default_browser_return_url="encrypted:BEGdh5/j7EAIPtUAUEILF8NkP2dDmbMM/R+VxGxGlGJC+iljIvIWuqDBhZYEuCTh39bpt5KxINqchxt+SY2rxisfpcWxLCfxEDhLufS1Dl1LuJFNUuvFsPonrX5UqO8AI+MmH7kJrZ2He0WWdiHFwp1qYVBcevs7Mg==" +kratos_selfservice_flows_errors_ui_url="encrypted:BEyxe92wU3dd0XGq59JIzKpvJ+/Uca2+HLpgPkQhEZtaA2xSbKk4JJIA6J5ynIkLxNTiMGfyg+hirslBBLAEKxiKe0N8zSjL5PNN0GDFa7nvHc6GazUTDqqAxY8OKI0qaxIltR0L/GpubNfzTuWIMvmFeTWv0V/c7uAY9s51" +kratos_selfservice_flows_login_after_hook_config_url="encrypted:BLwNizA5rxG9vb3WVxE8mFHj+ANCrQwW4A9PA6Qjxz9nHioxogWMhbVbn3d7y6SizDALTJr7YriLn3AoULAiBYkC7D05fUV8LayJyBYUXdyeltCHZhWRrAKszNrYsYiYHH4buLBTMC+w9OMtcgSSH4kwRIEh1BsXPB96+uSlPdh9CyAZBQ==" +kratos_selfservice_flows_login_after_hook_config_auth_config_value="encrypted:BPc1xmf3tI0UIbMHe0ACf9rkpkLxML6nsgip6cSUnVDAz+2OhBNAId11X+/42iRrpecuudbA1fJ65Mmw1hR594pg93Gee+ofuFyW67ouPoJWOK0wxszIKCWPX82rEaz+yvhFymNqeWtSk8HX27+/i+DUBUByJw==" +kratos_selfservice_flows_login_after_hook_config_body="encrypted:BJtwl7D5PgE+SPJJTxHdwd5t9vUrpWYx8t89VREJ6GQkBT2/zwmCTHmLG4pw4/wuyhKgGHEK9NYG3iSSfI7ylERhDA7vXNk5weg3EtzKoREPR8viVZhEYKB1ppvKlmQ2MXS4FHIdOumP1uz+tB0S76/+3Y0jkMH9sdmfl2VO3tGPhPS/ajvYeAfmt7J2fJom" +kratos_selfservice_flows_login_after_hook_config_can_interrupt="encrypted:BEk18vkG/8Giedz0n6t0KHF2ourmtOxcu6pcmyWACXgImriqCvUfXl4zHe9pQqodT3zKVFw22YakvDJxdD1i58lPWSoHpy5Tz1flBOG8+MBFcxoahuZt5NkPDmme7lHq3Hco+fk=" +kratos_selfservice_flows_login_after_hook_config_response_ignore="encrypted:BBORimJaZavVotLth3+aUFZipk4/BIa4hn0eUmQHJLeyatK8KhKJT3eH6Ipx/+exUXiB55E9TriqGyqwP7a5y3jOJ6Lt8FozQE0nv93awWWuI2xlnKdhdGqByfh5bAePDk8trpgQ" +kratos_selfservice_flows_login_after_hook_config_response_parse="encrypted:BFgKo1Etmfw0wpmxTHD2uHqbu0h3XKbHhY9xjRfWlxPRmbNf/pBZGdqvhUZ2yAHbx3wTRY6xEqe4hqN7FIn9GLTVXTznhl8/UzEEau9mYhoFcBgOghsK8mWcT90vXkjHJ8KAoULE" +kratos_selfservice_flows_login_ui_url="encrypted:BKQKwJdSf99oUdgFj2W5kYc3TWIjJlX50kcpe0eECim+ECooi14eBEPAG9snqJv2RzeeyP1BwIB4zBD5+mfHLY6nGS1j7tzDc3ifOxSAQtC7Ab8rqCxhJ3/Vn/ivTHZ66XZOJx//z7G/+GqcQYyIwAiKYxEjFcsfRh5rUW7Q" +kratos_selfservice_flows_recovery_ui_url="encrypted:BKLqTZ4O0yuoNtVJiVmGXl0OE2eh6ayxZqFMIzSqIIjViyTfiZIdx6VRqtn5/CvQqJiucnJKpwFtEusv/CT5XiDRVw/XzOE9ikSCbn1pNez1sMl2FdFKW4MdXi5I3buQtc3KijJFwFMEKhXqIopI738koQ65JfxwdjSMw+bFpk7Y" +kratos_selfservice_flows_registration_after_hook_config_url="encrypted:BFIcPw/8DHbH+i26sdz2KXWPcoLN4AV1J1/lUqRK29+XjMPjOOTWHOi6platF/iD3TmlRqt6TeZzmLdE8HUModFeDH4FNSaV92QIStAIlKqpYz8BuGGIkBh+WZGo1ryYSpTcxhIJhmTp0POXpvTgYabXe4gS4wcOzJiNLxtwQbWmO3SD+g==" +kratos_selfservice_flows_registration_after_hook_config_auth_config_value="encrypted:BBrcb1/+rOsTb4lIkyMvpH5dDSCvkslWh/WJUwcEHBMgqushB3VZpp7ndqX5ghtrIRm0oKmNYiRsDHJA4BmjMFJLRnjJGbPfh+RqEfimAtIGOmCyKtI5nun9pa5eiw6i4Onorf48fPmy67Du4HQr3eIpemeDsQ==" +kratos_selfservice_flows_registration_after_hook_config_body="encrypted:BJhGT0w8wvjTABjmr2C65LgzZN8DxfbWijidFv0poDEqqhsv4c42SyktgbDsQGCjl7NvUoPHBbYpCfHYX0NuLrhO/yzAWNeDI2KpLk7CmVtALXz2R0qH/EsFNBbD31Zcz30n/nhU/UXfoCVQSlpCdjtowCQwOdlgVqRVNT2g1RpDETow/3dwGzFWNq56pxOV" +kratos_selfservice_flows_registration_after_hook_config_can_interrupt="encrypted:BEu+Ic3nnrG8A19DVtYsg0iLr+g5YwSve9qneYCCqxm9TVxsNEnMbJ5hcG0txVRVrF65084t1NcRcclok2TAKr7xrJ2h1si5nSRAxUw6QN6CEgevnr2aKhY1tyf6pQgvUbZ2J/s=" +kratos_selfservice_flows_registration_after_hook_config_response_ignore="encrypted:BJ7eDF0UmZbzOeAOGo5Dv1ZcR5PuxGh0mjP2et/8gDJOPatVWks7lUR3CCVp7r2ktN9uDeLQr+m8VF/B2x+UO+583M3QW1AVXPlsH6bhMRQDuBVNith7idzgE/RC8q0bQx8LWIg3" +kratos_selfservice_flows_registration_after_hook_config_response_parse="encrypted:BISaG0XIK01dPSU9E1fnIrRJ1aYbC6ztjHE+zqVVu2Zxdrzq7y4dazw/57jqlBN1h6L8oFHgvEWbx0lxjfU4OVZHRC/N8reEv+vnkM1pXOIN616ecxId8TiJr26BE4O0wFO25dM=" +kratos_selfservice_flows_registration_ui_url="encrypted:BBs0yP7q7uP24ZHLnF4H9ZMnNjR/P3IsV9FYGSZcWQ3YP8wrkCX8B/zc530aFZ1326H3Je1hoKdXWyJhSD24AGz8nxSboSti9LL9IDQq7QgvfOT4AazGI5w7zpFlOTi59JkZUYBNcvCd02Swb5Ed4HBrrCekD8gW4NKdPhPbSkmJoCPQUg==" +kratos_selfservice_flows_settings_ui_url="encrypted:BColDRl+aT8icY5fMQF2l5Fg8EpvW3ucKiI34oFbJm9o4aoAnJRMbGCLwa9J2WBdbFIxiEkylpbdkx0yWlt3AsaNbGH3UlTWQGoOq7ZQkkdXk7Riziw46IjwR3VOeews/nkT9L+1IfLXhJPKQkOaJHYVGnxse58lc66sEn9P9UkY" +kratos_selfservice_flows_verification_ui_url="encrypted:BMFm04gfR7eG/8lopSOVt1AfAVaQJtZG2WrZBOopzUF1hwPjE+1KbnOH/9s/bEid/uQms0sgSZDzDL/63MHd19mJCM41x43weH3eO6iuym1CXn5cBVl4zvcsq/i6INe+bYKAiZA6MNvX9XKOMFU9OSNc4PO1YsG1BXHYSdbfrmKdtI36iA==" +kratos_selfservice_methods_oidc_config_base_redirect_uri="encrypted:BPu5XHaioLNOJ/UCTitnAfLGDzYm5b89PKBaglUyrstPIWyve8SsIv6UqEotC6CqBCZXch4kfysgTq+WbI00X6X71vxmEaTuMNYX13GhEJSqD0VvoWq7CSRWOUWkJEaURYhN9LfVuFL3ZYev4QmjpfQc7SR5sTdqG+30uJ5jLoxcCcpxKc8ZfY2unNUtiCDwV6ehzwDGzcZ++cqo0Vw=" +kratos_selfservice_methods_oidc_config_providers_0_id="encrypted:BCDCn8qWG1oua0i/Am7a8aiDyLyGjNy0yonzqviRx5qruxSHU0uwFmbFLmRwKHWuBCCfYwNNsbttUt5R+MU9DOd9y72ccVEHcXQkUYTLxF3WTc0gBpDySPtcTMD3IJZJqgIk3CfEEg==" +kratos_selfservice_methods_oidc_config_providers_0_client_id="encrypted:BBdJdiKnT0t70AgJPvS5u6mGORaS2k12o+IS7ba03Hg1XBHqfaOaFKd7IXKeMtsi6H6Q+KZnS4CM0I7YLsMcUEo9+q8XP8dbL0x9fYGlYSJI4wP5oGM+9nXkxVtIs0JKHREkI7M9f0Cbhku9ZQz8e93OC1O3" +kratos_selfservice_methods_oidc_config_providers_0_client_secret="encrypted:BD9vg7e6dTj7LgvXm4d6/X6YJfCZDW1kNL2T5xFPXF1ZQRUCxfKjt8WiGoSsb5VTSubNbc3NL5SbarceTFPp1AH87mVOR74Rok8ehO6tCVr3/zyBiIDGIaZhEhVY9Bml2zEpa3SjNcrJf8UwcY/QzS17RVSphgovypAU6cDO61KBEhU2s+sVtO8=" +kratos_selfservice_methods_oidc_config_providers_0_mapper_url="encrypted:BFkd42MFvGMJ/ardkJjY15CU0TQFXBgK/+em2JXc+qXNk4o3AkiUAhJUqN0zkXIa5dSJWxbMHETLRd2ZCfp7KnSdjZlEgDiYd7cpJE0U4XWW5bAWiFQ18Bdm0byP3MEE1LMuW211SLP1iiqqGg5MopQDW9CFHu5hp4bsW2VilLNz9HQF9cba0Hc31ucsp3HILR4cNGjKZFmjKC0i" +kratos_selfservice_methods_oidc_enabled="encrypted:BBSDIinBV574Uo+8XcELl21KCBFcPy334gU+aHIirq0JeEfSLxK8j2QxHzwGqitcAPm8d7ZMEGpR5W+6jNWHaeZSFNrqKsTk7S986gmMXlE5W0a1VPiRw6W9GYKvBSfdStFdBEha" +kratos_selfservice_methods_passkey_config_rp_id="encrypted:BIALENO8d656kLQyoLYfNKOG8d8A/aONvEbqxkogbYMHHA1h2bl/mFLsESVH+dgCWqMBYC0SNWobB2SmmXb7VKiBqS9uZ4MAnSKjEKkVkrbK+e0xss6itmh8H4Q0aRDuSz/EnZiWrjYM6w==" +kratos_selfservice_methods_passkey_config_rp_origins="encrypted:BHEVj/xIbumoi+r0wElHPq2MRO+nThKFX2Uf0gLAmxlq5+yRvaobpVKQQ+T7JsWFCdbEgDwVZrv/9+loAkeExFJJgslxZYQEH2GWPJgwAWLLBqHGe5eMZkY61mxexp02zLjSpzsv6pnWwj/DZ/nW+0rsRw0B4Ec=" +kratos_selfservice_methods_passkey_enabled="encrypted:BL9gj4k+u0EaSk5MTwm1AwwHkTYPQ0l2YIgXcnsFlufMndpgIP2Yckv63sUy2UAt/8mzShy0jPhkw2GSl1R8FpNiKdzrU274OQZE/Te/0P4xv97E2HG0HRRSU8fRPN32B+cUOZ6Q" +kratos_selfservice_methods_webauthn_config_rp_id="encrypted:BCYQqtbwaCqLVDIVGccPB8pbra/mnlkOp1RKFkfP7rK4PYHkJxAz+hyBB3Nk5GxbVeqeqrZjCpzOMZQsMs+t5Jf78Ua+27HnZUyqUSQQW3EKOG772x05E6QmPJRwe1wxW3qNGMNABnmVTA==" +kratos_selfservice_methods_webauthn_config_rp_origins="encrypted:BDSGGFAf6s1M4DVacb7Kdppa/mwK56l4Ic0K/iMdHeDaN5sprwFpboY6634BPtxabupFnjADzkpwJZDYay4icu+t296fRF4AwiSqEik8LdiJqRjKEpZRYeES/gX2KY8rfO2p2q9IWKrJUMh2kBZoPKuGV6OS4wo=" +kratos_selfservice_methods_webauthn_enabled="encrypted:BMW8Z1Mno3y+x2QTfbEWVaayipKoIQbsgWC244hcXbaqPIdigMFSZ0AVqkKs3tQr7yxDwvWY3tRUDAI4ge/XoRB8/YCUrmc1PhHcoFcKAUZfhFflFwocqLIEQ2wnut9QldP0aH1t" +kratos_secrets_cookie="encrypted:BHPId3z8mAPYjyaUUpEMC6tprwKMpqnxUejEJymQxHf72mpk2sGJoeALHv8NaXKOGuM79cBKwxDoehYncPdSJIhoIeAlOgQdFUHGqAPz23HwD3OHIwo+oLPlr+w7aQzfcEosTDbaP4/YJeuxtY1GuCwKqqqVdDO3mTWa2zjGhvWrmQ==" +kratos_secrets_cipher="encrypted:BNgBlu3Ikl/Bq1Jpj/HJuvnNttPr69V9ZpC3nZBBwdI/p9IuxYJ1sbjwChroz0vaDqoJ1JLmGa65D4c9HStuKxtp6qsF40K/voVwY6nzUjPQNu020SP5gbndV8H1vahXmT7ZsIO7EdImcfxRVFDHKM/cjQne4PPGhe1pI7D19mjS" +kratos_serve_admin_base_url="encrypted:BIjPD2ZdBsIKxIqjcunRd3Hh7nIIZK6+W1UH9/cjxYB8mb4HiqVDHhBAUwXHm1wXUQHEmddNAu38P8GQrlfyJ3J+CBvqkOTl990LojaVXfvFlxTuEnLIG4G41VH2ZLqMw0oCUTmnemEt8K7o3zZorwX5K+c=" +kratos_serve_public_base_url="encrypted:BCrYMSBBRHJd6pKfLKTZsE1u39XYVQtrwOOUZlTJ74o6NMrtvig6waV7WsYWSLj7aYnuw/S7HQKcBIr7MKGZCaMgBIIZ59NpKxQ+DBQYkATV0wnis1moEY+9bf/VUFcLwX16UBqMyI7pOryXDiq/WTaEixPNFe8=" +kratos_serve_public_cors_enabled="encrypted:BP6rqzI897ZgcD/X3lNxhZGxpA3XqY3mHIicippSXrHsnOJUTG/m0/MkyIGu3F9/ime400h7k7QuqGBGRixrwSv1h+S7gS1hDsPbDyCrdaUwQM69AkZPK/hjIh8/zT3TfgGIJwU=" +kratos_serve_public_cors_allowed_origins="encrypted:BGTcMAwKbGEHaNZz8tpmo51IpU7IEBMOm9PXX2/iWDPTuoNdALMFgX53IKKRxRU+FpkRBipoiN0mGDUuZ3pP4tfGrMjuJeOWrHbRbYycfvIpE5jo3Uao6mbYT4eqGPXRHmhztvJqF1A7PFt9IRF+H9gH0z7OChiN/wap9YBtHv7RshAie6F0KgLDxMelg8KcGTPp1NdavuilTU33dofXHQ==" +kratos_session_cookie_domain="encrypted:BA2pMvEAsv4TRq94ytetOyYKO8hCyOcMqgeogYsKcQh5iXJDltM/Ai4L59ho1iO9bYD1eF86sG6Ogi4+15KFHhdrMv85a43XKXo3GBIeVb91t92qFhUJk7b1Od0OCQu88Ad5JPASNbPhjg==" +keto_dsn="encrypted:BF7HvYUdYp+L+hC5g+yNMvLm5+K4qdgQJtx9PUd8pTjARl0r8WkexKNVKL16aN1iOuXCvFVBoxcbvSAywRb3MEDyJCMbbO8rbCu2UrjEsgraAsAREbu8dvcB/BwlAu3C74DLH7DtBA==" +keto_log_level="encrypted:BNSB/iiGvDwQ7KtduEfmjAcFHstJwN+O8WMmwaMEnalBQyvAIitmsw7CYq6Vnvek3HqZizKe9OGO+1Dh3A1lZEVGyCDtZIyQM+HkcT7L6+UGYL9Pfsy/f89sRdG7nWLPaRxK2b8N" +# keto_namespaces_location="file:///etc/config/keto/namespaces.ts" +keto_namespaces_location="encrypted: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" diff --git a/.env.vault b/.env.vault index 14e6959..32777c8 100644 --- a/.env.vault +++ b/.env.vault @@ -4,20 +4,20 @@ #/--------------------------------------------------/ # development -DOTENV_VAULT_DEVELOPMENT="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" -DOTENV_VAULT_DEVELOPMENT_VERSION=3 +DOTENV_VAULT_DEVELOPMENT="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" +DOTENV_VAULT_DEVELOPMENT_VERSION=4 # ci -DOTENV_VAULT_CI="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" -DOTENV_VAULT_CI_VERSION=4 +DOTENV_VAULT_CI="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" +DOTENV_VAULT_CI_VERSION=7 # staging -DOTENV_VAULT_STAGING="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" -DOTENV_VAULT_STAGING_VERSION=3 +DOTENV_VAULT_STAGING="0EJSUBd+CU5pFhcM/MO4abhfyNuvNopYh4AvD9tepyF0cb9Rqpm5Gt0Ytf3Rat5HznCQVCd/y2f1p6FJhFTU1zGQZdneSuhzRdowhpAbZsgwGU5WGZV2fXY1pTqbBSKxBbA/fWGO1bi4t+1VPF8gI9oaLbS4hFClFx8bA4Mdfo65jjtrYtIpcxiyz26/132dA1C2OYwNhBlo+XTX3GpeLmmjHRwQDUogphZxNxPyOlWv8zmHMYmdNiYKQu0MPEPiQot7QA5IpNZiT4HhTUrPsJIgp0nZLy7rcA48wQs3Xd2JFW9f5vMMWMhcLhaYPTHd9P1K46g+4LECf4klSa355Jw15uMbG7MRwSebYc7CI486cZQ4oyz9w58N+vGkXcD/uNu5/o02s+Hw6i2nVhAnkaCKZVf4IweU/LjbD8D/8a1MvNhWvBeWels9yCWg7v6Igw0mfuIuc9peVifwUDk2pYEPyC8hYAvYxQqZlqF8IT2xQy2Pa+CGSYk64gtuPw1A3DcLrKFjotL5CerldAVUg2Bu3xwJo4LNNhVs5WRFMX4Qigdy05U2suHdoSE6tOugIMV2uHRykwy2dfdzDfryBAZDJItgncG+r7AvjhouTUI5w7K9TpGc//TIJux6eXF0UAvJXp5Pa5jCvKUav3viRknU0fdBIb8kDKqpBQ4i2+0wWss3bW+FQM+Ghg1pf5xvXU3B/1Amp1dhjS/0z0B1YV9KpCMF8uBMutE0hFDiBVqcmvjRUniDCDEQteu0gH4RgBLFjbHFP3OOdCgtnAOtK1nJczbM24bXsobYSzSTsmnIuu7rSGfP8E0qJHRG3u3212sgbpEHWyQBrEG3eiBp/KUDhPrikjS970t5iBIw3kCD946n2srvqBrwmrG3XcutDD9+EeVc4Qirt9tBeECPpqHwluTleAzbvivovUBqIR9ISAwr6iZQjKqVPeu3vzqh6unvmeDOJLST23GNfWpcMgX7V62h1xr3S7YKZSJwJkDpO0E+PTtI+vb+F1+dpAWh3+2jDHFzDhaE6iFDlT7eSiZj9ahFrWHj0PDvnRcPkqcHhaIkFYKgVi0/LEPoMrRFVEVEoA6/FASj7wXYjsrWeBpwTGQk2vqLWbhkOMMeiZNk8L2THNBa5westBv31jw8jYTjoqRo8w3ukwbvDn7Hzr97IDlLw7twZ5WonqGlxtPIbgLSTDBJcn/2c2fQgOwRMBSlu3UhT/CuTI5kOX3zrzJVnaxrZU2ESOdiUlc3KQOVls6mEM5fWq/VuKroPlp+zoXBlvvr29tXECSBSksxxEDjDiZWxxfatLWLRoKhEP3kY2mrmv1XQB7Qo/w4IxX3jVnCw302kjEY9oYKmFLCj/ba4Nkb43/PjJVd4ll6UzVqIWXsjcFrkiffj1EDM35Fc3xLPnqpx1Vz9PfopM9zEar3+JAcKQHW0c5h7QmN7Yxf3KRAKBhdhbi4A9er/vByR4d2gghasxy4k+MXpreq8GCR0K3WlmpnAbQ94y1sgep4SZ6dCywpugtUsAV1XBUwDWjzgTtiMN6eOInSFWUQRpcDeW/xC0SV3T/oryMXGFPBiGpzoieB36+IMYPI3UxX3xRRGK6Ekb1t13ERvCsgkRUExL5MhjAG4i32O33/REKnwAryPxkd4BpBtb9kZnosyUagyju6gm/+/5KvUKU/X61bC/TZa7NyxNujrZ4pnSyFSicjbaeGhM2BD1gmJzEUDlTE3RADMZsoT2KMYSsFPUMO9RX29+a2PfsjbzMkmUO/oCdA0wXMuxz0EMxYdkBvZlb8cXiBWCwSVICmx5aB1lbMlEA9A/CMr79rth39aTmoYgXR7huYvX4ije2csAp16Ysi+jjn+besr7s2xyiGiZtOm2iOqSbfZlQnzC9nYrhbZ2qi+WbL6WS+VRZLFJPiBE68+/ZWUUjTpFW0VBNUO+JmTNJM7Ll7FIz6QFIFMLozmYD1Kyp6y2c0wKKHqPTwYe1wM/NCkoswMLzeCmm0OxaSU11ql5anvkl7Fa7Ssb3u/jTRaxI7aaqk98pEgY/jqdG1jaF+6M38DUqhXDPlVlVChNSxmBaXb5MVC3FvPwTuHOVcg5X7dU6iUIJZCnyHOrSqhBuBAojTFQcwCydWcVD8He049gzwolD72UJA6LuUNlZHVPUrX6PDc3yiZnW92iTjAfpjxaO33rqzb+WHhktOm3NVOtMiidG64BYLwhdY0uAYDnLiBrCBuObtUc96D9xjTmIyPti/ce7YRb80RPFDGQ8fWt2O0tdt9gDTjcLUrIkAOJPKIZyTVNePHRD3i3+eDN5/RZF9+fs7b9dupCGlUPi/nIeOaoFEdtjbb39tjj2J8S5k7d2i9XR1VB5B2M/cdlBenQjievVTkXHXFKFzlukFXVDMA4NGb27hA7pjSVfN9NclBBOHxVawEooKDhOozIi6ccINcat2JWiO1fgvZWshNFIRrebbbWUheWquq7KstQ+cy/uE8PK54OcxYVlcwpwaktwMcHtTq3FzvJgoSKZ3WO8ql5/qD4POA9fcPu6wfj6t/0Jh71kKhTGG05dxTxEy0e7OnXb/oAIXF+sYQdy8Q1Q866O9cVS61QhlrUaDtLF7C63hY+1xM5iT50a1OJS9Zz3Fn8FRGOQHCXAhedwuas9qZ3qw3h61AgGp6tKcva/XHGP0wg3G1XNhHSm1nz8s9f7lACwX7dBMBw5WwFHCe259hvYmmMjrsN9GdQFP0nmX6tKoWayjA2nnaVdL27y76ZggzXjWXekdQsrMZXcFumY7eRbRJuVZNesmwTUDEuGnkq6zJQUbUz7gjKLGTKsoqtFpb3P+Q8L4Kt39u34pJvx5/tOBS0+N+pLZztEZtbYlJmkgJnWlxqbx9e11A7fX+Unu8xPlgPTAWKMJM3g3xWtj6G3WmMjVYQ3lL9R8/i4N3RxhhGHwTnp80Lmis7B9zQHtUm+yF3iFSPAQ6YDq5KC6GI9QHo5p20D/uneGwkgOe5l4HTeAgN3qVJyI9et57aTiVbAFFmybrmERdEfXG8a3X3hhx4bHD+cU3zAW2nZcYeP58QeW1DGQUJJHUupASlmq2OARqSmGqP8VuXhk/TYOjbPE12pyUgT1c1g/Uwopz/536D/lqHiqFXCat9VpD0o55X2kIjPsWCfeAHbEKFU/uqIY+pC3clhmiSPLHn5OUmU0T21jyZd4w5Y7e7PGKEBQmcvxpJ8dJwfexy0xz0PP99TAYmJ3Pm8gh9c5i9WMXNEQ9g7lu4fS6kbpRDZwIuXEEi7W/fNX0rjD9t2+nzygr25oicEMLCTKq8XHZSc7RlXuBmwQX1kyjLagm1FR9DzBA+IUVVOwTR/xt4nHDHJRny9h2ionod4KZduEoMBRpJFYeRRqRf5fnUEFX9pvc+yr7iCzI0EMxEN2yULqq0zZdWtRUNjFRoDR36QY7jIHgqG3StequIq++bubjGgxcQjHN0cpHXwrRsTkN+HtAno8jzah23B/zTeJCw1hkRgI25S6yaBxfcoNzgVga03zD8zvLN0zyMh5DrvHH01mXVtpL1Wq3t1cCCS2DgCSk9Z9/tLG8OlO999CgOBS3oFRclvdztuDwlu9HxRhhc3d+Kqe3Cc/B3JKnzzaMiI4pQBdSvdQ+AHB2WyMnnfE1Ge3z2p1rDWOrwu4s3bJHrLGeUhhXHWvnhRlL16Zv+xUz4jit4UREo0FL0hZIodw+kbL3XH91FjOHV9inczHYs+CtMe6HrfDG4HAuRKp7M3ax2ea54VjmANZ1s/rF8NW8Q2JOuomqgBRb1melwKeN4utbZk3b/RjQG/7QJW9wk5cq+ys/VYB10E62h/J8EWv3TDie314cWR++1sVPgNV01IgeTJNgnN4Mzk+qLTkCoA9v5ASeUtMGr5PFWkqD+xvJQjN0a8i9HGJTSIb0qzFf49kM3cFelpFoB/5kX3ouvzVmzzBKxPHXlSYQ6AS4PTJmvMNZnLGvx6g+L4vit6zV72c/9k5e2rfOQ0mVwn5wB9zBa2cJXtlE+29A7hU4admWbxz9lBDvMHn2d80D3q++Fv7U/+tqrAo84diwlyXiULXmtFxOyaFEfg7zW9MNTNelKXSiTk0zJKjmk7O0mPm/gZbZpvwAFozcsEwp1tgNMC29hMGOcuDfEhkmms1NDapP+KLrW0k86BIBrcRv/BZW/wJIbdUr+CXTTitZaOK1Ke7EOIaIC1RO9D6wY5IXc3XmOuMjoQLP5/JpxitDMjT7TET6ORHMvOmqSGD1kKOCJJajlALVzuqjngX/aCqb4C//3jjmXU73coPPb8dqFpLpd6Ig7E0II0rfWOkaM+RLXnZOev7vK40zFiXZEAf0ZZm1H5sS2RtWu+gyfk4SU8PHQOV0a/eGMNqzBGIXUCSpvP7cn8EKRYWw2b6lsHNK1zG1vra4YmU8rd6LflF3kRXe5R4HoK1JoyIt2gwVm9+3kxHMCiNEijALnaEGI6TVygRK0fOL5pX93SF2X/wdRhj0isaeiKudDGqqoXXjCw423QhBeqVF++erdnO81gWl6pKLYhaWADeVbwwARGmwdftQixImB35BYCxOGWQ0JezuwoiMjzm6/h1ZV2ezxQlxjdQWMXGUNuUwbap41SkYvq89TGcdbc8u7aE7ugzFbQWQfMY3oxzYfB/FMnpaWiM9dTMJ3E5ImBkFWp0t7Z4hZkkdte80a3QLUn15r8ZvmfttG/ZmrhEP/9oRvqkwLAY195ux4LScxMBCvaVAs2noTMseJqMBBDOvhD6zuSMUP0aKgeqEFLBF7z+HT+FYDsomoLRtsRP5qdpj/0hE7nL8ZthXmSy6q4Ni5io9fopZdq+KAxew8GeAz7EcFplUG81iXWBj4ySECpO86UXJ1T9PYMRqwJJHQMq7GyBcDkMSEQou6R021e1ZbymxTUIld3lL41sZLTzgx8XAeiDW88InkkB6CHBDjd5nqZ5AJmjhNzyR61QSA9RZ+lnWwRaWqs60o2HYh/fjXNQ4R94b7W0FuD9vsQZR6ULHeMOOjuPxN8Xlrm+cl1oYMMz9f9piEEM83v7UR1lfd/cW4R+9R89S0mobk6mfcQ+tue1+iVNoxcygNAm47YJ+jnrelDS1WvqgWTRgNR8i7eiXTHOAtyyzuwsfSP7AfSb6Lyna03J2Ffqmf4u/r/zo3nbZhD0IwVyWJIU4JT6jHl9TudBJAK2t/cL0dJ+bQPNwga+RUPWO7HbpfFEax7shOyUUDl7R8xu8P/dodeuJzIbQhnWDkhEMaf/uROoWrIPNwUWz0HaqPuABJdNxQbeIXCTEtjkYyZvCYF9idLjAKTS1tnBKTrIr2gsWWfc+W7ty3pKUAb7Em5w+wGGWzrA3U7Y01ZtuByOXD/zo0uyb+3DRtUu2tQg/D3jNe+LDzniN78YCYP3zs1FQ39ZkdHRFIJoBi+BeF/CXSOuSvzxuF2Qm2Cq2p7Pw1XSsVilBMbe/h26XJd8xU9fCjMWELRCAjV2wFy7gW4YAhhVja+i61DLrR0B7OSc26ykljpZXNd19Uq2uZ+0JSuusmDDS1r1qE35/DPPMYjpDJTGI0PEtkHZ2kFCZG3XvdRaW+XnTcdHapehEGy3RU7eWrHPUMnEcJ9UFkCnL9BgVYPYD9GvU64M4knnYKgzg2g1rifUPB+DfzICdjKfSoRtydQPnA1Ns7mwbMFZHkYoNyzp5ixPSe5oU3auIzzOjrppXIzxXijCyqWnA8pD3bZ2X6jY73IuShxmzJko8W/F/T5XPw93y9QrX/IxRBxtkggXCiqblchWYdJ60u5FYmGynMwRuejIXO7QSO5r8KLDs7TEV0QnLDbqwDygNDUpIkRLTucRc3aiFZ8oEbSPkhN+mcZEA+oYYhn1LdzEwmanEyssRUtjdQ36DABVnWrqNYRkb9Gigix67jBF4wceSqStgvQXZnDBjXQ8bahROMrRd6Daok2GoNGFPTJ2mc1863kXKPxiCkR0ExAdahVBo1LaiRcY/J0Uoq2iB8+xVKR5eV3H8xgxQvGNNTCcWuHEukvGgCtjm4xWxzO2bAVTh4twdlcJrj25zuXzh6T90fKAxdiKIRvRaLKnurgZ5BEa/qTEeGPF9RlQEs/wDVUAhYjy+2MEL8H38LOiWR74E8EP8pnd0ZK8gjkRGZRxxHuih8/xMj1FR2CPVM7udmVGmSdFN4mZ06Mh6psQAZGeGYkVTxQDLMmz5fYLka/Xd6tqGopLAN9/y+YW2MhB//l6ljm+BdZAPfklK5XrajYSegYoVgjBbHgaSNSt5o3e7L/EcAULEafhQz8UlYc8p1y7jwGZpp4IspWZgMcw7IbhVYCPe1QBWTQxZIesK0dX/if8bJ5z39dB8IHQggp10FzmFla0j/Cn3T+rcjyxFO4P8w/CQwwyDGYCeZ7zFIFQTri7Bkq9ztOo5k5qZRj5HSNz5PZ6Z13MRSmTyOqvqGcL5w5wUPV9zCgUAhhB1m+h+3NsSWJpvT5cPItwwhSH8TVo71HqesLZKnwp4P8Uvf2Gv7EiJr5xjKsVXOao+M4GxFFZUj9c41rV7a4SmCWcWR31lUkIW6Fo39A5wXPR5Fdxhi1Xa7lL/5rcumQhaFVgRk3WHNO41w2SHyzxMQhDsEhBo2r54eOOOIlLamnMMVVvgf8rCErC+jycnrCOkom+zuVmxZaorlACc9qdsCuDS/QSX5eLbMoHu4ZWh9gY6yzXbvU8I072zes/5o1gP9Z5GFFlIMPsyxRatJ15w13U5ktff/DIpou9CXMGVUzVsZC+mWRn/Z5ZFoMCmmfA5T1+gmBflXQf+klFzM0okdPddmWm9ZGVs6j1t+sTJaZdChROIH2PWrY2lbVs48s+9OnhMlTn3XD5SfsqVUSFooN03sos7YQQviSBbokQ/JLqXKeGMkQpAb2s2OBTlR1WGyXcS356OLWHGHaky2sSbPiqVEAvXtchfGL8BLJJzlAgnxLQTfRxH+wHKpuoRNoi5fQtRsaU6KygVq2cTbvt9YbyxGeH0buiwNFuyWEeTabXp/bgxk+wIu0Bu0Y5/EY1tYZjWVBSBLVN8bfoZtvLVdHAm+qtYVMR5YfqLrMAcwPBF3wbUoXF7PUnUgekk1ie4zEeXwT3i7tt5Ekq61K/07ctBMcabfLDUNOYD680kdadegSLlQsOHP8hrEGVPLDd82CprCUBvXAfaN0eRHPt6XKWqF0Svf9F0MGLSgY84yyGOFkIhl2fWyMWFTlYL0Bm2B9tiwVfZ+ycFNbNYlSanKXXaSN+rhisN3V41dh8Nbk9+9Vw2mqm8bGmOBiHMw861gVvslfoAkpkwPZ2L1Qo8Y0K/nTwkTPsY+C0fnbW7Yv7zWpDlwdvMEph1kgwMRqjcmafwG875twcky0kT/Eyrhhd/wnyJBrGCqGbaTBlkHUzpYDYdACT8XkIBPKuDX7p5ZKZgmw+BYuLl9vQZ5jbGJwre0SxODZ7xMGSd6Uq18rjrhqrNZ/Glp20FWGZj7NL8sOZJq8oCxlS6LBLUm419ybwavXH2ILrZ8DLrUplobatUsoDRZKK+VlD1yG1UR0QeyjEfc4lx27TO08wOqUmv3yUP5EZR9hIkGF2p1x0vZ2ehay2uHy+nFmxVqa46li4lqczDQBjgSJuNm8A61oLP4i3WhynUdP4YREp0GapBmxrJtH9EyKTNV4/2sIzX90oz5RMbaq/vvAPln0ibhrUOLagy+NIKBjp7iofZPAjzP0Kzkwu4oXr18+SLk6/bree4zdf6+kfja3pRkLcUlBFCai5B2hVr165fU+EJot2Glgdf6iR2wcmqmB4pmCl+iZSTQPKb51y6ZOqytFhfC4dxSdpnbPN+Lj0wxuhMwtOICaJ3f75r6e8Fp6cvkahG7w0j44EV/ll6YfN8xzFC3YUkJZh0569Dh1GMDn2ldk0b4zINHDdC/g/y4FHcbOZPJPMe3+3IUFp35zaZCFSmgBkB+/ybnDetkqKwPrTlrkYuqWwMWjMKkisgnoETKTzoRwKs6tpApZXa1N+njIy8VcEMZJAnv82dywyOJU6R/IDdBW0jeriG8/pHuUQwz88PpnvCUegllTfVOI2z+0RMcKO9UG7H4OltSZKZFs40Sa4PLccBb0utFq2R92ZEez/hohrzfpIQyKhtzg7lkaVvGzuaXUeW6I4tLu1v7bGqXYDfZQQKG1gQp+ylrKbybtZOEJgU043DnPMqIeOeeF5QzILvdejJ7l8dJqoLzfnuc92cgDI0g++ZZ8j2wnh7VVoTiQCvv3OmirPMwTbg47XD3ATubDn8JdHv22Z4tBj4H+M4MkyEyekxK1hhFjubaoDbpqzQ7CLt/gpAb+mOlzX/t0wjJi5jAAlz0irVY9yDl+qtqkCeE74lYPw6M5vWn4QtJDJ3YOChFBqRT5zN+t5xtA+zuFbLb/3PorTQsmKpRtt62Lp2HxZdBq1TNG8x5G0l/k0y46+a9LVdZ7h8NDCZaRXB0Ptb+OKMDlb5bzE6sWOpR93ZrJXc/8PfG2yIe6UvRv6cmW7YjKT2EtRaE2BfYl28W8fPyVDHZU776higurPTwkZeyCmEMqruy0jwO3EUYeOZxTugWNbgNUjEe9AdUl2zcBQ6WnRf6E9667zHf/eWQTO2/kADIFXwb1+sgX0zh0jWncI+ocNAq70hrHbEOXvZXqXnWNTdOxswk9vPDxUe1VWl/VAHQdwJHgwf8TQg2ux4QEop9wzBMciWO3Rgw/bo2IDObXYPb8uNKMYg8XWo/mciTqFzYyZYmvJ7el1uu97JoakAUQF6wR7Kx7bV/I/ixSUYZgA4NsJq+xD1n8aJ/TBarkfcwXv6vv9aei159672IYaSrQKsugLSLokobgmnndqaoZGsxocZ94J+QdqgjDPTr7/K8UE2HUTJ5Cp+NfZUJpy97INu7IQmWsB2zGJdSSkCKgbtPyzXIdUeI8kAuUIQVSmwUa9Fobmym+65c52YgOXY8e48p5QdWpWEbu2IBlk3nad6tUooBX0H4HBpL6jFxn04QboTHM/6vzWrt8ZOlqkuHGvD+e7JbsvlhEMyh9GQIauod0nzG1qucf4jHIDT35D0h1UvRynq5Ux34UavBAnO34g6uyXYSHdSKs5J3+7KqLcEX0/R+X/gX6WTr37OrCrl22dlQ14wRf2oxYjh4sp4MMRI7/ZXPZURUjnDTDEdsKnH1nozT/t4lhC2YoHvv6FAOCwc+3/OwxhscEhaSyAWzhyZWAcnxWAIPUmEKmRgODIU8fJ7AjWPjQ9c1BQgvQ8AN6wvmaxhN5buhEj9gqMSQqskdr3W7d4F1/qY68=" +DOTENV_VAULT_STAGING_VERSION=5 # production -DOTENV_VAULT_PRODUCTION="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" -DOTENV_VAULT_PRODUCTION_VERSION=2 +DOTENV_VAULT_PRODUCTION="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" +DOTENV_VAULT_PRODUCTION_VERSION=4 #/----------------settings/metadata-----------------/ DOTENV_VAULT="vlt_a214f90f4b82d8ad4ca0c4b2a458f85f1eb137a0d7ebce91325a339fa48edad1" diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..a0e9cd9 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,91 @@ +name: ci + +on: + push: + branches: + - main + pull_request: + +permissions: + actions: read + contents: read + +env: + CI: true + DOTENV_PRIVATE_KEY_CI: ${{ secrets.DOTENV_PRIVATE_KEY_CI }} + POSTGRES_URL: postgres://dbuser:secret@localhost:5432 + POSTGRES_DB: cat_fostering_api_e2e + NX_CLOUD_DISTRIBUTED_EXECUTION: ${{ vars.NX_CLOUD_DISTRIBUTED_EXECUTION || 'true' }} + # ?NX_CI_EXECUTION_ID: 9682651267 + # E2E config + DEBUG:KRATOS_CLI: true + DEBUG:KETO_CLI: true + ORY_KRATOS_PUBLIC_URL: http://127.0.0.1:4433 + ORY_KETO_ADMIN_URL: http://127.0.0.1:4467 + ORY_KETO_PUBLIC_URL: http://127.0.0.1:4466 + API_HOST: 127.0.0.1 + API_PORT: 3000 + +jobs: + main: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + # TODO: ensure vars are shared with agents --with-env-vars="auto" + + # --require-explicit-completion because Nx agents might not receive tasks for more than 30 seconds when preparing the e2e test environment + # @see https://nx.dev/ci/troubleshooting/ci-execution-failed#the-nx-cloud-heartbeat-process-failed-to-report-its-status-in-time + - run: npx nx-cloud start-ci-run --distribute-on="3 linux-medium-js" --stop-agents-after="e2e-ci" --require-explicit-completion + if: ${{ env.NX_CLOUD_DISTRIBUTED_EXECUTION == 'true' }} + + - uses: actions/setup-node@v4 + with: + node-version: 20 + cache: 'npm' + cache-dependency-path: | + **/package-lock.json + patches/*.patch + + - run: npm ci + + - uses: nrwl/nx-set-shas@v4 + with: + workflow-id: 'ci.yml' + + - run: npx nx affected -t lint test build + if: ${{ !env.ACT }} + + - run: | + npm run ory:generate:kratos -- -e .env.ci + npm run ory:generate:keto -- -e .env.ci + + - run: npx nx run cat-fostering-api:docker-build --no-agents + + # can't use --wait --wait-timeout N options since Keto and Kratos migrate containers will exit before the Keto and Kratos services are ready + - run: npx @dotenvx/dotenvx run -- docker compose --profile ci -p cat-fostering up -d + + - run: sleep 10 + + # Prepend any command with "nx-cloud record --" to record its logs to Nx Cloud + - run: npx nx-cloud record -- docker ps + - run: npx nx-cloud record -- docker compose -p cat-fostering logs keto -n 500 + - run: npx nx-cloud record -- docker compose -p cat-fostering logs kratos -n 500 + + - name: Run e2e tests + run: npx nx affected -t e2e --no-agents + # if: ${{ env.NX_CLOUD_DISTRIBUTED_EXECUTION == 'false' }} + + # to enable DTE for e2e tests splitting, use the following command instead and set stop-agents-after="e2e-ci" + # - name: Run distributed e2e tests + # run: | + # npm run pg:create:connection -- -e .env.ci + # docker compose -p cat-fostering restart api + # npx nx affected -t e2e-ci + # if: ${{ env.NX_CLOUD_DISTRIBUTED_EXECUTION == 'true' }} + + - run: npx nx-cloud complete-ci-run + if: always() && ${{ env.NX_CLOUD_DISTRIBUTED_EXECUTION == 'true' }} diff --git a/.gitignore b/.gitignore index ced539f..dc5fc61 100644 --- a/.gitignore +++ b/.gitignore @@ -42,10 +42,10 @@ Thumbs.db .nx/cache .nx/workspace-data -*.env* -!*.env.example* - .env* +.env.keys .flaskenv* +!*.env.example* !.env.project -!.env.vault \ No newline at end of file +!.env.vault +!.env.ci diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..1b00682 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,12 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Attach to cat-fostering-api", + "request": "attach", + "cwd": "${workspaceFolder}/apps/cat-fostering-api", + "type": "node", + "port": 9220 + } + ] +} diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..519329d --- /dev/null +++ b/Makefile @@ -0,0 +1,13 @@ +ci: ## Run CI workflow defined in GitHub Actions CI workflow. + @echo 'ℹ️ Prerequisites: https://github.com/nektos/act#installation-through-package-managers' + @echo 'ℹ️ Prerequisites: https://github.com/cli/cli#installation' + @echo '{"head_commit": {"message": "build latest"}}' >github_event.tmp + + # export GITHUB_TOKEN=$(gh auth token) + # export DOTENV_PRIVATE_KEY_CI=$(cat .env.keys | grep DOTENV_PRIVATE_KEY_CI | cut -d '=' -f2 | tr -d '"') + @act push --container-daemon-socket="unix:///var/run/docker.sock" --bind --env-file='' --var NX_CLOUD_DISTRIBUTED_EXECUTION=true -s GITHUB_TOKEN="${GITHUB_TOKEN}" -s DOTENV_PRIVATE_KEY_CI=${DOTENV_PRIVATE_KEY_CI} --pull=true -e github_event.tmp + @rm -f github_event.tmp + + +ci-clean: ## Clean up containers and volumes created by CI workflow. + @docker compose --profile ci -p cat-fostering down diff --git a/apps/cat-fostering-api-e2e/project.json b/apps/cat-fostering-api-e2e/project.json index 0d3e0a2..3aab593 100644 --- a/apps/cat-fostering-api-e2e/project.json +++ b/apps/cat-fostering-api-e2e/project.json @@ -4,14 +4,5 @@ "projectType": "application", "implicitDependencies": ["cat-fostering-api"], "tags": ["type:test", "platform:node"], - "targets": { - "e2e": { - "executor": "@nx/jest:jest", - "outputs": ["{workspaceRoot}/coverage/{e2eProjectRoot}"], - "options": { - "jestConfig": "apps/cat-fostering-api-e2e/jest.config.ts", - "passWithNoTests": true - } - } - } + "targets": {} } diff --git a/apps/cat-fostering-api-e2e/src/cat-fostering-api/cat-fostering-api.spec.ts b/apps/cat-fostering-api-e2e/src/cat-fostering-api/cat-profile.spec.ts similarity index 62% rename from apps/cat-fostering-api-e2e/src/cat-fostering-api/cat-fostering-api.spec.ts rename to apps/cat-fostering-api-e2e/src/cat-fostering-api/cat-profile.spec.ts index d339ac8..3b18f99 100644 --- a/apps/cat-fostering-api-e2e/src/cat-fostering-api/cat-fostering-api.spec.ts +++ b/apps/cat-fostering-api-e2e/src/cat-fostering-api/cat-profile.spec.ts @@ -2,66 +2,28 @@ import axios from 'axios'; import { axiosOptionsFactory, - createCat, + createCatProfile, createOryAdminRelation, createOryUser, TestUser, } from './helpers'; -describe('E2E API tests', () => { +describe('E2E CatProfiles API tests', () => { let user1: TestUser; let user2: TestUser; beforeAll(async () => { user1 = await createOryUser({ - email: 'admin@test.it', + email: 'admin1@test.it', password: 'p4s$worD!', }); createOryAdminRelation({ userId: user1.id }); user2 = await createOryUser({ - email: 'user@test.it', + email: 'user1@test.it', password: 'p4s$worD!', }); - }, 8000); - - describe('GET /api', () => { - it('should return a message', async () => { - const res = await axios.get(`/api`); - - expect(res.status).toBe(200); - expect(res.data).toEqual({ message: 'Hello API' }); - }); - }); - - describe('GET /api/users/current-user', () => { - it('should return the current user', async () => { - const res = await axios.get(`/api/users/current-user`, { - headers: { - Authorization: `Bearer ${user1.sessionToken}`, - }, - }); - - expect(res.status).toBe(200); - expect(res.data.email).toBe(user1.email); - }); - - it('should return 401 if no token is provided', async () => { - const res = await axios.get(`/api/users/current-user`); - - expect(res.status).toBe(401); - }); - - it('should return 401 if an invalid token is provided', async () => { - const res = await axios.get(`/api/users/current-user`, { - headers: { - Authorization: `Bearer ory_st_invalid`, - }, - }); - - expect(res.status).toBe(401); - }); - }); + }, 15000); describe('POST /api/cat-profiles', () => { it('should create a cat profile', async () => { @@ -81,7 +43,7 @@ describe('E2E API tests', () => { describe('PATCH /api/cat-profiles/:id', () => { it('should update a cat profile when user is the owner', async () => { - const cat = await createCat({ + const cat = await createCatProfile({ name: 'Romeo', description: 'Grey cat, loves to cuddle', age: 2, @@ -98,7 +60,7 @@ describe('E2E API tests', () => { }); it('should update a cat profile when user is an admin', async () => { - const cat = await createCat({ + const cat = await createCatProfile({ name: 'Juliet', description: 'White cat, loves to play', age: 1, @@ -115,7 +77,7 @@ describe('E2E API tests', () => { }); it(`should return 403 if the user is not an admin or the cat profile's owner`, async () => { - const cat = await createCat({ + const cat = await createCatProfile({ name: 'Crousti', description: 'Tabby brown, with a diva attitude', age: 8, diff --git a/apps/cat-fostering-api-e2e/src/cat-fostering-api/fostering.spec.ts b/apps/cat-fostering-api-e2e/src/cat-fostering-api/fostering.spec.ts new file mode 100644 index 0000000..c7ee58a --- /dev/null +++ b/apps/cat-fostering-api-e2e/src/cat-fostering-api/fostering.spec.ts @@ -0,0 +1,234 @@ +import { Fostering } from '@cat-fostering/entities'; +import axios from 'axios'; + +import { + axiosOptionsFactory, + createCatProfile, + createFosteringRequest, + createOryUser, + getFosteringRequest, + TestUser, +} from './helpers'; + +describe('E2E Fostering Requests API tests', () => { + let user1: TestUser; + let user2: TestUser; + let user3: TestUser; + + beforeAll(async () => { + user1 = await createOryUser({ + email: 'guardian@test.it', + password: 'p4s$worD!', + }); + + user2 = await createOryUser({ + email: 'participant@test.it', + password: 'p4s$worD!', + }); + + user3 = await createOryUser({ + email: 'nobody@test.it', + password: 'p4s$worD!', + }); + }, 15000); + + describe('POST /api/fostering', () => { + it('should create a fostering request', async () => { + const catProfile = await createCatProfile({ + name: 'Godard', + description: 'Black and white cat, knows how to open doors', + age: 3, + sessionToken: user1.sessionToken, + }); + const res = await axios.post( + `/api/fostering`, + { + startDate: new Date(), + endDate: new Date(), + catProfileId: catProfile.id, + }, + axiosOptionsFactory(user2.sessionToken) + ); + + expect(res.status).toBe(201); + }); + + it(`should return 403 if the user is the cat profile owner`, async () => { + const catProfile = await createCatProfile({ + name: 'Godard', + description: 'Black and white cat, knows how to open doors', + age: 3, + sessionToken: user1.sessionToken, + }); + const res = await axios.post( + `/api/fostering`, + { + startDate: new Date(), + endDate: new Date(), + catProfileId: catProfile.id, + }, + axiosOptionsFactory(user1.sessionToken) + ); + + expect(res.status).toBe(403); + }); + }); + + describe('GET /api/fostering', () => { + it('user should only see her fostering requests', async () => { + const catProfile1 = await createCatProfile({ + name: 'Godard', + description: 'Black and white cat, knows how to open doors', + age: 3, + sessionToken: user1.sessionToken, + }); + await createFosteringRequest({ + catProfileId: catProfile1.id, + startDate: new Date(), + endDate: new Date(), + sessionToken: user2.sessionToken, + }); + await createFosteringRequest({ + catProfileId: catProfile1.id, + startDate: new Date(), + endDate: new Date(), + sessionToken: user3.sessionToken, + }); + + const res = await axios.get( + `/api/fostering`, + axiosOptionsFactory(user2.sessionToken) + ); + + expect(res.status).toBe(200); + const fosteringRequests = await Promise.all( + res.data.map((f) => + getFosteringRequest({ id: f.id, sessionToken: user2.sessionToken }) + ) + ); + expect( + fosteringRequests.every((r: Fostering) => r.participant.id === user2.id) + ).toBeTruthy(); + }); + }); + + describe('GET /api/fostering/:id', () => { + it('should read the fostering request when user is the participant', async () => { + const catProfile = await createCatProfile({ + name: 'Godard', + description: 'Black and white cat, knows how to open doors', + age: 3, + sessionToken: user1.sessionToken, + }); + const fosteringRequest = await createFosteringRequest({ + catProfileId: catProfile.id, + startDate: new Date(), + endDate: new Date(), + sessionToken: user2.sessionToken, + }); + + const res = await axios.get( + `/api/fostering/${fosteringRequest.id}`, + axiosOptionsFactory(user2.sessionToken) + ); + + expect(res.status).toBe(200); + }); + + it('should read the fostering request when user is the catprofile owner', async () => { + const catProfile = await createCatProfile({ + name: 'Godard', + description: 'Black and white cat, knows how to open doors', + age: 3, + sessionToken: user1.sessionToken, + }); + const fosteringRequest = await createFosteringRequest({ + catProfileId: catProfile.id, + startDate: new Date(), + endDate: new Date(), + sessionToken: user2.sessionToken, + }); + + const res = await axios.get( + `/api/fostering/${fosteringRequest.id}`, + axiosOptionsFactory(user1.sessionToken) + ); + expect(res.status).toBe(200); + }); + + it(`should return 403 if the user is not the participant or the catprofile owner`, async () => { + const catProfile = await createCatProfile({ + name: 'Godard', + description: 'Black and white cat, knows how to open doors', + age: 3, + sessionToken: user1.sessionToken, + }); + const fosteringRequest = await createFosteringRequest({ + catProfileId: catProfile.id, + startDate: new Date(), + endDate: new Date(), + sessionToken: user2.sessionToken, + }); + + const res = await axios.get( + `/api/fostering/${fosteringRequest.id}`, + axiosOptionsFactory(user3.sessionToken) + ); + expect(res.status).toBe(403); + }); + }); + + describe('PATCH /api/fostering/:id', () => { + it.todo('should update a fostering request when user is the participant'); + + it.todo(`should return 403 if the user is not the participant`); + }); + + describe('PATCH /api/fostering/:id/approve', () => { + it('should approve a fostering request when user is the cat profile owner', async () => { + const catProfile = await createCatProfile({ + name: 'Juliet', + description: 'White cat, loves to play', + age: 1, + sessionToken: user1.sessionToken, + }); + const fosteringRequest = await createFosteringRequest({ + catProfileId: catProfile.id, + startDate: new Date(), + endDate: new Date(), + sessionToken: user2.sessionToken, + }); + + const res = await axios.patch( + `/api/fostering/${fosteringRequest.id}/approve`, + {}, + axiosOptionsFactory(user1.sessionToken) + ); + + expect(res.status).toBe(200); + }); + + it(`should return 403 if the user is not the cat profile owner`, async () => { + const catProfile = await createCatProfile({ + name: 'Crousti', + description: 'Tabby brown, with a diva attitude', + age: 8, + sessionToken: user1.sessionToken, + }); + const fosteringRequest = await createFosteringRequest({ + catProfileId: catProfile.id, + startDate: new Date(), + endDate: new Date(), + sessionToken: user2.sessionToken, + }); + + const res = await axios.patch( + `/api/fostering/${fosteringRequest.id}/approve`, + {}, + axiosOptionsFactory(user2.sessionToken) + ); + + expect(res.status).toBe(403); + }); + }); +}); diff --git a/apps/cat-fostering-api-e2e/src/cat-fostering-api/helpers.ts b/apps/cat-fostering-api-e2e/src/cat-fostering-api/helpers.ts index 9af0ef7..fb94cbb 100644 --- a/apps/cat-fostering-api-e2e/src/cat-fostering-api/helpers.ts +++ b/apps/cat-fostering-api-e2e/src/cat-fostering-api/helpers.ts @@ -23,12 +23,13 @@ export const login = async ({ identity: string; }> => { const { stdout, stderr } = await execAsync( - `npx @getlarge/kratos-cli login --email '${email}' --password '${password}'` + `npx @getlarge/kratos-cli login --email '${email}' --password '${password}'`, + { encoding: 'utf-8' } ); if (stderr) { - throw new Error(stderr.toString()); + throw new Error(stderr); } - return JSON.parse(stdout.toString().trim()); + return JSON.parse(stdout.trim()); }; export const register = async ({ @@ -39,10 +40,12 @@ export const register = async ({ password: string; }): Promise => { const { stderr } = await execAsync( - `npx @getlarge/kratos-cli register --email '${email}' --password '${password}'` + `npx @getlarge/kratos-cli register --email '${email}' --password '${password}'`, + { encoding: 'utf-8' } ); + if (stderr) { - throw new Error(stderr.toString()); + throw new Error(stderr); } }; @@ -95,7 +98,7 @@ export const createOryAdminRelation = ({ execSync(`npx @getlarge/keto-cli create --tuple '${relationTuple}'`); }; -export const createCat = async ({ +export const createCatProfile = async ({ name, description, age, @@ -128,6 +131,58 @@ export const createCat = async ({ return res.data; }; +export const createFosteringRequest = async ({ + catProfileId, + startDate, + endDate, + sessionToken, +}: { + catProfileId: string; + startDate: Date; + endDate: Date; + sessionToken: string; +}): Promise<{ + startDate: Date; + endDate: Date; + id: string; +}> => { + const res = await axios.post( + 'api/fostering', + { + catProfileId, + startDate, + endDate, + }, + { + headers: { + Authorization: `Bearer ${sessionToken}`, + }, + } + ); + expect(res.status).toBe(201); + return res.data; +}; + +export const getFosteringRequest = async ({ + id, + sessionToken, +}: { + id: string; + sessionToken: string; +}): Promise<{ + startDate: Date; + endDate: Date; + id: string; +}> => { + const res = await axios.get(`api/fostering/${id}`, { + headers: { + Authorization: `Bearer ${sessionToken}`, + }, + }); + expect(res.status).toBe(200); + return res.data; +}; + export const axiosOptionsFactory = ( sessionToken: string ): AxiosRequestConfig => ({ diff --git a/apps/cat-fostering-api-e2e/src/cat-fostering-api/users.spec.ts b/apps/cat-fostering-api-e2e/src/cat-fostering-api/users.spec.ts new file mode 100644 index 0000000..f1b5960 --- /dev/null +++ b/apps/cat-fostering-api-e2e/src/cat-fostering-api/users.spec.ts @@ -0,0 +1,52 @@ +import axios from 'axios'; + +import { createOryUser, TestUser } from './helpers'; + +describe('E2E Users API tests', () => { + let user1: TestUser; + + beforeAll(async () => { + user1 = await createOryUser({ + email: 'test@test.it', + password: 'p4s$worD!', + }); + }, 8000); + + describe('GET /api', () => { + it('should return a message', async () => { + const res = await axios.get(`/api`); + + expect(res.status).toBe(200); + expect(res.data).toEqual({ message: 'Hello API' }); + }); + }); + + describe('GET /api/users/current-user', () => { + it('should return the current user', async () => { + const res = await axios.get(`/api/users/current-user`, { + headers: { + Authorization: `Bearer ${user1.sessionToken}`, + }, + }); + + expect(res.status).toBe(200); + expect(res.data.email).toBe(user1.email); + }); + + it('should return 401 if no token is provided', async () => { + const res = await axios.get(`/api/users/current-user`); + + expect(res.status).toBe(401); + }); + + it('should return 401 if an invalid token is provided', async () => { + const res = await axios.get(`/api/users/current-user`, { + headers: { + Authorization: `Bearer ory_st_invalid`, + }, + }); + + expect(res.status).toBe(401); + }); + }); +}); diff --git a/apps/cat-fostering-api-e2e/src/support/global-setup.ts b/apps/cat-fostering-api-e2e/src/support/global-setup.ts index 2c1a23b..a412cf9 100644 --- a/apps/cat-fostering-api-e2e/src/support/global-setup.ts +++ b/apps/cat-fostering-api-e2e/src/support/global-setup.ts @@ -1,27 +1,55 @@ -import { execSync } from 'node:child_process'; +import { registerTsProject } from '@nx/js/src/internal'; +const cleanupRegisteredPaths = registerTsProject('../../tsconfig.base.json'); -import { createTestConnection } from './helpers'; +import { + generateOryKetoConfig, + generateOryKratosConfig, +} from '@cat-fostering/ory-config-generators'; +import { createTestConnection } from '@cat-fostering/pg-config'; +import { join } from 'node:path'; -const envPath = 'apps/cat-fostering-api/.env.ci'; +import { restartService } from './helpers'; -const cwd = process.cwd(); +const applicationEnvPath = join( + __dirname, + '..', + '..', + '..', + 'cat-fostering-api', + '.env.ci' +); +const dockerEnvPath = join(__dirname, '..', '..', '..', '..', '.env.ci'); export default async (): Promise => { console.log('\nSetting up...\n'); - const __TEARDOWN_MESSAGE__ = '\nTearing down...\n'; globalThis.__TEARDOWN_MESSAGE__ = __TEARDOWN_MESSAGE__; - execSync( - 'npx ts-node --project tools/tsconfig.json tools/ory/generate-config.ts keto -e .env.ci', - { cwd, stdio: 'ignore' } - ); - execSync('docker compose restart keto', { cwd, stdio: 'ignore' }); - execSync( - 'npx ts-node --project tools/tsconfig.json tools/ory/generate-config.ts kratos -e .env.ci', - { cwd, stdio: 'ignore' } - ); - execSync('docker compose restart kratos', { cwd, stdio: 'ignore' }); - - globalThis.__DB_CONNECTION__ = await createTestConnection(envPath); + console.log({ + CI: process.env.CI, + ACT: process.env.ACT, + NX_TASK_TARGET_TARGET: process.env.NX_TASK_TARGET_TARGET, + }); + + if ( + process.env.CI || + process.env.ACT || + // unfortunately, the task generated for tests splitting do not contain the target name + process.env.NX_TASK_TARGET_TARGET?.includes('e2e-ci') + ) { + return; + } + + if (process.env.NX_TASK_TARGET_TARGET === 'e2e') { + generateOryKetoConfig(dockerEnvPath); + restartService('keto'); + generateOryKratosConfig(dockerEnvPath); + restartService('kratos'); + globalThis.__DB_CONNECTION__ = await createTestConnection( + applicationEnvPath + ); + restartService('api'); + } }; + +cleanupRegisteredPaths(); diff --git a/apps/cat-fostering-api-e2e/src/support/global-teardown.ts b/apps/cat-fostering-api-e2e/src/support/global-teardown.ts index 3fe540b..7584fcd 100644 --- a/apps/cat-fostering-api-e2e/src/support/global-teardown.ts +++ b/apps/cat-fostering-api-e2e/src/support/global-teardown.ts @@ -1,21 +1,36 @@ -import { execSync } from 'node:child_process'; +import { registerTsProject } from '@nx/js/src/internal'; +const cleanupRegisteredPaths = registerTsProject('../../tsconfig.base.json'); + +import { + generateOryKetoConfig, + generateOryKratosConfig, +} from '@cat-fostering/ory-config-generators'; +import { join } from 'node:path'; import { DataSource } from 'typeorm'; -const cwd = process.cwd(); +import { restartService } from './helpers'; + +const dockerEnvPath = join(__dirname, '..', '..', '..', '..', '.env'); export default async (): Promise => { console.log(globalThis.__TEARDOWN_MESSAGE__); - await (globalThis.__DB_CONNECTION__ as DataSource)?.destroy(); + if ( + process.env.CI || + process.env.ACT || + // unfortunately, the task generated for tests splitting do not contain the target name + process.env.NX_TASK_TARGET_TARGET?.includes('e2e-ci') + ) { + return; + } - execSync( - 'npx ts-node --project tools/tsconfig.json tools/ory/generate-config.ts keto -e .env', - { cwd, stdio: 'ignore' } - ); - execSync('docker compose restart keto', { cwd, stdio: 'ignore' }); - execSync( - 'npx ts-node --project tools/tsconfig.json tools/ory/generate-config.ts kratos -e .env', - { cwd, stdio: 'ignore' } - ); - execSync('docker compose restart kratos', { cwd, stdio: 'ignore' }); + if (process.env.NX_TASK_TARGET_TARGET === 'e2e') { + await (globalThis.__DB_CONNECTION__ as DataSource)?.destroy(); + generateOryKetoConfig(dockerEnvPath); + restartService('keto'); + generateOryKratosConfig(dockerEnvPath); + restartService('kratos'); + } }; + +cleanupRegisteredPaths(); diff --git a/apps/cat-fostering-api-e2e/src/support/helpers.ts b/apps/cat-fostering-api-e2e/src/support/helpers.ts index e3ce140..c6d57b7 100644 --- a/apps/cat-fostering-api-e2e/src/support/helpers.ts +++ b/apps/cat-fostering-api-e2e/src/support/helpers.ts @@ -1,74 +1,10 @@ -/** - * this is a workaround since the TS environment is not yet loaded in the global setup hook - * @see https://stackoverflow.com/questions/48318230/configure-jest-global-tests-setup-with-ts-file - **/ -import * as tsConfigPaths from 'tsconfig-paths'; -tsConfigPaths.register({ - baseUrl: './', - paths: { - '@cat-fostering/entities': ['libs/shared/entities/src/index.ts'], - }, -}); +import { execSync } from 'node:child_process'; -import { - CatProfileSchema, - FosteringSchema, - UserSchema, -} from '@cat-fostering/entities'; -import { config, parse } from 'dotenv'; -import { existsSync, readFileSync } from 'node:fs'; -import { resolve } from 'node:path'; -import { DataSource, DataSourceOptions } from 'typeorm'; +const cwd = process.cwd(); -const getConnectionOptions = (envFilePath = '.env.test') => { - const variables = existsSync(envFilePath) - ? parse(readFileSync(envFilePath)) - : {}; - const env = config({ path: resolve(envFilePath) }); - const { parsed, error } = env; - const source = error - ? { ...process.env, ...variables } - : { ...parsed, ...variables }; - - const database = source['POSTGRES_DB']; - const username = source['POSTGRES_USER']; - const password = source['POSTGRES_PASSWORD']; - const url = new URL(source['POSTGRES_URL']); - url.username = username || url.username; - url.password = password || url.password; - url.pathname = database ? `/${database}` : url.pathname; - return { - type: 'postgres', - url: url.toString(), - synchronize: true, - dropSchema: true, - logging: false, - entities: [UserSchema, CatProfileSchema, FosteringSchema], - } satisfies Partial; -}; - -export const createTestConnection = async (envFilePath = '.env.test') => { - const options = getConnectionOptions(envFilePath); - const urlObject = new URL(options.url); - const database = urlObject.pathname.replace('/', ''); - const username = urlObject.username; - try { - return await new DataSource(options).initialize(); - } catch (error) { - if (error.message.includes('does not exist')) { - console.warn(`Creating database ${database}...`); - const mainDatababase = 'postgres'; - const adminConn = await new DataSource({ - ...options, - url: options.url.replace(database, mainDatababase), - }).initialize(); - await adminConn.query(`CREATE DATABASE ${database}`); - await adminConn.query( - `GRANT ALL PRIVILEGES ON DATABASE ${database} TO ${username}` - ); - await adminConn.destroy(); - return new DataSource(options).initialize(); - } - throw error; - } +export const restartService = (service: string): void => { + execSync(`docker compose -p cat-fostering restart ${service}`, { + cwd, + stdio: 'ignore', + }); }; diff --git a/apps/cat-fostering-api-e2e/src/support/test-setup.ts b/apps/cat-fostering-api-e2e/src/support/test-setup.ts index 01a8e01..85854b6 100644 --- a/apps/cat-fostering-api-e2e/src/support/test-setup.ts +++ b/apps/cat-fostering-api-e2e/src/support/test-setup.ts @@ -4,8 +4,8 @@ import axios from 'axios'; module.exports = async function () { // Configure axios for tests to use. - const host = process.env.HOST ?? 'localhost'; - const port = process.env.PORT ?? '3000'; + const host = process.env.API_HOST ?? 'localhost'; + const port = process.env.API_PORT ?? '3000'; axios.defaults.baseURL = `http://${host}:${port}`; // Do not throw on non-2xx status codes. axios.defaults.validateStatus = () => true; diff --git a/apps/cat-fostering-api/Dockerfile b/apps/cat-fostering-api/Dockerfile index f77a5cd..b05ec16 100644 --- a/apps/cat-fostering-api/Dockerfile +++ b/apps/cat-fostering-api/Dockerfile @@ -1,3 +1,8 @@ +# Build the docker image with `npx nx docker-build cat-fostering-api`. +# Tip: Modify "docker-build" options in project.json to change docker build args. +# +# Run the container with `docker run -e ORY_ACTION_API_KEY='hello' -e POSTGRES_URL='postgres://dbuser:secret@postgres:5432/appdb' --network cat-fostering_ory -p 3000:3000 -t ghcr.io/getlarge/cat-fostering/cat-fostering-api:latest`. + ARG NODE_VERSION=20.9.0 ### optimize @@ -5,23 +10,23 @@ FROM node:$NODE_VERSION AS optimize WORKDIR /app +RUN echo "Building cat-fostering-api image with NODE_VERSION=$NODE_VERSION" + COPY ./apps/cat-fostering-api/package*.json ./ +COPY --chown=node:node ./dist/apps/cat-fostering-api ./ -RUN npm install --loglevel=error -# to reduce image size +RUN npm install --omit=dev -f --loglevel=error RUN curl -sf https://gobinaries.com/tj/node-prune | sh RUN node-prune -COPY --chown=node:node ./dist/apps/cat-fostering-api ./ - ### FROM node:$NODE_VERSION-alpine USER node ENV NODE_ENV=development +ENV HOST=0.0.0.0 ENV PORT=3000 -ENV GLOBAL_API_PREFIX=api WORKDIR /app diff --git a/apps/cat-fostering-api/package.json b/apps/cat-fostering-api/package.json index 6682b2b..2420860 100644 --- a/apps/cat-fostering-api/package.json +++ b/apps/cat-fostering-api/package.json @@ -6,16 +6,16 @@ "@nestjs/common": "^10.0.2", "@nestjs/config": "^3.2.1", "@nestjs/core": "^10.0.2", - "@nestjs/mapped-types": "2.0.5", + "@nestjs/platform-express": "^10.0.2", + "@nestjs/swagger": "^7.3.1", "@nestjs/typeorm": "^10.0.2", "@ory/client": "1.9.0", "class-transformer": "^0.5.1", "class-validator": "^0.14.1", "express": "4.19.2", "nestjs-pino": "^4.0.0", - "tslib": "^2.3.0", "typeorm": "^0.3.20", - "@nestjs/platform-express": "^10.0.2", + "validator": "13.11.0", "pg": "^8.11.5" } } diff --git a/apps/cat-fostering-api/project.json b/apps/cat-fostering-api/project.json index 288fa12..b4c8fb8 100644 --- a/apps/cat-fostering-api/project.json +++ b/apps/cat-fostering-api/project.json @@ -13,19 +13,25 @@ }, "configurations": { "local": { - "buildTarget": "cat-fostering-api:build:local" + "buildTarget": "cat-fostering-api:build:local", + "inspect": true, + "port": 9220 }, "ci": { - "buildTarget": "cat-fostering-api:build:development" + "buildTarget": "cat-fostering-api:build:development", + "inspect": false }, "development": { - "buildTarget": "cat-fostering-api:build:development" + "buildTarget": "cat-fostering-api:build:development", + "inspect": true, + "port": 9220 }, "staging": { "buildTarget": "cat-fostering-api:build:development" }, "test": { - "buildTarget": "cat-fostering-api:build:development" + "buildTarget": "cat-fostering-api:build:development", + "inspect": false }, "production": { "buildTarget": "cat-fostering-api:build:production" @@ -43,6 +49,11 @@ "tags": ["ghcr.io/getlarge/cat-fostering/cat-fostering-api:latest"], "build-args": ["APP_NAME=cat-fostering-api", "NODE_VERSION=20.9.0"] } + }, + "docker-build": { + "dependsOn": ["build"], + "inputs": ["production", "^production"], + "command": "docker build -f apps/cat-fostering-api/Dockerfile . -t ghcr.io/getlarge/cat-fostering/cat-fostering-api:dev" } } } diff --git a/apps/cat-fostering-api/src/main.ts b/apps/cat-fostering-api/src/main.ts index ae7b5ac..8711f05 100644 --- a/apps/cat-fostering-api/src/main.ts +++ b/apps/cat-fostering-api/src/main.ts @@ -13,6 +13,7 @@ import { SwaggerModule, } from '@nestjs/swagger'; import { Logger, LoggerErrorInterceptor } from 'nestjs-pino'; +import { existsSync } from 'node:fs'; import { writeFile } from 'node:fs/promises'; import { join, resolve } from 'node:path'; @@ -62,11 +63,12 @@ async function bootstrap() { const document = SwaggerModule.createDocument(app, docBuilder); - await writeFile( - resolve(join('apps', 'cat-fostering-api', 'openapi.json')), - JSON.stringify(document, null, 2), - 'utf-8' + const openapiPath = resolve( + join('apps', 'cat-fostering-api', 'openapi.json') ); + if (existsSync(openapiPath)) { + await writeFile(openapiPath, JSON.stringify(document, null, 2), 'utf-8'); + } // Swagger UI const customOptions: SwaggerCustomOptions = { diff --git a/docker-compose.yaml b/docker-compose.yaml index a088c54..e3ee0de 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -29,10 +29,11 @@ services: delay: 5s max_attempts: 3 window: 120s + profiles: + - dev postgres: image: postgres:16 - container_name: app_postgres volumes: - app_postgres_volume:/var/lib/postgresql/data ports: @@ -40,16 +41,48 @@ services: environment: - POSTGRES_USER=dbuser - POSTGRES_PASSWORD=secret - - POSTGRES_DB=appdb + - POSTGRES_DB=${POSTGRES_DB:-appdb} + networks: + - ory + profiles: + - ci + - dev + + api: + image: ghcr.io/getlarge/cat-fostering/cat-fostering-api:dev + pull_policy: never + depends_on: + - postgres + - kratos + - keto + ports: + - '3000:3000' + environment: + - NODE_ENV=test + - ORY_ACTION_API_KEY=${ORY_ACTION_API_KEY:-unsecure_api_key} + - ORY_KETO_ADMIN_URL=http://keto:4467 + - ORY_KETO_PUBLIC_URL=http://keto:4466 + - ORY_KRATOS_ADMIN_URL=http://kratos:4434 + - ORY_KRATOS_PUBLIC_URL=http://kratos:4433 + - PORT=3000 + - POSTGRES_URL=postgres://dbuser:secret@postgres:5432 + - POSTGRES_DB=${POSTGRES_DB:-cat_fostering_api_e2e} + networks: + - ory + profiles: + - ci kratos-migrate: image: oryd/kratos:v1.1.0 volumes: - - ./infra/ory-kratos:/etc/config/kratos:ro + - ${PWD}/infra/ory-kratos:/etc/config/kratos:ro command: -c /etc/config/kratos/kratos.yaml migrate sql -e --yes restart: on-failure networks: - ory + profiles: + - ci + - dev kratos: depends_on: @@ -61,15 +94,17 @@ services: restart: unless-stopped command: serve -c /etc/config/kratos/kratos.yaml --dev --watch-courier volumes: - - ./infra/ory-kratos:/etc/config/kratos:ro + - ${PWD}/infra/ory-kratos:/etc/config/kratos:ro networks: - ory extra_hosts: - - "host.docker.internal:host-gateway" + - 'host.docker.internal:host-gateway' + profiles: + - ci + - dev kratos-postgres: image: postgres:16 - container_name: kratos_postgres environment: - POSTGRES_USER=dbuser - POSTGRES_PASSWORD=secret @@ -78,6 +113,9 @@ services: - kratos_postgres_volume:/var/lib/postgresql/data networks: - ory + profiles: + - ci + - dev kratos-selfservice-ui-node: image: oryd/kratos-selfservice-ui-node:v1.0.0 @@ -90,6 +128,8 @@ services: networks: - ory restart: on-failure + profiles: + - dev mailslurper: image: oryd/mailslurper:latest-smtps @@ -99,15 +139,21 @@ services: - '4437:4437' networks: - ory + profiles: + - ci + - dev keto-migrate: image: oryd/keto:v0.12.0 volumes: - - ./infra/ory-keto:/etc/config/keto:ro + - ${PWD}/infra/ory-keto:/etc/config/keto:ro command: ['migrate', 'up', '-y', '-c', '/etc/config/keto/keto.yaml'] restart: on-failure networks: - ory + profiles: + - ci + - dev keto: depends_on: @@ -119,13 +165,15 @@ services: command: serve -c /etc/config/keto/keto.yaml restart: on-failure volumes: - - ./infra/ory-keto:/etc/config/keto:ro + - ${PWD}/infra/ory-keto:/etc/config/keto:ro networks: - ory + profiles: + - ci + - dev keto-postgres: image: postgres:16 - container_name: keto_postgres environment: - POSTGRES_USER=dbuser - POSTGRES_PASSWORD=secret @@ -134,3 +182,6 @@ services: - keto_postgres_volume:/var/lib/postgresql/data networks: - ory + profiles: + - ci + - dev diff --git a/libs/fostering/nestjs-module/src/lib/fostering.controller.ts b/libs/fostering/nestjs-module/src/lib/fostering.controller.ts index 0d1bb36..282c101 100644 --- a/libs/fostering/nestjs-module/src/lib/fostering.controller.ts +++ b/libs/fostering/nestjs-module/src/lib/fostering.controller.ts @@ -94,6 +94,7 @@ export class FosteringController { new ValidationPipe({ transform: true, transformOptions: { enableImplicitConversion: true }, + whitelist: true, }) ) @Post() diff --git a/libs/ory-config-generators/.eslintrc.json b/libs/ory-config-generators/.eslintrc.json new file mode 100644 index 0000000..9d9c0db --- /dev/null +++ b/libs/ory-config-generators/.eslintrc.json @@ -0,0 +1,18 @@ +{ + "extends": ["../../.eslintrc.json"], + "ignorePatterns": ["!**/*"], + "overrides": [ + { + "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], + "rules": {} + }, + { + "files": ["*.ts", "*.tsx"], + "rules": {} + }, + { + "files": ["*.js", "*.jsx"], + "rules": {} + } + ] +} diff --git a/libs/ory-config-generators/README.md b/libs/ory-config-generators/README.md new file mode 100644 index 0000000..4c0232a --- /dev/null +++ b/libs/ory-config-generators/README.md @@ -0,0 +1,3 @@ +# ory-config-generators + +This library was generated with [Nx](https://nx.dev). diff --git a/libs/ory-config-generators/project.json b/libs/ory-config-generators/project.json new file mode 100644 index 0000000..cb5dfc7 --- /dev/null +++ b/libs/ory-config-generators/project.json @@ -0,0 +1,9 @@ +{ + "name": "ory-config-generators", + "$schema": "../../node_modules/nx/schemas/project-schema.json", + "sourceRoot": "libs/ory-config-generators/src", + "projectType": "library", + "tags": ["scope:shared", "type:utils", "platform:node"], + "// targets": "to see all targets run: nx show project ory-config-generators --web", + "targets": {} +} diff --git a/libs/ory-config-generators/src/index.ts b/libs/ory-config-generators/src/index.ts new file mode 100644 index 0000000..7ea540f --- /dev/null +++ b/libs/ory-config-generators/src/index.ts @@ -0,0 +1 @@ +export * from './lib/ory-config-generators'; diff --git a/tools/ory/mappings.ts b/libs/ory-config-generators/src/lib/mappings.ts similarity index 94% rename from tools/ory/mappings.ts rename to libs/ory-config-generators/src/lib/mappings.ts index 9d1b1f5..0b5dbbf 100644 --- a/tools/ory/mappings.ts +++ b/libs/ory-config-generators/src/lib/mappings.ts @@ -1,9 +1,10 @@ import 'reflect-metadata'; + import { ClassConstructor, Expose, + plainToInstance, Transform, - plainToClass, } from 'class-transformer'; import { IsArray, @@ -23,7 +24,7 @@ export class KeywordMappings { @IsString() log_level?: string = 'debug'; - [key: string]: (string | number)[] | string | number | boolean; + [key: string]: (string | number)[] | string | number | boolean | undefined; } const isUrlOptions: Parameters[0] = { @@ -40,6 +41,9 @@ const DEFAULT_SELF_SERVICE_UI_URL = 'http://localhost:4455'; const strToBool = (value: string | boolean) => value === 'true' || value === true; +const strToArray = (value?: string) => + value ? value.split(',').map((v) => v.trim()) : []; + export class KratosMappings extends KeywordMappings { @Expose() @IsOptional() @@ -163,10 +167,9 @@ export class KratosMappings extends KeywordMappings { @Expose() @IsOptional() - @Transform( - ({ value }) => (value ? value.split(',').map((v) => v.trim()) : []), - { toClassOnly: true } - ) + @Transform(({ value }) => strToArray(value), { + toClassOnly: true, + }) @IsArray() @IsString({ each: true }) kratos_selfservice_allowed_return_urls?: string[] = []; @@ -299,10 +302,9 @@ export class KratosMappings extends KeywordMappings { @Expose() @IsOptional() - @Transform( - ({ value }) => (value ? value.split(',').map((v) => v.trim()) : []), - { toClassOnly: true } - ) + @Transform(({ value }) => strToArray(value), { + toClassOnly: true, + }) @IsArray() @IsUrl(isUrlOptions, { each: true }) kratos_selfservice_methods_passkey_config_rp_origins?: string[] = []; @@ -322,10 +324,9 @@ export class KratosMappings extends KeywordMappings { @Expose() @IsOptional() - @Transform( - ({ value }) => (value ? value.split(',').map((v) => v.trim()) : []), - { toClassOnly: true } - ) + @Transform(({ value }) => strToArray(value), { + toClassOnly: true, + }) @IsArray() @IsUrl(isUrlOptions, { each: true }) kratos_selfservice_methods_webauthn_config_rp_origins?: string[] = []; @@ -356,7 +357,7 @@ export class KratosMappings extends KeywordMappings { kratos_serve_public_base_url?: string = 'http://localhost:4433/'; @Expose() - @Transform(({ obj, key }) => obj[key] === 'true' || obj[key] === true, { + @Transform(({ obj, key }) => strToBool(obj[key]), { toClassOnly: true, }) @IsOptional() @@ -364,10 +365,9 @@ export class KratosMappings extends KeywordMappings { kratos_serve_public_cors_enabled?: boolean = false; @Expose() - @Transform( - ({ value }) => (value ? value.split(',').map((v) => v.trim()) : []), - { toClassOnly: true } - ) + @Transform(({ value }) => strToArray(value), { + toClassOnly: true, + }) @IsOptional() @IsString({ each: true }) kratos_serve_public_cors_allowed_origins?: string[] = [ @@ -414,7 +414,7 @@ export function validateMappings( mappings: ClassConstructor, processEnv: Record ) { - const validatedConfig = plainToClass(mappings, processEnv, { + const validatedConfig = plainToInstance(mappings, processEnv, { enableImplicitConversion: true, excludeExtraneousValues: true, exposeDefaultValues: true, diff --git a/tools/ory/helpers.ts b/libs/ory-config-generators/src/lib/ory-config-generators.ts similarity index 87% rename from tools/ory/helpers.ts rename to libs/ory-config-generators/src/lib/ory-config-generators.ts index 9902aca..a3d74d4 100644 --- a/tools/ory/helpers.ts +++ b/libs/ory-config-generators/src/lib/ory-config-generators.ts @@ -1,11 +1,11 @@ +import * as dotenvX from '@dotenvx/dotenvx'; import type { ClassConstructor } from 'class-transformer'; -import dotenv from 'dotenv'; -import { expand } from 'dotenv-expand'; -import { load, dump } from 'js-yaml'; +import { dump, load } from 'js-yaml'; import { execSync } from 'node:child_process'; -import { constants, accessSync, readFileSync, writeFileSync } from 'node:fs'; +import { accessSync, constants, readFileSync, writeFileSync } from 'node:fs'; import { join, resolve } from 'node:path'; import { inspect } from 'node:util'; + import { KetoMappings, KeywordMappings, @@ -13,7 +13,9 @@ import { validateMappings, } from './mappings'; -export const INFRA_DIRECTORY = join(__dirname, '..', '..', 'infra'); +export const INFRA_DIRECTORY = + process.env['ORY_INFRA_DIRECTORY'] ?? + join(__dirname, '..', '..', '..', '..', 'infra'); export const ORY_KRATOS_DIRECTORY = join(INFRA_DIRECTORY, 'ory-kratos'); export const ORY_KETO_DIRECTORY = join(INFRA_DIRECTORY, 'ory-keto'); export const ORY_NETWORK_DIRECTORY = join(INFRA_DIRECTORY, 'ory-network'); @@ -26,6 +28,7 @@ function keywordArrayReplace(input: string, mappings: KeywordMappings) { const pattern = `@@${key}@@`; const patternWithQuotes = `"${pattern}"`; const regex = new RegExp(`${patternWithQuotes}|${pattern}`, 'g'); + // eslint-disable-next-line no-param-reassign input = input.replace(regex, JSON.stringify(mappings[key])); }); return input; @@ -40,8 +43,10 @@ function keywordStringReplace(input: string, mappings: KeywordMappings) { typeof mapping === 'number' || typeof mapping === 'boolean' ) { + // eslint-disable-next-line no-param-reassign input = input.replace(regex, mapping.toString()); } else { + // eslint-disable-next-line no-param-reassign input = input.replace(regex, ''); } }); @@ -50,7 +55,9 @@ function keywordStringReplace(input: string, mappings: KeywordMappings) { function keywordReplace(input: string, mappings: KeywordMappings) { // Replace keywords with mappings within input. if (mappings && Object.keys(mappings).length > 0) { + // eslint-disable-next-line no-param-reassign input = keywordArrayReplace(input, mappings); + // eslint-disable-next-line no-param-reassign input = keywordStringReplace(input, mappings); } return input; @@ -58,7 +65,7 @@ function keywordReplace(input: string, mappings: KeywordMappings) { export function loadFileAndReplaceKeywords( file: ConfigFilepath, - mappings: KeywordMappings + mappings?: KeywordMappings ) { const f = resolve(file); try { @@ -87,9 +94,13 @@ function getOryMappings( cls: ClassConstructor, envFilePath: string ): T { - const processEnv: Record = {}; - const { parsed } = dotenv.config({ path: envFilePath, processEnv }); - const result = expand({ parsed, ignoreProcessEnv: true }); + const oldProcessEnv = structuredClone(process.env); + // const keys = Object.keys(plainToInstance(cls, {})); + const result = dotenvX.config({ path: envFilePath, overload: true }); + process.env = { ...oldProcessEnv }; + if (!result.parsed) { + throw new Error(`Unable to parse env file ${envFilePath}`); + } return validateMappings(cls, result.parsed); } diff --git a/libs/ory-config-generators/tsconfig.json b/libs/ory-config-generators/tsconfig.json new file mode 100644 index 0000000..db7b566 --- /dev/null +++ b/libs/ory-config-generators/tsconfig.json @@ -0,0 +1,19 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "module": "commonjs", + "forceConsistentCasingInFileNames": true, + "strict": true, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true + }, + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.lib.json" + } + ] +} diff --git a/libs/ory-config-generators/tsconfig.lib.json b/libs/ory-config-generators/tsconfig.lib.json new file mode 100644 index 0000000..faa09cc --- /dev/null +++ b/libs/ory-config-generators/tsconfig.lib.json @@ -0,0 +1,10 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../dist/out-tsc", + "declaration": true, + "types": ["node"] + }, + "include": ["src/**/*.ts"], + "exclude": ["src/**/*.spec.ts", "src/**/*.test.ts"] +} diff --git a/libs/pg-config/.eslintrc.json b/libs/pg-config/.eslintrc.json new file mode 100644 index 0000000..9d9c0db --- /dev/null +++ b/libs/pg-config/.eslintrc.json @@ -0,0 +1,18 @@ +{ + "extends": ["../../.eslintrc.json"], + "ignorePatterns": ["!**/*"], + "overrides": [ + { + "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], + "rules": {} + }, + { + "files": ["*.ts", "*.tsx"], + "rules": {} + }, + { + "files": ["*.js", "*.jsx"], + "rules": {} + } + ] +} diff --git a/libs/pg-config/README.md b/libs/pg-config/README.md new file mode 100644 index 0000000..5ba33b0 --- /dev/null +++ b/libs/pg-config/README.md @@ -0,0 +1,3 @@ +# pg-config + +This library was generated with [Nx](https://nx.dev). diff --git a/libs/pg-config/project.json b/libs/pg-config/project.json new file mode 100644 index 0000000..9bfa59e --- /dev/null +++ b/libs/pg-config/project.json @@ -0,0 +1,9 @@ +{ + "name": "pg-config", + "$schema": "../../node_modules/nx/schemas/project-schema.json", + "sourceRoot": "libs/pg-config/src", + "projectType": "library", + "tags": ["scope:shared", "type:test", "platform:node"], + "// targets": "to see all targets run: nx show project pg-config --web", + "targets": {} +} diff --git a/libs/pg-config/src/index.ts b/libs/pg-config/src/index.ts new file mode 100644 index 0000000..c37c156 --- /dev/null +++ b/libs/pg-config/src/index.ts @@ -0,0 +1 @@ +export * from './lib/pg-config'; diff --git a/libs/pg-config/src/lib/pg-config.ts b/libs/pg-config/src/lib/pg-config.ts new file mode 100644 index 0000000..7d3db5f --- /dev/null +++ b/libs/pg-config/src/lib/pg-config.ts @@ -0,0 +1,75 @@ +import { + CatProfileSchema, + FosteringSchema, + UserSchema, +} from '@cat-fostering/entities'; +import { config, parse } from 'dotenv'; +import { existsSync, readFileSync } from 'node:fs'; +import { resolve } from 'node:path'; +import { DataSource, DataSourceOptions } from 'typeorm'; + +const getConnectionOptions = (envFilePath = '.env.test') => { + const variables = existsSync(envFilePath) + ? parse(readFileSync(envFilePath)) + : {}; + const env = config({ path: resolve(envFilePath) }); + const { parsed, error } = env; + const source = error + ? { ...process.env, ...variables } + : { ...process.env, ...parsed, ...variables }; + + const database = source['POSTGRES_DB']; + const username = source['POSTGRES_USER']; + const password = source['POSTGRES_PASSWORD']; + if (!source['POSTGRES_URL']) { + throw new Error( + 'POSTGRES_URL is not defined in the environment variables.' + ); + } + const url = new URL(source['POSTGRES_URL']); + url.username = username || url.username; + url.password = password || url.password; + url.pathname = database ? `/${database}` : url.pathname; + return { + type: 'postgres', + url: url.toString(), + synchronize: true, + dropSchema: true, + logging: false, + entities: [UserSchema, CatProfileSchema, FosteringSchema], + } satisfies Partial; +}; + +export const createTestConnection = async (envFilePath = '.env.test') => { + const options = getConnectionOptions(envFilePath); + const urlObject = new URL(options.url); + const database = urlObject.pathname.replace('/', ''); + const username = urlObject.username; + try { + const conn = await new DataSource(options).initialize(); + await conn.dropDatabase(); + return conn; + } catch (error) { + if ( + typeof error === 'object' && + error && + 'message' in error && + typeof error.message === 'string' && + error.message.includes('does not exist') + ) { + console.warn(`Creating database ${database}...`); + const mainDatababase = 'postgres'; + const adminConn = await new DataSource({ + ...options, + url: options.url.replace(database, mainDatababase), + }).initialize(); + await adminConn.query(`CREATE DATABASE ${database}`); + await adminConn.query( + `GRANT ALL PRIVILEGES ON DATABASE ${database} TO ${username}` + ); + await adminConn.destroy(); + return new DataSource(options).initialize(); + } + throw error; + } +}; diff --git a/libs/pg-config/tsconfig.json b/libs/pg-config/tsconfig.json new file mode 100644 index 0000000..db7b566 --- /dev/null +++ b/libs/pg-config/tsconfig.json @@ -0,0 +1,19 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "module": "commonjs", + "forceConsistentCasingInFileNames": true, + "strict": true, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true + }, + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.lib.json" + } + ] +} diff --git a/libs/pg-config/tsconfig.lib.json b/libs/pg-config/tsconfig.lib.json new file mode 100644 index 0000000..faa09cc --- /dev/null +++ b/libs/pg-config/tsconfig.lib.json @@ -0,0 +1,10 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../dist/out-tsc", + "declaration": true, + "types": ["node"] + }, + "include": ["src/**/*.ts"], + "exclude": ["src/**/*.spec.ts", "src/**/*.test.ts"] +} diff --git a/libs/shared/entities/project.json b/libs/shared/entities/project.json index 7363686..5b1abb9 100644 --- a/libs/shared/entities/project.json +++ b/libs/shared/entities/project.json @@ -4,16 +4,5 @@ "sourceRoot": "libs/shared/entities/src", "projectType": "library", "tags": ["scope:shared", "type:core", "platform:node"], - "targets": { - "build": { - "executor": "@nx/js:tsc", - "outputs": ["{options.outputPath}"], - "options": { - "outputPath": "dist/libs/shared/entities", - "main": "libs/shared/entities/src/index.ts", - "tsConfig": "libs/shared/entities/tsconfig.lib.json", - "assets": ["libs/shared/entities/*.md"] - } - } - } + "targets": {} } diff --git a/libs/shared/nestjs-utils/project.json b/libs/shared/nestjs-utils/project.json index 22fb330..a4130bc 100644 --- a/libs/shared/nestjs-utils/project.json +++ b/libs/shared/nestjs-utils/project.json @@ -4,16 +4,5 @@ "sourceRoot": "libs/shared/nestjs-utils/src", "projectType": "library", "tags": ["scope:shared", "type:utils", "platform:node"], - "targets": { - "build": { - "executor": "@nx/js:tsc", - "outputs": ["{options.outputPath}"], - "options": { - "outputPath": "dist/libs/shared/nestjs-utils", - "main": "libs/shared/nestjs-utils/src/index.ts", - "tsConfig": "libs/shared/nestjs-utils/tsconfig.lib.json", - "assets": ["libs/shared/nestjs-utils/*.md"] - } - } - } + "targets": {} } diff --git a/libs/user/nestjs-module/src/lib/models/ory-webhook.error.ts b/libs/user/nestjs-module/src/lib/models/ory-webhook.error.ts index c2ae565..a4e51b5 100644 --- a/libs/user/nestjs-module/src/lib/models/ory-webhook.error.ts +++ b/libs/user/nestjs-module/src/lib/models/ory-webhook.error.ts @@ -1,5 +1,9 @@ import { HttpException } from '@nestjs/common'; +/** + * @see https://www.ory.sh/docs/kratos/concepts/ui-messages + * @see https://www.ory.sh/docs/kratos/concepts/ui-user-interface + */ export type OryWebhookErrorMessages = { instance_ptr?: string; messages: { diff --git a/migrations.json b/migrations.json index d4db1ed..f803c1a 100644 --- a/migrations.json +++ b/migrations.json @@ -33,4 +33,4 @@ "name": "update-19-1-0-rename-no-extra-semi" } ] -} \ No newline at end of file +} diff --git a/nx.json b/nx.json index 4ed7de2..dda71c6 100644 --- a/nx.json +++ b/nx.json @@ -38,9 +38,18 @@ }, { "plugin": "@nx/jest/plugin", + "exclude": ["apps/cat-fostering-api-e2e/**/*"], "options": { "targetName": "test" } + }, + { + "plugin": "@nx/jest/plugin", + "include": ["apps/cat-fostering-api-e2e/**/*"], + "options": { + "targetName": "e2e", + "ciTargetName": "e2e-ci" + } } ], "targetDefaults": { @@ -48,6 +57,22 @@ "cache": true, "dependsOn": ["^build"], "inputs": ["production", "^production"] + }, + "test": { + "cache": true, + "inputs": ["default", "^default"], + "options": { + "jestConfig": "{projectRoot}/jest.config.ts", + "passWithNoTests": true + } + }, + "e2e": { + "cache": true, + "inputs": ["default", "^default"], + "options": { + "jestConfig": "{projectRoot}/jest.config.ts", + "runInBand": true + } } }, "nxCloudAccessToken": "ZDE5NmQ1N2QtZmZlZS00YTQyLTgzZmMtYzMzYzdiYmQ5YTRmfHJlYWQtd3JpdGU=" diff --git a/package-lock.json b/package-lock.json index 88ee530..216f175 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,16 +7,19 @@ "": { "name": "cat-fostering", "version": "0.0.0", + "hasInstallScript": true, "license": "MIT", "workspaces": [ "packages/*" ], "dependencies": { + "@dotenvx/dotenvx": "1.0.0", "@getlarge/keto-cli": "^0.2.2", "@getlarge/keto-client-wrapper": "^0.2.5", "@getlarge/keto-relations-parser": "^0.0.9", "@getlarge/kratos-cli": "^0.2.1", "@getlarge/kratos-client-wrapper": "^0.1.8", + "@nestjs/axios": "^3.0.2", "@nestjs/common": "^10.0.2", "@nestjs/config": "^3.2.1", "@nestjs/core": "^10.0.2", @@ -32,7 +35,7 @@ "pg": "^8.11.5", "reflect-metadata": "^0.1.13", "rxjs": "^7.8.0", - "tslib": "^2.3.0", + "tslib": "^2.6.0", "typeorm": "^0.3.20" }, "devDependencies": { @@ -62,6 +65,7 @@ "jest": "^29.4.1", "jest-environment-node": "^29.4.1", "nx": "19.3.1", + "patch-package": "^8.0.0", "prettier": "^2.6.2", "ts-jest": "^29.1.0", "ts-node": "10.9.1", @@ -2099,11 +2103,19 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, + "node_modules/@colors/colors": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", + "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", + "engines": { + "node": ">=0.1.90" + } + }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, + "devOptional": true, "dependencies": { "@jridgewell/trace-mapping": "0.3.9" }, @@ -2115,12 +2127,22 @@ "version": "0.3.9", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, + "devOptional": true, "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" } }, + "node_modules/@dabh/diagnostics": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", + "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", + "dependencies": { + "colorspace": "1.1.x", + "enabled": "2.0.x", + "kuler": "^2.0.0" + } + }, "node_modules/@discoveryjs/json-ext": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", @@ -2130,6 +2152,168 @@ "node": ">=10.0.0" } }, + "node_modules/@dotenvx/dotenvx": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@dotenvx/dotenvx/-/dotenvx-1.0.0.tgz", + "integrity": "sha512-z6xELzLG70tV4Mt+x9NL/HZDZ4WakBX4tN+36tMVl8bqDRAJLj+FXLILkS1OWvFREJSb8k53YGhK1w35m9834A==", + "dependencies": { + "@inquirer/confirm": "^2.0.17", + "arch": "^2.1.1", + "chalk": "^4.1.2", + "commander": "^11.1.0", + "conf": "^10.2.0", + "diff": "^5.2.0", + "dotenv": "^16.4.5", + "dotenv-expand": "^11.0.6", + "eciesjs": "^0.4.6", + "execa": "^5.1.1", + "glob": "^10.3.10", + "ignore": "^5.3.0", + "is-wsl": "^2.1.1", + "object-treeify": "1.1.33", + "open": "^8.4.2", + "ora": "^5.4.1", + "semver": "^7.3.4", + "undici": "^5.28.3", + "which": "^4.0.0", + "winston": "^3.11.0", + "xxhashjs": "^0.2.2" + }, + "bin": { + "dotenvx": "src/cli/dotenvx.js", + "git-dotenvx": "src/cli/dotenvx.js" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/@dotenvx/dotenvx/node_modules/commander": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", + "engines": { + "node": ">=16" + } + }, + "node_modules/@dotenvx/dotenvx/node_modules/diff": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/@dotenvx/dotenvx/node_modules/dotenv-expand": { + "version": "11.0.6", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.6.tgz", + "integrity": "sha512-8NHi73otpWsZGBSZwwknTXS5pqMOrk9+Ssrna8xCaxkzEpU9OTf9R5ArQGVw03//Zmk9MOwLPng9WwndvpAJ5g==", + "dependencies": { + "dotenv": "^16.4.4" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/@dotenvx/dotenvx/node_modules/glob": { + "version": "10.4.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.2.tgz", + "integrity": "sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@dotenvx/dotenvx/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "engines": { + "node": ">=16" + } + }, + "node_modules/@dotenvx/dotenvx/node_modules/jackspeak": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.0.tgz", + "integrity": "sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/@dotenvx/dotenvx/node_modules/minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@dotenvx/dotenvx/node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@dotenvx/dotenvx/node_modules/which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", @@ -2257,6 +2441,14 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/@fastify/busboy": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", + "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", + "engines": { + "node": ">=14" + } + }, "node_modules/@getlarge/keto-cli": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/@getlarge/keto-cli/-/keto-cli-0.2.2.tgz", @@ -2416,6 +2608,118 @@ "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", "dev": true }, + "node_modules/@inquirer/confirm": { + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-2.0.17.tgz", + "integrity": "sha512-EqzhGryzmGpy2aJf6LxJVhndxYmFs+m8cxXzf8nejb1DE3sabf6mUgBcp4J0jAUEiAcYzqmkqRr7LPFh/WdnXA==", + "dependencies": { + "@inquirer/core": "^6.0.0", + "@inquirer/type": "^1.1.6", + "chalk": "^4.1.2" + }, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/@inquirer/core": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-6.0.0.tgz", + "integrity": "sha512-fKi63Khkisgda3ohnskNf5uZJj+zXOaBvOllHsOkdsXRA/ubQLJQrZchFFi57NKbZzkTunXiBMdvWOv71alonw==", + "dependencies": { + "@inquirer/type": "^1.1.6", + "@types/mute-stream": "^0.0.4", + "@types/node": "^20.10.7", + "@types/wrap-ansi": "^3.0.0", + "ansi-escapes": "^4.3.2", + "chalk": "^4.1.2", + "cli-spinners": "^2.9.2", + "cli-width": "^4.1.0", + "figures": "^3.2.0", + "mute-stream": "^1.0.0", + "run-async": "^3.0.0", + "signal-exit": "^4.1.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0" + }, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/@inquirer/core/node_modules/@types/node": { + "version": "20.14.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.8.tgz", + "integrity": "sha512-DO+2/jZinXfROG7j7WKFn/3C6nFwxy2lLpgLjEXJz+0XKphZlTLJ14mo8Vfg8X5BWN6XjyESXq+LcYdT7tR3bA==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@inquirer/core/node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@inquirer/core/node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "engines": { + "node": ">= 12" + } + }, + "node_modules/@inquirer/core/node_modules/mute-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", + "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@inquirer/core/node_modules/run-async": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", + "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/@inquirer/core/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@inquirer/core/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@inquirer/type": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-1.3.3.tgz", + "integrity": "sha512-xTUt0NulylX27/zMx04ZYar/kr1raaiFTVvQ5feljQsiAgdm0WPj4S73/ye0fbslh+15QrIuDvfCXTek7pMY5A==", + "engines": { + "node": ">=18" + } + }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -2857,7 +3161,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, + "devOptional": true, "engines": { "node": ">=6.0.0" } @@ -2885,7 +3189,7 @@ "version": "1.4.15", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true + "devOptional": true }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.25", @@ -2916,6 +3220,16 @@ "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.14.2.tgz", "integrity": "sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==" }, + "node_modules/@nestjs/axios": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@nestjs/axios/-/axios-3.0.2.tgz", + "integrity": "sha512-Z6GuOUdNQjP7FX+OuV2Ybyamse+/e0BFdTWBX5JxpBDKA+YkdLynDgG6HTF04zy6e9zPa19UX0WA2VDoehwhXQ==", + "peerDependencies": { + "@nestjs/common": "^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0", + "axios": "^1.3.1", + "rxjs": "^6.0.0 || ^7.0.0" + } + }, "node_modules/@nestjs/common": { "version": "10.3.7", "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-10.3.7.tgz", @@ -3155,6 +3469,36 @@ "uuid": "dist/bin/uuid" } }, + "node_modules/@noble/ciphers": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-0.5.3.tgz", + "integrity": "sha512-B0+6IIHiqEs3BPMT0hcRmHvEj2QHOLu+uwt+tqDDeVd0oyVzh7BPrDcPjRnV1PV/5LaknXJJQvOuRGR0zQJz+w==", + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/curves": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.0.tgz", + "integrity": "sha512-p+4cb332SFCrReJkCYe8Xzm0OWi4Jji5jVdIZRL/PmacmDkFNw6MrrV+gGpiPxLHbV+zKFRywUWbaseT+tZRXg==", + "dependencies": { + "@noble/hashes": "1.4.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/hashes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -3190,6 +3534,16 @@ "node": ">= 8" } }, + "node_modules/@nrwl/devkit": { + "version": "18.3.5", + "resolved": "https://registry.npmjs.org/@nrwl/devkit/-/devkit-18.3.5.tgz", + "integrity": "sha512-DIvChKMe4q8CtIsbrumL/aYgf85H5vlT6eF3jnCCWORj6LTwoHtK8Q9ky1+uM82KIM0gaKd32NVDw+w64scHyg==", + "dev": true, + "peer": true, + "dependencies": { + "@nx/devkit": "18.3.5" + } + }, "node_modules/@nrwl/eslint-plugin-nx": { "version": "19.3.1", "resolved": "https://registry.npmjs.org/@nrwl/eslint-plugin-nx/-/eslint-plugin-nx-19.3.1.tgz", @@ -3385,6 +3739,26 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, + "node_modules/@nx/devkit": { + "version": "18.3.5", + "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-18.3.5.tgz", + "integrity": "sha512-9I0L17t0MN87fL4m4MjDiBxJIx7h5RQY/pTYtt5TBjye0ANb165JeE4oh3ibzfjMzXv42Aej2Gm+cOuSPwzT9g==", + "dev": true, + "peer": true, + "dependencies": { + "@nrwl/devkit": "18.3.5", + "ejs": "^3.1.7", + "enquirer": "~2.3.6", + "ignore": "^5.0.4", + "semver": "^7.5.3", + "tmp": "~0.2.1", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + }, + "peerDependencies": { + "nx": ">= 16 <= 19" + } + }, "node_modules/@nx/eslint": { "version": "19.3.1", "resolved": "https://registry.npmjs.org/@nx/eslint/-/eslint-19.3.1.tgz", @@ -4507,6 +4881,16 @@ "tslib": "^2.4.0" } }, + "node_modules/@swc/types": { + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.9.tgz", + "integrity": "sha512-qKnCno++jzcJ4lM4NTfYifm1EFSCeIfKiAHAfkENZAV5Kl9PjJIyd2yeeVv6c/2CckuLyv2NmRC5pv6pm2WQBg==", + "dev": true, + "peer": true, + "dependencies": { + "@swc/counter": "^0.1.3" + } + }, "node_modules/@trysound/sax": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", @@ -4520,25 +4904,25 @@ "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", - "dev": true + "devOptional": true }, "node_modules/@tsconfig/node12": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true + "devOptional": true }, "node_modules/@tsconfig/node14": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true + "devOptional": true }, "node_modules/@tsconfig/node16": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true + "devOptional": true }, "node_modules/@types/babel__core": { "version": "7.20.5", @@ -4693,6 +5077,16 @@ "@types/node": "*" } }, + "node_modules/@types/inquirer": { + "version": "8.2.10", + "resolved": "https://registry.npmjs.org/@types/inquirer/-/inquirer-8.2.10.tgz", + "integrity": "sha512-IdD5NmHyVjWM8SHWo/kPBgtzXatwPkfwzyP3fN1jF2g9BWt5WO+8hL2F4o2GKIYsU40PpqeevuUWvkS/roXJkA==", + "peer": true, + "dependencies": { + "@types/through": "*", + "rxjs": "^7.2.0" + } + }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", @@ -4751,11 +5145,18 @@ "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", "dev": true }, + "node_modules/@types/mute-stream": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/@types/mute-stream/-/mute-stream-0.0.4.tgz", + "integrity": "sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/node": { "version": "18.16.20", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.20.tgz", - "integrity": "sha512-nL54VfDjThdP2UXJXZao5wp76CDiDw4zSRO8d4Tk7UgDqNKGKVEQB0/t3ti63NS+YNNkIQDvwEAF04BO+WYu7Q==", - "dev": true + "integrity": "sha512-nL54VfDjThdP2UXJXZao5wp76CDiDw4zSRO8d4Tk7UgDqNKGKVEQB0/t3ti63NS+YNNkIQDvwEAF04BO+WYu7Q==" }, "node_modules/@types/node-forge": { "version": "1.3.11", @@ -4841,11 +5242,30 @@ "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", "dev": true }, + "node_modules/@types/through": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/through/-/through-0.0.33.tgz", + "integrity": "sha512-HsJ+z3QuETzP3cswwtzt2vEIiHBk/dCcHGhbmG5X3ecnwFD/lPrMpliGXxSCg03L9AhrdwA4Oz/qfspkDW+xGQ==", + "peer": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/triple-beam": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", + "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==" + }, "node_modules/@types/validator": { "version": "13.11.9", "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.9.tgz", "integrity": "sha512-FCTsikRozryfayPuiI46QzH3fnrOoctTjvOYZkho9BTFLCOZ2rgZJHMOVgCOfttjPJcgOx52EpkY0CMfy87MIw==" }, + "node_modules/@types/wrap-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/wrap-ansi/-/wrap-ansi-3.0.0.tgz", + "integrity": "sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==" + }, "node_modules/@types/ws": { "version": "8.5.10", "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", @@ -5321,10 +5741,22 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "peer": true, + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" @@ -5337,7 +5769,7 @@ "version": "8.11.3", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", - "dev": true, + "devOptional": true, "bin": { "acorn": "bin/acorn" }, @@ -5367,7 +5799,7 @@ "version": "8.3.2", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", - "dev": true, + "devOptional": true, "engines": { "node": ">=0.4.0" } @@ -5385,7 +5817,6 @@ "version": "8.12.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -5401,7 +5832,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dev": true, "dependencies": { "ajv": "^8.0.0" }, @@ -5514,11 +5944,30 @@ "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==" }, + "node_modules/arch": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", + "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true + "devOptional": true }, "node_modules/argparse": { "version": "2.0.1", @@ -5662,14 +6111,39 @@ "node_modules/async": { "version": "3.2.5", "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", - "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", - "dev": true + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/atomic-sleep": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", + "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", + "peer": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/atomically": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/atomically/-/atomically-1.7.0.tgz", + "integrity": "sha512-Xcz9l0z7y9yQ9rdDaxlmaI4uJHf/T8g9hOEzJcsEqX2SjCj4J20uK7+ldkDHMbpJDK76wF7xEIgxc/vSlsfw5w==", + "engines": { + "node": ">=10.12.0" + } + }, "node_modules/autoprefixer": { "version": "10.4.19", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz", @@ -6502,6 +6976,15 @@ "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", "dev": true }, + "node_modules/color": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", + "dependencies": { + "color-convert": "^1.9.3", + "color-string": "^1.6.0" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -6518,6 +7001,28 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/color/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, "node_modules/colord": { "version": "2.9.3", "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", @@ -6530,6 +7035,15 @@ "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "dev": true }, + "node_modules/colorspace": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", + "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", + "dependencies": { + "color": "^3.1.3", + "text-hex": "1.0.x" + } + }, "node_modules/columnify": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/columnify/-/columnify-1.6.0.tgz", @@ -6692,6 +7206,29 @@ "safe-buffer": "~5.1.0" } }, + "node_modules/conf": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/conf/-/conf-10.2.0.tgz", + "integrity": "sha512-8fLl9F04EJqjSqH+QjITQfJF8BrOVaYr1jewVgSRAEWePfxT0sku4w2hrGQ60BC/TNLGQ2pgxNlTbWQmMPFvXg==", + "dependencies": { + "ajv": "^8.6.3", + "ajv-formats": "^2.1.1", + "atomically": "^1.7.0", + "debounce-fn": "^4.0.0", + "dot-prop": "^6.0.1", + "env-paths": "^2.2.1", + "json-schema-typed": "^7.0.3", + "onetime": "^5.1.2", + "pkg-up": "^3.1.0", + "semver": "^7.3.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/confusing-browser-globals": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", @@ -6922,7 +7459,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true + "devOptional": true }, "node_modules/cross-spawn": { "version": "7.0.3", @@ -7196,6 +7733,11 @@ "integrity": "sha512-JiQosUWiOFgp4hQn0an+SBoV9IKdqzhROM0iiN4LB7UpfJBlsSJlWl9nq4zGgxgMAzHJ6V4t29VAVD+3+2NJAg==", "dev": true }, + "node_modules/cuint": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz", + "integrity": "sha512-d4ZVpCW31eWwCMe1YT3ur7mUDnTXbgwyzaL320DrcRT45rfjYxkt5QWLrmOJ+/UEAI2+fQgKe/fCjR8l4TpRgw==" + }, "node_modules/data-view-buffer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", @@ -7252,6 +7794,28 @@ "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==" }, + "node_modules/debounce-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/debounce-fn/-/debounce-fn-4.0.0.tgz", + "integrity": "sha512-8pYCQiL9Xdcg0UPSD3d+0KMlOjp+KGU5EPwYddgzQ7DATsg4fuUDjQtsYLmWjnk2obnNHgV3vE2Y4jejSOJVBQ==", + "dependencies": { + "mimic-fn": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/debounce-fn/node_modules/mimic-fn": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz", + "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==", + "engines": { + "node": ">=8" + } + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -7345,7 +7909,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "dev": true, "engines": { "node": ">=8" } @@ -7425,7 +7988,7 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, + "devOptional": true, "engines": { "node": ">=0.3.1" } @@ -7530,6 +8093,20 @@ "url": "https://github.com/fb55/domutils?sponsor=1" } }, + "node_modules/dot-prop": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", + "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/dotenv": { "version": "16.4.5", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", @@ -7560,6 +8137,19 @@ "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" }, + "node_modules/eciesjs": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/eciesjs/-/eciesjs-0.4.7.tgz", + "integrity": "sha512-4JQahOkBdDy27jjW4q3FJQigHlcwZXx28sCtBQkBamF2XUdcNXrInpgrr8h205MtVIS0CMHufyIKGVjtjxQ2ZA==", + "dependencies": { + "@noble/ciphers": "^0.5.3", + "@noble/curves": "^1.4.0", + "@noble/hashes": "^1.4.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -7612,6 +8202,11 @@ "node": ">= 4" } }, + "node_modules/enabled": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", + "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==" + }, "node_modules/encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", @@ -7666,6 +8261,14 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "engines": { + "node": ">=6" + } + }, "node_modules/envinfo": { "version": "7.11.1", "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.11.1.tgz", @@ -8335,6 +8938,15 @@ "node": ">= 0.6" } }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "peer": true, + "engines": { + "node": ">=6" + } + }, "node_modules/eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", @@ -8345,7 +8957,6 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, "engines": { "node": ">=0.8.x" } @@ -8354,7 +8965,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", @@ -8484,8 +9094,7 @@ "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "node_modules/fast-glob": { "version": "3.2.7", @@ -8515,6 +9124,15 @@ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, + "node_modules/fast-redact": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.5.0.tgz", + "integrity": "sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==", + "peer": true, + "engines": { + "node": ">=6" + } + }, "node_modules/fast-safe-stringify": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", @@ -8559,6 +9177,11 @@ "bser": "2.1.1" } }, + "node_modules/fecha": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", + "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==" + }, "node_modules/figures": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", @@ -8677,6 +9300,15 @@ "node": ">=8" } }, + "node_modules/find-yarn-workspace-root": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz", + "integrity": "sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==", + "dev": true, + "dependencies": { + "micromatch": "^4.0.2" + } + }, "node_modules/flat": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", @@ -8706,6 +9338,11 @@ "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", "dev": true }, + "node_modules/fn.name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", + "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" + }, "node_modules/follow-redirects": { "version": "1.15.6", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", @@ -9081,7 +9718,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, "engines": { "node": ">=10" }, @@ -9577,7 +10213,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, "engines": { "node": ">=10.17.0" } @@ -9640,7 +10275,6 @@ "version": "5.3.1", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", - "dev": true, "engines": { "node": ">= 4" } @@ -9944,7 +10578,6 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, "bin": { "is-docker": "cli.js" }, @@ -10037,6 +10670,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "engines": { + "node": ">=8" + } + }, "node_modules/is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", @@ -10105,7 +10746,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, "engines": { "node": ">=8" }, @@ -10191,7 +10831,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, "dependencies": { "is-docker": "^2.0.0" }, @@ -10974,8 +11613,30 @@ "node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/json-schema-typed": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-7.0.3.tgz", + "integrity": "sha512-7DE8mpG+/fVw+dTpjbxnx47TaMnDfOI1jwft9g1VybltZCduyRQPJPvc+zzKY9WPHxhPWczyFuYa6I8Mw4iU5A==" + }, + "node_modules/json-stable-stringify": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.1.1.tgz", + "integrity": "sha512-SU/971Kt5qVQfJpyDveVhQ/vya+5hvrjClFOcr8c0Fq5aODJjMwutrOfCU+eCnVD5gpx1Q3fEqkyom77zH1iIg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "isarray": "^2.0.5", + "jsonify": "^0.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", @@ -10983,6 +11644,12 @@ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, + "node_modules/json-stable-stringify/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -11031,6 +11698,15 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/jsonify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz", + "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -11049,6 +11725,15 @@ "node": ">=0.10.0" } }, + "node_modules/klaw-sync": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz", + "integrity": "sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.11" + } + }, "node_modules/kleur": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", @@ -11067,6 +11752,11 @@ "node": ">= 8" } }, + "node_modules/kuler": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", + "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" + }, "node_modules/launch-editor": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.1.tgz", @@ -11301,6 +11991,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/logform": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.6.0.tgz", + "integrity": "sha512-1ulHeNPp6k/LD8H91o7VYFBng5i1BDE7HoKxVbZiGFidS1Rj65qcywLxX+pVfAPoQJEjRdvKcusKwOupHCVOVQ==", + "dependencies": { + "@colors/colors": "1.6.0", + "@types/triple-beam": "^1.3.2", + "fecha": "^4.2.0", + "ms": "^2.1.1", + "safe-stable-stringify": "^2.3.1", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -11341,7 +12047,7 @@ "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true + "devOptional": true }, "node_modules/makeerror": { "version": "1.0.12", @@ -11386,8 +12092,7 @@ "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" }, "node_modules/merge2": { "version": "1.4.1", @@ -11505,9 +12210,9 @@ } }, "node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "engines": { "node": ">=16 || 14 >=14.17" } @@ -11818,7 +12523,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, "dependencies": { "path-key": "^3.0.0" }, @@ -11946,6 +12650,14 @@ "node": ">= 0.4" } }, + "node_modules/object-treeify": { + "version": "1.1.33", + "resolved": "https://registry.npmjs.org/object-treeify/-/object-treeify-1.1.33.tgz", + "integrity": "sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A==", + "engines": { + "node": ">= 10" + } + }, "node_modules/object.assign": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", @@ -12019,6 +12731,15 @@ "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", "dev": true }, + "node_modules/on-exit-leak-free": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", + "integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==", + "peer": true, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", @@ -12048,6 +12769,14 @@ "wrappy": "1" } }, + "node_modules/one-time": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", + "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", + "dependencies": { + "fn.name": "1.x.x" + } + }, "node_modules/onetime": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", @@ -12066,7 +12795,6 @@ "version": "8.4.2", "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", - "dev": true, "dependencies": { "define-lazy-prop": "^2.0.0", "is-docker": "^2.1.1", @@ -12194,11 +12922,15 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, "engines": { "node": ">=6" } }, + "node_modules/package-json-from-dist": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", + "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==" + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -12268,6 +13000,113 @@ "node": ">= 0.8" } }, + "node_modules/patch-package": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/patch-package/-/patch-package-8.0.0.tgz", + "integrity": "sha512-da8BVIhzjtgScwDJ2TtKsfT5JFWz1hYoBl9rUQ1f38MC2HwnEIkK8VN3dKMKcP7P7bvvgzNDbfNHtx3MsQb5vA==", + "dev": true, + "dependencies": { + "@yarnpkg/lockfile": "^1.1.0", + "chalk": "^4.1.2", + "ci-info": "^3.7.0", + "cross-spawn": "^7.0.3", + "find-yarn-workspace-root": "^2.0.0", + "fs-extra": "^9.0.0", + "json-stable-stringify": "^1.0.2", + "klaw-sync": "^6.0.0", + "minimist": "^1.2.6", + "open": "^7.4.2", + "rimraf": "^2.6.3", + "semver": "^7.5.3", + "slash": "^2.0.0", + "tmp": "^0.0.33", + "yaml": "^2.2.2" + }, + "bin": { + "patch-package": "index.js" + }, + "engines": { + "node": ">=14", + "npm": ">5" + } + }, + "node_modules/patch-package/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/patch-package/node_modules/open": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/patch-package/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/patch-package/node_modules/slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/patch-package/node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/patch-package/node_modules/yaml": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.5.tgz", + "integrity": "sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg==", + "dev": true, + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -12301,15 +13140,15 @@ "dev": true }, "node_modules/path-scurry": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.2.tgz", - "integrity": "sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=16 || 14 >=14.18" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -12443,6 +13282,96 @@ "node": ">=0.10.0" } }, + "node_modules/pino": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/pino/-/pino-8.21.0.tgz", + "integrity": "sha512-ip4qdzjkAyDDZklUaZkcRFb2iA118H9SgRh8yzTkSQK8HilsOJF7rSY8HoW5+I0M46AZgX/pxbprf2vvzQCE0Q==", + "peer": true, + "dependencies": { + "atomic-sleep": "^1.0.0", + "fast-redact": "^3.1.1", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "^1.2.0", + "pino-std-serializers": "^6.0.0", + "process-warning": "^3.0.0", + "quick-format-unescaped": "^4.0.3", + "real-require": "^0.2.0", + "safe-stable-stringify": "^2.3.1", + "sonic-boom": "^3.7.0", + "thread-stream": "^2.6.0" + }, + "bin": { + "pino": "bin.js" + } + }, + "node_modules/pino-abstract-transport": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.2.0.tgz", + "integrity": "sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q==", + "peer": true, + "dependencies": { + "readable-stream": "^4.0.0", + "split2": "^4.0.0" + } + }, + "node_modules/pino-abstract-transport/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "peer": true, + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/pino-abstract-transport/node_modules/readable-stream": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", + "peer": true, + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/pino-http": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/pino-http/-/pino-http-9.0.0.tgz", + "integrity": "sha512-Q9QDNEz0vQmbJtMFjOVr2c9yL92vHudjmr3s3m6J1hbw3DBGFZJm3TIj9TWyynZ4GEsEA9SOtni4heRUr6lNOg==", + "peer": true, + "dependencies": { + "get-caller-file": "^2.0.5", + "pino": "^8.17.1", + "pino-std-serializers": "^6.2.2", + "process-warning": "^3.0.0" + } + }, + "node_modules/pino-std-serializers": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-6.2.2.tgz", + "integrity": "sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==", + "peer": true + }, "node_modules/pirates": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", @@ -12549,6 +13478,73 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-up/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-up/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "engines": { + "node": ">=4" + } + }, "node_modules/pluralize": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", @@ -13245,11 +14241,26 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "peer": true, + "engines": { + "node": ">= 0.6.0" + } + }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, + "node_modules/process-warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-3.0.0.tgz", + "integrity": "sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==", + "peer": true + }, "node_modules/prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", @@ -13291,7 +14302,6 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, "engines": { "node": ">=6" } @@ -13346,6 +14356,12 @@ } ] }, + "node_modules/quick-format-unescaped": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", + "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==", + "peer": true + }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -13417,6 +14433,15 @@ "node": ">=8.10.0" } }, + "node_modules/real-require": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", + "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==", + "peer": true, + "engines": { + "node": ">= 12.13.0" + } + }, "node_modules/rechoir": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", @@ -13544,7 +14569,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -13755,6 +14779,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/safe-stable-stringify": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", + "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", + "engines": { + "node": ">=10" + } + }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -13870,7 +14902,6 @@ "version": "7.6.0", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dev": true, "dependencies": { "lru-cache": "^6.0.0" }, @@ -13885,7 +14916,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, "dependencies": { "yallist": "^4.0.0" }, @@ -13896,8 +14926,7 @@ "node_modules/semver/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/send": { "version": "0.18.0", @@ -14151,6 +15180,19 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/simple-swizzle/node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + }, "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", @@ -14177,6 +15219,15 @@ "websocket-driver": "^0.7.4" } }, + "node_modules/sonic-boom": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-3.8.1.tgz", + "integrity": "sha512-y4Z8LCDBuum+PBP3lSV7RHrXscqksve/bi0as7mhwVnBW+/wUqKT/2Kb7um8yqcFy0duYbbPxzt89Zy2nOCaxg==", + "peer": true, + "dependencies": { + "atomic-sleep": "^1.0.0" + } + }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -14281,6 +15332,14 @@ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true }, + "node_modules/stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", + "engines": { + "node": "*" + } + }, "node_modules/stack-utils": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", @@ -14451,7 +15510,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, "engines": { "node": ">=6" } @@ -14851,6 +15909,11 @@ "node": "*" } }, + "node_modules/text-hex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", + "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" + }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -14876,6 +15939,15 @@ "node": ">=0.8" } }, + "node_modules/thread-stream": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-2.7.0.tgz", + "integrity": "sha512-qQiRWsU/wvNolI6tbbCKd9iKaTnCXsTwVxhhKM6nctPdujTyztjlbUkUTUymidWcMnZ5pWR0ej4a0tjsW021vw==", + "peer": true, + "dependencies": { + "real-require": "^0.2.0" + } + }, "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -14936,6 +16008,14 @@ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, + "node_modules/triple-beam": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", + "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", + "engines": { + "node": ">= 14.0.0" + } + }, "node_modules/ts-api-utils": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", @@ -15024,7 +16104,7 @@ "version": "10.9.1", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "dev": true, + "devOptional": true, "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", @@ -15408,7 +16488,7 @@ "version": "5.4.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.3.tgz", "integrity": "sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg==", - "dev": true, + "devOptional": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -15456,6 +16536,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/undici": { + "version": "5.28.4", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz", + "integrity": "sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==", + "dependencies": { + "@fastify/busboy": "^2.0.0" + }, + "engines": { + "node": ">=14.0" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", @@ -15559,7 +16655,6 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, "dependencies": { "punycode": "^2.1.0" } @@ -15596,7 +16691,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true + "devOptional": true }, "node_modules/v8-to-istanbul": { "version": "9.2.0", @@ -16111,6 +17206,40 @@ "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", "dev": true }, + "node_modules/winston": { + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.13.0.tgz", + "integrity": "sha512-rwidmA1w3SE4j0E5MuIufFhyJPBDG7Nu71RkZor1p2+qHvJSZ9GYDA81AyleQcZbh/+V6HjeBdfnTZJm9rSeQQ==", + "dependencies": { + "@colors/colors": "^1.6.0", + "@dabh/diagnostics": "^2.0.2", + "async": "^3.2.3", + "is-stream": "^2.0.0", + "logform": "^2.4.0", + "one-time": "^1.0.0", + "readable-stream": "^3.4.0", + "safe-stable-stringify": "^2.3.1", + "stack-trace": "0.0.x", + "triple-beam": "^1.3.0", + "winston-transport": "^4.7.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/winston-transport": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.7.0.tgz", + "integrity": "sha512-ajBj65K5I7denzer2IYW6+2bNIVqLGDHqDw3Ow8Ohh+vdW+rv4MZ6eiDvHoKhfJFZ2auyN8byXieDDJ96ViONg==", + "dependencies": { + "logform": "^2.3.2", + "readable-stream": "^3.6.0", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, "node_modules/wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", @@ -16198,6 +17327,14 @@ "node": ">=0.4" } }, + "node_modules/xxhashjs": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/xxhashjs/-/xxhashjs-0.2.2.tgz", + "integrity": "sha512-AkTuIuVTET12tpsVIQo+ZU6f/qDmKuRUcjaqR+OIvm+aCBsZ95i7UVY5WJ9TMsSaZ0DA2WxoZ4acu0sPH+OKAw==", + "dependencies": { + "cuint": "^0.2.2" + } + }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -16250,7 +17387,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, + "devOptional": true, "engines": { "node": ">=6" } diff --git a/package.json b/package.json index e37c1ab..157c9b6 100644 --- a/package.json +++ b/package.json @@ -3,25 +3,29 @@ "version": "0.0.0", "license": "MIT", "scripts": { - "ory:generate:kratos": "ts-node --project tools/tsconfig.json tools/ory/generate-config.ts kratos -e .env", - "ory:generate:keto": "ts-node --project tools/tsconfig.json tools/ory/generate-config.ts keto -e .env", - "ory:generate:network": "ts-node --project tools/tsconfig.json tools/ory/generate-config.ts network -e .env.staging", - "ory:generate": "npm run ory:generate:kratos && npm run ory:generate:keto && npm run ory:generate:network", + "pg:create:connection": "ts-node --project tools/tsconfig.json tools/pg/connection.ts create", + "ory:generate:kratos": "ts-node --project tools/tsconfig.json tools/ory/generate-config.ts kratos", + "ory:generate:keto": "ts-node --project tools/tsconfig.json tools/ory/generate-config.ts keto", + "ory:generate:network": "ts-node --project tools/tsconfig.json tools/ory/generate-config.ts network", + "ory:generate": "npm run ory:generate:kratos -- -e .env && npm run ory:generate:keto -- -e .env && npm run ory:generate:network -- -e .env.staging", "ory:update:network": "ts-node --project tools/tsconfig.json tools/ory/update-network-config.ts network -e .env.staging", - "docker:dev:up": "docker compose -p cat-fostering --env-file .env up -d", - "docker:dev:down": "docker compose -p cat-fostering --env-file .env down", - "docker:dev:log": "docker compose -p cat-fostering logs -f --tail=100", - "docker:dev:clean": "docker compose -p cat-fostering down -v --rmi all", + "docker:dev:up": "docker compose --profile dev -p cat-fostering --env-file .env up -d", + "docker:dev:down": "docker compose --profile dev -p cat-fostering --env-file .env down", + "docker:dev:log": "docker compose --profile dev -p cat-fostering logs -f --tail=100", + "docker:dev:clean": "docker compose --profile dev -p cat-fostering down -v --rmi all", "docker:caddy:build": "docker buildx build infra/caddy -f infra/caddy/Dockerfile -t ghcr.io/getlarge/cat-fostering/caddy --load", - "docker:caddy:push": "docker buildx build infra/caddy -f infra/caddy/Dockerfile --platform linux/amd64,linux/arm64 -t ghcr.io/getlarge/cat-fostering/caddy --push" + "docker:caddy:push": "docker buildx build infra/caddy -f infra/caddy/Dockerfile --platform linux/amd64,linux/arm64 -t ghcr.io/getlarge/cat-fostering/caddy --push", + "postinstall": "patch-package" }, "private": true, "dependencies": { + "@dotenvx/dotenvx": "1.0.0", "@getlarge/keto-cli": "^0.2.2", "@getlarge/keto-client-wrapper": "^0.2.5", "@getlarge/keto-relations-parser": "^0.0.9", "@getlarge/kratos-cli": "^0.2.1", "@getlarge/kratos-client-wrapper": "^0.1.8", + "@nestjs/axios": "^3.0.2", "@nestjs/common": "^10.0.2", "@nestjs/config": "^3.2.1", "@nestjs/core": "^10.0.2", @@ -37,7 +41,7 @@ "pg": "^8.11.5", "reflect-metadata": "^0.1.13", "rxjs": "^7.8.0", - "tslib": "^2.3.0", + "tslib": "^2.6.0", "typeorm": "^0.3.20" }, "devDependencies": { @@ -67,6 +71,7 @@ "jest": "^29.4.1", "jest-environment-node": "^29.4.1", "nx": "19.3.1", + "patch-package": "^8.0.0", "prettier": "^2.6.2", "ts-jest": "^29.1.0", "ts-node": "10.9.1", diff --git a/patches/@getlarge+kratos-cli+0.2.1.patch b/patches/@getlarge+kratos-cli+0.2.1.patch new file mode 100644 index 0000000..1b1c033 --- /dev/null +++ b/patches/@getlarge+kratos-cli+0.2.1.patch @@ -0,0 +1,46 @@ +diff --git a/node_modules/@getlarge/kratos-cli/src/app/login.command.js b/node_modules/@getlarge/kratos-cli/src/app/login.command.js +index b1c9284..9b72ea4 100644 +--- a/node_modules/@getlarge/kratos-cli/src/app/login.command.js ++++ b/node_modules/@getlarge/kratos-cli/src/app/login.command.js +@@ -8,6 +8,8 @@ const common_1 = require("@nestjs/common"); + const client_1 = require("@ory/client"); + const class_validator_1 = require("class-validator"); + const nest_commander_1 = require("nest-commander"); ++const util = require("util"); ++ + let LoginQuestions = class LoginQuestions { + parsePassword(val) { + if (!val) { +@@ -60,6 +62,9 @@ let LoginCommand = LoginCommand_1 = class LoginCommand extends nest_commander_1. + identifier: email, + password, + }, ++ }).catch((err) => { ++ console.error(util.inspect(err?.error?.response?.data ?? err, false, null, true)); ++ throw err; + }); + this.logger.debug('checking session token:', sessionToken); + const { data } = await this.oryFrontendService.toSession({ +diff --git a/node_modules/@getlarge/kratos-cli/src/app/registration.command.js b/node_modules/@getlarge/kratos-cli/src/app/registration.command.js +index 385648f..71c2c98 100644 +--- a/node_modules/@getlarge/kratos-cli/src/app/registration.command.js ++++ b/node_modules/@getlarge/kratos-cli/src/app/registration.command.js +@@ -8,6 +8,7 @@ const common_1 = require("@nestjs/common"); + const client_1 = require("@ory/client"); + const class_validator_1 = require("class-validator"); + const nest_commander_1 = require("nest-commander"); ++const util = require("util"); + let RegistrationQuestions = class RegistrationQuestions { + parsePassword(val) { + if (!val) { +@@ -60,6 +61,10 @@ let RegistrationCommand = RegistrationCommand_1 = class RegistrationCommand exte + password, + method: 'password', + }, ++ }).catch((err) => { ++ // this.logger.warn(err.message, util.inspect(err?.error?.response?.data ?? err, false, null, true)); ++ console.error(util.inspect(err?.error?.response?.data ?? err, false, null, true)); ++ throw err; + }); + this.logger.debug(`Registered with email: ${email} and identity.id: ${data.identity.id}`); + console.log(JSON.stringify({ diff --git a/tools/ory/generate-config.ts b/tools/ory/generate-config.ts index 44ff902..71545b9 100644 --- a/tools/ory/generate-config.ts +++ b/tools/ory/generate-config.ts @@ -1,9 +1,10 @@ -import yargs from 'yargs'; import { generateOryKratosConfig, generateOryKetoConfig, generateOryNetworkConfig, -} from './helpers'; +} from '@cat-fostering/ory-config-generators'; +import { resolve } from 'node:path'; +import yargs from 'yargs'; interface BaseOptions { envFile?: string; @@ -30,8 +31,7 @@ async function main() { } > ) => { - const { envFile } = argv; - generateOryKratosConfig(envFile); + generateOryKratosConfig(resolve(argv.envFile)); }, }) .command({ @@ -44,8 +44,7 @@ async function main() { } > ) => { - const { envFile } = argv; - generateOryKetoConfig(envFile); + generateOryKetoConfig(resolve(argv.envFile)); }, }) .command({ @@ -58,7 +57,7 @@ async function main() { } > ) => { - generateOryNetworkConfig(argv.envFile); + generateOryNetworkConfig(resolve(argv.envFile)); }, }) .demandCommand(1, 'A valid command must be provided') diff --git a/tools/ory/update-network-config.ts b/tools/ory/update-network-config.ts index 83589bc..851ef20 100644 --- a/tools/ory/update-network-config.ts +++ b/tools/ory/update-network-config.ts @@ -1,5 +1,5 @@ +import { updateOryNetworkConfig } from '@cat-fostering/ory-config-generators'; import { parseArgs } from 'node:util'; -import { updateOryNetworkConfig } from './helpers'; const options = { envFile: { diff --git a/tools/pg/connection.ts b/tools/pg/connection.ts new file mode 100644 index 0000000..55cc8c7 --- /dev/null +++ b/tools/pg/connection.ts @@ -0,0 +1,60 @@ +/** + * this is a workaround since the TS environment is not yet loaded in the global setup hook + * @see https://stackoverflow.com/questions/48318230/configure-jest-global-tests-setup-with-ts-file + **/ +// import * as tsConfigPaths from 'tsconfig-paths'; +// tsConfigPaths.register({ +// baseUrl: './', +// paths: { +// '@cat-fostering/entities': ['libs/shared/entities/src/index.ts'], +// '@cat-fostering/pg-config': ['libs/pg-config/src/index.ts'], +// }, +// }); + +import { createTestConnection } from '@cat-fostering/pg-config'; +import { resolve } from 'node:path'; +import yargs from 'yargs'; + +interface BaseOptions { + envFile?: string; +} + +async function main() { + await yargs(process.argv.slice(2)) + .options({ + envFile: { + description: 'Path to .env file', + demandOption: false, + example: '.env', + alias: 'e', + type: 'string', + }, + }) + .command({ + command: 'create', + describe: 'Command to create a PG connection', + handler: async ( + argv: yargs.ArgumentsCamelCase< + BaseOptions & { + _: ['create']; + } + > + ) => { + await createTestConnection(resolve(argv.envFile)); + }, + }) + .demandCommand(1, 'A valid command must be provided') + .fail((msg, err) => { + if (err) throw err; + throw new Error(msg); + }).argv; +} + +main() + .then(() => { + process.exit(0); + }) + .catch((err) => { + console.error(err); + process.exit(1); + }); diff --git a/tsconfig.base.json b/tsconfig.base.json index b01973e..c0780ea 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -25,8 +25,14 @@ "@cat-fostering/nestjs-user-module": [ "libs/user/nestjs-module/src/index.ts" ], - "@cat-fostering/nestjs-utils": ["libs/shared/nestjs-utils/src/index.ts"] - } + "@cat-fostering/nestjs-utils": ["libs/shared/nestjs-utils/src/index.ts"], + "@cat-fostering/ory-config-generators": [ + "libs/ory-config-generators/src/index.ts" + ], + "@cat-fostering/pg-config": ["libs/pg-config/src/index.ts"] + }, + "typeRoots": ["node_modules/@types", "types"], + "types": ["@dotenvx/dotenvx"] }, "exclude": ["node_modules", "tmp"] } diff --git a/types/@dotenvx/dotenvx/index.d.ts b/types/@dotenvx/dotenvx/index.d.ts new file mode 100644 index 0000000..10e4156 --- /dev/null +++ b/types/@dotenvx/dotenvx/index.d.ts @@ -0,0 +1,17 @@ +declare module '@dotenvx/dotenvx' { + type DotenvxConfig = { + DOTENV_KEY?: string; + overload?: boolean; + override?: boolean; + convention?: boolean; + path?: string; + processEnv?: Record; + }; + + type DotenvxResult = { + parsed: Record; + error?: Error & { message?: string; code?: string; help?: string }; + }; + + export function config(options?: DotenvxConfig): DotenvxResult; +}