add webfinger and routes boilerplate
This commit is contained in:
		
							parent
							
								
									cad4c59d51
								
							
						
					
					
						commit
						9f74db9857
					
				
					 8 changed files with 589 additions and 17 deletions
				
			
		|  | @ -17,6 +17,8 @@ | |||
|     "argon2": "^0.30.3", | ||||
|     "dotenv": "^16.3.1", | ||||
|     "express": "^4.18.2", | ||||
|     "fastify": "^4.20.0", | ||||
|     "glob": "^10.3.3", | ||||
|     "pg": "^8.11.1", | ||||
|     "reflect-metadata": "^0.1.13", | ||||
|     "tslog": "^4.8.2", | ||||
|  |  | |||
							
								
								
									
										457
									
								
								pnpm-lock.yaml
									
										
									
										generated
									
									
									
								
							
							
						
						
									
										457
									
								
								pnpm-lock.yaml
									
										
									
										generated
									
									
									
								
							|  | @ -10,6 +10,12 @@ dependencies: | |||
|   express: | ||||
|     specifier: ^4.18.2 | ||||
|     version: 4.18.2 | ||||
|   fastify: | ||||
|     specifier: ^4.20.0 | ||||
|     version: 4.20.0 | ||||
|   glob: | ||||
|     specifier: ^10.3.3 | ||||
|     version: 10.3.3 | ||||
|   pg: | ||||
|     specifier: ^8.11.1 | ||||
|     version: 8.11.1 | ||||
|  | @ -58,6 +64,40 @@ packages: | |||
|     dependencies: | ||||
|       '@jridgewell/trace-mapping': 0.3.9 | ||||
| 
 | ||||
|   /@fastify/ajv-compiler@3.5.0: | ||||
|     resolution: {integrity: sha512-ebbEtlI7dxXF5ziNdr05mOY8NnDiPB1XvAlLHctRt/Rc+C3LCOVW5imUVX+mhvUhnNzmPBHewUkOFgGlCxgdAA==} | ||||
|     dependencies: | ||||
|       ajv: 8.12.0 | ||||
|       ajv-formats: 2.1.1(ajv@8.12.0) | ||||
|       fast-uri: 2.2.0 | ||||
|     dev: false | ||||
| 
 | ||||
|   /@fastify/deepmerge@1.3.0: | ||||
|     resolution: {integrity: sha512-J8TOSBq3SoZbDhM9+R/u77hP93gz/rajSA+K2kGyijPpORPWUXHUpTaleoj+92As0S9uPRP7Oi8IqMf0u+ro6A==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /@fastify/error@3.3.0: | ||||
|     resolution: {integrity: sha512-dj7vjIn1Ar8sVXj2yAXiMNCJDmS9MQ9XMlIecX2dIzzhjSHCyKo4DdXjXMs7wKW2kj6yvVRSpuQjOZ3YLrh56w==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /@fastify/fast-json-stringify-compiler@4.3.0: | ||||
|     resolution: {integrity: sha512-aZAXGYo6m22Fk1zZzEUKBvut/CIIQe/BapEORnxiD5Qr0kPHqqI69NtEMCme74h+at72sPhbkb4ZrLd1W3KRLA==} | ||||
|     dependencies: | ||||
|       fast-json-stringify: 5.7.0 | ||||
|     dev: false | ||||
| 
 | ||||
|   /@isaacs/cliui@8.0.2: | ||||
|     resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} | ||||
|     engines: {node: '>=12'} | ||||
|     dependencies: | ||||
|       string-width: 5.1.2 | ||||
|       string-width-cjs: /string-width@4.2.3 | ||||
|       strip-ansi: 7.1.0 | ||||
|       strip-ansi-cjs: /strip-ansi@6.0.1 | ||||
|       wrap-ansi: 8.1.0 | ||||
|       wrap-ansi-cjs: /wrap-ansi@7.0.0 | ||||
|     dev: false | ||||
| 
 | ||||
|   /@jridgewell/resolve-uri@3.1.1: | ||||
|     resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} | ||||
|     engines: {node: '>=6.0.0'} | ||||
|  | @ -94,6 +134,13 @@ packages: | |||
|     engines: {node: '>=10'} | ||||
|     dev: false | ||||
| 
 | ||||
|   /@pkgjs/parseargs@0.11.0: | ||||
|     resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} | ||||
|     engines: {node: '>=14'} | ||||
|     requiresBuild: true | ||||
|     dev: false | ||||
|     optional: true | ||||
| 
 | ||||
|   /@sqltools/formatter@1.2.5: | ||||
|     resolution: {integrity: sha512-Uy0+khmZqUrUGm5dmMqVlnvufZRSK0FbYzVgp0UMstm+F5+W2/jnEEQyc9vo1ZR/E5ZI/B1WjjoTqBqwJL6Krw==} | ||||
|     dev: false | ||||
|  | @ -182,6 +229,17 @@ packages: | |||
|   /abbrev@1.1.1: | ||||
|     resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} | ||||
| 
 | ||||
