diff --git a/back/Insomnia4.json b/back/Insomnia4.json new file mode 100644 index 0000000..07749d3 --- /dev/null +++ b/back/Insomnia4.json @@ -0,0 +1 @@ +{"_type":"export","__export_format":4,"__export_date":"2023-09-23T09:15:41.007Z","__export_source":"insomnia.desktop.app:v2023.5.8","resources":[{"_id":"req_54139b7550f643b6845c1e051a602807","parentId":"wrk_cf1f617499f54fd2b42f9875c942610d","modified":1692768329669,"created":1673005787757,"url":"{{base_url}}/posts","name":"文章分页列表","description":"","method":"GET","body":{},"parameters":[{"id":"pair_a9c03e97e1cb404fa4502f1db7b84188","name":"page","value":"1","description":""},{"id":"pair_13e90b118d0044239ea632ef7b89c541","name":"limit","value":"3","description":"","disabled":false},{"id":"pair_909eeb5e367e4c84bfc9c1ca521a229a","name":"orderBy","value":"custom","description":"","disabled":false},{"id":"pair_16d24f39e4e8465f9d4e7047d8260455","name":"isPublished","value":"false","description":"","disabled":true}],"headers":[],"authentication":{},"metaSortKey":-1673006024968,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"wrk_cf1f617499f54fd2b42f9875c942610d","parentId":null,"modified":1695460454680,"created":1692767531537,"name":"nestapp-4","description":"","scope":"collection","_type":"workspace"},{"_id":"req_b2ca3725cf924206ae265fe04aed466e","parentId":"wrk_cf1f617499f54fd2b42f9875c942610d","modified":1695460410755,"created":1673122921310,"url":"{{base_url}}/posts/2065c805-1a6b-4e81-9dd4-80f457334b26","name":"文章详情","description":"","method":"GET","body":{},"parameters":[],"headers":[],"authentication":{},"metaSortKey":-1673006024955.5,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_54208d3f295d4bf7a6ebb6837197d409","parentId":"wrk_cf1f617499f54fd2b42f9875c942610d","modified":1695460385905,"created":1673005854149,"url":"{{base_url}}/posts","name":"新增文章","description":"","method":"POST","body":{"mimeType":"application/json","text":"{\n\t\"title\": \"测试文章7\",\n\t\"body\": \"这是第7篇文章\"\n}"},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json"}],"authentication":{},"metaSortKey":-1673006024943,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_c38a22de0a384cd8a98891de582c30f8","parentId":"wrk_cf1f617499f54fd2b42f9875c942610d","modified":1695460418492,"created":1673006024918,"url":"{{base_url}}/posts","name":"更新文章","description":"","method":"PATCH","body":{"mimeType":"application/json","text":"{\n\t\"id\": \"2065c805-1a6b-4e81-9dd4-80f457334b26\",\n\t\"customOrder\": 1,\n\t\"publishedAt\": \"{% customTimestamp 'specific', '', '', '', '', '', '', '', 'iso-8601', '', '' %}\"\n}"},"parameters":[],"headers":[{"id":"pair_d70cc4fe9f534354a3617ff43378bfdd","name":"Content-Type","value":"application/json","description":""}],"authentication":{},"metaSortKey":-1673006024918,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_39bc515120874ad6a5e0c9eb5a88479c","parentId":"wrk_cf1f617499f54fd2b42f9875c942610d","modified":1695460431300,"created":1673006224369,"url":"{{base_url}}/posts/2065c805-1a6b-4e81-9dd4-80f457334b26","name":"删除文章","description":"","method":"DELETE","body":{},"parameters":[],"headers":[],"authentication":{},"metaSortKey":-1673006024868,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"env_b7e12d26efb6436f9f989e6a7eeb8bec","parentId":"wrk_cf1f617499f54fd2b42f9875c942610d","modified":1673005797444,"created":1673005758611,"name":"Base Environment","data":{},"dataPropertyOrder":{},"color":null,"isPrivate":false,"metaSortKey":1673005758611,"_type":"environment"},{"_id":"jar_8716af200d694ecf9bdf74803381db0c","parentId":"wrk_cf1f617499f54fd2b42f9875c942610d","modified":1673005758611,"created":1673005758611,"name":"Default Jar","cookies":[],"_type":"cookie_jar"},{"_id":"env_5e79c99a87e54a9f915296ecb8c05856","parentId":"env_b7e12d26efb6436f9f989e6a7eeb8bec","modified":1692767608192,"created":1673005798804,"name":"dev","data":{"host":"127.0.0.1:3100","base_url":"{{host}}/api"},"dataPropertyOrder":{"&":["host","base_url"]},"color":null,"isPrivate":false,"metaSortKey":1673005798804,"_type":"environment"}]} \ No newline at end of file diff --git a/back/Insomnia6.json b/back/Insomnia6.json new file mode 100644 index 0000000..821e553 --- /dev/null +++ b/back/Insomnia6.json @@ -0,0 +1 @@ +{"_type":"export","__export_format":4,"__export_date":"2023-09-23T12:34:41.959Z","__export_source":"insomnia.desktop.app:v2023.5.8","resources":[{"_id":"req_938a6d6b28784e0194c7db672e37496c","parentId":"fld_b54e9ea87f0f4bc3818e1edde896fa4a","modified":1693667895265,"created":1693667879202,"url":"{{base_url}}/categories/tree","name":"分类树","description":"","method":"GET","body":{},"parameters":[],"headers":[{"name":"User-Agent","value":"Insomnia/2023.5.7"}],"authentication":{},"metaSortKey":-1693667879202,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"fld_b54e9ea87f0f4bc3818e1edde896fa4a","parentId":"wrk_b0358dfa7c9045d8bf906cba6065b2aa","modified":1693667315491,"created":1693667293589,"name":"分类","description":"","environment":{},"environmentPropertyOrder":null,"metaSortKey":-1693667307806,"_type":"request_group"},{"_id":"wrk_b0358dfa7c9045d8bf906cba6065b2aa","parentId":null,"modified":1695466678119,"created":1695466664800,"name":"nestapp-6","description":"","scope":"collection","_type":"workspace"},{"_id":"req_d1563eca2de34b7994832b30dc0e6661","parentId":"fld_b54e9ea87f0f4bc3818e1edde896fa4a","modified":1693667779586,"created":1693667464847,"url":"{{base_url}}/categories","name":"分类列表","description":"","method":"GET","body":{},"parameters":[],"headers":[{"name":"User-Agent","value":"Insomnia/2023.5.7"}],"authentication":{},"metaSortKey":-1693667382196.5,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_45b8fd294bc240c5a3662e3191f8f5e9","parentId":"fld_b54e9ea87f0f4bc3818e1edde896fa4a","modified":1695467127021,"created":1693667378546,"url":"{{base_url}}/categories/59247c53-ee43-4cdf-8b2f-0a7cda443116","name":"分类信息","description":"","method":"GET","body":{},"parameters":[],"headers":[{"name":"User-Agent","value":"Insomnia/2023.5.7"}],"authentication":{},"metaSortKey":-1693667378546,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_435c7b2a45ee46879c70b659138c717e","parentId":"fld_b54e9ea87f0f4bc3818e1edde896fa4a","modified":1695467971880,"created":1693667366545,"url":"{{base_url}}/categories","name":"添加分类","description":"","method":"POST","body":{"mimeType":"application/json","text":"{\n\t\"name\": \"react\"\n}"},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json"},{"name":"User-Agent","value":"Insomnia/2023.5.7"}],"authentication":{},"metaSortKey":-1693667366545,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_c8c1f72e00e34bb6bb00f5954bda5a97","parentId":"fld_b54e9ea87f0f4bc3818e1edde896fa4a","modified":1695468002901,"created":1693667380146,"url":"{{base_url}}/categories","name":"更新分类","description":"","method":"PATCH","body":{"mimeType":"application/json","text":"{\n\t\"id\": \"0b8e8ff6-c376-4192-b0d2-9b82ccfc0f89\",\n\t\"parent\": \"d72f1ff5-1a0b-49ba-b0fe-41a5d56ac389\",\n\t\"customOrder\": 1\n}"},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json"},{"name":"User-Agent","value":"Insomnia/2023.5.7"}],"authentication":{},"metaSortKey":-1693667366445,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_3797d0de28554bc1bb14e50ec8ca9286","parentId":"fld_b54e9ea87f0f4bc3818e1edde896fa4a","modified":1695467245166,"created":1693667441395,"url":"{{base_url}}/categories/59247c53-ee43-4cdf-8b2f-0a7cda443116","name":"删除分类","description":"","method":"DELETE","body":{},"parameters":[],"headers":[{"name":"User-Agent","value":"Insomnia/2023.5.7"}],"authentication":{},"metaSortKey":-1693667366345,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_4b4b97873b904351b11e25cdcd76e984","parentId":"fld_fe76024bf7e3464d80efac032f5b134c","modified":1695466723970,"created":1693667385847,"url":"{{base_url}}/tags","name":"标签列表","description":"","method":"GET","body":{},"parameters":[],"headers":[{"name":"User-Agent","value":"Insomnia/2023.5.7"}],"authentication":{},"metaSortKey":-1693667481608,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"fld_fe76024bf7e3464d80efac032f5b134c","parentId":"wrk_b0358dfa7c9045d8bf906cba6065b2aa","modified":1693667334395,"created":1693667323723,"name":"标签","description":"","environment":{},"environmentPropertyOrder":null,"metaSortKey":-1693667307756,"_type":"request_group"},{"_id":"req_48df3c552e8d4fcfac808b50dda284ea","parentId":"fld_fe76024bf7e3464d80efac032f5b134c","modified":1695468233444,"created":1693667481508,"url":"{{base_url}}/tags/b7908d5f-4ad0-4809-9149-1ef035f01452","name":"标签信息","description":"","method":"GET","body":{},"parameters":[],"headers":[{"name":"User-Agent","value":"Insomnia/2023.5.7"}],"authentication":{},"metaSortKey":-1693667481508,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_83ae22faa8804652a4c808f95bc55422","parentId":"fld_fe76024bf7e3464d80efac032f5b134c","modified":1695468335971,"created":1693667480421,"url":"{{base_url}}/tags","name":"添加标签","description":"","method":"POST","body":{"mimeType":"application/json","text":"{\n\t\"name\": \"标签3\"\n}"},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json"},{"name":"User-Agent","value":"Insomnia/2023.5.7"}],"authentication":{},"metaSortKey":-1693667480421,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_dcf459f8d49548558fb4b83b54bbadfe","parentId":"fld_fe76024bf7e3464d80efac032f5b134c","modified":1695468288010,"created":1693667478865,"url":"{{base_url}}/tags","name":"更新标签","description":"","method":"PATCH","body":{"mimeType":"application/json","text":"{\n\t\"id\": \"b7908d5f-4ad0-4809-9149-1ef035f01452\",\n\t\"description\": \"标签2\"\n}"},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json"},{"name":"User-Agent","value":"Insomnia/2023.5.7"}],"authentication":{},"metaSortKey":-1693667478865,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_99afa59694544131894a3a122ce0e41e","parentId":"fld_fe76024bf7e3464d80efac032f5b134c","modified":1693670349179,"created":1693667473956,"url":"{{base_url}}/tags/xxx","name":"删除标签","description":"","method":"DELETE","body":{},"parameters":[],"headers":[{"name":"User-Agent","value":"Insomnia/2023.5.7"}],"authentication":{},"metaSortKey":-1693667473956,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_bb2d20545b1442ac8800bab1c5f9bf94","parentId":"fld_0719aadd6f0f431882928347f15a0ac1","modified":1695468560620,"created":1693667509592,"url":"{{base_url}}/posts","name":"文章列表","description":"","method":"GET","body":{},"parameters":[{"id":"pair_bf64498c28834db3aea9eea3a102d61f","name":"category","value":"68512e33-c263-4551-bc16-c63bf993cf1d","description":"","disabled":false},{"id":"pair_e9a0ea09af064a05901f511097b99b64","name":"orderBy","value":"commentCount","description":""}],"headers":[{"name":"User-Agent","value":"Insomnia/2023.5.7"}],"authentication":{},"metaSortKey":-1693667509592,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"fld_0719aadd6f0f431882928347f15a0ac1","parentId":"wrk_b0358dfa7c9045d8bf906cba6065b2aa","modified":1693667352194,"created":1693667307706,"name":"文章","description":"","environment":{},"environmentPropertyOrder":null,"metaSortKey":-1693667307743.5,"_type":"request_group"},{"_id":"req_4c388d17beb54b5c83407e0e50c6814d","parentId":"fld_0719aadd6f0f431882928347f15a0ac1","modified":1695471163975,"created":1693667507886,"url":"{{base_url}}/posts/1ef94196-5233-400f-ac46-e468f72ad89b","name":"文章信息","description":"","method":"GET","body":{},"parameters":[],"headers":[{"name":"User-Agent","value":"Insomnia/2023.5.7"}],"authentication":{},"metaSortKey":-1693667507886,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_71d224cfe21a4518a943feb243b028e1","parentId":"fld_0719aadd6f0f431882928347f15a0ac1","modified":1693670117501,"created":1693667505468,"url":"{{base_url}}/posts","name":"添加文章","description":"","method":"POST","body":{},"parameters":[],"headers":[{"name":"User-Agent","value":"Insomnia/2023.5.7"}],"authentication":{},"metaSortKey":-1693667505468,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_5180e7019f1546e29f0cb3db33f636b6","parentId":"fld_0719aadd6f0f431882928347f15a0ac1","modified":1695472225454,"created":1693667502384,"url":"{{base_url}}/posts","name":"更新文章","description":"","method":"PATCH","body":{"mimeType":"application/json","text":"{\n\t\"id\": \"1ef94196-5233-400f-ac46-e468f72ad89b\",\n\t\"title\": \"最新文章2\",\n\t\"category\": \"459b9680-ac69-4313-9506-44a794f45a22\",\n\t\"tags\": [\"b7908d5f-4ad0-4809-9149-1ef035f01452\"]\n}"},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json"},{"name":"User-Agent","value":"Insomnia/2023.5.7"}],"authentication":{},"metaSortKey":-1693667502384,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_2b0d3d798db047ab8d022c9c2bd62841","parentId":"fld_0719aadd6f0f431882928347f15a0ac1","modified":1693670130076,"created":1693667500575,"url":"{{base_url}}/posts/xxxx","name":"删除文章","description":"","method":"DELETE","body":{},"parameters":[],"headers":[{"name":"User-Agent","value":"Insomnia/2023.5.7"}],"authentication":{},"metaSortKey":-1693667500575,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_bcbd0da82c9f47229b40a2fdc83b21b5","parentId":"fld_89e214eac8534e2eb7c258b620f8ff8f","modified":1695472416612,"created":1695472352653,"url":"{{base_url}}/comments/tree","name":"评论树","description":"","method":"GET","body":{},"parameters":[{"id":"pair_8066add0fcaf44e39e03986500ca3fe8","name":"post","value":"1ef94196-5233-400f-ac46-e468f72ad89b","description":""}],"headers":[{"name":"User-Agent","value":"insomnia/2023.5.8"}],"authentication":{},"metaSortKey":-1693667523087,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"fld_89e214eac8534e2eb7c258b620f8ff8f","parentId":"wrk_b0358dfa7c9045d8bf906cba6065b2aa","modified":1693667350912,"created":1693667341010,"name":"评论","description":"","environment":{},"environmentPropertyOrder":null,"metaSortKey":-1693667307731,"_type":"request_group"},{"_id":"req_e05c3e924f004674b8dda2c6a5fe911f","parentId":"fld_89e214eac8534e2eb7c258b620f8ff8f","modified":1695472425151,"created":1693667522987,"url":"{{base_url}}/comments","name":"评论列表","description":"","method":"GET","body":{},"parameters":[{"id":"pair_b784fd4e10bb414cb53ec351bd514aa9","name":"post","value":"1ef94196-5233-400f-ac46-e468f72ad89b","description":""}],"headers":[{"name":"User-Agent","value":"Insomnia/2023.5.7"}],"authentication":{},"metaSortKey":-1693667522987,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_32d2fa72c0b843a9801d79bc4cf3a291","parentId":"fld_89e214eac8534e2eb7c258b620f8ff8f","modified":1695472317299,"created":1693667520120,"url":"{{base_url}}/comments","name":"添加评论","description":"","method":"POST","body":{"mimeType":"application/json","text":"{\n\t\"body\": \"回复评论1\",\n\t\"parent\": \"03133318-f086-43f7-8f47-d10683032cde\",\n\t\"post\": \"1ef94196-5233-400f-ac46-e468f72ad89b\"\n}"},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json"},{"name":"User-Agent","value":"Insomnia/2023.5.7"}],"authentication":{},"metaSortKey":-1693667520120,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_3f36f6e51ac94e819d807689ba8e6990","parentId":"fld_89e214eac8534e2eb7c258b620f8ff8f","modified":1695472438269,"created":1693667517340,"url":"{{base_url}}/comments/xxx","name":"删除评论","description":"","method":"DELETE","body":{},"parameters":[],"headers":[{"name":"User-Agent","value":"Insomnia/2023.5.7"}],"authentication":{},"metaSortKey":-1693667517340,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"env_7bd663a4d4cf48759eff9c851ab75dfe","parentId":"wrk_b0358dfa7c9045d8bf906cba6065b2aa","modified":1693667700585,"created":1693667278569,"name":"Base Environment","data":{},"dataPropertyOrder":{},"color":null,"isPrivate":false,"metaSortKey":1693667278569,"_type":"environment"},{"_id":"jar_d6f29aac3e4c4ce2837ef1b73fbde1dc","parentId":"wrk_b0358dfa7c9045d8bf906cba6065b2aa","modified":1693667278570,"created":1693667278570,"name":"Default Jar","cookies":[],"_type":"cookie_jar"},{"_id":"env_e948cdca159546d5a08858265f54b578","parentId":"env_7bd663a4d4cf48759eff9c851ab75dfe","modified":1693667764937,"created":1693667714580,"name":"dev","data":{"host":"http://localhost:3100","base_url":"{{host}}/api"},"dataPropertyOrder":{"&":["host","base_url"]},"color":null,"isPrivate":false,"metaSortKey":1693667714580,"_type":"environment"}]} \ No newline at end of file diff --git a/back/Insomnia9.json b/back/Insomnia9.json new file mode 100644 index 0000000..020e636 --- /dev/null +++ b/back/Insomnia9.json @@ -0,0 +1 @@ +{"_type":"export","__export_format":4,"__export_date":"2023-09-24T00:08:20.526Z","__export_source":"insomnia.desktop.app:v2023.5.8","resources":[{"_id":"req_f680633570684039a2a5fd46d9ed2248","parentId":"fld_4dc896ca7abb4c9c86dc5a1275817ce5","modified":1693667895265,"created":1693667879202,"url":"{{base_url}}/categories/tree","name":"分类树","description":"","method":"GET","body":{},"parameters":[],"headers":[{"name":"User-Agent","value":"Insomnia/2023.5.7"}],"authentication":{},"metaSortKey":-1693667879202,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"fld_4dc896ca7abb4c9c86dc5a1275817ce5","parentId":"wrk_5b3327925a1840089e2a6246519abf77","modified":1693667315491,"created":1693667293589,"name":"分类","description":"","environment":{},"environmentPropertyOrder":null,"metaSortKey":-1693667307806,"_type":"request_group"},{"_id":"wrk_5b3327925a1840089e2a6246519abf77","parentId":null,"modified":1695512990746,"created":1693667278559,"name":"nestapp-9","description":"","scope":"collection","_type":"workspace"},{"_id":"req_c9e31d7994ba4261b3492ee9e9815f22","parentId":"fld_4dc896ca7abb4c9c86dc5a1275817ce5","modified":1695007687906,"created":1693667464847,"url":"{{base_url}}/categories","name":"分类列表","description":"","method":"GET","body":{},"parameters":[{"id":"pair_98b2568fa4214ecc9ccd4099bd50c1db","name":"trashed","value":"only","description":"","disabled":true}],"headers":[{"name":"User-Agent","value":"Insomnia/2023.5.7"}],"authentication":{},"metaSortKey":-1693667382196.5,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_17503738661a493ea8b13798aef932d8","parentId":"fld_4dc896ca7abb4c9c86dc5a1275817ce5","modified":1695513314359,"created":1693667378546,"url":"{{base_url}}/categories/3853756e-5964-4eda-86de-bfaa662186ae","name":"分类信息","description":"","method":"GET","body":{},"parameters":[],"headers":[{"name":"User-Agent","value":"Insomnia/2023.5.7"}],"authentication":{},"metaSortKey":-1693667378546,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_ee63979d308d432eaa4fecada3019473","parentId":"fld_4dc896ca7abb4c9c86dc5a1275817ce5","modified":1695513663434,"created":1693667366545,"url":"{{base_url}}/categories","name":"添加分类","description":"","method":"POST","body":{"mimeType":"application/json","text":"{\n\t\"name\": \"nextjs\"\n}"},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json"},{"name":"User-Agent","value":"Insomnia/2023.5.7"}],"authentication":{},"metaSortKey":-1693667366545,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_b5e10548ddfb4884a640de3610c4d25b","parentId":"fld_4dc896ca7abb4c9c86dc5a1275817ce5","modified":1695513656005,"created":1693667380146,"url":"{{base_url}}/categories","name":"更新分类","description":"","method":"PATCH","body":{"mimeType":"application/json","text":"{\n\t\"id\": \"3853756e-5964-4eda-86de-bfaa662186ae\",\n\t\"parent\": \"d72f1ff5-1a0b-49ba-b0fe-41a5d56ac389\",\n\t\"customOrder\": 1\n}"},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json"},{"name":"User-Agent","value":"Insomnia/2023.5.7"}],"authentication":{},"metaSortKey":-1693667366445,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_fc94700c0d8941289c09b1a9fd73b9e0","parentId":"fld_4dc896ca7abb4c9c86dc5a1275817ce5","modified":1695513676383,"created":1693667441395,"url":"{{base_url}}/categories","name":"删除分类","description":"","method":"DELETE","body":{"mimeType":"application/json","text":"{\n\t\"ids\": [\"3853756e-5964-4eda-86de-bfaa662186ae\"],\n\t\"trash\": true\n}"},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json"},{"name":"User-Agent","value":"Insomnia/2023.5.7"}],"authentication":{},"metaSortKey":-1693667366345,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_f5e01b76dce24775ae04edeee61f65ee","parentId":"fld_4dc896ca7abb4c9c86dc5a1275817ce5","modified":1695513682741,"created":1695006592192,"url":"{{base_url}}/categories/restore","name":"恢复分类","description":"","method":"PATCH","body":{"mimeType":"application/json","text":"{\n\t\"ids\": [\"3853756e-5964-4eda-86de-bfaa662186ae\"]\n}"},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json"},{"name":"User-Agent","value":"insomnia/2023.5.8"}],"authentication":{},"metaSortKey":-1693667366245,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_070ac5ea4c494ff09b8393864597ee90","parentId":"fld_21f97d2424ba4d678370c5adcfa51c82","modified":1695007720735,"created":1693667385847,"url":"{{base_url}}/tags","name":"标签列表","description":"","method":"GET","body":{},"parameters":[],"headers":[{"name":"User-Agent","value":"Insomnia/2023.5.7"}],"authentication":{},"metaSortKey":-1693667481608,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"fld_21f97d2424ba4d678370c5adcfa51c82","parentId":"wrk_5b3327925a1840089e2a6246519abf77","modified":1693667334395,"created":1693667323723,"name":"标签","description":"","environment":{},"environmentPropertyOrder":null,"metaSortKey":-1693667307756,"_type":"request_group"},{"_id":"req_cbdd2872bdca44729df79fb474629d15","parentId":"fld_21f97d2424ba4d678370c5adcfa51c82","modified":1695513704411,"created":1693667481508,"url":"{{base_url}}/tags/b7908d5f-4ad0-4809-9149-1ef035f01452","name":"标签信息","description":"","method":"GET","body":{},"parameters":[],"headers":[{"name":"User-Agent","value":"Insomnia/2023.5.7"}],"authentication":{},"metaSortKey":-1693667481508,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_439d26eb732c4adcb2305faf294d9e1b","parentId":"fld_21f97d2424ba4d678370c5adcfa51c82","modified":1695280262704,"created":1693667480421,"url":"{{base_url}}/tags","name":"添加标签","description":"","method":"POST","body":{"mimeType":"application/json","text":"{\n\t\"name\": \"标签1\"\n}"},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json"},{"name":"User-Agent","value":"Insomnia/2023.5.7"}],"authentication":{},"metaSortKey":-1693667480421,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_8eb12ce62693470988d4169fb4040caa","parentId":"fld_21f97d2424ba4d678370c5adcfa51c82","modified":1695513715974,"created":1693667478865,"url":"{{base_url}}/tags","name":"更新标签","description":"","method":"PATCH","body":{"mimeType":"application/json","text":"{\n\t\"id\": \"b7908d5f-4ad0-4809-9149-1ef035f01452\",\n\t\"name\": \"标签2\"\n}"},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json"},{"name":"User-Agent","value":"Insomnia/2023.5.7"}],"authentication":{},"metaSortKey":-1693667478865,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_eea0c20d3efa4bc1af6539b3a67b3664","parentId":"fld_21f97d2424ba4d678370c5adcfa51c82","modified":1695513734823,"created":1693667473956,"url":"{{base_url}}/tags","name":"删除标签","description":"","method":"DELETE","body":{"mimeType":"application/json","text":"{\n\t\"ids\": [\"b7908d5f-4ad0-4809-9149-1ef035f01452\"],\n\t\"trash\": true\n}"},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json"},{"name":"User-Agent","value":"Insomnia/2023.5.7"}],"authentication":{},"metaSortKey":-1693667473956,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_18185ceedcf54419a04546b3dd2b7186","parentId":"fld_21f97d2424ba4d678370c5adcfa51c82","modified":1695513747029,"created":1695006601223,"url":"{{base_url}}/tags/restore","name":"恢复标签","description":"","method":"PATCH","body":{"mimeType":"application/json","text":"{\n\t\"ids\": [\"b7908d5f-4ad0-4809-9149-1ef035f01452\"]\n}"},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json"},{"name":"User-Agent","value":"insomnia/2023.5.8"}],"authentication":{},"metaSortKey":-1693667473856,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_ee3febaaf8d94914a4483ac9d3693ca1","parentId":"fld_fdc43583018e48e2b9667a6d4939dafb","modified":1695514033675,"created":1693667509592,"url":"{{base_url}}/posts","name":"文章列表","description":"","method":"GET","body":{},"parameters":[{"id":"pair_e9a0ea09af064a05901f511097b99b64","name":"orderBy","value":"commentCount","description":"","disabled":false},{"id":"pair_5910c555c3ec43609d19bc9fe654f034","name":"trashed","value":"all","description":"","disabled":false}],"headers":[{"name":"User-Agent","value":"Insomnia/2023.5.7"}],"authentication":{},"metaSortKey":-1693667509592,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"fld_fdc43583018e48e2b9667a6d4939dafb","parentId":"wrk_5b3327925a1840089e2a6246519abf77","modified":1693667352194,"created":1693667307706,"name":"文章","description":"","environment":{},"environmentPropertyOrder":null,"metaSortKey":-1693667307743.5,"_type":"request_group"},{"_id":"req_e67ff364744c461d87c0f9cbb00138ba","parentId":"fld_fdc43583018e48e2b9667a6d4939dafb","modified":1695513796454,"created":1693667507886,"url":"{{base_url}}/posts/1ef94196-5233-400f-ac46-e468f72ad89b","name":"文章信息","description":"","method":"GET","body":{},"parameters":[],"headers":[{"name":"User-Agent","value":"Insomnia/2023.5.7"}],"authentication":{},"metaSortKey":-1693667507886,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_e3d845070fa1460ca16d586275fb8cf4","parentId":"fld_fdc43583018e48e2b9667a6d4939dafb","modified":1695513870359,"created":1693667505468,"url":"{{base_url}}/posts","name":"添加文章","description":"","method":"POST","body":{"mimeType":"application/json","text":"{\n\t\"title\": \"最新文章3\",\n\t\"body\": \"这是第10篇文章\",\n\t\"category\": \"459b9680-ac69-4313-9506-44a794f45a22\",\n\t\"tags\": [\"b7908d5f-4ad0-4809-9149-1ef035f01452\"]\n}"},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json"},{"name":"User-Agent","value":"Insomnia/2023.5.7"}],"authentication":{},"metaSortKey":-1693667505468,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_3516467f039842298fad7b3c64b7c0f7","parentId":"fld_fdc43583018e48e2b9667a6d4939dafb","modified":1695514023298,"created":1693667502384,"url":"{{base_url}}/posts","name":"更新文章","description":"","method":"PATCH","body":{"mimeType":"application/json","text":"{\n\t\"id\": \"1b2b53b8-688c-4702-bda4-06602d2de26b\",\n\t\"title\": \"回收站中的文章\",\n\t\"category\": \"459b9680-ac69-4313-9506-44a794f45a22\",\n\t\"tags\": [\"b7908d5f-4ad0-4809-9149-1ef035f01452\"]\n}"},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json"},{"name":"User-Agent","value":"Insomnia/2023.5.7"}],"authentication":{},"metaSortKey":-1693667502384,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_322cf2f421ca4e168ea2b8a4a691753d","parentId":"fld_fdc43583018e48e2b9667a6d4939dafb","modified":1695514006940,"created":1693667500575,"url":"{{base_url}}/posts","name":"删除文章","description":"","method":"DELETE","body":{"mimeType":"application/json","text":"{\n\t\"ids\": [\"1b2b53b8-688c-4702-bda4-06602d2de26b\"],\n\t\"trash\": true\n}"},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json"},{"name":"User-Agent","value":"Insomnia/2023.5.7"}],"authentication":{},"metaSortKey":-1693667500575,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_2d241057403e4c98b653114fcbafd0e5","parentId":"fld_fdc43583018e48e2b9667a6d4939dafb","modified":1695514011196,"created":1695006606917,"url":"{{base_url}}/posts/restore","name":"恢复文章","description":"","method":"PATCH","body":{"mimeType":"application/json","text":"{\n\t\"ids\": [\"1b2b53b8-688c-4702-bda4-06602d2de26b\"]\n}"},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json"},{"name":"User-Agent","value":"insomnia/2023.5.8"}],"authentication":{},"metaSortKey":-1693667500475,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_839d1248458d4b29a92257b5424dc2c9","parentId":"fld_60e15b3ecbd54fec9dfa0eda36cf72d7","modified":1693671427278,"created":1693667522987,"url":"{{base_url}}/comments","name":"评论列表","description":"","method":"GET","body":{},"parameters":[],"headers":[{"name":"User-Agent","value":"Insomnia/2023.5.7"}],"authentication":{},"metaSortKey":-1693667522987,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"fld_60e15b3ecbd54fec9dfa0eda36cf72d7","parentId":"wrk_5b3327925a1840089e2a6246519abf77","modified":1693667350912,"created":1693667341010,"name":"评论","description":"","environment":{},"environmentPropertyOrder":null,"metaSortKey":-1693667307731,"_type":"request_group"},{"_id":"req_6c0de3f743834922883bcf30b9ec6d8f","parentId":"fld_60e15b3ecbd54fec9dfa0eda36cf72d7","modified":1695514065668,"created":1693667520120,"url":"{{base_url}}/comments","name":"添加评论","description":"","method":"POST","body":{"mimeType":"application/json","text":"{\n\t\"body\": \"回复评论2\",\n\t\"parent\": \"03133318-f086-43f7-8f47-d10683032cde\",\n\t\"post\": \"1ef94196-5233-400f-ac46-e468f72ad89b\"\n}"},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json"},{"name":"User-Agent","value":"Insomnia/2023.5.7"}],"authentication":{},"metaSortKey":-1693667520120,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_a13359fbe3a448af942d3ba8db724f18","parentId":"fld_60e15b3ecbd54fec9dfa0eda36cf72d7","modified":1695514084361,"created":1693667517340,"url":"{{base_url}}/comments","name":"删除评论","description":"","method":"DELETE","body":{"mimeType":"application/json","text":"{\n\t\"ids\": [\"e76ad120-6375-470e-8790-1c3ad40c99b2\"]\n}"},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json"},{"name":"User-Agent","value":"Insomnia/2023.5.7"}],"authentication":{},"metaSortKey":-1693667517340,"isPrivate":false,"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"env_02df071691a8167839aaf070e2506ee38c1f460f","parentId":"wrk_5b3327925a1840089e2a6246519abf77","modified":1693667700585,"created":1693667278569,"name":"Base Environment","data":{},"dataPropertyOrder":{},"color":null,"isPrivate":false,"metaSortKey":1693667278569,"_type":"environment"},{"_id":"jar_02df071691a8167839aaf070e2506ee38c1f460f","parentId":"wrk_5b3327925a1840089e2a6246519abf77","modified":1693667278570,"created":1693667278570,"name":"Default Jar","cookies":[],"_type":"cookie_jar"},{"_id":"env_22750edb289a45c184b41450ca87d73b","parentId":"env_02df071691a8167839aaf070e2506ee38c1f460f","modified":1693667764937,"created":1693667714580,"name":"dev","data":{"host":"http://localhost:3100","base_url":"{{host}}/api"},"dataPropertyOrder":{"&":["host","base_url"]},"color":null,"isPrivate":false,"metaSortKey":1693667714580,"_type":"environment"}]} \ No newline at end of file diff --git a/back/database4.db b/back/database4.db new file mode 100644 index 0000000..c25f1b8 Binary files /dev/null and b/back/database4.db differ diff --git a/back/database6.db b/back/database6.db new file mode 100644 index 0000000..a22200a Binary files /dev/null and b/back/database6.db differ diff --git a/back/database9.db b/back/database9.db new file mode 100644 index 0000000..3b6fa5e Binary files /dev/null and b/back/database9.db differ diff --git a/package.json b/package.json index 45a9201..07c8845 100644 --- a/package.json +++ b/package.json @@ -1,81 +1,87 @@ { - "name": "ink-nestjs-api", - "version": "0.0.1", - "description": "", - "author": "", - "private": true, - "license": "UNLICENSED", - "scripts": { - "build": "nest build", - "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"", - "start": "nest start", - "start:dev": "nest start --watch", - "start:debug": "nest start --debug --watch", - "start:prod": "node dist/main", - "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix", - "test": "jest", - "test:watch": "jest --watch", - "test:cov": "jest --coverage", - "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand", - "test:e2e": "jest --config ./test/jest-e2e.json" - }, - "dependencies": { - "@nestjs/common": "^10.2.9", - "@nestjs/core": "^10.2.9", - "@nestjs/platform-fastify": "^10.2.9", - "@nestjs/swagger": "^7.1.16", - "class-transformer": "^0.5.1", - "class-validator": "^0.14.0", - "fastify": "^4.24.3", - "lodash": "^4.17.21", - "reflect-metadata": "^0.1.13", - "rxjs": "^7.8.1" - }, - "devDependencies": { - "@nestjs/cli": "^10.2.1", - "@nestjs/schematics": "^10.0.3", - "@nestjs/testing": "^10.2.9", - "@swc/cli": "^0.1.63", - "@swc/core": "^1.3.96", - "@types/jest": "^29.5.8", - "@types/lodash": "^4.14.201", - "@types/node": "^20.9.1", - "@types/supertest": "^2.0.16", - "@typescript-eslint/eslint-plugin": "^6.11.0", - "@typescript-eslint/parser": "^6.11.0", - "eslint": "^8.53.0", - "eslint-config-airbnb-base": "^15.0.0", - "eslint-config-airbnb-typescript": "^17.1.0", - "eslint-config-prettier": "^9.0.0", - "eslint-plugin-import": "^2.29.0", - "eslint-plugin-jest": "^27.6.0", - "eslint-plugin-prettier": "^5.0.1", - "eslint-plugin-unused-imports": "^3.0.0", - "jest": "^29.7.0", - "prettier": "^3.1.0", - "source-map-support": "^0.5.21", - "supertest": "^6.3.3", - "ts-jest": "^29.1.1", - "ts-loader": "^9.5.1", - "ts-node": "^10.9.1", - "tsconfig-paths": "^4.2.0", - "typescript": "^5.2.2" - }, - "jest": { - "moduleFileExtensions": [ - "js", - "json", - "ts" - ], - "rootDir": "src", - "testRegex": ".*\\.spec\\.ts$", - "transform": { - "^.+\\.(t|j)s$": "ts-jest" + "name": "ink-nestjs-api", + "version": "0.0.1", + "description": "", + "author": "", + "private": true, + "license": "UNLICENSED", + "scripts": { + "build": "nest build", + "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"", + "start": "nest start", + "start:dev": "nest start --watch", + "start:debug": "nest start --debug --watch", + "start:prod": "node dist/main", + "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix", + "test": "jest", + "test:watch": "jest --watch", + "test:cov": "jest --coverage", + "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand", + "test:e2e": "jest --config ./test/jest-e2e.json" }, - "collectCoverageFrom": [ - "**/*.(t|j)s" - ], - "coverageDirectory": "../coverage", - "testEnvironment": "node" - } -} \ No newline at end of file + "dependencies": { + "@nestjs/common": "^10.2.9", + "@nestjs/core": "^10.2.9", + "@nestjs/platform-fastify": "^10.2.9", + "@nestjs/swagger": "^7.1.16", + "@nestjs/typeorm": "^10.0.1", + "better-sqlite3": "^9.0.0", + "class-transformer": "^0.5.1", + "class-validator": "^0.14.0", + "deepmerge": "^4.3.1", + "fastify": "^4.24.3", + "lodash": "^4.17.21", + "reflect-metadata": "^0.1.13", + "rxjs": "^7.8.1", + "sanitize-html": "^2.11.0", + "typeorm": "^0.3.17" + }, + "devDependencies": { + "@nestjs/cli": "^10.2.1", + "@nestjs/schematics": "^10.0.3", + "@nestjs/testing": "^10.2.9", + "@swc/cli": "^0.1.63", + "@swc/core": "^1.3.96", + "@types/jest": "^29.5.8", + "@types/lodash": "^4.14.201", + "@types/node": "^20.9.2", + "@types/sanitize-html": "^2.9.4", + "@types/supertest": "^2.0.16", + "@typescript-eslint/eslint-plugin": "^6.11.0", + "@typescript-eslint/parser": "^6.11.0", + "eslint": "^8.54.0", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-config-airbnb-typescript": "^17.1.0", + "eslint-config-prettier": "^9.0.0", + "eslint-plugin-import": "^2.29.0", + "eslint-plugin-jest": "^27.6.0", + "eslint-plugin-prettier": "^5.0.1", + "eslint-plugin-unused-imports": "^3.0.0", + "jest": "^29.7.0", + "prettier": "^3.1.0", + "source-map-support": "^0.5.21", + "supertest": "^6.3.3", + "ts-jest": "^29.1.1", + "ts-loader": "^9.5.1", + "ts-node": "^10.9.1", + "tsconfig-paths": "^4.2.0", + "typescript": "^5.2.2" + }, + "jest": { + "moduleFileExtensions": [ + "js", + "json", + "ts" + ], + "rootDir": "src", + "testRegex": ".*\\.spec\\.ts$", + "transform": { + "^.+\\.(t|j)s$": "ts-jest" + }, + "collectCoverageFrom": [ + "**/*.(t|j)s" + ], + "coverageDirectory": "../coverage", + "testEnvironment": "node" + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e30ccf3..09407b8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,5 +1,9 @@ lockfileVersion: '6.0' +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + dependencies: '@nestjs/common': specifier: ^10.2.9 @@ -13,12 +17,21 @@ dependencies: '@nestjs/swagger': specifier: ^7.1.16 version: 7.1.16(@nestjs/common@10.2.9)(@nestjs/core@10.2.9)(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13) + '@nestjs/typeorm': + specifier: ^10.0.1 + version: 10.0.1(@nestjs/common@10.2.9)(@nestjs/core@10.2.9)(reflect-metadata@0.1.13)(rxjs@7.8.1)(typeorm@0.3.17) + better-sqlite3: + specifier: ^9.0.0 + version: 9.1.1 class-transformer: specifier: ^0.5.1 version: 0.5.1 class-validator: specifier: ^0.14.0 version: 0.14.0 + deepmerge: + specifier: ^4.3.1 + version: 4.3.1 fastify: specifier: ^4.24.3 version: 4.24.3 @@ -31,6 +44,12 @@ dependencies: rxjs: specifier: ^7.8.1 version: 7.8.1 + sanitize-html: + specifier: ^2.11.0 + version: 2.11.0 + typeorm: + specifier: ^0.3.17 + version: 0.3.17(better-sqlite3@9.1.1)(ts-node@10.9.1) devDependencies: '@nestjs/cli': @@ -55,44 +74,47 @@ devDependencies: specifier: ^4.14.201 version: 4.14.201 '@types/node': - specifier: ^20.9.1 - version: 20.9.1 + specifier: ^20.9.2 + version: 20.9.2 + '@types/sanitize-html': + specifier: ^2.9.4 + version: 2.9.4 '@types/supertest': specifier: ^2.0.16 version: 2.0.16 '@typescript-eslint/eslint-plugin': specifier: ^6.11.0 - version: 6.11.0(@typescript-eslint/parser@6.11.0)(eslint@8.53.0)(typescript@5.2.2) + version: 6.11.0(@typescript-eslint/parser@6.11.0)(eslint@8.54.0)(typescript@5.2.2) '@typescript-eslint/parser': specifier: ^6.11.0 - version: 6.11.0(eslint@8.53.0)(typescript@5.2.2) + version: 6.11.0(eslint@8.54.0)(typescript@5.2.2) eslint: - specifier: ^8.53.0 - version: 8.53.0 + specifier: ^8.54.0 + version: 8.54.0 eslint-config-airbnb-base: specifier: ^15.0.0 - version: 15.0.0(eslint-plugin-import@2.29.0)(eslint@8.53.0) + version: 15.0.0(eslint-plugin-import@2.29.0)(eslint@8.54.0) eslint-config-airbnb-typescript: specifier: ^17.1.0 - version: 17.1.0(@typescript-eslint/eslint-plugin@6.11.0)(@typescript-eslint/parser@6.11.0)(eslint-plugin-import@2.29.0)(eslint@8.53.0) + version: 17.1.0(@typescript-eslint/eslint-plugin@6.11.0)(@typescript-eslint/parser@6.11.0)(eslint-plugin-import@2.29.0)(eslint@8.54.0) eslint-config-prettier: specifier: ^9.0.0 - version: 9.0.0(eslint@8.53.0) + version: 9.0.0(eslint@8.54.0) eslint-plugin-import: specifier: ^2.29.0 - version: 2.29.0(@typescript-eslint/parser@6.11.0)(eslint@8.53.0) + version: 2.29.0(@typescript-eslint/parser@6.11.0)(eslint@8.54.0) eslint-plugin-jest: specifier: ^27.6.0 - version: 27.6.0(@typescript-eslint/eslint-plugin@6.11.0)(eslint@8.53.0)(jest@29.7.0)(typescript@5.2.2) + version: 27.6.0(@typescript-eslint/eslint-plugin@6.11.0)(eslint@8.54.0)(jest@29.7.0)(typescript@5.2.2) eslint-plugin-prettier: specifier: ^5.0.1 - version: 5.0.1(eslint-config-prettier@9.0.0)(eslint@8.53.0)(prettier@3.1.0) + version: 5.0.1(eslint-config-prettier@9.0.0)(eslint@8.54.0)(prettier@3.1.0) eslint-plugin-unused-imports: specifier: ^3.0.0 - version: 3.0.0(@typescript-eslint/eslint-plugin@6.11.0)(eslint@8.53.0) + version: 3.0.0(@typescript-eslint/eslint-plugin@6.11.0)(eslint@8.54.0) jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@20.9.1)(ts-node@10.9.1) + version: 29.7.0(@types/node@20.9.2)(ts-node@10.9.1) prettier: specifier: ^3.1.0 version: 3.1.0 @@ -110,7 +132,7 @@ devDependencies: version: 9.5.1(typescript@5.2.2)(webpack@5.89.0) ts-node: specifier: ^10.9.1 - version: 10.9.1(@swc/core@1.3.96)(@types/node@20.9.1)(typescript@5.2.2) + version: 10.9.1(@swc/core@1.3.96)(@types/node@20.9.2)(typescript@5.2.2) tsconfig-paths: specifier: ^4.2.0 version: 4.2.0 @@ -468,6 +490,13 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/runtime@7.23.2: + resolution: {integrity: sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.14.0 + dev: false + /@babel/template@7.22.15: resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} engines: {node: '>=6.9.0'} @@ -520,15 +549,14 @@ packages: engines: {node: '>=12'} dependencies: '@jridgewell/trace-mapping': 0.3.9 - dev: true - /@eslint-community/eslint-utils@4.4.0(eslint@8.53.0): + /@eslint-community/eslint-utils@4.4.0(eslint@8.54.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 dependencies: - eslint: 8.53.0 + eslint: 8.54.0 eslint-visitor-keys: 3.4.3 dev: true @@ -554,8 +582,8 @@ packages: - supports-color dev: true - /@eslint/js@8.53.0: - resolution: {integrity: sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w==} + /@eslint/js@8.54.0: + resolution: {integrity: sha512-ut5V+D+fOoWPgGGNj83GGjnntO39xDy6DWxO0wb7Jp3DcMX0TfIqdzHF85VTQkerdyGmuuMD9AKAo5KiNlf/AQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true @@ -657,7 +685,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 20.9.1 + '@types/node': 20.9.2 chalk: 4.1.2 jest-message-util: 29.7.0 jest-util: 29.7.0 @@ -678,14 +706,14 @@ packages: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.9.1 + '@types/node': 20.9.2 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.9.0 exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.9.1)(ts-node@10.9.1) + jest-config: 29.7.0(@types/node@20.9.2)(ts-node@10.9.1) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -713,7 +741,7 @@ packages: dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.9.1 + '@types/node': 20.9.2 jest-mock: 29.7.0 dev: true @@ -740,7 +768,7 @@ packages: dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 - '@types/node': 20.9.1 + '@types/node': 20.9.2 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -773,7 +801,7 @@ packages: '@jest/transform': 29.7.0 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.20 - '@types/node': 20.9.1 + '@types/node': 20.9.2 chalk: 4.1.2 collect-v8-coverage: 1.0.2 exit: 0.1.2 @@ -861,7 +889,7 @@ packages: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 20.9.1 + '@types/node': 20.9.2 '@types/yargs': 17.0.31 chalk: 4.1.2 dev: true @@ -878,7 +906,6 @@ packages: /@jridgewell/resolve-uri@3.1.1: resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} engines: {node: '>=6.0.0'} - dev: true /@jridgewell/set-array@1.1.2: resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} @@ -894,7 +921,6 @@ packages: /@jridgewell/sourcemap-codec@1.4.15: resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - dev: true /@jridgewell/trace-mapping@0.3.20: resolution: {integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==} @@ -908,7 +934,6 @@ packages: dependencies: '@jridgewell/resolve-uri': 3.1.1 '@jridgewell/sourcemap-codec': 1.4.15 - dev: true /@lukeed/csprng@1.1.0: resolution: {integrity: sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==} @@ -1130,6 +1155,23 @@ packages: tslib: 2.6.2 dev: true + /@nestjs/typeorm@10.0.1(@nestjs/common@10.2.9)(@nestjs/core@10.2.9)(reflect-metadata@0.1.13)(rxjs@7.8.1)(typeorm@0.3.17): + resolution: {integrity: sha512-YVFYL7D25VAVp5/G+KLXIgsRfYomA+VaFZBpm2rtwrrBOmkXNrxr7kuI2bBBO/Xy4kKBDe6wbvIVVFeEA7/ngA==} + peerDependencies: + '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 + '@nestjs/core': ^8.0.0 || ^9.0.0 || ^10.0.0 + reflect-metadata: ^0.1.13 + rxjs: ^7.2.0 + typeorm: ^0.3.0 + dependencies: + '@nestjs/common': 10.2.9(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/core': 10.2.9(@nestjs/common@10.2.9)(reflect-metadata@0.1.13)(rxjs@7.8.1) + reflect-metadata: 0.1.13 + rxjs: 7.8.1 + typeorm: 0.3.17(better-sqlite3@9.1.1)(ts-node@10.9.1) + uuid: 9.0.1 + dev: false + /@nodelib/fs.scandir@2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -1202,6 +1244,10 @@ packages: '@sinonjs/commons': 3.0.0 dev: true + /@sqltools/formatter@1.2.5: + resolution: {integrity: sha512-Uy0+khmZqUrUGm5dmMqVlnvufZRSK0FbYzVgp0UMstm+F5+W2/jnEEQyc9vo1ZR/E5ZI/B1WjjoTqBqwJL6Krw==} + dev: false + /@swc/cli@0.1.63(@swc/core@1.3.96): resolution: {integrity: sha512-EM9oxxHzmmsprYRbGqsS2M4M/Gr5Gkcl0ROYYIdlUyTkhOiX822EQiRCpPCwdutdnzH2GyaTN7wc6i0Y+CKd3A==} engines: {node: '>= 12.13'} @@ -1228,7 +1274,6 @@ packages: cpu: [arm64] os: [darwin] requiresBuild: true - dev: true optional: true /@swc/core-darwin-x64@1.3.96: @@ -1237,7 +1282,6 @@ packages: cpu: [x64] os: [darwin] requiresBuild: true - dev: true optional: true /@swc/core-linux-arm-gnueabihf@1.3.96: @@ -1246,7 +1290,6 @@ packages: cpu: [arm] os: [linux] requiresBuild: true - dev: true optional: true /@swc/core-linux-arm64-gnu@1.3.96: @@ -1256,7 +1299,6 @@ packages: os: [linux] libc: [glibc] requiresBuild: true - dev: true optional: true /@swc/core-linux-arm64-musl@1.3.96: @@ -1266,7 +1308,6 @@ packages: os: [linux] libc: [musl] requiresBuild: true - dev: true optional: true /@swc/core-linux-x64-gnu@1.3.96: @@ -1276,7 +1317,6 @@ packages: os: [linux] libc: [glibc] requiresBuild: true - dev: true optional: true /@swc/core-linux-x64-musl@1.3.96: @@ -1286,7 +1326,6 @@ packages: os: [linux] libc: [musl] requiresBuild: true - dev: true optional: true /@swc/core-win32-arm64-msvc@1.3.96: @@ -1295,7 +1334,6 @@ packages: cpu: [arm64] os: [win32] requiresBuild: true - dev: true optional: true /@swc/core-win32-ia32-msvc@1.3.96: @@ -1304,7 +1342,6 @@ packages: cpu: [ia32] os: [win32] requiresBuild: true - dev: true optional: true /@swc/core-win32-x64-msvc@1.3.96: @@ -1313,7 +1350,6 @@ packages: cpu: [x64] os: [win32] requiresBuild: true - dev: true optional: true /@swc/core@1.3.96: @@ -1339,15 +1375,12 @@ packages: '@swc/core-win32-arm64-msvc': 1.3.96 '@swc/core-win32-ia32-msvc': 1.3.96 '@swc/core-win32-x64-msvc': 1.3.96 - dev: true /@swc/counter@0.1.2: resolution: {integrity: sha512-9F4ys4C74eSTEUNndnER3VJ15oru2NumfQxS8geE+f3eB5xvfxpWyqE5XlVnxb/R14uoXi6SLbBwwiDSkv+XEw==} - dev: true /@swc/types@0.1.5: resolution: {integrity: sha512-myfUej5naTBWnqOCc/MdVOLVjXUXtIA+NpDrDBKJtLLg2shUjBu3cZmB/85RyitKc55+lUUyl7oRfLOvkr2hsw==} - dev: true /@szmarczak/http-timer@4.0.6: resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} @@ -1362,19 +1395,15 @@ packages: /@tsconfig/node10@1.0.9: resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} - dev: true /@tsconfig/node12@1.0.11: resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} - dev: true /@tsconfig/node14@1.0.3: resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} - dev: true /@tsconfig/node16@1.0.4: resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} - dev: true /@types/babel__core@7.20.4: resolution: {integrity: sha512-mLnSC22IC4vcWiuObSRjrLd9XcBTGf59vUSoq2jkQDJ/QQ8PMI9rSuzE+aEV8karUMbskw07bKYoUJCKTUaygg==} @@ -1410,7 +1439,7 @@ packages: dependencies: '@types/http-cache-semantics': 4.0.4 '@types/keyv': 3.1.4 - '@types/node': 20.9.1 + '@types/node': 20.9.2 '@types/responselike': 1.0.3 dev: true @@ -1439,7 +1468,7 @@ packages: /@types/graceful-fs@4.1.9: resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} dependencies: - '@types/node': 20.9.1 + '@types/node': 20.9.2 dev: true /@types/http-cache-semantics@4.0.4: @@ -1480,23 +1509,28 @@ packages: /@types/keyv@3.1.4: resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} dependencies: - '@types/node': 20.9.1 + '@types/node': 20.9.2 dev: true /@types/lodash@4.14.201: resolution: {integrity: sha512-y9euML0cim1JrykNxADLfaG0FgD1g/yTHwUs/Jg9ZIU7WKj2/4IW9Lbb1WZbvck78W/lfGXFfe+u2EGfIJXdLQ==} dev: true - /@types/node@20.9.1: - resolution: {integrity: sha512-HhmzZh5LSJNS5O8jQKpJ/3ZcrrlG6L70hpGqMIAoM9YVD0YBRNWYsfwcXq8VnSjlNpCpgLzMXdiPo+dxcvSmiA==} + /@types/node@20.9.2: + resolution: {integrity: sha512-WHZXKFCEyIUJzAwh3NyyTHYSR35SevJ6mZ1nWwJafKtiQbqRTIKSRcw3Ma3acqgsent3RRDqeVwpHntMk+9irg==} dependencies: undici-types: 5.26.5 - dev: true /@types/responselike@1.0.3: resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} dependencies: - '@types/node': 20.9.1 + '@types/node': 20.9.2 + dev: true + + /@types/sanitize-html@2.9.4: + resolution: {integrity: sha512-Ym4hjmAFxF/eux7nW2yDPAj2o9RYh0vP/9V5ECoHtgJ/O9nPGslUd20CMn6WatRMlFVfjMTg3lMcWq8YyO6QnA==} + dependencies: + htmlparser2: 8.0.2 dev: true /@types/semver@7.5.5: @@ -1511,7 +1545,7 @@ packages: resolution: {integrity: sha512-GMaOrnnUsjChvH8zlzdDPARRXky8bU3E8xsU/fOclgqsINekbwDu1+wzJzJaGzZP91SGpOutf5Te5pm5M/qCWg==} dependencies: '@types/cookiejar': 2.1.4 - '@types/node': 20.9.1 + '@types/node': 20.9.2 dev: true /@types/supertest@2.0.16: @@ -1533,7 +1567,7 @@ packages: '@types/yargs-parser': 21.0.3 dev: true - /@typescript-eslint/eslint-plugin@6.11.0(@typescript-eslint/parser@6.11.0)(eslint@8.53.0)(typescript@5.2.2): + /@typescript-eslint/eslint-plugin@6.11.0(@typescript-eslint/parser@6.11.0)(eslint@8.54.0)(typescript@5.2.2): resolution: {integrity: sha512-uXnpZDc4VRjY4iuypDBKzW1rz9T5YBBK0snMn8MaTSNd2kMlj50LnLBABELjJiOL5YHk7ZD8hbSpI9ubzqYI0w==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -1545,13 +1579,13 @@ packages: optional: true dependencies: '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 6.11.0(eslint@8.53.0)(typescript@5.2.2) + '@typescript-eslint/parser': 6.11.0(eslint@8.54.0)(typescript@5.2.2) '@typescript-eslint/scope-manager': 6.11.0 - '@typescript-eslint/type-utils': 6.11.0(eslint@8.53.0)(typescript@5.2.2) - '@typescript-eslint/utils': 6.11.0(eslint@8.53.0)(typescript@5.2.2) + '@typescript-eslint/type-utils': 6.11.0(eslint@8.54.0)(typescript@5.2.2) + '@typescript-eslint/utils': 6.11.0(eslint@8.54.0)(typescript@5.2.2) '@typescript-eslint/visitor-keys': 6.11.0 debug: 4.3.4 - eslint: 8.53.0 + eslint: 8.54.0 graphemer: 1.4.0 ignore: 5.3.0 natural-compare: 1.4.0 @@ -1562,7 +1596,7 @@ packages: - supports-color dev: true - /@typescript-eslint/parser@6.11.0(eslint@8.53.0)(typescript@5.2.2): + /@typescript-eslint/parser@6.11.0(eslint@8.54.0)(typescript@5.2.2): resolution: {integrity: sha512-+whEdjk+d5do5nxfxx73oanLL9ghKO3EwM9kBCkUtWMRwWuPaFv9ScuqlYfQ6pAD6ZiJhky7TZ2ZYhrMsfMxVQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -1577,7 +1611,7 @@ packages: '@typescript-eslint/typescript-estree': 6.11.0(typescript@5.2.2) '@typescript-eslint/visitor-keys': 6.11.0 debug: 4.3.4 - eslint: 8.53.0 + eslint: 8.54.0 typescript: 5.2.2 transitivePeerDependencies: - supports-color @@ -1599,7 +1633,7 @@ packages: '@typescript-eslint/visitor-keys': 6.11.0 dev: true - /@typescript-eslint/type-utils@6.11.0(eslint@8.53.0)(typescript@5.2.2): + /@typescript-eslint/type-utils@6.11.0(eslint@8.54.0)(typescript@5.2.2): resolution: {integrity: sha512-nA4IOXwZtqBjIoYrJcYxLRO+F9ri+leVGoJcMW1uqr4r1Hq7vW5cyWrA43lFbpRvQ9XgNrnfLpIkO3i1emDBIA==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -1610,9 +1644,9 @@ packages: optional: true dependencies: '@typescript-eslint/typescript-estree': 6.11.0(typescript@5.2.2) - '@typescript-eslint/utils': 6.11.0(eslint@8.53.0)(typescript@5.2.2) + '@typescript-eslint/utils': 6.11.0(eslint@8.54.0)(typescript@5.2.2) debug: 4.3.4 - eslint: 8.53.0 + eslint: 8.54.0 ts-api-utils: 1.0.3(typescript@5.2.2) typescript: 5.2.2 transitivePeerDependencies: @@ -1671,19 +1705,19 @@ packages: - supports-color dev: true - /@typescript-eslint/utils@5.62.0(eslint@8.53.0)(typescript@5.2.2): + /@typescript-eslint/utils@5.62.0(eslint@8.54.0)(typescript@5.2.2): resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.53.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.54.0) '@types/json-schema': 7.0.15 '@types/semver': 7.5.5 '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.2.2) - eslint: 8.53.0 + eslint: 8.54.0 eslint-scope: 5.1.1 semver: 7.5.4 transitivePeerDependencies: @@ -1691,19 +1725,19 @@ packages: - typescript dev: true - /@typescript-eslint/utils@6.11.0(eslint@8.53.0)(typescript@5.2.2): + /@typescript-eslint/utils@6.11.0(eslint@8.54.0)(typescript@5.2.2): resolution: {integrity: sha512-p23ibf68fxoZy605dc0dQAEoUsoiNoP3MD9WQGiHLDuTSOuqoTsa4oAy+h3KDkTcxbbfOtUjb9h3Ta0gT4ug2g==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.53.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.54.0) '@types/json-schema': 7.0.15 '@types/semver': 7.5.5 '@typescript-eslint/scope-manager': 6.11.0 '@typescript-eslint/types': 6.11.0 '@typescript-eslint/typescript-estree': 6.11.0(typescript@5.2.2) - eslint: 8.53.0 + eslint: 8.54.0 semver: 7.5.4 transitivePeerDependencies: - supports-color @@ -1874,13 +1908,11 @@ packages: /acorn-walk@8.3.0: resolution: {integrity: sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA==} engines: {node: '>=0.4.0'} - dev: true /acorn@8.11.2: resolution: {integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==} engines: {node: '>=0.4.0'} hasBin: true - dev: true /ajv-formats@2.1.1(ajv@8.12.0): resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} @@ -1932,7 +1964,6 @@ packages: /ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - dev: true /ansi-regex@6.0.1: resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} @@ -1962,6 +1993,10 @@ packages: engines: {node: '>=12'} dev: true + /any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + dev: false + /anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} @@ -1970,6 +2005,11 @@ packages: picomatch: 2.3.1 dev: true + /app-root-path@3.1.0: + resolution: {integrity: sha512-biN3PwB2gUtjaYy/isrU3aNWI5w+fAfvHkSvCKeQGxhmYpwKFUxudR3Yya+KqVRHBmEDYh+/lTozYCFbmzX4nA==} + engines: {node: '>= 6.0.0'} + dev: false + /arch@2.2.0: resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} dev: true @@ -1980,7 +2020,6 @@ packages: /arg@4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} - dev: true /argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} @@ -2164,11 +2203,18 @@ packages: /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - dev: true /base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + /better-sqlite3@9.1.1: + resolution: {integrity: sha512-FhW7bS7cXwkB2SFnPJrSGPmQerVSCzwBgmQ1cIRcYKxLsyiKjljzCbyEqqhYXo5TTBqt5BISiBj2YE2Sy2ynaA==} + requiresBuild: true + dependencies: + bindings: 1.5.0 + prebuild-install: 7.1.1 + dev: false + /big-integer@1.6.51: resolution: {integrity: sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==} engines: {node: '>=0.6'} @@ -2204,13 +2250,18 @@ packages: engines: {node: '>=8'} dev: true + /bindings@1.5.0: + resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + dependencies: + file-uri-to-path: 1.0.0 + dev: false + /bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} dependencies: buffer: 5.7.1 inherits: 2.0.4 readable-stream: 3.6.2 - dev: true /bplist-parser@0.2.0: resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==} @@ -2230,7 +2281,6 @@ packages: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} dependencies: balanced-match: 1.0.2 - dev: true /braces@3.0.2: resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} @@ -2245,7 +2295,7 @@ packages: hasBin: true dependencies: caniuse-lite: 1.0.30001563 - electron-to-chromium: 1.4.587 + electron-to-chromium: 1.4.588 node-releases: 2.0.13 update-browserslist-db: 1.0.13(browserslist@4.22.1) dev: true @@ -2272,7 +2322,6 @@ packages: dependencies: base64-js: 1.5.1 ieee754: 1.2.1 - dev: true /buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} @@ -2373,6 +2422,10 @@ packages: fsevents: 2.3.3 dev: true + /chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + dev: false + /chrome-trace-event@1.0.3: resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} engines: {node: '>=6.0'} @@ -2404,6 +2457,19 @@ packages: restore-cursor: 3.1.0 dev: true + /cli-highlight@2.1.11: + resolution: {integrity: sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==} + engines: {node: '>=8.0.0', npm: '>=5.0.0'} + hasBin: true + dependencies: + chalk: 4.1.2 + highlight.js: 10.7.3 + mz: 2.7.0 + parse5: 5.1.1 + parse5-htmlparser2-tree-adapter: 6.0.1 + yargs: 16.2.0 + dev: false + /cli-spinners@2.9.1: resolution: {integrity: sha512-jHgecW0pxkonBJdrKsqxgRX9AcG+u/5k0Q7WPDfi8AogLAdwxEkyYYNWwZ5GvVFoFx2uiY1eNcSK00fh+1+FyQ==} engines: {node: '>=6'} @@ -2423,6 +2489,14 @@ packages: engines: {node: '>= 10'} dev: true + /cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: false + /cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} @@ -2430,7 +2504,6 @@ packages: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 7.0.0 - dev: true /clone-response@1.0.3: resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} @@ -2558,7 +2631,7 @@ packages: typescript: 5.2.2 dev: true - /create-jest@29.7.0(@types/node@20.9.1)(ts-node@10.9.1): + /create-jest@29.7.0(@types/node@20.9.2)(ts-node@10.9.1): resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -2567,7 +2640,7 @@ packages: chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@20.9.1)(ts-node@10.9.1) + jest-config: 29.7.0(@types/node@20.9.2)(ts-node@10.9.1) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -2579,7 +2652,6 @@ packages: /create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} - dev: true /cross-spawn@5.1.0: resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} @@ -2598,6 +2670,13 @@ packages: which: 2.0.2 dev: true + /date-fns@2.30.0: + resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} + engines: {node: '>=0.11'} + dependencies: + '@babel/runtime': 7.23.2 + dev: false + /debug@3.2.7: resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: @@ -2625,7 +2704,6 @@ packages: engines: {node: '>=10'} dependencies: mimic-response: 3.1.0 - dev: true /dedent@1.5.1: resolution: {integrity: sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==} @@ -2636,6 +2714,11 @@ packages: optional: true dev: true + /deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + dev: false + /deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} dev: true @@ -2643,7 +2726,6 @@ packages: /deepmerge@4.3.1: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} - dev: true /default-browser-id@3.0.0: resolution: {integrity: sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==} @@ -2702,6 +2784,11 @@ packages: engines: {node: '>=0.4.0'} dev: true + /detect-libc@2.0.2: + resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} + engines: {node: '>=8'} + dev: false + /detect-newline@3.1.0: resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} engines: {node: '>=8'} @@ -2722,7 +2809,6 @@ packages: /diff@4.0.2: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} - dev: true /dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} @@ -2745,12 +2831,40 @@ packages: esutils: 2.0.3 dev: true + /dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + + /domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + /domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + dependencies: + domelementtype: 2.3.0 + + /domutils@3.1.0: + resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + + /dotenv@16.3.1: + resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} + engines: {node: '>=12'} + dev: false + /eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} dev: true - /electron-to-chromium@1.4.587: - resolution: {integrity: sha512-RyJX0q/zOkAoefZhB9XHghGeATVP0Q3mwA253XD/zj2OeXc+JZB9pCaEv6R578JUYaWM9PRhye0kXvd/V1cQ3Q==} + /electron-to-chromium@1.4.588: + resolution: {integrity: sha512-soytjxwbgcCu7nh5Pf4S2/4wa6UIu+A3p03U2yVr53qGxi1/VTR3ENI+p50v+UxqqZAfl48j3z55ud7VHIOr9w==} dev: true /emittery@0.13.1: @@ -2760,7 +2874,6 @@ packages: /emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - dev: true /emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} @@ -2770,7 +2883,6 @@ packages: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} dependencies: once: 1.4.0 - dev: true /enhanced-resolve@5.15.0: resolution: {integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==} @@ -2780,6 +2892,10 @@ packages: tapable: 2.2.1 dev: true + /entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + /error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} dependencies: @@ -2862,7 +2978,6 @@ packages: /escalade@3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} - dev: true /escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} @@ -2877,14 +2992,13 @@ packages: /escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - dev: true /escape-string-regexp@5.0.0: resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} engines: {node: '>=12'} dev: true - /eslint-config-airbnb-base@15.0.0(eslint-plugin-import@2.29.0)(eslint@8.53.0): + /eslint-config-airbnb-base@15.0.0(eslint-plugin-import@2.29.0)(eslint@8.54.0): resolution: {integrity: sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==} engines: {node: ^10.12.0 || >=12.0.0} peerDependencies: @@ -2892,14 +3006,14 @@ packages: eslint-plugin-import: ^2.25.2 dependencies: confusing-browser-globals: 1.0.11 - eslint: 8.53.0 - eslint-plugin-import: 2.29.0(@typescript-eslint/parser@6.11.0)(eslint@8.53.0) + eslint: 8.54.0 + eslint-plugin-import: 2.29.0(@typescript-eslint/parser@6.11.0)(eslint@8.54.0) object.assign: 4.1.4 object.entries: 1.1.7 semver: 6.3.1 dev: true - /eslint-config-airbnb-typescript@17.1.0(@typescript-eslint/eslint-plugin@6.11.0)(@typescript-eslint/parser@6.11.0)(eslint-plugin-import@2.29.0)(eslint@8.53.0): + /eslint-config-airbnb-typescript@17.1.0(@typescript-eslint/eslint-plugin@6.11.0)(@typescript-eslint/parser@6.11.0)(eslint-plugin-import@2.29.0)(eslint@8.54.0): resolution: {integrity: sha512-GPxI5URre6dDpJ0CtcthSZVBAfI+Uw7un5OYNVxP2EYi3H81Jw701yFP7AU+/vCE7xBtFmjge7kfhhk4+RAiig==} peerDependencies: '@typescript-eslint/eslint-plugin': ^5.13.0 || ^6.0.0 @@ -2907,20 +3021,20 @@ packages: eslint: ^7.32.0 || ^8.2.0 eslint-plugin-import: ^2.25.3 dependencies: - '@typescript-eslint/eslint-plugin': 6.11.0(@typescript-eslint/parser@6.11.0)(eslint@8.53.0)(typescript@5.2.2) - '@typescript-eslint/parser': 6.11.0(eslint@8.53.0)(typescript@5.2.2) - eslint: 8.53.0 - eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.29.0)(eslint@8.53.0) - eslint-plugin-import: 2.29.0(@typescript-eslint/parser@6.11.0)(eslint@8.53.0) + '@typescript-eslint/eslint-plugin': 6.11.0(@typescript-eslint/parser@6.11.0)(eslint@8.54.0)(typescript@5.2.2) + '@typescript-eslint/parser': 6.11.0(eslint@8.54.0)(typescript@5.2.2) + eslint: 8.54.0 + eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.29.0)(eslint@8.54.0) + eslint-plugin-import: 2.29.0(@typescript-eslint/parser@6.11.0)(eslint@8.54.0) dev: true - /eslint-config-prettier@9.0.0(eslint@8.53.0): + /eslint-config-prettier@9.0.0(eslint@8.54.0): resolution: {integrity: sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==} hasBin: true peerDependencies: eslint: '>=7.0.0' dependencies: - eslint: 8.53.0 + eslint: 8.54.0 dev: true /eslint-import-resolver-node@0.3.9: @@ -2933,7 +3047,7 @@ packages: - supports-color dev: true - /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.11.0)(eslint-import-resolver-node@0.3.9)(eslint@8.53.0): + /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.11.0)(eslint-import-resolver-node@0.3.9)(eslint@8.54.0): resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} engines: {node: '>=4'} peerDependencies: @@ -2954,15 +3068,15 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 6.11.0(eslint@8.53.0)(typescript@5.2.2) + '@typescript-eslint/parser': 6.11.0(eslint@8.54.0)(typescript@5.2.2) debug: 3.2.7 - eslint: 8.53.0 + eslint: 8.54.0 eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color dev: true - /eslint-plugin-import@2.29.0(@typescript-eslint/parser@6.11.0)(eslint@8.53.0): + /eslint-plugin-import@2.29.0(@typescript-eslint/parser@6.11.0)(eslint@8.54.0): resolution: {integrity: sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg==} engines: {node: '>=4'} peerDependencies: @@ -2972,16 +3086,16 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 6.11.0(eslint@8.53.0)(typescript@5.2.2) + '@typescript-eslint/parser': 6.11.0(eslint@8.54.0)(typescript@5.2.2) array-includes: 3.1.7 array.prototype.findlastindex: 1.2.3 array.prototype.flat: 1.3.2 array.prototype.flatmap: 1.3.2 debug: 3.2.7 doctrine: 2.1.0 - eslint: 8.53.0 + eslint: 8.54.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.11.0)(eslint-import-resolver-node@0.3.9)(eslint@8.53.0) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.11.0)(eslint-import-resolver-node@0.3.9)(eslint@8.54.0) hasown: 2.0.0 is-core-module: 2.13.1 is-glob: 4.0.3 @@ -2997,7 +3111,7 @@ packages: - supports-color dev: true - /eslint-plugin-jest@27.6.0(@typescript-eslint/eslint-plugin@6.11.0)(eslint@8.53.0)(jest@29.7.0)(typescript@5.2.2): + /eslint-plugin-jest@27.6.0(@typescript-eslint/eslint-plugin@6.11.0)(eslint@8.54.0)(jest@29.7.0)(typescript@5.2.2): resolution: {integrity: sha512-MTlusnnDMChbElsszJvrwD1dN3x6nZl//s4JD23BxB6MgR66TZlL064su24xEIS3VACfAoHV1vgyMgPw8nkdng==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -3010,16 +3124,16 @@ packages: jest: optional: true dependencies: - '@typescript-eslint/eslint-plugin': 6.11.0(@typescript-eslint/parser@6.11.0)(eslint@8.53.0)(typescript@5.2.2) - '@typescript-eslint/utils': 5.62.0(eslint@8.53.0)(typescript@5.2.2) - eslint: 8.53.0 - jest: 29.7.0(@types/node@20.9.1)(ts-node@10.9.1) + '@typescript-eslint/eslint-plugin': 6.11.0(@typescript-eslint/parser@6.11.0)(eslint@8.54.0)(typescript@5.2.2) + '@typescript-eslint/utils': 5.62.0(eslint@8.54.0)(typescript@5.2.2) + eslint: 8.54.0 + jest: 29.7.0(@types/node@20.9.2)(ts-node@10.9.1) transitivePeerDependencies: - supports-color - typescript dev: true - /eslint-plugin-prettier@5.0.1(eslint-config-prettier@9.0.0)(eslint@8.53.0)(prettier@3.1.0): + /eslint-plugin-prettier@5.0.1(eslint-config-prettier@9.0.0)(eslint@8.54.0)(prettier@3.1.0): resolution: {integrity: sha512-m3u5RnR56asrwV/lDC4GHorlW75DsFfmUcjfCYylTUs85dBRnB7VM6xG8eCMJdeDRnppzmxZVf1GEPJvl1JmNg==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: @@ -3033,14 +3147,14 @@ packages: eslint-config-prettier: optional: true dependencies: - eslint: 8.53.0 - eslint-config-prettier: 9.0.0(eslint@8.53.0) + eslint: 8.54.0 + eslint-config-prettier: 9.0.0(eslint@8.54.0) prettier: 3.1.0 prettier-linter-helpers: 1.0.0 synckit: 0.8.5 dev: true - /eslint-plugin-unused-imports@3.0.0(@typescript-eslint/eslint-plugin@6.11.0)(eslint@8.53.0): + /eslint-plugin-unused-imports@3.0.0(@typescript-eslint/eslint-plugin@6.11.0)(eslint@8.54.0): resolution: {integrity: sha512-sduiswLJfZHeeBJ+MQaG+xYzSWdRXoSw61DpU13mzWumCkR0ufD0HmO4kdNokjrkluMHpj/7PJeN35pgbhW3kw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -3050,8 +3164,8 @@ packages: '@typescript-eslint/eslint-plugin': optional: true dependencies: - '@typescript-eslint/eslint-plugin': 6.11.0(@typescript-eslint/parser@6.11.0)(eslint@8.53.0)(typescript@5.2.2) - eslint: 8.53.0 + '@typescript-eslint/eslint-plugin': 6.11.0(@typescript-eslint/parser@6.11.0)(eslint@8.54.0)(typescript@5.2.2) + eslint: 8.54.0 eslint-rule-composer: 0.3.0 dev: true @@ -3081,15 +3195,15 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /eslint@8.53.0: - resolution: {integrity: sha512-N4VuiPjXDUa4xVeV/GC/RV3hQW9Nw+Y463lkWaKKXKYMvmRiRDAtfpuPFLN+E1/6ZhyR8J2ig+eVREnYgUsiag==} + /eslint@8.54.0: + resolution: {integrity: sha512-NY0DfAkM8BIZDVl6PgSa1ttZbx3xHgJzSNJKYcQglem6CppHyMhRIQkBVSSMaSRnLhig3jsDbEzOjwCVt4AmmA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.53.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.54.0) '@eslint-community/regexpp': 4.10.0 '@eslint/eslintrc': 2.1.3 - '@eslint/js': 8.53.0 + '@eslint/js': 8.54.0 '@humanwhocodes/config-array': 0.11.13 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 @@ -3251,6 +3365,11 @@ packages: engines: {node: '>= 0.8.0'} dev: true + /expand-template@2.0.3: + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} + dev: false + /expect@29.7.0: resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -3367,7 +3486,7 @@ packages: find-my-way: 7.7.0 light-my-request: 5.11.0 pino: 8.16.2 - process-warning: 2.3.0 + process-warning: 2.3.1 proxy-addr: 2.0.7 rfdc: 1.3.0 secure-json-parse: 2.7.0 @@ -3411,6 +3530,10 @@ packages: token-types: 5.0.1 dev: true + /file-uri-to-path@1.0.0: + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + dev: false + /filename-reserved-regex@3.0.0: resolution: {integrity: sha512-hn4cQfU6GOT/7cFHXBqeBg2TbrMBgdD0kcjLhvSQYYwm3s4B6cjvBfb7nBALJLAXqmU5xajSa7X2NnUud/VCdw==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -3537,6 +3660,10 @@ packages: engines: {node: '>= 0.6'} dev: false + /fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + dev: false + /fs-extra@10.1.0: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} engines: {node: '>=12'} @@ -3552,7 +3679,6 @@ packages: /fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - dev: true /fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} @@ -3588,7 +3714,6 @@ packages: /get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - dev: true /get-intrinsic@1.2.2: resolution: {integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==} @@ -3629,6 +3754,10 @@ packages: get-intrinsic: 1.2.2 dev: true + /github-from-package@0.0.0: + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + dev: false + /glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -3670,6 +3799,17 @@ packages: path-is-absolute: 1.0.1 dev: true + /glob@8.1.0: + resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} + engines: {node: '>=12'} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 5.1.6 + once: 1.4.0 + dev: false + /glob@9.3.5: resolution: {integrity: sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==} engines: {node: '>=16 || 14 >=14.17'} @@ -3795,10 +3935,22 @@ packages: engines: {node: '>=8'} dev: true + /highlight.js@10.7.3: + resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} + dev: false + /html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} dev: true + /htmlparser2@8.0.2: + resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.1.0 + entities: 4.5.0 + /http-cache-semantics@4.1.1: resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} dev: true @@ -3868,11 +4020,13 @@ packages: dependencies: once: 1.4.0 wrappy: 1.0.2 - dev: true /inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - dev: true + + /ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + dev: false /inquirer@8.2.4: resolution: {integrity: sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==} @@ -4006,7 +4160,6 @@ packages: /is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} - dev: true /is-generator-fn@2.1.0: resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} @@ -4060,6 +4213,11 @@ packages: engines: {node: '>=0.10.0'} dev: true + /is-plain-object@5.0.0: + resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} + engines: {node: '>=0.10.0'} + dev: false + /is-regex@1.1.4: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} @@ -4225,7 +4383,7 @@ packages: '@jest/expect': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.9.1 + '@types/node': 20.9.2 chalk: 4.1.2 co: 4.6.0 dedent: 1.5.1 @@ -4246,7 +4404,7 @@ packages: - supports-color dev: true - /jest-cli@29.7.0(@types/node@20.9.1)(ts-node@10.9.1): + /jest-cli@29.7.0(@types/node@20.9.2)(ts-node@10.9.1): resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -4260,10 +4418,10 @@ packages: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@20.9.1)(ts-node@10.9.1) + create-jest: 29.7.0(@types/node@20.9.2)(ts-node@10.9.1) exit: 0.1.2 import-local: 3.1.0 - jest-config: 29.7.0(@types/node@20.9.1)(ts-node@10.9.1) + jest-config: 29.7.0(@types/node@20.9.2)(ts-node@10.9.1) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -4274,7 +4432,7 @@ packages: - ts-node dev: true - /jest-config@29.7.0(@types/node@20.9.1)(ts-node@10.9.1): + /jest-config@29.7.0(@types/node@20.9.2)(ts-node@10.9.1): resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -4289,7 +4447,7 @@ packages: '@babel/core': 7.23.3 '@jest/test-sequencer': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.9.1 + '@types/node': 20.9.2 babel-jest: 29.7.0(@babel/core@7.23.3) chalk: 4.1.2 ci-info: 3.9.0 @@ -4309,7 +4467,7 @@ packages: pretty-format: 29.7.0 slash: 3.0.0 strip-json-comments: 3.1.1 - ts-node: 10.9.1(@swc/core@1.3.96)(@types/node@20.9.1)(typescript@5.2.2) + ts-node: 10.9.1(@swc/core@1.3.96)(@types/node@20.9.2)(typescript@5.2.2) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -4350,7 +4508,7 @@ packages: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.9.1 + '@types/node': 20.9.2 jest-mock: 29.7.0 jest-util: 29.7.0 dev: true @@ -4366,7 +4524,7 @@ packages: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.9 - '@types/node': 20.9.1 + '@types/node': 20.9.2 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -4417,7 +4575,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 20.9.1 + '@types/node': 20.9.2 jest-util: 29.7.0 dev: true @@ -4472,7 +4630,7 @@ packages: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.9.1 + '@types/node': 20.9.2 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 @@ -4503,7 +4661,7 @@ packages: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.9.1 + '@types/node': 20.9.2 chalk: 4.1.2 cjs-module-lexer: 1.2.3 collect-v8-coverage: 1.0.2 @@ -4555,7 +4713,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 20.9.1 + '@types/node': 20.9.2 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -4580,7 +4738,7 @@ packages: dependencies: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.9.1 + '@types/node': 20.9.2 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -4592,7 +4750,7 @@ packages: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 20.9.1 + '@types/node': 20.9.2 merge-stream: 2.0.0 supports-color: 8.1.1 dev: true @@ -4601,13 +4759,13 @@ packages: resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@types/node': 20.9.1 + '@types/node': 20.9.2 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 dev: true - /jest@29.7.0(@types/node@20.9.1)(ts-node@10.9.1): + /jest@29.7.0(@types/node@20.9.2)(ts-node@10.9.1): resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -4620,7 +4778,7 @@ packages: '@jest/core': 29.7.0(ts-node@10.9.1) '@jest/types': 29.6.3 import-local: 3.1.0 - jest-cli: 29.7.0(@types/node@20.9.1)(ts-node@10.9.1) + jest-cli: 29.7.0(@types/node@20.9.2)(ts-node@10.9.1) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -4733,7 +4891,7 @@ packages: resolution: {integrity: sha512-qkFCeloXCOMpmEdZ/MV91P8AT4fjwFXWaAFz3lUeStM8RcoM1ks4J/F8r1b3r6y/H4u3ACEJ1T+Gv5bopj7oDA==} dependencies: cookie: 0.5.0 - process-warning: 2.3.0 + process-warning: 2.3.1 set-cookie-parser: 2.6.0 dev: false @@ -4784,11 +4942,9 @@ packages: engines: {node: '>=8'} dev: true - /lru-cache@10.0.2: - resolution: {integrity: sha512-Yj9mA8fPiVgOUpByoTZO5pNrcl5Yk37FcSHsUINpAsaBIEZIuqcCclDZJCVxqQShDsmYX8QG63svJiTbOATZwg==} + /lru-cache@10.0.3: + resolution: {integrity: sha512-B7gr+F6MkqB3uzINHXNctGieGsRTMwIBgxkp0yq/5BwcuDzD4A8wQpHQW6vDAm1uKSLQghmRdD9sKqf2vJ1cEg==} engines: {node: 14 || >=16.14} - dependencies: - semver: 7.5.4 dev: true /lru-cache@4.1.5: @@ -4831,7 +4987,6 @@ packages: /make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - dev: true /makeerror@1.0.12: resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} @@ -4904,7 +5059,6 @@ packages: /mimic-response@3.1.0: resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} engines: {node: '>=10'} - dev: true /minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -4912,6 +5066,13 @@ packages: brace-expansion: 1.1.11 dev: true + /minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + dependencies: + brace-expansion: 2.0.1 + dev: false + /minimatch@8.0.4: resolution: {integrity: sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==} engines: {node: '>=16 || 14 >=14.17'} @@ -4928,7 +5089,6 @@ packages: /minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - dev: true /minipass@4.2.8: resolution: {integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==} @@ -4940,6 +5100,16 @@ packages: engines: {node: '>=16 || 14 >=14.17'} dev: true + /mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + dev: false + + /mkdirp@2.1.6: + resolution: {integrity: sha512-+hEnITedc8LAtIP9u3HJDFIdcLV2vXP33sqLLIzkv1Db1zO/1OxbvYf0Y1OC/S/Qo5dxHXepofhmxL02PsKe+A==} + engines: {node: '>=10'} + hasBin: true + dev: false + /mnemonist@0.39.5: resolution: {integrity: sha512-FPUtkhtJ0efmEFGpU14x7jGbTB+s18LrzRL2KgoWz9YvcY3cPomz8tih01GbHwnGk/OmkOKfqd/RAQoc8Lm7DQ==} dependencies: @@ -4957,6 +5127,24 @@ packages: resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} dev: true + /mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + dev: false + + /nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: false + + /napi-build-utils@1.0.2: + resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} + dev: false + /natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} dev: true @@ -4965,6 +5153,13 @@ packages: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} dev: true + /node-abi@3.51.0: + resolution: {integrity: sha512-SQkEP4hmNWjlniS5zdnfIXTk1x7Ome85RDzHlTbBtzE97Gfwz/Ipw4v/Ryk20DWIy3yCNVLVlGKApCnmvYoJbA==} + engines: {node: '>=10'} + dependencies: + semver: 7.5.4 + dev: false + /node-abort-controller@3.1.1: resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==} dev: true @@ -5025,6 +5220,11 @@ packages: path-key: 4.0.0 dev: true + /object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + dev: false + /object-inspect@1.13.1: resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} dev: true @@ -5093,7 +5293,6 @@ packages: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: wrappy: 1.0.2 - dev: true /onetime@5.1.2: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} @@ -5226,6 +5425,24 @@ packages: lines-and-columns: 1.2.4 dev: true + /parse-srcset@1.0.2: + resolution: {integrity: sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q==} + dev: false + + /parse5-htmlparser2-tree-adapter@6.0.1: + resolution: {integrity: sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==} + dependencies: + parse5: 6.0.1 + dev: false + + /parse5@5.1.1: + resolution: {integrity: sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==} + dev: false + + /parse5@6.0.1: + resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} + dev: false + /path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -5259,7 +5476,7 @@ packages: resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} engines: {node: '>=16 || 14 >=14.17'} dependencies: - lru-cache: 10.0.2 + lru-cache: 10.0.3 minipass: 7.0.4 dev: true @@ -5282,7 +5499,6 @@ packages: /picocolors@1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} - dev: true /picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} @@ -5314,7 +5530,7 @@ packages: on-exit-leak-free: 2.1.2 pino-abstract-transport: 1.1.0 pino-std-serializers: 6.2.2 - process-warning: 2.3.0 + process-warning: 2.3.1 quick-format-unescaped: 4.0.4 real-require: 0.2.0 safe-stable-stringify: 2.4.3 @@ -5339,6 +5555,34 @@ packages: engines: {node: '>=4'} dev: true + /postcss@8.4.31: + resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: false + + /prebuild-install@7.1.1: + resolution: {integrity: sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==} + engines: {node: '>=10'} + hasBin: true + dependencies: + detect-libc: 2.0.2 + expand-template: 2.0.3 + github-from-package: 0.0.0 + minimist: 1.2.8 + mkdirp-classic: 0.5.3 + napi-build-utils: 1.0.2 + node-abi: 3.51.0 + pump: 3.0.0 + rc: 1.2.8 + simple-get: 4.0.1 + tar-fs: 2.1.1 + tunnel-agent: 0.6.0 + dev: false + /prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} @@ -5366,8 +5610,8 @@ packages: react-is: 18.2.0 dev: true - /process-warning@2.3.0: - resolution: {integrity: sha512-N6mp1+2jpQr3oCFMz6SeHRGbv6Slb20bRhj4v3xR99HqNToAcOe1MFOp4tytyzOfJn+QtN8Rf7U/h2KAn4kC6g==} + /process-warning@2.3.1: + resolution: {integrity: sha512-JjBvFEn7MwFbzUDa2SRtKJSsyO0LlER4V/FmwLMhBlXNbGgGxdyFCxIdMDLerWUycsVUyaoM9QFLvppFy4IWaQ==} dev: false /process@0.11.10: @@ -5400,7 +5644,6 @@ packages: dependencies: end-of-stream: 1.4.4 once: 1.4.0 - dev: true /punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} @@ -5436,6 +5679,16 @@ packages: safe-buffer: 5.2.1 dev: true + /rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + dev: false + /react-is@18.2.0: resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} dev: true @@ -5447,7 +5700,6 @@ packages: inherits: 2.0.4 string_decoder: 1.3.0 util-deprecate: 1.0.2 - dev: true /readable-stream@4.4.2: resolution: {integrity: sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==} @@ -5489,6 +5741,10 @@ packages: /reflect-metadata@0.1.13: resolution: {integrity: sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==} + /regenerator-runtime@0.14.0: + resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==} + dev: false + /regexp.prototype.flags@1.5.1: resolution: {integrity: sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==} engines: {node: '>= 0.4'} @@ -5506,7 +5762,6 @@ packages: /require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} - dev: true /require-from-string@2.0.2: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} @@ -5648,6 +5903,17 @@ packages: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} dev: true + /sanitize-html@2.11.0: + resolution: {integrity: sha512-BG68EDHRaGKqlsNjJ2xUB7gpInPA8gVx/mvjO743hZaeMCZ2DwzW7xvsqZ+KNU4QKwj86HJ3uu2liISf2qBBUA==} + dependencies: + deepmerge: 4.3.1 + escape-string-regexp: 4.0.0 + htmlparser2: 8.0.2 + is-plain-object: 5.0.0 + parse-srcset: 1.0.2 + postcss: 8.4.31 + dev: false + /schema-utils@3.3.0: resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} engines: {node: '>= 10.13.0'} @@ -5714,6 +5980,14 @@ packages: has-property-descriptors: 1.0.1 dev: true + /sha.js@2.4.11: + resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} + hasBin: true + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: false + /shebang-command@1.2.0: resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} engines: {node: '>=0.10.0'} @@ -5765,6 +6039,18 @@ packages: engines: {node: '>=14'} dev: true + /simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + dev: false + + /simple-get@4.0.1: + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + dev: false + /sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} dev: true @@ -5794,6 +6080,11 @@ packages: is-plain-obj: 1.1.0 dev: true + /source-map-js@1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + dev: false + /source-map-support@0.5.13: resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} dependencies: @@ -5849,7 +6140,6 @@ packages: emoji-regex: 8.0.0 is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - dev: true /string-width@5.1.2: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} @@ -5895,7 +6185,6 @@ packages: engines: {node: '>=8'} dependencies: ansi-regex: 5.0.1 - dev: true /strip-ansi@7.1.0: resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} @@ -5929,6 +6218,11 @@ packages: engines: {node: '>=12'} dev: true + /strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + dev: false + /strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} @@ -6022,6 +6316,26 @@ packages: engines: {node: '>=6'} dev: true + /tar-fs@2.1.1: + resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.0 + tar-stream: 2.2.0 + dev: false + + /tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: false + /terser-webpack-plugin@5.3.9(@swc/core@1.3.96)(webpack@5.89.0): resolution: {integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==} engines: {node: '>= 10.13.0'} @@ -6071,6 +6385,19 @@ packages: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} dev: true + /thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + dependencies: + thenify: 3.3.1 + dev: false + + /thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + dependencies: + any-promise: 1.3.0 + dev: false + /thread-stream@2.4.1: resolution: {integrity: sha512-d/Ex2iWd1whipbT681JmTINKw0ZwOUBZm7+Gjs64DHuX34mmw8vJL2bFAaNacaW72zYiTJxSHi5abUuOi5nsfg==} dependencies: @@ -6170,7 +6497,7 @@ packages: '@babel/core': 7.23.3 bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@20.9.1)(ts-node@10.9.1) + jest: 29.7.0(@types/node@20.9.2)(ts-node@10.9.1) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -6196,7 +6523,7 @@ packages: webpack: 5.89.0(@swc/core@1.3.96) dev: true - /ts-node@10.9.1(@swc/core@1.3.96)(@types/node@20.9.1)(typescript@5.2.2): + /ts-node@10.9.1(@swc/core@1.3.96)(@types/node@20.9.2)(typescript@5.2.2): resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: @@ -6216,7 +6543,7 @@ packages: '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 20.9.1 + '@types/node': 20.9.2 acorn: 8.11.2 acorn-walk: 8.3.0 arg: 4.1.3 @@ -6226,7 +6553,6 @@ packages: typescript: 5.2.2 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - dev: true /tsconfig-paths-webpack-plugin@4.1.0: resolution: {integrity: sha512-xWFISjviPydmtmgeUAuXp4N1fky+VCtfhOkDUFIv5ea7p4wuTomI4QTrXvFBX2S4jZsmyTSrStQl+E+4w+RzxA==} @@ -6272,6 +6598,12 @@ packages: typescript: 5.2.2 dev: true + /tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + dependencies: + safe-buffer: 5.2.1 + dev: false + /type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -6332,11 +6664,89 @@ packages: is-typed-array: 1.1.12 dev: true + /typeorm@0.3.17(better-sqlite3@9.1.1)(ts-node@10.9.1): + resolution: {integrity: sha512-UDjUEwIQalO9tWw9O2A4GU+sT3oyoUXheHJy4ft+RFdnRdQctdQ34L9SqE2p7LdwzafHx1maxT+bqXON+Qnmig==} + engines: {node: '>= 12.9.0'} + hasBin: true + peerDependencies: + '@google-cloud/spanner': ^5.18.0 + '@sap/hana-client': ^2.12.25 + better-sqlite3: ^7.1.2 || ^8.0.0 + hdb-pool: ^0.1.6 + ioredis: ^5.0.4 + mongodb: ^5.2.0 + mssql: ^9.1.1 + mysql2: ^2.2.5 || ^3.0.1 + oracledb: ^5.1.0 + pg: ^8.5.1 + pg-native: ^3.0.0 + pg-query-stream: ^4.0.0 + redis: ^3.1.1 || ^4.0.0 + sql.js: ^1.4.0 + sqlite3: ^5.0.3 + ts-node: ^10.7.0 + typeorm-aurora-data-api-driver: ^2.0.0 + peerDependenciesMeta: + '@google-cloud/spanner': + optional: true + '@sap/hana-client': + optional: true + better-sqlite3: + optional: true + hdb-pool: + optional: true + ioredis: + optional: true + mongodb: + optional: true + mssql: + optional: true + mysql2: + optional: true + oracledb: + optional: true + pg: + optional: true + pg-native: + optional: true + pg-query-stream: + optional: true + redis: + optional: true + sql.js: + optional: true + sqlite3: + optional: true + ts-node: + optional: true + typeorm-aurora-data-api-driver: + optional: true + dependencies: + '@sqltools/formatter': 1.2.5 + app-root-path: 3.1.0 + better-sqlite3: 9.1.1 + buffer: 6.0.3 + chalk: 4.1.2 + cli-highlight: 2.1.11 + date-fns: 2.30.0 + debug: 4.3.4 + dotenv: 16.3.1 + glob: 8.1.0 + mkdirp: 2.1.6 + reflect-metadata: 0.1.13 + sha.js: 2.4.11 + ts-node: 10.9.1(@swc/core@1.3.96)(@types/node@20.9.2)(typescript@5.2.2) + tslib: 2.6.2 + uuid: 9.0.1 + yargs: 17.7.2 + transitivePeerDependencies: + - supports-color + dev: false + /typescript@5.2.2: resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} engines: {node: '>=14.17'} hasBin: true - dev: true /uid@2.0.2: resolution: {integrity: sha512-u3xV3X7uzvi5b1MncmZo3i2Aw222Zk1keqLA1YkHldREkAhAqi65wuPfe7lHx8H/Wzy+8CE7S7uS3jekIM5s8g==} @@ -6355,7 +6765,6 @@ packages: /undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - dev: true /universalify@2.0.1: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} @@ -6385,11 +6794,14 @@ packages: /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - dev: true + + /uuid@9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + hasBin: true + dev: false /v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} - dev: true /v8-to-istanbul@9.1.3: resolution: {integrity: sha512-9lDD+EVI2fjFsMWXc6dy5JJzBsVTcQ2fVkfBvncZ6xJWG9wtBhOldG+mHkSL0+V1K/xgZz0JDO5UT5hFwHUghg==} @@ -6542,7 +6954,6 @@ packages: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - dev: true /wrap-ansi@8.1.0: resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} @@ -6555,7 +6966,6 @@ packages: /wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - dev: true /write-file-atomic@4.0.2: resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} @@ -6568,7 +6978,6 @@ packages: /y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} - dev: true /yallist@2.1.2: resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} @@ -6581,10 +6990,27 @@ packages: /yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + /yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + dev: false + /yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} - dev: true + + /yargs@16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} + dependencies: + cliui: 7.0.4 + escalade: 3.1.1 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.9 + dev: false /yargs@17.7.2: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} @@ -6597,18 +7023,12 @@ packages: string-width: 4.2.3 y18n: 5.0.8 yargs-parser: 21.1.1 - dev: true /yn@3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} engines: {node: '>=6'} - dev: true /yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} dev: true - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false diff --git a/src/app.module.ts b/src/app.module.ts index 6b83193..b257476 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -1,20 +1,13 @@ import { Module } from '@nestjs/common'; +import { database } from '@/config'; import { ContentModule } from '@/modules/content/content.module'; +import { CoreModule } from '@/modules/core/core.module'; +import { DatabaseModule } from '@/modules/database/database.module'; import { WelcomeModule } from '@/modules/welcome/welcome.module'; -import { CoreModule } from './modules/core/core.module'; - @Module({ - imports: [ - ContentModule, - WelcomeModule, - CoreModule.forRoot({ - config: { - name: '欢迎访问 Ink NestJS API !', - }, - }), - ], + imports: [DatabaseModule.forRoot(database), ContentModule, WelcomeModule, CoreModule.forRoot()], controllers: [], providers: [], }) diff --git a/src/config/database.config.ts b/src/config/database.config.ts new file mode 100644 index 0000000..dcb9b3e --- /dev/null +++ b/src/config/database.config.ts @@ -0,0 +1,23 @@ +import { resolve } from 'path'; + +import { TypeOrmModuleOptions } from '@nestjs/typeorm'; + +/** + * 数据库配置 + */ +export const database = (): TypeOrmModuleOptions => ({ + // 以下为mysql配置 + // charset: 'utf8mb4', + // logging: ['error'], + // type: 'mysql', + // host: '127.0.0.1', + // port: 3306, + // username: 'root', + // password: '123456789', + // database: 'ink_apps', + // 以下为sqlite配置 + type: 'better-sqlite3', + database: resolve(__dirname, '../../back/database4.db'), + synchronize: true, + autoLoadEntities: true, +}); diff --git a/src/config/index.ts b/src/config/index.ts new file mode 100644 index 0000000..64341a6 --- /dev/null +++ b/src/config/index.ts @@ -0,0 +1 @@ +export * from './database.config'; diff --git a/src/main.ts b/src/main.ts index 2d0ecd8..ffd203a 100644 --- a/src/main.ts +++ b/src/main.ts @@ -9,8 +9,10 @@ const bootstrap = async () => { logger: ['error', 'warn'], }); + app.setGlobalPrefix('api'); + await app.listen(2333, () => { - console.log('api: http://localhost:2333'); + console.log('api: http://localhost:2333/api'); }); }; diff --git a/src/modules/content/constants.ts b/src/modules/content/constants.ts new file mode 100644 index 0000000..f149fed --- /dev/null +++ b/src/modules/content/constants.ts @@ -0,0 +1,17 @@ +/** + * 文章内容类型 + */ +export enum PostBodyType { + HTML = 'html', + MD = 'markdown', +} + +/** + * 文章排序类型 + */ +export enum PostOrderType { + CREATED = 'createdAt', + UPDATED = 'updatedAt', + PUBLISHED = 'publishedAt', + CUSTOM = 'custom', +} diff --git a/src/modules/content/content.module.ts b/src/modules/content/content.module.ts index 2ca4b36..80f4b5d 100644 --- a/src/modules/content/content.module.ts +++ b/src/modules/content/content.module.ts @@ -1,11 +1,22 @@ import { Module } from '@nestjs/common'; -import { PostController } from './controllers'; -import { PostService } from './services'; +import { TypeOrmModule } from '@nestjs/typeorm'; + +import { PostController } from '@/modules/content/controllers'; +import { PostEntity } from '@/modules/content/entities'; + +import { PostRepository } from '@/modules/content/repositories'; +import { PostService, SanitizeService } from '@/modules/content/services'; +import { PostSubscriber } from '@/modules/content/subscribers'; +import { DatabaseModule } from '@/modules/database/database.module'; @Module({ + imports: [ + TypeOrmModule.forFeature([PostEntity]), + DatabaseModule.forRepository([PostRepository]), + ], controllers: [PostController], - providers: [PostService], - exports: [PostService], + providers: [PostService, PostSubscriber, SanitizeService], + exports: [PostService, DatabaseModule.forRepository([PostRepository])], }) export class ContentModule {} diff --git a/src/modules/content/controllers/post.controller.ts b/src/modules/content/controllers/post.controller.ts index b6bfaee..579a54c 100644 --- a/src/modules/content/controllers/post.controller.ts +++ b/src/modules/content/controllers/post.controller.ts @@ -1,24 +1,38 @@ -import { Body, Controller, Delete, Get, Param, Patch, Post, ValidationPipe } from '@nestjs/common'; +import { + Body, + Controller, + Delete, + Get, + Param, + ParseUUIDPipe, + Patch, + Post, + Query, + ValidationPipe, +} from '@nestjs/common'; -import { CreatePostDto, UpdatePostDto } from '../dtos'; -import { PostService } from '../services'; +import { PostService } from '@/modules/content/services'; +import { PaginateOptions } from '@/modules/database/types'; /** * 文章控制器 * 负责处理与文章相关的请求,如获取文章列表、创建新文章等。 */ -@Controller('post') +@Controller('posts') export class PostController { constructor(private postService: PostService) {} @Get() - async index() { - return this.postService.findAll(); + async list( + @Query() + options: PaginateOptions, + ) { + return this.postService.paginate(options); } @Get(':id') - async show(@Param('id') id: number) { - return this.postService.findOne(id); + async detail(@Param('id', new ParseUUIDPipe()) id: string) { + return this.postService.detail(id); } @Post() @@ -32,7 +46,7 @@ export class PostController { groups: ['create'], }), ) - data: CreatePostDto, + data: RecordAny, ) { return this.postService.create(data); } @@ -48,13 +62,13 @@ export class PostController { groups: ['update'], }), ) - data: UpdatePostDto, + data: RecordAny, ) { return this.postService.update(data); } @Delete(':id') - async delete(@Param('id') id: number) { + async delete(@Param('id', new ParseUUIDPipe()) id: string) { return this.postService.delete(id); } } diff --git a/src/modules/content/entities/index.ts b/src/modules/content/entities/index.ts new file mode 100644 index 0000000..b2450aa --- /dev/null +++ b/src/modules/content/entities/index.ts @@ -0,0 +1 @@ +export * from './post.entity'; diff --git a/src/modules/content/entities/post.entity.ts b/src/modules/content/entities/post.entity.ts new file mode 100644 index 0000000..c93c0ac --- /dev/null +++ b/src/modules/content/entities/post.entity.ts @@ -0,0 +1,43 @@ +import { + BaseEntity, + Column, + CreateDateColumn, + Entity, + PrimaryColumn, + UpdateDateColumn, +} from 'typeorm'; + +import { PostBodyType } from '@/modules/content/constants'; + +@Entity('content_posts') +export class PostEntity extends BaseEntity { + @PrimaryColumn({ type: 'varchar', generated: 'uuid', length: '36' }) + id: string; + + @Column({ comment: '文章标题' }) + title: string; + + @Column({ comment: '文章内容', type: 'text' }) + body: string; + + @Column({ comment: '文章摘要', nullable: true }) + summary: string; + + @Column({ comment: '关键字', type: 'simple-array', nullable: true }) + keywords?: string[]; + + @Column({ comment: '文章类型', type: 'varchar', default: PostBodyType.MD }) + type: PostBodyType; + + @Column({ comment: '发布时间', type: 'varchar', nullable: true }) + publishedAt?: Date | null; + + @CreateDateColumn({ comment: '创建时间' }) + createdAt: Date; + + @UpdateDateColumn({ comment: '更新时间' }) + updatedAt: Date; + + @Column({ comment: '文章自定义排序', default: 0 }) + customOrder: number; +} diff --git a/src/modules/content/repositories/index.ts b/src/modules/content/repositories/index.ts new file mode 100644 index 0000000..626f965 --- /dev/null +++ b/src/modules/content/repositories/index.ts @@ -0,0 +1 @@ +export * from './post.repository'; diff --git a/src/modules/content/repositories/post.repository.ts b/src/modules/content/repositories/post.repository.ts new file mode 100644 index 0000000..1e8d443 --- /dev/null +++ b/src/modules/content/repositories/post.repository.ts @@ -0,0 +1,11 @@ +import { Repository } from 'typeorm'; + +import { PostEntity } from '@/modules/content/entities'; +import { CustomRepository } from '@/modules/database/decorators'; + +@CustomRepository(PostEntity) +export class PostRepository extends Repository { + buildBaseQB() { + return this.createQueryBuilder('post'); + } +} diff --git a/src/modules/content/services/index.ts b/src/modules/content/services/index.ts index 588bc86..e0eabc7 100644 --- a/src/modules/content/services/index.ts +++ b/src/modules/content/services/index.ts @@ -1 +1,2 @@ export * from './post.service'; +export * from './sanitize.service'; diff --git a/src/modules/content/services/post.service.ts b/src/modules/content/services/post.service.ts index e52a668..3205bd5 100644 --- a/src/modules/content/services/post.service.ts +++ b/src/modules/content/services/post.service.ts @@ -1,64 +1,119 @@ -import { Injectable, NotFoundException } from '@nestjs/common'; +import { Injectable } from '@nestjs/common'; -import { isNil } from 'lodash'; +import { isFunction, isNil, omit } from 'lodash'; -import { CreatePostDto, UpdatePostDto } from '../dtos'; +import { EntityNotFoundError, IsNull, Not, SelectQueryBuilder } from 'typeorm'; -import { PostEntity } from '../types'; +import { PostOrderType } from '@/modules/content/constants'; +import { PostEntity } from '@/modules/content/entities'; +import { PostRepository } from '@/modules/content/repositories'; + +import { paginate } from '@/modules/database/helpers'; +import { PaginateOptions, QueryHook } from '@/modules/database/types'; @Injectable() export class PostService { - protected posts: PostEntity[] = [ - { title: '第一篇文章标题', body: '第一篇文章内容' }, - { title: '第二篇文章标题', body: '第二篇文章内容' }, - { title: '第三篇文章标题', body: '第三篇文章内容' }, - { title: '第四篇文章标题', body: '第四篇文章内容' }, - { title: '第五篇文章标题', body: '第五篇文章内容' }, - { title: '第六篇文章标题', body: '第六篇文章内容' }, - ].map((v, id) => ({ ...v, id })); + constructor(protected repository: PostRepository) {} - async findAll() { - return this.posts; + /** + * 获取分页数据 + * @param options 分页选项 + * @param callback 添加额外的查询 + */ + async paginate(options: PaginateOptions, callback?: QueryHook) { + const qb = await this.buildListQuery(this.repository.buildBaseQB(), options, callback); + return paginate(qb, options); } - async findOne(id: number) { - const post = this.posts.find((item) => item.id === id); - - if (isNil(post)) throw new NotFoundException(`id: ${id} 文章不存在`); - - return post; + /** + * 查询单篇文章 + * @param id + * @param callback 添加额外的查询 + */ + async detail(id: string, callback?: QueryHook) { + let qb = this.repository.buildBaseQB(); + qb.where(`post.id = :id`, { id }); + qb = !isNil(callback) && isFunction(callback) ? await callback(qb) : qb; + const item = await qb.getOne(); + if (!item) throw new EntityNotFoundError(PostEntity, `The post ${id} not exists!`); + return item; } - async create(data: CreatePostDto) { - const newPost: PostEntity = { - id: Math.max(...this.posts.map(({ id }) => id + 1)), - ...data, - }; + /** + * 创建文章 + * @param data + */ + async create(data: Record) { + const item = await this.repository.save(data); - this.posts.push(newPost); - - return newPost; + return this.detail(item.id); } - async update(data: UpdatePostDto) { - let toUpdate = this.posts.find((item) => item.id === data.id); - - if (isNil(toUpdate)) throw new NotFoundException(`id: ${data.id} 文章不存在`); - - toUpdate = { ...toUpdate, ...data }; - - this.posts = this.posts.map((item) => (item.id === data.id ? toUpdate : item)); - - return toUpdate; + /** + * 更新文章 + * @param data + */ + async update(data: Record) { + await this.repository.update(data.id, omit(data, ['id'])); + return this.detail(data.id); } - async delete(id: number) { - const toDelete = this.posts.find((item) => item.id === id); + /** + * 删除文章 + * @param id + */ + async delete(id: string) { + const item = await this.repository.findOneByOrFail({ id }); + return this.repository.remove(item); + } - if (isNil(toDelete)) throw new NotFoundException(`id: ${id} 文章不存在`); + /** + * 构建文章列表查询器 + * @param qb 初始查询构造器 + * @param options 排查分页选项后的查询选项 + * @param callback 添加额外的查询 + */ + protected async buildListQuery( + qb: SelectQueryBuilder, + options: Record, + callback?: QueryHook, + ) { + const { orderBy, isPublished } = options; + let newQb = qb; + if (typeof isPublished === 'boolean') { + newQb = isPublished + ? newQb.where({ + publishedAt: Not(IsNull()), + }) + : newQb.where({ + publishedAt: IsNull(), + }); + } + newQb = this.queryOrderBy(newQb, orderBy); + if (callback) return callback(newQb); + return newQb; + } - this.posts = this.posts.filter((item) => item.id !== id); - - return toDelete; + /** + * 对文章进行排序的Query构建 + * @param qb + * @param orderBy 排序方式 + */ + protected queryOrderBy(qb: SelectQueryBuilder, orderBy?: PostOrderType) { + switch (orderBy) { + case PostOrderType.CREATED: + return qb.orderBy('post.createdAt', 'DESC'); + case PostOrderType.UPDATED: + return qb.orderBy('post.updatedAt', 'DESC'); + case PostOrderType.PUBLISHED: + return qb.orderBy('post.publishedAt', 'DESC'); + case PostOrderType.CUSTOM: + return qb.orderBy('customOrder', 'DESC'); + default: + return qb + .orderBy('post.createdAt', 'DESC') + .addOrderBy('post.updatedAt', 'DESC') + .addOrderBy('post.publishedAt', 'DESC'); + } } } diff --git a/src/modules/content/services/sanitize.service.ts b/src/modules/content/services/sanitize.service.ts new file mode 100644 index 0000000..d43a930 --- /dev/null +++ b/src/modules/content/services/sanitize.service.ts @@ -0,0 +1,26 @@ +import { Injectable } from '@nestjs/common'; +import sanitizeHtml from 'sanitize-html'; + +import { deepMerge } from '@/modules/core/helpers'; + +@Injectable() +export class SanitizeService { + protected config: sanitizeHtml.IOptions = {}; + + constructor() { + this.config = { + allowedTags: sanitizeHtml.defaults.allowedTags.concat(['img', 'code']), + allowedAttributes: { + ...sanitizeHtml.defaults.allowedAttributes, + '*': ['class', 'style', 'height', 'width'], + }, + parser: { + lowerCaseTags: true, + }, + }; + } + + sanitize(body: string, options?: sanitizeHtml.IOptions) { + return sanitizeHtml(body, deepMerge(this.config, options ?? {}, 'replace')); + } +} diff --git a/src/modules/content/subscribers/index.ts b/src/modules/content/subscribers/index.ts new file mode 100644 index 0000000..1fd30c6 --- /dev/null +++ b/src/modules/content/subscribers/index.ts @@ -0,0 +1 @@ +export * from './post.subscriber'; diff --git a/src/modules/content/subscribers/post.subscriber.ts b/src/modules/content/subscribers/post.subscriber.ts new file mode 100644 index 0000000..24d15b6 --- /dev/null +++ b/src/modules/content/subscribers/post.subscriber.ts @@ -0,0 +1,28 @@ +import { DataSource, EventSubscriber } from 'typeorm'; + +import { PostBodyType } from '@/modules/content/constants'; +import { PostEntity } from '@/modules/content/entities'; +import { PostRepository } from '@/modules/content/repositories'; +import { SanitizeService } from '@/modules/content/services'; + +@EventSubscriber() +export class PostSubscriber { + constructor( + protected dataSource: DataSource, + protected sanitizeService: SanitizeService, + protected postRepository: PostRepository, + ) {} + + listenTo() { + return PostEntity; + } + + /** + * 加载文章数据的处理 + */ + async afterLoad(entity: PostEntity) { + if (entity.type === PostBodyType.HTML) { + entity.body = this.sanitizeService.sanitize(entity.body); + } + } +} diff --git a/src/modules/content/types.ts b/src/modules/content/types.ts deleted file mode 100644 index 2d8a348..0000000 --- a/src/modules/content/types.ts +++ /dev/null @@ -1,6 +0,0 @@ -export interface PostEntity { - id: number; - title: string; - summary?: string; - body: string; -} diff --git a/src/modules/core/core.module.ts b/src/modules/core/core.module.ts index 5422b25..ea588ec 100644 --- a/src/modules/core/core.module.ts +++ b/src/modules/core/core.module.ts @@ -1,23 +1,11 @@ -import { DynamicModule, Global, Module } from '@nestjs/common'; +import { DynamicModule, Module } from '@nestjs/common'; -import { ConfigService } from './services/config.service'; - -@Global() @Module({}) export class CoreModule { - static forRoot(options: { config: RecordAny }): DynamicModule { + static forRoot(): DynamicModule { return { module: CoreModule, global: true, - providers: [ - { - provide: ConfigService, - useFactory() { - return new ConfigService(options.config); - }, - }, - ], - exports: [ConfigService], }; } } diff --git a/src/modules/core/helpers/index.ts b/src/modules/core/helpers/index.ts new file mode 100644 index 0000000..04bca77 --- /dev/null +++ b/src/modules/core/helpers/index.ts @@ -0,0 +1 @@ +export * from './utils'; diff --git a/src/modules/core/helpers/utils.ts b/src/modules/core/helpers/utils.ts new file mode 100644 index 0000000..70c0a8c --- /dev/null +++ b/src/modules/core/helpers/utils.ts @@ -0,0 +1,50 @@ +import deepmerge from 'deepmerge'; + +import { isNil } from 'lodash'; + +/** + * 用于请求验证中的boolean数据转义 + * @param value + */ +export const toBoolean = (value?: string | boolean): boolean => { + if (isNil(value)) return false; + + if (typeof value === 'boolean') return value; + + try { + return JSON.parse(value.toLowerCase()); + } catch (error) { + return value as unknown as boolean; + } +}; + +/** + * 用于请求验证中转义null + * @param value + */ +export const toNull = (value?: string | null): string | null | undefined => { + return value === 'null' ? null : value; +}; + +/** + * 深度合并对象 + * @param x 初始值 + * @param y 新值 + * @param arrayMode 对于数组采取的策略,`replace`为直接替换,`merge`为合并数组 + */ +export const deepMerge = ( + x: Partial, + y: Partial, + arrayMode: 'replace' | 'merge' = 'merge', +) => { + const options: deepmerge.Options = {}; + + if (arrayMode === 'replace') { + options.arrayMerge = (target, source, _options) => source; + } else if (arrayMode === 'merge') { + options.arrayMerge = (target, source, _options) => + Array.from(new Set({ ...target, ...source })); + } + + return deepmerge(x, y, options) as T2 extends T1 ? T1 : T1 & T2; +}; diff --git a/src/modules/core/services/config.service.ts b/src/modules/core/services/config.service.ts deleted file mode 100644 index e5685d6..0000000 --- a/src/modules/core/services/config.service.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { Injectable } from '@nestjs/common'; -import { get } from 'lodash'; - -@Injectable() -export class ConfigService { - protected config: RecordAny = {}; - - constructor(data: RecordAny) { - this.config = data; - } - - get(key: string, defaultValue?: T): T | undefined { - return get(this.config, key, defaultValue); - } -} diff --git a/src/modules/database/constants.ts b/src/modules/database/constants.ts new file mode 100644 index 0000000..2711973 --- /dev/null +++ b/src/modules/database/constants.ts @@ -0,0 +1,4 @@ +/** + * 自定义 Repository 元数据 + */ +export const CUSTOM_REPOSITORY_METADATA = 'CUSTOM_REPOSITORY_METADATA'; diff --git a/src/modules/database/database.module.ts b/src/modules/database/database.module.ts new file mode 100644 index 0000000..843b031 --- /dev/null +++ b/src/modules/database/database.module.ts @@ -0,0 +1,47 @@ +import { DynamicModule, Module, Provider, Type } from '@nestjs/common'; +import { TypeOrmModule, TypeOrmModuleOptions, getDataSourceToken } from '@nestjs/typeorm'; + +import { DataSource, ObjectType } from 'typeorm'; + +import { CUSTOM_REPOSITORY_METADATA } from '@/modules/database/constants'; + +@Module({}) +export class DatabaseModule { + static forRoot(configRegister: () => TypeOrmModuleOptions): DynamicModule { + return { + global: true, + module: DatabaseModule, + imports: [TypeOrmModule.forRoot(configRegister())], + }; + } + + static forRepository>( + repositories: T[], + dataSourceName?: string, + ): DynamicModule { + const providers: Provider[] = []; + + for (const Repo of repositories) { + const entity = Reflect.getMetadata(CUSTOM_REPOSITORY_METADATA, Repo); + + if (!entity) { + continue; + } + + providers.push({ + inject: [getDataSourceToken(dataSourceName)], + provide: Repo, + useFactory: (dataSource: DataSource): InstanceType => { + const base = dataSource.getRepository>(entity); + return new Repo(base.target, base.manager, base.queryRunner); + }, + }); + } + + return { + exports: providers, + module: DatabaseModule, + providers, + }; + } +} diff --git a/src/modules/database/decorators/index.ts b/src/modules/database/decorators/index.ts new file mode 100644 index 0000000..17575dd --- /dev/null +++ b/src/modules/database/decorators/index.ts @@ -0,0 +1 @@ +export * from './repository.decorator'; diff --git a/src/modules/database/decorators/repository.decorator.ts b/src/modules/database/decorators/repository.decorator.ts new file mode 100644 index 0000000..53a2926 --- /dev/null +++ b/src/modules/database/decorators/repository.decorator.ts @@ -0,0 +1,13 @@ +import { SetMetadata } from '@nestjs/common'; + +import { ObjectType } from 'typeorm'; + +import { CUSTOM_REPOSITORY_METADATA } from '@/modules/database/constants'; + +/** + * 自定义存储库装饰器,用于将一个TypeORM实体类关联到一个自定义存储库类。 + * @param {ObjectType} entity - TypeORM实体类,将被关联到自定义存储库。 + * @returns {ClassDecorator} - 一个类装饰器,将元数据关联到目标存储库类。 + */ +export const CustomRepository = (entity: ObjectType): ClassDecorator => + SetMetadata(CUSTOM_REPOSITORY_METADATA, entity); diff --git a/src/modules/database/helpers.ts b/src/modules/database/helpers.ts new file mode 100644 index 0000000..aac21e3 --- /dev/null +++ b/src/modules/database/helpers.ts @@ -0,0 +1,46 @@ +import { isNil } from 'lodash'; +import { ObjectLiteral, SelectQueryBuilder } from 'typeorm'; + +import { PaginateOptions, PaginateReturn } from '@/modules/database/types'; + +/** + * 分页函数 + * @params qb queryBuilder实例 + * @params options 分页选项 + */ +export const paginate = async ( + qb: SelectQueryBuilder, + options: PaginateOptions, +): Promise> => { + const limit = isNil(options.limit) || options.limit < 1 ? 1 : options.limit; + + const page = isNil(options.page) || options.page < 1 ? 1 : options.page; + + const start = page >= 1 ? page - 1 : 0; + + const totalItems = await qb.getCount(); + + qb.take(limit).skip(start * limit); + + const items = await qb.getMany(); + + const totalPages = + totalItems % limit === 0 + ? Math.floor(totalItems / limit) + : Math.floor(totalItems / limit) + 1; + + const remainder = totalItems % limit !== 0 ? totalItems % limit : limit; + + const itemCount = page < totalPages ? limit : remainder; + + return { + items, + meta: { + totalItems, + totalPages, + itemCount, + perPage: limit, + currentPage: page, + }, + }; +}; diff --git a/src/modules/database/types.ts b/src/modules/database/types.ts new file mode 100644 index 0000000..a390bd9 --- /dev/null +++ b/src/modules/database/types.ts @@ -0,0 +1,70 @@ +import { ObjectLiteral, SelectQueryBuilder } from 'typeorm'; + +/** + * 一个查询钩子,用于修改或增强给定的查询构建器。 + * @param {SelectQueryBuilder} qb - TypeORM的查询构建器实例。 + * @returns {Promise>} - 经过修改或增强的查询构建器实例。 + */ +export type QueryHook = ( + qb: SelectQueryBuilder, +) => Promise>; + +/** + * 分页原数据 + */ +export interface PaginateMeta { + /** + * 当前页项目数量 + */ + itemCount: number; + + /** + * 项目总数量 + */ + totalItems?: number; + + /** + * 每页显示数量 + */ + perPage: number; + + /** + * 总页数 + */ + totalPages?: number; + + /** + * 当前页数 + */ + currentPage: number; +} + +/** + * 分页选项 + */ +export interface PaginateOptions { + /** + * 当前页数 + */ + page: number; + + /** + * 每页显示数量 + */ + limit: number; +} + +/** + * 分页数据返回 + */ +export interface PaginateReturn { + /** + * 项目列表 + */ + items: E[]; + + /** + * 分页信息 + */ + meta: PaginateMeta; +} diff --git a/src/modules/welcome/welcome.controller.ts b/src/modules/welcome/welcome.controller.ts index 71addfe..2ee5383 100644 --- a/src/modules/welcome/welcome.controller.ts +++ b/src/modules/welcome/welcome.controller.ts @@ -1,59 +1,12 @@ -import { Controller, Get, Inject } from '@nestjs/common'; - -import { ConfigService } from '../core/services/config.service'; - -import { FifthService } from './services/fifth.service'; -import { FirstService } from './services/first.service'; -import { FourthService } from './services/fourth.service'; -import { SecondService } from './services/second.service'; +import { Controller, Get } from '@nestjs/common'; /** * 欢迎访问 Ink NestJS API */ @Controller() export class WelcomeController { - constructor( - private configService: ConfigService, - private first: FirstService, - @Inject('ID-WELCOME') private idExp: FirstService, - @Inject('FACTORY-WELCOME') private ftExp: FourthService, - @Inject('ALIAS-WELCOME') private asExp: FirstService, - @Inject('ASYNC-WELCOME') private acExp: SecondService, - private fifth: FifthService, - ) {} - @Get() getMessage(): string { - return this.configService.get('name'); - } - - @Get('value') - async useValue() { - return this.first.useValue(); - } - - @Get('id') - async useId() { - return this.idExp.useId(); - } - - @Get('factory') - async useFactory() { - return this.ftExp.getContent(); - } - - @Get('alias') - async useAlias() { - return this.asExp.useAlias(); - } - - @Get('async') - async useAsync() { - return this.acExp.useAsync(); - } - - @Get('circular') - async useCircular() { - return this.fifth.circular(); + return '欢迎访问 Ink NestJS API'; } } diff --git a/src/modules/welcome/welcome.module.ts b/src/modules/welcome/welcome.module.ts index 5ab17cd..edcb29b 100644 --- a/src/modules/welcome/welcome.module.ts +++ b/src/modules/welcome/welcome.module.ts @@ -1,58 +1,8 @@ import { Module } from '@nestjs/common'; -import { FirstService } from './services/first.service'; -import { FourthService } from './services/fourth.service'; -import { SecondService } from './services/second.service'; -import { ThirdService } from './services/third.service'; import { WelcomeController } from './welcome.controller'; -import { FifthService } from './services/fifth.service'; -import { SixthService } from './services/sixth.service'; - -const firstObject = { - useValue: () => 'firstObject useValue 提供者', - useAlias: () => 'firstObject 别名提供者', -}; - -const firstInstance = new FirstService(); @Module({ controllers: [WelcomeController], - providers: [ - { - provide: FirstService, - useValue: firstObject, - }, - { - provide: 'ID-WELCOME', - useValue: firstInstance, - }, - { - provide: SecondService, - useClass: ThirdService, - }, - { - provide: 'FACTORY-WELCOME', - useFactory(second: SecondService) { - const factory = new FourthService(second); - - return factory; - }, - inject: [SecondService], - }, - { - provide: 'ALIAS-WELCOME', - useExisting: FirstService, - }, - { - provide: 'ASYNC-WELCOME', - useFactory: async () => { - const factory = new FourthService(new SecondService()); - - return factory.getPromise(); - }, - }, - FifthService, - SixthService, - ], }) export class WelcomeModule {}