|   /abort-controller@3.0.0: | ||||
|     resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} | ||||
|     engines: {node: '>=6.5'} | ||||
|     dependencies: | ||||
|       event-target-shim: 5.0.1 | ||||
|     dev: false | ||||
| 
 | ||||
|   /abstract-logging@2.0.1: | ||||
|     resolution: {integrity: sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /accepts@1.3.8: | ||||
|     resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} | ||||
|     engines: {node: '>= 0.6'} | ||||
|  | @ -208,11 +266,36 @@ packages: | |||
|       - supports-color | ||||
|     dev: false | ||||
| 
 | ||||
|   /ajv-formats@2.1.1(ajv@8.12.0): | ||||
|     resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} | ||||
|     peerDependencies: | ||||
|       ajv: ^8.0.0 | ||||
|     peerDependenciesMeta: | ||||
|       ajv: | ||||
|         optional: true | ||||
|     dependencies: | ||||
|       ajv: 8.12.0 | ||||
|     dev: false | ||||
| 
 | ||||
|   /ajv@8.12.0: | ||||
|     resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} | ||||
|     dependencies: | ||||
|       fast-deep-equal: 3.1.3 | ||||
|       json-schema-traverse: 1.0.0 | ||||
|       require-from-string: 2.0.2 | ||||
|       uri-js: 4.4.1 | ||||
|     dev: false | ||||
| 
 | ||||
|   /ansi-regex@5.0.1: | ||||
|     resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} | ||||
|     engines: {node: '>=8'} | ||||
|     dev: false | ||||
| 
 | ||||
|   /ansi-regex@6.0.1: | ||||
|     resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} | ||||
|     engines: {node: '>=12'} | ||||
|     dev: false | ||||
| 
 | ||||
|   /ansi-styles@4.3.0: | ||||
|     resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} | ||||
|     engines: {node: '>=8'} | ||||
|  | @ -220,6 +303,11 @@ packages: | |||
|       color-convert: 2.0.1 | ||||
|     dev: false | ||||
| 
 | ||||
|   /ansi-styles@6.2.1: | ||||
|     resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} | ||||
|     engines: {node: '>=12'} | ||||
|     dev: false | ||||
| 
 | ||||
|   /any-promise@1.3.0: | ||||
|     resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} | ||||
|     dev: false | ||||
|  | @ -241,6 +329,10 @@ packages: | |||
|     resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /archy@1.0.0: | ||||
|     resolution: {integrity: sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /are-we-there-yet@2.0.0: | ||||
|     resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} | ||||
|     engines: {node: '>=10'} | ||||
|  | @ -269,6 +361,21 @@ packages: | |||
|     resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /atomic-sleep@1.0.0: | ||||
|     resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} | ||||
|     engines: {node: '>=8.0.0'} | ||||
|     dev: false | ||||
| 
 | ||||
|   /avvio@8.2.1: | ||||
|     resolution: {integrity: sha512-TAlMYvOuwGyLK3PfBb5WKBXZmXz2fVCgv23d6zZFdle/q3gPjmxBaeuC0pY0Dzs5PWMSgfqqEZkrye19GlDTgw==} | ||||
|     dependencies: | ||||
|       archy: 1.0.0 | ||||
|       debug: 4.3.4 | ||||
|       fastq: 1.15.0 | ||||
|     transitivePeerDependencies: | ||||
|       - supports-color | ||||
|     dev: false | ||||
| 
 | ||||
|   /balanced-match@1.0.2: | ||||
|     resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} | ||||
| 
 | ||||
|  | @ -449,6 +556,15 @@ packages: | |||
|   /create-require@1.1.1: | ||||
|     resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} | ||||
| 
 | ||||
|   /cross-spawn@7.0.3: | ||||
|     resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} | ||||
|     engines: {node: '>= 8'} | ||||
|     dependencies: | ||||
|       path-key: 3.1.1 | ||||
|       shebang-command: 2.0.0 | ||||
|       which: 2.0.2 | ||||
|     dev: false | ||||
| 
 | ||||
|   /date-fns@2.30.0: | ||||
|     resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} | ||||
|     engines: {node: '>=0.11'} | ||||
|  | @ -519,6 +635,10 @@ packages: | |||
|     engines: {node: '>=12'} | ||||
|     dev: false | ||||
| 
 | ||||
|   /eastasianwidth@0.2.0: | ||||
|     resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /ee-first@1.1.1: | ||||
|     resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} | ||||
|     dev: false | ||||
|  | @ -527,6 +647,10 @@ packages: | |||
|     resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /emoji-regex@9.2.2: | ||||
|     resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /encodeurl@1.0.2: | ||||
|     resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} | ||||
|     engines: {node: '>= 0.8'} | ||||
|  | @ -546,6 +670,16 @@ packages: | |||
|     engines: {node: '>= 0.6'} | ||||
|     dev: false | ||||
| 
 | ||||
|   /event-target-shim@5.0.1: | ||||
|     resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} | ||||
|     engines: {node: '>=6'} | ||||
|     dev: false | ||||
| 
 | ||||
|   /events@3.3.0: | ||||
|     resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} | ||||
|     engines: {node: '>=0.8.x'} | ||||
|     dev: false | ||||
| 
 | ||||
|   /express@4.18.2: | ||||
|     resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} | ||||
|     engines: {node: '>= 0.10.0'} | ||||
|  | @ -585,6 +719,73 @@ packages: | |||
|       - supports-color | ||||
|     dev: false | ||||
| 
 | ||||
|   /fast-content-type-parse@1.0.0: | ||||
|     resolution: {integrity: sha512-Xbc4XcysUXcsP5aHUU7Nq3OwvHq97C+WnbkeIefpeYLX+ryzFJlU6OStFJhs6Ol0LkUGpcK+wL0JwfM+FCU5IA==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /fast-decode-uri-component@1.0.1: | ||||
|     resolution: {integrity: sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /fast-deep-equal@3.1.3: | ||||
|     resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /fast-json-stringify@5.7.0: | ||||
|     resolution: {integrity: sha512-sBVPTgnAZseLu1Qgj6lUbQ0HfjFhZWXAmpZ5AaSGkyLh5gAXBga/uPJjQPHpDFjC9adWIpdOcCLSDTgrZ7snoQ==} | ||||
|     dependencies: | ||||
|       '@fastify/deepmerge': 1.3.0 | ||||
|       ajv: 8.12.0 | ||||
|       ajv-formats: 2.1.1(ajv@8.12.0) | ||||
|       fast-deep-equal: 3.1.3 | ||||
|       fast-uri: 2.2.0 | ||||
|       rfdc: 1.3.0 | ||||
|     dev: false | ||||
| 
 | ||||
|   /fast-querystring@1.1.2: | ||||
|     resolution: {integrity: sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==} | ||||
|     dependencies: | ||||
|       fast-decode-uri-component: 1.0.1 | ||||
|     dev: false | ||||
| 
 | ||||
|   /fast-redact@3.2.0: | ||||
|     resolution: {integrity: sha512-zaTadChr+NekyzallAMXATXLOR8MNx3zqpZ0MUF2aGf4EathnG0f32VLODNlY8IuGY3HoRO2L6/6fSzNsLaHIw==} | ||||
|     engines: {node: '>=6'} | ||||
|     dev: false | ||||
| 
 | ||||
|   /fast-uri@2.2.0: | ||||
|     resolution: {integrity: sha512-cIusKBIt/R/oI6z/1nyfe2FvGKVTohVRfvkOhvx0nCEW+xf5NoCXjAHcWp93uOUBchzYcsvPlrapAdX1uW+YGg==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /fastify@4.20.0: | ||||
|     resolution: {integrity: sha512-zWWi5KGAb1YZ6fyrnFnA1CA1EZHkGM6YuELgB3QpS3l4lLRy14W1cc16b4KGPH/zQ98WCSdS+T41JkHY3eq1oA==} | ||||
|     dependencies: | ||||
|       '@fastify/ajv-compiler': 3.5.0 | ||||
|       '@fastify/error': 3.3.0 | ||||
|       '@fastify/fast-json-stringify-compiler': 4.3.0 | ||||
|       abstract-logging: 2.0.1 | ||||
|       avvio: 8.2.1 | ||||
|       fast-content-type-parse: 1.0.0 | ||||
|       fast-json-stringify: 5.7.0 | ||||
|       find-my-way: 7.6.2 | ||||
|       light-my-request: 5.10.0 | ||||
|       pino: 8.14.1 | ||||
|       process-warning: 2.2.0 | ||||
|       proxy-addr: 2.0.7 | ||||
|       rfdc: 1.3.0 | ||||
|       secure-json-parse: 2.7.0 | ||||
|       semver: 7.5.4 | ||||
|       tiny-lru: 11.0.1 | ||||
|     transitivePeerDependencies: | ||||
|       - supports-color | ||||
|     dev: false | ||||
| 
 | ||||
|   /fastq@1.15.0: | ||||
|     resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} | ||||
|     dependencies: | ||||
|       reusify: 1.0.4 | ||||
|     dev: false | ||||
| 
 | ||||
|   /fill-range@7.0.1: | ||||
|     resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} | ||||
|     engines: {node: '>=8'} | ||||
|  | @ -607,6 +808,23 @@ packages: | |||
|       - supports-color | ||||
|     dev: false | ||||
| 
 | ||||
|   /find-my-way@7.6.2: | ||||
|     resolution: {integrity: sha512-0OjHn1b1nCX3eVbm9ByeEHiscPYiHLfhei1wOUU9qffQkk98wE0Lo8VrVYfSGMgnSnDh86DxedduAnBf4nwUEw==} | ||||
|     engines: {node: '>=14'} | ||||
|     dependencies: | ||||
|       fast-deep-equal: 3.1.3 | ||||
|       fast-querystring: 1.1.2 | ||||
|       safe-regex2: 2.0.0 | ||||
|     dev: false | ||||
| 
 | ||||
|   /foreground-child@3.1.1: | ||||
|     resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} | ||||
|     engines: {node: '>=14'} | ||||
|     dependencies: | ||||
|       cross-spawn: 7.0.3 | ||||
|       signal-exit: 4.0.2 | ||||
|     dev: false | ||||
| 
 | ||||
|   /forwarded@0.2.0: | ||||
|     resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} | ||||
|     engines: {node: '>= 0.6'} | ||||
|  | @ -676,6 +894,18 @@ packages: | |||
|       is-glob: 4.0.3 | ||||
|     dev: true | ||||
| 
 | ||||
|   /glob@10.3.3: | ||||
|     resolution: {integrity: sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw==} | ||||
|     engines: {node: '>=16 || 14 >=14.17'} | ||||
|     hasBin: true | ||||
|     dependencies: | ||||
|       foreground-child: 3.1.1 | ||||
|       jackspeak: 2.2.1 | ||||
|       minimatch: 9.0.3 | ||||
|       minipass: 5.0.0 | ||||
|       path-scurry: 1.10.1 | ||||
|     dev: false | ||||
| 
 | ||||
|   /glob@7.2.3: | ||||
|     resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} | ||||
|     dependencies: | ||||
|  | @ -814,6 +1044,36 @@ packages: | |||
|     engines: {node: '>=0.12.0'} | ||||
|     dev: true | ||||
| 
 | ||||
|   /isexe@2.0.0: | ||||
|     resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /jackspeak@2.2.1: | ||||
|     resolution: {integrity: sha512-MXbxovZ/Pm42f6cDIDkl3xpwv1AGwObKwfmjs2nQePiy85tP3fatofl3FC1aBsOtP/6fq5SbtgHwWcMsLP+bDw==} | ||||
|     engines: {node: '>=14'} | ||||
|     dependencies: | ||||
|       '@isaacs/cliui': 8.0.2 | ||||
|     optionalDependencies: | ||||
|       '@pkgjs/parseargs': 0.11.0 | ||||
|     dev: false | ||||
| 
 | ||||
|   /json-schema-traverse@1.0.0: | ||||
|     resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /light-my-request@5.10.0: | ||||
|     resolution: {integrity: sha512-ZU2D9GmAcOUculTTdH9/zryej6n8TzT+fNGdNtm6SDp5MMMpHrJJkvAdE3c6d8d2chE9i+a//dS9CWZtisknqA==} | ||||
|     dependencies: | ||||
|       cookie: 0.5.0 | ||||
|       process-warning: 2.2.0 | ||||
|       set-cookie-parser: 2.6.0 | ||||
|     dev: false | ||||
| 
 | ||||
|   /lru-cache@10.0.0: | ||||
|     resolution: {integrity: sha512-svTf/fzsKHffP42sujkO/Rjs37BCIsQVRCeNYIm9WN8rgT7ffoUnRtZCqU+6BqcSBdv8gwJeTz8knJpgACeQMw==} | ||||
|     engines: {node: 14 || >=16.14} | ||||
|     dev: false | ||||
| 
 | ||||
|   /lru-cache@6.0.0: | ||||
|     resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} | ||||
|     engines: {node: '>=10'} | ||||
|  | @ -874,6 +1134,13 @@ packages: | |||
|       brace-expansion: 2.0.1 | ||||
|     dev: false | ||||
| 
 | ||||
|   /minimatch@9.0.3: | ||||
|     resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} | ||||
|     engines: {node: '>=16 || 14 >=14.17'} | ||||
|     dependencies: | ||||
|       brace-expansion: 2.0.1 | ||||
|     dev: false | ||||
| 
 | ||||
|   /minipass@3.3.6: | ||||
|     resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} | ||||
|     engines: {node: '>=8'} | ||||
|  | @ -1001,6 +1268,10 @@ packages: | |||
|     resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /on-exit-leak-free@2.1.0: | ||||
|     resolution: {integrity: sha512-VuCaZZAjReZ3vUwgOB8LxAosIurDiAW0s13rI1YwmaP++jvcxP77AWoQvenZebpCA2m8WC1/EosPYPMjnRAp/w==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /on-finished@2.4.1: | ||||
|     resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} | ||||
|     engines: {node: '>= 0.8'} | ||||
|  | @ -1042,6 +1313,19 @@ packages: | |||
|     engines: {node: '>=0.10.0'} | ||||
|     dev: false | ||||
| 
 | ||||
|   /path-key@3.1.1: | ||||
|     resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} | ||||
|     engines: {node: '>=8'} | ||||
|     dev: false | ||||
| 
 | ||||
|   /path-scurry@1.10.1: | ||||
|     resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} | ||||
|     engines: {node: '>=16 || 14 >=14.17'} | ||||
|     dependencies: | ||||
|       lru-cache: 10.0.0 | ||||
|       minipass: 5.0.0 | ||||
|     dev: false | ||||
| 
 | ||||
|   /path-to-regexp@0.1.7: | ||||
|     resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} | ||||
|     dev: false | ||||
|  | @ -1115,6 +1399,34 @@ packages: | |||
|     engines: {node: '>=8.6'} | ||||
|     dev: true | ||||
| 
 | ||||
|   /pino-abstract-transport@1.0.0: | ||||
|     resolution: {integrity: sha512-c7vo5OpW4wIS42hUVcT5REsL8ZljsUfBjqV/e2sFxmFEFZiq1XLUp5EYLtuDH6PEHq9W1egWqRbnLUP5FuZmOA==} | ||||
|     dependencies: | ||||
|       readable-stream: 4.4.2 | ||||
|       split2: 4.2.0 | ||||
|     dev: false | ||||
| 
 | ||||
|   /pino-std-serializers@6.2.2: | ||||
|     resolution: {integrity: sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /pino@8.14.1: | ||||
|     resolution: {integrity: sha512-8LYNv7BKWXSfS+k6oEc6occy5La+q2sPwU3q2ljTX5AZk7v+5kND2o5W794FyRaqha6DJajmkNRsWtPpFyMUdw==} | ||||
|     hasBin: true | ||||
|     dependencies: | ||||
|       atomic-sleep: 1.0.0 | ||||
|       fast-redact: 3.2.0 | ||||
|       on-exit-leak-free: 2.1.0 | ||||
|       pino-abstract-transport: 1.0.0 | ||||
|       pino-std-serializers: 6.2.2 | ||||
|       process-warning: 2.2.0 | ||||
|       quick-format-unescaped: 4.0.4 | ||||
|       real-require: 0.2.0 | ||||
|       safe-stable-stringify: 2.4.3 | ||||
|       sonic-boom: 3.3.0 | ||||
|       thread-stream: 2.3.0 | ||||
|     dev: false | ||||
| 
 | ||||
|   /postgres-array@2.0.0: | ||||
|     resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} | ||||
|     engines: {node: '>=4'} | ||||
|  | @ -1143,6 +1455,15 @@ packages: | |||
|     hasBin: true | ||||
|     dev: true | ||||
| 
 | ||||
|   /process-warning@2.2.0: | ||||
|     resolution: {integrity: sha512-/1WZ8+VQjR6avWOgHeEPd7SDQmFQ1B5mC1eRXsCm5TarlNmx/wCsa5GEaxGm05BORRtyG/Ex/3xq3TuRvq57qg==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /process@0.11.10: | ||||
|     resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} | ||||
|     engines: {node: '>= 0.6.0'} | ||||
|     dev: false | ||||
| 
 | ||||
|   /proxy-addr@2.0.7: | ||||
|     resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} | ||||
|     engines: {node: '>= 0.10'} | ||||
|  | @ -1155,6 +1476,11 @@ packages: | |||
|     resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} | ||||
|     dev: true | ||||
| 
 | ||||
|   /punycode@2.3.0: | ||||
|     resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} | ||||
|     engines: {node: '>=6'} | ||||
|     dev: false | ||||
| 
 | ||||
|   /qs@6.11.0: | ||||
|     resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} | ||||
|     engines: {node: '>=0.6'} | ||||
|  | @ -1162,6 +1488,10 @@ packages: | |||
|       side-channel: 1.0.4 | ||||
|     dev: false | ||||
| 
 | ||||
|   /quick-format-unescaped@4.0.4: | ||||
|     resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /range-parser@1.2.1: | ||||
|     resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} | ||||
|     engines: {node: '>= 0.6'} | ||||
|  | @ -1186,6 +1516,17 @@ packages: | |||
|       util-deprecate: 1.0.2 | ||||
|     dev: false | ||||
| 
 | ||||
|   /readable-stream@4.4.2: | ||||
|     resolution: {integrity: sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==} | ||||
|     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} | ||||
|     dependencies: | ||||
|       abort-controller: 3.0.0 | ||||
|       buffer: 6.0.3 | ||||
|       events: 3.3.0 | ||||
|       process: 0.11.10 | ||||
|       string_decoder: 1.3.0 | ||||
|     dev: false | ||||
| 
 | ||||
|   /readdirp@3.6.0: | ||||
|     resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} | ||||
|     engines: {node: '>=8.10.0'} | ||||
|  | @ -1193,6 +1534,11 @@ packages: | |||
|       picomatch: 2.3.1 | ||||
|     dev: true | ||||
| 
 | ||||
|   /real-require@0.2.0: | ||||
|     resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} | ||||
|     engines: {node: '>= 12.13.0'} | ||||
|     dev: false | ||||
| 
 | ||||
|   /reflect-metadata@0.1.13: | ||||
|     resolution: {integrity: sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==} | ||||
|     dev: false | ||||
|  | @ -1206,6 +1552,25 @@ packages: | |||
|     engines: {node: '>=0.10.0'} | ||||
|     dev: false | ||||
| 
 | ||||
|   /require-from-string@2.0.2: | ||||
|     resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} | ||||
|     engines: {node: '>=0.10.0'} | ||||
|     dev: false | ||||
| 
 | ||||
|   /ret@0.2.2: | ||||
|     resolution: {integrity: sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ==} | ||||
|     engines: {node: '>=4'} | ||||
|     dev: false | ||||
| 
 | ||||
|   /reusify@1.0.4: | ||||
|     resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} | ||||
|     engines: {iojs: '>=1.0.0', node: '>=0.10.0'} | ||||
|     dev: false | ||||
| 
 | ||||
|   /rfdc@1.3.0: | ||||
|     resolution: {integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /rimraf@3.0.2: | ||||
|     resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} | ||||
|     hasBin: true | ||||
|  | @ -1217,10 +1582,25 @@ packages: | |||
|     resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /safe-regex2@2.0.0: | ||||
|     resolution: {integrity: sha512-PaUSFsUaNNuKwkBijoAPHAK6/eM6VirvyPWlZ7BAQy4D+hCvh4B6lIG+nPdhbFfIbP+gTGBcrdsOaUs0F+ZBOQ==} | ||||
|     dependencies: | ||||
|       ret: 0.2.2 | ||||
|     dev: false | ||||
| 
 | ||||
|   /safe-stable-stringify@2.4.3: | ||||
|     resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} | ||||
|     engines: {node: '>=10'} | ||||
|     dev: false | ||||
| 
 | ||||
|   /safer-buffer@2.1.2: | ||||
|     resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /secure-json-parse@2.7.0: | ||||
|     resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /semver@6.3.1: | ||||
|     resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} | ||||
|     hasBin: true | ||||
|  | @ -1270,6 +1650,10 @@ packages: | |||
|     resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /set-cookie-parser@2.6.0: | ||||
|     resolution: {integrity: sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /setprototypeof@1.2.0: | ||||
|     resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} | ||||
|     dev: false | ||||
|  | @ -1282,6 +1666,18 @@ packages: | |||
|       safe-buffer: 5.2.1 | ||||
|     dev: false | ||||
| 
 | ||||
|   /shebang-command@2.0.0: | ||||
|     resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} | ||||
|     engines: {node: '>=8'} | ||||
|     dependencies: | ||||
|       shebang-regex: 3.0.0 | ||||
|     dev: false | ||||
| 
 | ||||
|   /shebang-regex@3.0.0: | ||||
|     resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} | ||||
|     engines: {node: '>=8'} | ||||
|     dev: false | ||||
| 
 | ||||
|   /side-channel@1.0.4: | ||||
|     resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} | ||||
|     dependencies: | ||||
|  | @ -1294,6 +1690,11 @@ packages: | |||
|     resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /signal-exit@4.0.2: | ||||
|     resolution: {integrity: sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==} | ||||
|     engines: {node: '>=14'} | ||||
|     dev: false | ||||
| 
 | ||||
|   /simple-update-notifier@2.0.0: | ||||
|     resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} | ||||
|     engines: {node: '>=10'} | ||||
|  | @ -1301,6 +1702,12 @@ packages: | |||
|       semver: 7.5.4 | ||||
|     dev: true | ||||
| 
 | ||||
|   /sonic-boom@3.3.0: | ||||
|     resolution: {integrity: sha512-LYxp34KlZ1a2Jb8ZQgFCK3niIHzibdwtwNUWKg0qQRzsDoJ3Gfgkf8KdBTFU3SkejDEIlWwnSnpVdOZIhFMl/g==} | ||||
|     dependencies: | ||||
|       atomic-sleep: 1.0.0 | ||||
|     dev: false | ||||
| 
 | ||||
|   /split2@4.2.0: | ||||
|     resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} | ||||
|     engines: {node: '>= 10.x'} | ||||
|  | @ -1320,6 +1727,15 @@ packages: | |||
|       strip-ansi: 6.0.1 | ||||
|     dev: false | ||||
| 
 | ||||
|   /string-width@5.1.2: | ||||
|     resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} | ||||
|     engines: {node: '>=12'} | ||||
|     dependencies: | ||||
|       eastasianwidth: 0.2.0 | ||||
|       emoji-regex: 9.2.2 | ||||
|       strip-ansi: 7.1.0 | ||||
|     dev: false | ||||
| 
 | ||||
|   /string_decoder@1.3.0: | ||||
|     resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} | ||||
|     dependencies: | ||||
|  | @ -1333,6 +1749,13 @@ packages: | |||
|       ansi-regex: 5.0.1 | ||||
|     dev: false | ||||
| 
 | ||||
|   /strip-ansi@7.1.0: | ||||
|     resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} | ||||
|     engines: {node: '>=12'} | ||||
|     dependencies: | ||||
|       ansi-regex: 6.0.1 | ||||
|     dev: false | ||||
| 
 | ||||
|   /supports-color@5.5.0: | ||||
|     resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} | ||||
|     engines: {node: '>=4'} | ||||
|  | @ -1372,6 +1795,17 @@ packages: | |||
|       any-promise: 1.3.0 | ||||
|     dev: false | ||||
| 
 | ||||
|   /thread-stream@2.3.0: | ||||
|     resolution: {integrity: sha512-kaDqm1DET9pp3NXwR8382WHbnpXnRkN9xGN9dQt3B2+dmXiW8X1SOwmFOxAErEQ47ObhZ96J6yhZNXuyCOL7KA==} | ||||
|     dependencies: | ||||
|       real-require: 0.2.0 | ||||
|     dev: false | ||||
| 
 | ||||
|   /tiny-lru@11.0.1: | ||||
|     resolution: {integrity: sha512-iNgFugVuQgBKrqeO/mpiTTgmBsTP0WL6yeuLfLs/Ctf0pI/ixGqIRm8sDCwMcXGe9WWvt2sGXI5mNqZbValmJg==} | ||||
|     engines: {node: '>=12'} | ||||
|     dev: false | ||||
| 
 | ||||
|   /to-regex-range@5.0.1: | ||||
|     resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} | ||||
|     engines: {node: '>=8.0'} | ||||
|  | @ -1540,6 +1974,12 @@ packages: | |||
|     engines: {node: '>= 0.8'} | ||||
|     dev: false | ||||
| 
 | ||||
|   /uri-js@4.4.1: | ||||
|     resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} | ||||
|     dependencies: | ||||
|       punycode: 2.3.0 | ||||
|     dev: false | ||||
| 
 | ||||
|   /util-deprecate@1.0.2: | ||||
|     resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} | ||||
|     dev: false | ||||
|  | @ -1573,6 +2013,14 @@ packages: | |||
|       webidl-conversions: 3.0.1 | ||||
|     dev: false | ||||
| 
 | ||||
|   /which@2.0.2: | ||||
|     resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} | ||||
|     engines: {node: '>= 8'} | ||||
|     hasBin: true | ||||
|     dependencies: | ||||
|       isexe: 2.0.0 | ||||
|     dev: false | ||||
| 
 | ||||
|   /wide-align@1.1.5: | ||||
|     resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} | ||||
|     dependencies: | ||||
|  | @ -1588,6 +2036,15 @@ packages: | |||
|       strip-ansi: 6.0.1 | ||||
|     dev: false | ||||
| 
 | ||||
|   /wrap-ansi@8.1.0: | ||||
|     resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} | ||||
|     engines: {node: '>=12'} | ||||
|     dependencies: | ||||
|       ansi-styles: 6.2.1 | ||||
|       string-width: 5.1.2 | ||||
|       strip-ansi: 7.1.0 | ||||
|     dev: false | ||||
| 
 | ||||
|   /wrappy@1.0.2: | ||||
|     resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} | ||||
|     dev: false | ||||
|  |  | |||
|  | @ -9,3 +9,10 @@ export const DATABASE_PORT = Number(process.env.DATABASE_PORT) || 5432; | |||
| export const DATABASE_USER = process.env.DATABASE_USER || "postgres"; | ||||
| export const DATABASE_PASS = process.env.DATABASE_PASS || "postgres"; | ||||
| export const DATABASE_NAME = process.env.DATABASE_NAME || "postgres"; | ||||
| 
 | ||||
| export const HTTPS = process.env.HTTPS === "true"; | ||||
| export const DOMAIN = process.env.DOMAIN; | ||||
| 
 | ||||
| if (!DOMAIN) throw "$DOMAIN is empty"; | ||||
| 
 | ||||
| export const BASE_URL = `${HTTPS ? "https" : "http"}://${DOMAIN}`; | ||||
|  |  | |||
|  | @ -1,7 +1,7 @@ | |||
| import * as crypto from "node:crypto"; | ||||
| import * as util from "node:util"; | ||||
| import { promisify }from "node:util"; | ||||
| 
 | ||||
| const generate = util.promisify(crypto.generateKeyPair); | ||||
| const generate = promisify(crypto.generateKeyPair); | ||||
| 
 | ||||
| export async function generateKeyPair() { | ||||
|   return await generate("rsa", { | ||||
|  |  | |||
							
								
								
									
										31
									
								
								src/routes.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								src/routes.ts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,31 @@ | |||
| import { dirname, join } from "node:path"; | ||||
| import { fileURLToPath } from "node:url"; | ||||
| import { glob } from "glob"; | ||||
| import type { FastifyInstance, RouteOptions } from "fastify"; | ||||
| 
 | ||||
| import log from "./log.js"; | ||||
| 
 | ||||
| export default async function getRoutes() { | ||||
|   const rootDir = dirname(fileURLToPath(import.meta.url)); | ||||
| 
 | ||||
|   const routes: RouteOptions[] = []; | ||||
|   const matches = await glob(join(rootDir, "/routes/**/*.{js,ts}")); | ||||
| 
 | ||||
|   for (const filename of matches) { | ||||
|     try { | ||||
|       const mod = await import(filename); | ||||
|       routes.push(mod.default as RouteOptions); | ||||
|     } catch (e) { | ||||
|       log.error("Importing route %s", filename, e); | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   return routes; | ||||
| } | ||||
| 
 | ||||
| export function mountRoutes(app: FastifyInstance, routes: RouteOptions[]) { | ||||
|   for (const route of routes) { | ||||
|     log.trace("Mounting route %s %s", route.method, route.url); | ||||
|     app.route(route); | ||||
|   } | ||||
| } | ||||
							
								
								
									
										80
									
								
								src/routes/well-known/webfinger.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										80
									
								
								src/routes/well-known/webfinger.ts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,80 @@ | |||
| import type { FastifyReply, FastifyRequest, RouteOptions } from "fastify"; | ||||
| import { IsNull } from "typeorm"; | ||||
| 
 | ||||
| import log from "../../log.js"; | ||||
| import MercuryDataSource from "../../db/index.js"; | ||||
| import { Blog } from "../../db/entities/blog.js"; | ||||
| import { BASE_URL } from "../../config.js"; | ||||
| 
 | ||||
| const route: RouteOptions = { | ||||
|   method: "GET", | ||||
|   url: "/.well-known/webfinger", | ||||
|   handler: async (req, res) => { | ||||
|     // TypeScript complains if we just use plain `req.query` :(
 | ||||
|     const encodedResource = (req.query as { resource: string }).resource; | ||||
| 
 | ||||
|     if (!encodedResource || typeof encodedResource !== "string") { | ||||
|       res.status(400).send({ | ||||
|         error: "resource query parameter is missing or invalid", | ||||
|       }); | ||||
|       return; | ||||
|     } | ||||
|     const resource = decodeURIComponent(encodedResource); | ||||
| 
 | ||||
|     log.debug("Handling WebFinger request for %s", resource); | ||||
| 
 | ||||
|     if (resource.startsWith("acct:")) { | ||||
|       await handleAcctWebfinger(req, res, resource); | ||||
|       return; | ||||
|     } | ||||
| 
 | ||||
|     res.status(500).send({ error: "Unhandled WebFinger resource type" }); | ||||
|   }, | ||||
| }; | ||||
| 
 | ||||
| export default route; | ||||
| 
 | ||||
| async function handleAcctWebfinger( | ||||
|   req: FastifyRequest, | ||||
|   res: FastifyReply, | ||||
|   resource: string | ||||
| ): Promise<void> { | ||||
|   const [username, domain] = resource.slice("acct:".length).split("@"); | ||||
|   if (domain !== process.env.DOMAIN) { | ||||
|     res.status(404).send({ | ||||
|       error: "Account not found", | ||||
|     }); | ||||
|     return; | ||||
|   } | ||||
| 
 | ||||
|   const blog = await MercuryDataSource.getRepository(Blog).findOneBy({ | ||||
|     username: username, | ||||
|     host: IsNull(), | ||||
|   }); | ||||
|   if (!blog) { | ||||
|     res.status(404).send({ | ||||
|       error: "Account not found", | ||||
|     }); | ||||
|     return; | ||||
|   } | ||||
| 
 | ||||
|   res.send({ | ||||
|     subject: resource, | ||||
|     aliases: [ | ||||
|       `${BASE_URL}/@${blog.username}`, | ||||
|       `${BASE_URL}/blogs/${blog.username}`, | ||||
|     ], | ||||
|     links: [ | ||||
|       { | ||||
|         rel: "http://webfinger.net/rel/profile-page", | ||||
|         type: "text/html", | ||||
|         href: `${BASE_URL}/@${blog.username}`, | ||||
|       }, | ||||
|       { | ||||
|         rel: "self", | ||||
|         type: "application/activity+json", | ||||
|         href: `${BASE_URL}/blogs/${blog.username}`, | ||||
|       }, | ||||
|     ], | ||||
|   }); | ||||
| } | ||||
							
								
								
									
										22
									
								
								src/start.ts
									
										
									
									
									
								
							
							
						
						
									
										22
									
								
								src/start.ts
									
										
									
									
									
								
							|  | @ -1,9 +1,10 @@ | |||
| import "reflect-metadata"; // Required for TypeORM
 | ||||
| import express from "express"; | ||||
| import Fastify from "fastify"; | ||||
| 
 | ||||
| import MercuryDataSource from "./db/index.js"; | ||||
| import log from "./log.js"; | ||||
| import { Blog } from "./db/entities/blog.js"; | ||||
| import { PORT } from "./config.js"; | ||||
| import getRoutes, { mountRoutes } from "./routes.js"; | ||||
| 
 | ||||
| export default async function start() { | ||||
|   log.info("Initializing database"); | ||||
|  | @ -17,17 +18,12 @@ export default async function start() { | |||
|     return; | ||||
|   } | ||||
| 
 | ||||
|   log.debug("Setting up routes") | ||||
|   const app = express(); | ||||
|   log.debug("Setting up routes"); | ||||
|   const app = Fastify(); | ||||
| 
 | ||||
|   app.get("/", async (_, res) => { | ||||
|     const blogRepository = MercuryDataSource.getRepository(Blog); | ||||
|   const routes = await getRoutes(); | ||||
|   mountRoutes(app, routes); | ||||
| 
 | ||||
|     const resp = await blogRepository.find(); | ||||
| 
 | ||||
|     return res.json(resp) | ||||
|   }) | ||||
| 
 | ||||
|   log.info("Listening on port %d", PORT) | ||||
|   app.listen(PORT); | ||||
|   log.info("Listening on port %d", PORT); | ||||
|   await app.listen({ port: PORT }); | ||||
| } | ||||
|  |  | |||
|  | @ -6,8 +6,7 @@ | |||
|     "rootDir": "./src", | ||||
|     "allowJs": true, | ||||
|     "checkJs": true, | ||||
|     "declaration": true, | ||||
|     "declarationMap": true, | ||||
|     "declaration": false, | ||||
|     "sourceMap": true, | ||||
|     "outDir": "./build", | ||||
|     "esModuleInterop": true, | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue