diff --git a/.github/workflows/test-fern-bot.yml b/.github/workflows/test-fern-bot.yml new file mode 100644 index 0000000000..18d901f07b --- /dev/null +++ b/.github/workflows/test-fern-bot.yml @@ -0,0 +1,38 @@ +name: Test FernBot Dev + +on: + pull_request: + branches: + - main + paths: + - "servers/fern-bot/**" + - ".github/workflows/deploy-fern-bot-dev.yml" + +env: + AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + SERVERLESS_ACCESS_KEY: ${{ secrets.SERVERLESS_ACCESS_KEY }} + GITHUB_APP_LOGIN_NAME: ${{ secrets.FERN_BOT_DEV_GITHUB_APP_LOGIN_NAME }} + GITHUB_APP_LOGIN_ID: ${{ secrets.FERN_BOT_DEV_GITHUB_APP_LOGIN_ID }} + GITHUB_APP_ID: ${{ secrets.FERN_BOT_DEV_GITHUB_APP_ID }} + GITHUB_APP_PRIVATE_KEY: ${{ secrets.FERN_BOT_DEV_GITHUB_APP_PRIVATE_KEY }} + GITHUB_APP_CLIENT_ID: ${{ secrets.FERN_BOT_DEV_GITHUB_APP_CLIENT_ID }} + GITHUB_APP_CLIENT_SECRET: ${{ secrets.FERN_BOT_DEV_GITHUB_APP_CLIENT_SECRET }} + GITHUB_APP_WEBHOOK_SECRET: ${{ secrets.FERN_BOT_DEV_GITHUB_APP_WEBHOOK_SECRET }} + CO_API_KEY: ${{ secrets.DEV_CO_API_KEY }} + +jobs: + test_dev: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: 📥 Install + uses: ./.github/actions/install + - name: 🚀 serverless function run-thru + env: + CI: false + # For now we're just invoking all the functions to confirm they're functional + run: | + pnpm --filter "@fern-platform/fern-bot" invoke local --function updateRepoDataset --stage development + pnpm --filter "@fern-platform/fern-bot" invoke local --function updateOpenApiSpec --stage development + pnpm --filter "@fern-platform/fern-bot" invoke local --function updateOpenApiSpecs --stage development diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 499b7f2f09..821b78fc84 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -445,7 +445,7 @@ importers: version: 3.2.5 simple-git: specifier: ^3.24.0 - version: 3.24.0(supports-color@8.1.1) + version: 3.24.0 stylelint: specifier: ^16.1.0 version: 16.5.0(typescript@5.4.3) @@ -2243,6 +2243,9 @@ importers: servers/fern-bot: dependencies: + '@aws-sdk/client-s3': + specifier: ^3.335.0 + version: 3.572.0 '@fern-api/core-utils': specifier: 0.15.0-rc63 version: 0.15.0-rc63 @@ -2264,12 +2267,18 @@ importers: js-yaml: specifier: ^4.1.0 version: 4.1.0 + json-2-csv: + specifier: ^5.5.1 + version: 5.5.1 octokit: specifier: ^3.2.0 version: 3.2.1 + serverless-step-functions: + specifier: ^3.21.0 + version: 3.21.0(serverless@3.38.0) simple-git: specifier: ^3.24.0 - version: 3.24.0(supports-color@8.1.1) + version: 3.24.0 tmp-promise: specifier: ^3.0.3 version: 3.0.3 @@ -2321,7 +2330,6 @@ packages: dependencies: d: 1.0.2 es5-ext: 0.10.64 - dev: true /@adobe/css-tools@4.3.3: resolution: {integrity: sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ==} @@ -2632,7 +2640,6 @@ packages: uuid: 9.0.1 transitivePeerDependencies: - aws-crt - dev: true /@aws-sdk/client-s3@3.572.0: resolution: {integrity: sha512-YLtJRVZN+ktOaseWeTtthmimRQoWxygdzRPFlb1HpDPX+akBrGkL7Mz69onpXKfqm9Loz3diUXHqKfpxRX9Pog==} @@ -3223,7 +3230,7 @@ packages: '@babel/traverse': 7.24.5 '@babel/types': 7.24.5 convert-source-map: 2.0.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4(supports-color@5.5.0) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -3301,7 +3308,7 @@ packages: '@babel/core': 7.24.5 '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-plugin-utils': 7.24.5 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4(supports-color@5.5.0) lodash.debounce: 4.0.8 resolve: 1.22.8 transitivePeerDependencies: @@ -4539,7 +4546,7 @@ packages: '@babel/helper-split-export-declaration': 7.24.5 '@babel/parser': 7.24.5 '@babel/types': 7.24.5 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4(supports-color@5.5.0) globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -4908,7 +4915,7 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: ajv: 6.12.6 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4(supports-color@5.5.0) espree: 9.6.1 globals: 13.24.0 ignore: 5.3.1 @@ -5145,6 +5152,16 @@ packages: '@fortawesome/fontawesome-common-types': 6.5.2 dev: false + /@hapi/hoek@9.3.0: + resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} + dev: false + + /@hapi/topo@5.1.0: + resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} + dependencies: + '@hapi/hoek': 9.3.0 + dev: false + /@headlessui/react@1.7.19(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-Ll+8q3OlMJfJbAKM/+/Y2q6PPYbryqNTXDbryx7SXLIDamkF6iQFbriYHga0dY44PvDhvvBWCx1Xj4U5+G4hOw==} engines: {node: '>=10'} @@ -5171,7 +5188,7 @@ packages: engines: {node: '>=10.10.0'} dependencies: '@humanwhocodes/object-schema': 2.0.3 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4(supports-color@5.5.0) minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -5669,6 +5686,13 @@ packages: resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==} dev: false + /@kwsites/file-exists@1.1.1: + resolution: {integrity: sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==} + dependencies: + debug: 4.3.4(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + /@kwsites/file-exists@1.1.1(supports-color@8.1.1): resolution: {integrity: sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==} dependencies: @@ -8011,7 +8035,7 @@ packages: hasBin: true requiresBuild: true dependencies: - https-proxy-agent: 5.0.1(supports-color@8.1.1) + https-proxy-agent: 5.0.1 mkdirp: 0.5.6 node-fetch: 2.7.0 progress: 2.0.3 @@ -8028,7 +8052,7 @@ packages: hasBin: true requiresBuild: true dependencies: - https-proxy-agent: 5.0.1(supports-color@8.1.1) + https-proxy-agent: 5.0.1 node-fetch: 2.7.0 progress: 2.0.3 proxy-from-env: 1.1.0 @@ -8209,14 +8233,12 @@ packages: - encoding - supports-color - utf-8-validate - dev: true /@serverless/event-mocks@1.1.1: resolution: {integrity: sha512-YAV5V/y+XIOfd+HEVeXfPWZb8C6QLruFk9tBivoX2roQLWVq145s4uxf8D0QioCueuRzkukHUS4JIj+KVoS34A==} dependencies: '@types/lodash': 4.17.1 lodash: 4.17.21 - dev: true /@serverless/platform-client@4.5.1(supports-color@8.1.1): resolution: {integrity: sha512-XltmO/029X76zi0LUFmhsnanhE2wnqH1xf+WBt5K8gumQA9LnrfwLgPxj+VA+mm6wQhy+PCp7H5SS0ZPu7F2Cw==} @@ -8242,7 +8264,6 @@ packages: - debug - supports-color - utf-8-validate - dev: true /@serverless/typescript@3.38.0: resolution: {integrity: sha512-2AZ7SwWNMOfe2sovoBf68FgiQlLH+RuS9MdSMAzXJ/Hx5d0tPZmmLxfUieF7gUGOExe/fhzCAW3akr6wTZuTpQ==} @@ -8287,7 +8308,6 @@ packages: write-file-atomic: 4.0.2 transitivePeerDependencies: - encoding - dev: true /@shikijs/core@1.5.1: resolution: {integrity: sha512-xjV63pRUBvxA1LsxOUhRKLPh0uUjwBLzAKLdEuYSLIylo71sYuwDcttqNP01Ib1TZlLfO840CXHPlgUUsYFjzg==} @@ -8303,6 +8323,20 @@ packages: shiki: 1.5.1 dev: false + /@sideway/address@4.1.5: + resolution: {integrity: sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==} + dependencies: + '@hapi/hoek': 9.3.0 + dev: false + + /@sideway/formula@3.0.1: + resolution: {integrity: sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==} + dev: false + + /@sideway/pinpoint@2.0.0: + resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==} + dev: false + /@sinclair/typebox@0.27.8: resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} @@ -10217,7 +10251,7 @@ packages: typescript: '>= 4.x' webpack: '>= 4' dependencies: - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4(supports-color@5.5.0) endent: 2.1.0 find-cache-dir: 3.3.2 flat-cache: 3.2.0 @@ -10673,7 +10707,6 @@ packages: engines: {node: '>=10'} dependencies: defer-to-connect: 2.0.1 - dev: true /@szmarczak/http-timer@5.0.1: resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} @@ -10902,7 +10935,6 @@ packages: /@tokenizer/token@0.3.0: resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} - dev: true /@trysound/sax@0.2.0: resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} @@ -10994,7 +11026,6 @@ packages: '@types/keyv': 3.1.4 '@types/node': 20.12.12 '@types/responselike': 1.0.3 - dev: true /@types/compression@1.7.5: resolution: {integrity: sha512-AAQvK5pxMpaT+nDvhHrsBhLSYG5yQdtkaJE1WYieSNY2mVFKAgmU4ks65rkZD5oqnGCFLyQpUr1CqI4DmUMyDg==} @@ -11236,7 +11267,6 @@ packages: resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} dependencies: '@types/node': 20.12.12 - dev: true /@types/lodash-es@4.17.12: resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==} @@ -11246,7 +11276,6 @@ packages: /@types/lodash@4.17.1: resolution: {integrity: sha512-X+2qazGS3jxLAIz5JDXDzglAF3KpijdhFxlf/V1+hEsOUc+HnWi81L/uv/EvGuV90WY+7mPGFCUDGfQC3Gj95Q==} - dev: true /@types/lodash@4.17.4: resolution: {integrity: sha512-wYCP26ZLxaT3R39kiN2+HcJ4kTd3U1waI/cY7ivWYqFP6pW3ZNpvi6Wd6PHZx7T/t8z0vlkXMg3QYLa7DZ/IJQ==} @@ -11403,7 +11432,6 @@ packages: resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} dependencies: '@types/node': 20.12.12 - dev: true /@types/retry@0.12.0: resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} @@ -11499,7 +11527,7 @@ packages: '@typescript-eslint/type-utils': 7.3.1(eslint@8.57.0)(typescript@5.4.3) '@typescript-eslint/utils': 7.3.1(eslint@8.57.0)(typescript@5.4.3) '@typescript-eslint/visitor-keys': 7.3.1 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4(supports-color@5.5.0) eslint: 8.57.0 graphemer: 1.4.0 ignore: 5.3.1 @@ -11524,7 +11552,7 @@ packages: '@typescript-eslint/types': 7.2.0 '@typescript-eslint/typescript-estree': 7.2.0(typescript@5.4.3) '@typescript-eslint/visitor-keys': 7.2.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4(supports-color@5.5.0) eslint: 8.57.0 typescript: 5.4.3 transitivePeerDependencies: @@ -11545,7 +11573,7 @@ packages: '@typescript-eslint/types': 7.3.1 '@typescript-eslint/typescript-estree': 7.3.1(typescript@5.4.3) '@typescript-eslint/visitor-keys': 7.3.1 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4(supports-color@5.5.0) eslint: 8.57.0 typescript: 5.4.3 transitivePeerDependencies: @@ -11600,7 +11628,7 @@ packages: dependencies: '@typescript-eslint/typescript-estree': 7.3.1(typescript@5.4.3) '@typescript-eslint/utils': 7.3.1(eslint@8.57.0)(typescript@5.4.3) - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4(supports-color@5.5.0) eslint: 8.57.0 ts-api-utils: 1.3.0(typescript@5.4.3) typescript: 5.4.3 @@ -11640,7 +11668,7 @@ packages: dependencies: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4(supports-color@5.5.0) globby: 11.1.0 is-glob: 4.0.3 semver: 7.6.2 @@ -11661,7 +11689,7 @@ packages: dependencies: '@typescript-eslint/types': 6.21.0 '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4(supports-color@5.5.0) globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.3 @@ -11682,7 +11710,7 @@ packages: dependencies: '@typescript-eslint/types': 7.2.0 '@typescript-eslint/visitor-keys': 7.2.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4(supports-color@5.5.0) globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.3 @@ -11704,7 +11732,7 @@ packages: dependencies: '@typescript-eslint/types': 7.3.1 '@typescript-eslint/visitor-keys': 7.3.1 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4(supports-color@5.5.0) globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.3 @@ -11725,7 +11753,7 @@ packages: dependencies: '@typescript-eslint/types': 7.8.0 '@typescript-eslint/visitor-keys': 7.8.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4(supports-color@5.5.0) globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.4 @@ -12328,7 +12356,15 @@ packages: /adm-zip@0.5.12: resolution: {integrity: sha512-6TVU49mK6KZb4qG6xWaaM4C7sA/sgUMLy/JYMOzkcp3BvVLpW0fXDFQiIzAuxFCt/2+xD7fNIiPFAoLZPhVNLQ==} engines: {node: '>=6.0'} - dev: true + + /agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + dependencies: + debug: 4.3.4(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + dev: false /agent-base@6.0.2(supports-color@8.1.1): resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} @@ -12342,7 +12378,7 @@ packages: resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} engines: {node: '>= 14'} dependencies: - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -12381,7 +12417,6 @@ packages: optional: true dependencies: ajv: 8.13.0 - dev: true /ajv-keywords@3.5.2(ajv@6.12.6): resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} @@ -12449,7 +12484,6 @@ packages: engines: {node: '>=8'} dependencies: type-fest: 0.21.3 - dev: true /ansi-escapes@5.0.0: resolution: {integrity: sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==} @@ -12525,7 +12559,6 @@ packages: engines: {node: '>=4'} dependencies: file-type: 4.4.0 - dev: true /archiver-utils@2.1.0: resolution: {integrity: sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==} @@ -12541,7 +12574,6 @@ packages: lodash.union: 4.6.0 normalize-path: 3.0.0 readable-stream: 2.3.8 - dev: true /archiver-utils@3.0.4: resolution: {integrity: sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==} @@ -12557,7 +12589,6 @@ packages: lodash.union: 4.6.0 normalize-path: 3.0.0 readable-stream: 3.6.2 - dev: true /archiver-utils@5.0.2: resolution: {integrity: sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==} @@ -12583,7 +12614,6 @@ packages: readdir-glob: 1.1.3 tar-stream: 2.2.0 zip-stream: 4.1.1 - dev: true /archiver@7.0.1: resolution: {integrity: sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==} @@ -12743,7 +12773,23 @@ packages: /asap@2.0.6: resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} - dev: true + + /asl-path-validator@0.12.0: + resolution: {integrity: sha512-pzBX2mKp8NQ7p1xM6sfSd2vFQJDX0UdUCun/YcRKMNSv7j93erTomK7iIU79N5rjJD++kPr9qwWhA67pFVpdhA==} + dependencies: + jsonpath-plus: 7.2.0 + dev: false + + /asl-validator@3.8.2: + resolution: {integrity: sha512-wSGCbzbTz5hfuSQl33u/OZEGXT8IE9taRbAPtCNg4boK7oHLlXZqH7VlwKGeKY4QwvDwlyktERBXs3r32JwIeQ==} + hasBin: true + dependencies: + ajv: 8.13.0 + asl-path-validator: 0.12.0 + commander: 10.0.1 + jsonpath-plus: 7.2.0 + yaml: 2.4.2 + dev: false /asn1.js@4.10.1: resolution: {integrity: sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==} @@ -12796,7 +12842,6 @@ packages: /at-least-node@1.0.0: resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} engines: {node: '>= 4.0.0'} - dev: true /autoprefixer@10.4.19(postcss@8.4.31): resolution: {integrity: sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==} @@ -12852,8 +12897,8 @@ packages: fsevents: 2.3.2 dev: true - /aws-sdk@2.1617.0: - resolution: {integrity: sha512-lIZtMv/0H0OJG/0sMscXB8e96M03AcqpfIEyuuNES4ZkytjyiTaLYCfviYudrRn7gcLbX/b3/TPphymBng4tHw==} + /aws-sdk@2.1646.0: + resolution: {integrity: sha512-PAvDiR8ow3zjO0T5HMda04kXIzQ5e1zeWxWGSUodRwu9W569gZPBnqzcPX3PJFNAKBZnZBdbNgsci1g2nXCcBg==} engines: {node: '>= 10.0.0'} requiresBuild: true dependencies: @@ -12867,7 +12912,6 @@ packages: util: 0.12.5 uuid: 8.0.0 xml2js: 0.6.2 - dev: true /axe-core@4.7.0: resolution: {integrity: sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==} @@ -13138,7 +13182,6 @@ packages: dependencies: readable-stream: 2.3.8 safe-buffer: 5.2.1 - dev: true /bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} @@ -13146,7 +13189,6 @@ packages: buffer: 5.7.1 inherits: 2.0.4 readable-stream: 3.6.2 - dev: true /bl@5.1.0: resolution: {integrity: sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==} @@ -13158,7 +13200,6 @@ packages: /bluebird@3.7.2: resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} - dev: true /bn.js@4.12.0: resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} @@ -13314,18 +13355,15 @@ packages: /buffer-alloc-unsafe@1.1.0: resolution: {integrity: sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==} - dev: true /buffer-alloc@1.2.0: resolution: {integrity: sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==} dependencies: buffer-alloc-unsafe: 1.1.0 buffer-fill: 1.0.0 - dev: true /buffer-crc32@0.2.13: resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} - dev: true /buffer-crc32@1.0.0: resolution: {integrity: sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==} @@ -13338,7 +13376,6 @@ packages: /buffer-fill@1.0.0: resolution: {integrity: sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==} - dev: true /buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} @@ -13353,14 +13390,12 @@ packages: base64-js: 1.5.1 ieee754: 1.2.1 isarray: 1.0.0 - dev: true /buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} dependencies: base64-js: 1.5.1 ieee754: 1.2.1 - dev: true /buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} @@ -13371,7 +13406,6 @@ packages: /builtin-modules@3.3.0: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} engines: {node: '>=6'} - dev: true /builtin-status-codes@3.0.0: resolution: {integrity: sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==} @@ -13379,7 +13413,6 @@ packages: /builtins@1.0.3: resolution: {integrity: sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==} - dev: true /bundle-require@4.1.0(esbuild@0.20.2): resolution: {integrity: sha512-FeArRFM+ziGkRViKRnSTbHZc35dgmR9yNog05Kn0+ItI59pOAISGvnnIwW1WgFZQW59IxD9QpJnUPkdIPfZuXg==} @@ -13412,7 +13445,6 @@ packages: /cacheable-lookup@5.0.4: resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} engines: {node: '>=10.6.0'} - dev: true /cacheable-lookup@7.0.0: resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==} @@ -13443,12 +13475,10 @@ packages: lowercase-keys: 2.0.0 normalize-url: 6.1.0 responselike: 2.0.1 - dev: true /cachedir@2.4.0: resolution: {integrity: sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ==} engines: {node: '>=6'} - dev: true /call-bind@1.0.7: resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} @@ -13594,7 +13624,6 @@ packages: /chardet@0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} - dev: true /check-error@1.0.3: resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} @@ -13609,7 +13638,6 @@ packages: log: 6.3.1 split2: 3.2.2 stream-promise: 3.2.0 - dev: true /child-process-ext@3.0.2: resolution: {integrity: sha512-oBePsLbQpTJFxzwyCvs9yWWF0OEM6vGGepHwt1stqmX7QQqOuDc8j2ywdvAs9Tvi44TT7d9ackqhR4Q10l1u8w==} @@ -13620,7 +13648,6 @@ packages: log: 6.3.1 split2: 3.2.2 stream-promise: 3.2.0 - dev: true /chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} @@ -13664,7 +13691,6 @@ packages: /ci-info@3.9.0: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} - dev: true /cipher-base@1.0.4: resolution: {integrity: sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==} @@ -13716,14 +13742,12 @@ packages: es6-iterator: 2.0.3 memoizee: 0.4.15 timers-ext: 0.1.7 - dev: true /cli-cursor@3.1.0: resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} engines: {node: '>=8'} dependencies: restore-cursor: 3.1.0 - dev: true /cli-cursor@4.0.0: resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} @@ -13742,7 +13766,6 @@ packages: process-utils: 4.0.0 timers-ext: 0.1.7 type: 2.7.2 - dev: true /cli-spinners@2.9.2: resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} @@ -13756,7 +13779,6 @@ packages: es5-ext: 0.10.64 sprintf-kit: 2.0.1 supports-color: 6.1.0 - dev: true /cli-table3@0.6.4: resolution: {integrity: sha512-Lm3L0p+/npIQWNIiyF/nAn7T5dnOwR3xNTHXYEBFBFVPXzCVNZ5lqEC/1eo/EVfpDsQ1I+TX4ORPQgp+UI0CRw==} @@ -13778,7 +13800,6 @@ packages: /cli-width@3.0.0: resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} engines: {node: '>= 10'} - dev: true /client-only@0.0.1: resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} @@ -13827,7 +13848,6 @@ packages: resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} dependencies: mimic-response: 1.0.1 - dev: true /clone@1.0.4: resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} @@ -13946,6 +13966,11 @@ packages: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} dev: false + /commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + dev: false + /commander@11.0.0: resolution: {integrity: sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==} engines: {node: '>=16'} @@ -13995,7 +14020,6 @@ packages: /component-emitter@1.3.1: resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==} - dev: true /compress-commons@4.1.2: resolution: {integrity: sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==} @@ -14005,7 +14029,6 @@ packages: crc32-stream: 4.0.3 normalize-path: 3.0.0 readable-stream: 3.6.2 - dev: true /compress-commons@6.0.2: resolution: {integrity: sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==} @@ -14106,7 +14129,6 @@ packages: /cookiejar@2.1.4: resolution: {integrity: sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==} - dev: true /copy-anything@2.0.6: resolution: {integrity: sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==} @@ -14198,7 +14220,6 @@ packages: dependencies: crc-32: 1.2.2 readable-stream: 3.6.2 - dev: true /crc32-stream@6.0.0: resolution: {integrity: sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==} @@ -14275,7 +14296,6 @@ packages: semver: 5.7.2 shebang-command: 1.2.0 which: 1.3.1 - dev: true /cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} @@ -14485,7 +14505,6 @@ packages: dependencies: es5-ext: 0.10.64 type: 2.7.2 - dev: true /damerau-levenshtein@1.0.8: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} @@ -14570,7 +14589,6 @@ packages: dependencies: ms: 2.1.2 supports-color: 5.5.0 - dev: true /debug@4.3.4(supports-color@8.1.1): resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} @@ -14606,7 +14624,6 @@ packages: file-type: 5.2.0 is-stream: 1.1.0 tar-stream: 1.6.2 - dev: true /decompress-tarbz2@4.1.1: resolution: {integrity: sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==} @@ -14617,7 +14634,6 @@ packages: is-stream: 1.1.0 seek-bzip: 1.0.6 unbzip2-stream: 1.4.3 - dev: true /decompress-targz@4.1.1: resolution: {integrity: sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==} @@ -14626,7 +14642,6 @@ packages: decompress-tar: 4.1.1 file-type: 5.2.0 is-stream: 1.1.0 - dev: true /decompress-unzip@4.0.1: resolution: {integrity: sha512-1fqeluvxgnn86MOh66u8FjbtJpAFv5wgCT9Iw8rcBqQcCo5tO8eiJw7NNTrvt9n4CRBVq7CstiS922oPgyGLrw==} @@ -14636,7 +14651,6 @@ packages: get-stream: 2.3.1 pify: 2.3.0 yauzl: 2.10.0 - dev: true /decompress@4.2.1: resolution: {integrity: sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==} @@ -14650,7 +14664,6 @@ packages: make-dir: 1.3.0 pify: 2.3.0 strip-dirs: 2.1.0 - dev: true /dedent@0.7.0: resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} @@ -14665,6 +14678,11 @@ packages: optional: true dev: true + /deeks@3.1.0: + resolution: {integrity: sha512-e7oWH1LzIdv/prMQ7pmlDlaVoL64glqzvNgkgQNgyec9ORPHrT2jaOqMtRyqJuwWjtfb6v+2rk9pmaHj+F137A==} + engines: {node: '>= 16'} + dev: false + /deep-eql@4.1.3: resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} engines: {node: '>=6'} @@ -14730,7 +14748,6 @@ packages: event-emitter: 0.3.5 next-tick: 1.1.0 timers-ext: 0.1.7 - dev: true /define-data-property@1.1.4: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} @@ -14790,7 +14807,7 @@ packages: callsite: 1.0.0 camelcase: 6.3.0 cosmiconfig: 7.1.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4(supports-color@5.5.0) deps-regex: 0.2.0 findup-sync: 5.0.0 ignore: 5.3.1 @@ -14873,7 +14890,7 @@ packages: hasBin: true dependencies: address: 1.2.2 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -14888,7 +14905,6 @@ packages: dependencies: asap: 2.0.6 wrappy: 1.0.2 - dev: true /didyoumean@1.2.2: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} @@ -14936,6 +14952,11 @@ packages: dns-packet: 5.6.1 dev: false + /doc-path@4.1.1: + resolution: {integrity: sha512-h1ErTglQAVv2gCnOpD3sFS6uolDbOKHDU1BZq+Kl3npPqroU3dYL42lUgMfd5UimlwtRgp7C9dLGwqQ5D2HYgQ==} + engines: {node: '>=16'} + dev: false + /doctrine@2.1.0: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} @@ -15034,7 +15055,6 @@ packages: /dotenv-expand@10.0.0: resolution: {integrity: sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==} engines: {node: '>=12'} - dev: true /dotenv-expand@8.0.3: resolution: {integrity: sha512-SErOMvge0ZUyWd5B0NXMQlDkN+8r+HhVUsxgOO7IoPDOdDRD2JjExpN6y3KnFR66jsJMwSn1pqIivhU5rcJiNg==} @@ -15044,7 +15064,6 @@ packages: /dotenv@16.4.5: resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} engines: {node: '>=12'} - dev: true /duplexer@0.1.2: resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} @@ -15063,7 +15082,6 @@ packages: dependencies: d: 1.0.2 es5-ext: 0.10.64 - dev: true /eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} @@ -15141,7 +15159,6 @@ packages: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} dependencies: once: 1.4.0 - dev: true /endent@2.1.0: resolution: {integrity: sha512-r8VyPX7XL8U01Xgnb1CjZ3XV+z90cXIJ9JPE/R9SEC9vpw2P6CfsRPJmp20DppC5N7ZAMCmjYkJIa744Iyg96w==} @@ -15167,7 +15184,7 @@ packages: base64id: 2.0.0 cookie: 0.4.2 cors: 2.8.5 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4(supports-color@5.5.0) engine.io-parser: 5.2.2 ws: 8.11.0 transitivePeerDependencies: @@ -15354,7 +15371,6 @@ packages: es6-symbol: 3.1.4 esniff: 2.0.1 next-tick: 1.1.0 - dev: true /es6-iterator@2.0.3: resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==} @@ -15362,7 +15378,6 @@ packages: d: 1.0.2 es5-ext: 0.10.64 es6-symbol: 3.1.4 - dev: true /es6-set@0.1.6: resolution: {integrity: sha512-TE3LgGLDIBX332jq3ypv6bcOpkLO0AslAQo7p2VqX/1N46YNsvIWgvjojjSEnWEGWMhr1qUbYeTSir5J6mFHOw==} @@ -15374,7 +15389,6 @@ packages: es6-symbol: 3.1.4 event-emitter: 0.3.5 type: 2.7.2 - dev: true /es6-symbol@3.1.4: resolution: {integrity: sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==} @@ -15382,7 +15396,6 @@ packages: dependencies: d: 1.0.2 ext: 1.7.0 - dev: true /es6-weak-map@2.0.3: resolution: {integrity: sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==} @@ -15391,7 +15404,6 @@ packages: es5-ext: 0.10.64 es6-iterator: 2.0.3 es6-symbol: 3.1.4 - dev: true /esast-util-from-estree@2.0.0: resolution: {integrity: sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==} @@ -15420,7 +15432,7 @@ packages: peerDependencies: esbuild: 0.20.2 dependencies: - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4(supports-color@5.5.0) esbuild: 0.20.2 transitivePeerDependencies: - supports-color @@ -15555,7 +15567,7 @@ packages: eslint: '*' eslint-plugin-import: '*' dependencies: - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4(supports-color@5.5.0) enhanced-resolve: 5.16.1 eslint: 8.57.0 eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) @@ -15860,7 +15872,7 @@ packages: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4(supports-color@5.5.0) doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 @@ -15896,7 +15908,6 @@ packages: dependencies: d: 1.0.2 es5-ext: 0.10.64 - dev: true /esniff@2.0.1: resolution: {integrity: sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==} @@ -15906,7 +15917,6 @@ packages: es5-ext: 0.10.64 event-emitter: 0.3.5 type: 2.7.2 - dev: true /espree@9.6.1: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} @@ -15943,7 +15953,6 @@ packages: resolution: {integrity: sha512-kP/j7Iw7KeNE8b/o7+tr9uX2s1wegElGOoGZ2Xm35qBr4BbbEcH3/bxR2nfH9l9JANCq9AUrvKw+gRuHtZp0HQ==} dependencies: uni-global: 1.0.0 - dev: true /estraverse@4.3.0: resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} @@ -16019,7 +16028,6 @@ packages: dependencies: d: 1.0.2 es5-ext: 0.10.64 - dev: true /event-stream@3.3.4: resolution: {integrity: sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g==} @@ -16052,7 +16060,6 @@ packages: /events@1.1.1: resolution: {integrity: sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==} engines: {node: '>=0.4.x'} - dev: true /events@3.3.0: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} @@ -16192,7 +16199,6 @@ packages: engines: {node: '>=0.10.0'} dependencies: mime-db: 1.52.0 - dev: true /ext-name@5.0.0: resolution: {integrity: sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==} @@ -16200,13 +16206,11 @@ packages: dependencies: ext-list: 2.2.2 sort-keys-length: 1.0.1 - dev: true /ext@1.7.0: resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} dependencies: type: 2.7.2 - dev: true /extend-shallow@2.0.1: resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} @@ -16226,7 +16230,6 @@ packages: chardet: 0.7.0 iconv-lite: 0.4.24 tmp: 0.0.33 - dev: true /fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -16260,7 +16263,6 @@ packages: /fast-safe-stringify@2.1.1: resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} - dev: true /fast-shallow-equal@1.0.0: resolution: {integrity: sha512-HPtaa38cPgWvaCFmRNhlc6NG7pv6NUHqjPgVAkWGoB9mQMwYB27/K0CvOM5Czy+qpT3e8XJ6Q4aPAnzpNpzNaw==} @@ -16281,7 +16283,6 @@ packages: /fastest-levenshtein@1.0.16: resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} engines: {node: '>= 4.9.1'} - dev: true /fastest-stable-stringify@2.0.2: resolution: {integrity: sha512-bijHueCGd0LqqNK9b5oCMHc0MluJAx0cwqASgbWMvkO01lCYgIhacVRLcaDz3QnyYIRNJRDwMb41VuT6pHJ91Q==} @@ -16317,7 +16318,6 @@ packages: resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} dependencies: pend: 1.2.0 - dev: true /fecha@4.2.3: resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} @@ -16341,7 +16341,6 @@ packages: engines: {node: '>=8'} dependencies: escape-string-regexp: 1.0.5 - dev: true /file-entry-cache@6.0.1: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} @@ -16369,27 +16368,22 @@ packages: readable-web-to-node-stream: 3.0.2 strtok3: 6.3.0 token-types: 4.2.1 - dev: true /file-type@3.9.0: resolution: {integrity: sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==} engines: {node: '>=0.10.0'} - dev: true /file-type@4.4.0: resolution: {integrity: sha512-f2UbFQEk7LXgWpi5ntcO86OeA/cC80fuDDDaX/fZ2ZGel+AF7leRQqBBW1eJNiiQkrZlAoM6P+VYP5P6bOlDEQ==} engines: {node: '>=4'} - dev: true /file-type@5.2.0: resolution: {integrity: sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==} engines: {node: '>=4'} - dev: true /file-type@6.2.0: resolution: {integrity: sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==} engines: {node: '>=4'} - dev: true /filelist@1.0.4: resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} @@ -16400,7 +16394,6 @@ packages: /filename-reserved-regex@2.0.0: resolution: {integrity: sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==} engines: {node: '>=4'} - dev: true /filenamify@4.3.0: resolution: {integrity: sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==} @@ -16409,12 +16402,10 @@ packages: filename-reserved-regex: 2.0.0 strip-outer: 1.0.1 trim-repeated: 1.0.0 - dev: true /filesize@10.1.1: resolution: {integrity: sha512-L0cdwZrKlwZQkMSFnCflJ6J2Y+5egO/p3vgRSDQGxQt++QbUZe5gMbRO6kg6gzwQDPvq2Fk9AmoxUNfZ5gdqaQ==} engines: {node: '>= 10.4.0'} - dev: true /fill-range@7.0.1: resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} @@ -16473,7 +16464,6 @@ packages: dependencies: es5-ext: 0.10.64 esniff: 1.1.3 - dev: true /find-up@3.0.0: resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} @@ -16543,7 +16533,6 @@ packages: /flat@5.0.2: resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} hasBin: true - dev: true /flatted@3.3.1: resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} @@ -16657,7 +16646,6 @@ packages: hexoid: 1.0.0 once: 1.4.0 qs: 6.12.0 - dev: true /forwarded@0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} @@ -16701,7 +16689,6 @@ packages: /fs-constants@1.0.0: resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - dev: true /fs-extra@10.1.0: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} @@ -16710,7 +16697,6 @@ packages: graceful-fs: 4.2.11 jsonfile: 6.1.0 universalify: 2.0.1 - dev: true /fs-extra@11.1.1: resolution: {integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==} @@ -16736,7 +16722,6 @@ packages: graceful-fs: 4.2.11 jsonfile: 6.1.0 universalify: 2.0.1 - dev: true /fs-minipass@2.1.0: resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} @@ -16778,7 +16763,6 @@ packages: ignore: 5.3.1 memoizee: 0.4.15 type: 2.7.2 - dev: true /fsevents@2.3.2: resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} @@ -16864,7 +16848,6 @@ packages: /get-stdin@8.0.0: resolution: {integrity: sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==} engines: {node: '>=10'} - dev: true /get-stream@2.3.1: resolution: {integrity: sha512-AUGhbbemXxrZJRD5cDvKtQxLuYaIbNtDTK8YqupCI393Q2KSTreEsLUN3ZxAWFGiKTzL6nKuzfcIvieflUX9qA==} @@ -16872,7 +16855,6 @@ packages: dependencies: object-assign: 4.1.1 pinkie-promise: 2.0.1 - dev: true /get-stream@3.0.0: resolution: {integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==} @@ -16884,7 +16866,6 @@ packages: engines: {node: '>=8'} dependencies: pump: 3.0.0 - dev: true /get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} @@ -17104,7 +17085,6 @@ packages: lowercase-keys: 2.0.0 p-cancelable: 2.1.1 responselike: 2.0.1 - dev: true /got@12.6.1: resolution: {integrity: sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==} @@ -17158,7 +17138,6 @@ packages: resolution: {integrity: sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==} dependencies: lodash: 4.17.21 - dev: true /gray-matter@4.0.3: resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} @@ -17666,7 +17645,6 @@ packages: /hexoid@1.0.0: resolution: {integrity: sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==} engines: {node: '>=8'} - dev: true /hmac-drbg@1.0.1: resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} @@ -17813,7 +17791,7 @@ packages: engines: {node: '>= 14'} dependencies: agent-base: 7.1.1 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -17823,7 +17801,6 @@ packages: dependencies: quick-lru: 5.1.1 resolve-alpn: 1.2.1 - dev: true /http2-wrapper@2.2.1: resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==} @@ -17837,6 +17814,16 @@ packages: resolution: {integrity: sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==} dev: true + /https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + dependencies: + agent-base: 6.0.2 + debug: 4.3.4(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + dev: false + /https-proxy-agent@5.0.1(supports-color@8.1.1): resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} @@ -17851,7 +17838,7 @@ packages: engines: {node: '>= 14'} dependencies: agent-base: 7.1.1 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -17937,7 +17924,6 @@ packages: /ieee754@1.1.13: resolution: {integrity: sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==} - dev: true /ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -18050,7 +18036,6 @@ packages: strip-ansi: 6.0.1 through: 2.3.8 wrap-ansi: 6.2.0 - dev: true /instantsearch-ui-components@0.5.0: resolution: {integrity: sha512-iDdbAbPDyKZOCdOd4aiMkMVJ1WFhc+QU0dM0EIgfZqDYHFuw8XfyLakRK+S7YcQi4bomoqWZ4FiQ/gTFFWo4rQ==} @@ -18266,7 +18251,6 @@ packages: /is-interactive@1.0.0: resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} engines: {node: '>=8'} - dev: true /is-interactive@2.0.0: resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} @@ -18294,7 +18278,6 @@ packages: /is-natural-number@4.0.1: resolution: {integrity: sha512-Y4LTamMe0DDQIIAlaer9eKebAlDSV6huy+TWhJVPlzZh2o4tRP5SQWFlLn5N0To4mDD22/qdOq+veo1cSISLgQ==} - dev: true /is-negative-zero@2.0.3: resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} @@ -18337,7 +18320,6 @@ packages: /is-plain-obj@1.1.0: resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} engines: {node: '>=0.10.0'} - dev: true /is-plain-obj@4.1.0: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} @@ -18360,7 +18342,6 @@ packages: /is-promise@2.2.2: resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} - dev: true /is-reference@1.2.1: resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} @@ -18429,7 +18410,6 @@ packages: /is-unicode-supported@0.1.0: resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} engines: {node: '>=10'} - dev: true /is-unicode-supported@1.3.0: resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} @@ -18491,7 +18471,6 @@ packages: ws: '*' dependencies: ws: 7.5.9 - dev: true /istanbul-lib-coverage@3.2.2: resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} @@ -18537,7 +18516,7 @@ packages: resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} engines: {node: '>=10'} dependencies: - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4(supports-color@5.5.0) istanbul-lib-coverage: 3.2.2 source-map: 0.6.1 transitivePeerDependencies: @@ -19047,7 +19026,16 @@ packages: /jmespath@0.16.0: resolution: {integrity: sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==} engines: {node: '>= 0.6.0'} - dev: true + + /joi@17.13.3: + resolution: {integrity: sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==} + dependencies: + '@hapi/hoek': 9.3.0 + '@hapi/topo': 5.1.0 + '@sideway/address': 4.1.5 + '@sideway/formula': 3.0.1 + '@sideway/pinpoint': 2.0.0 + dev: false /jose@5.2.4: resolution: {integrity: sha512-6ScbIk2WWCeXkmzF6bRPmEuaqy1m8SbsRFMa/FLrSCkGIhj8OLVG/IH+XHVmNMx/KUo8cVWEE6oKR4dJ+S0Rkg==} @@ -19183,6 +19171,14 @@ packages: engines: {node: '>=4'} hasBin: true + /json-2-csv@5.5.1: + resolution: {integrity: sha512-KgAtAXTQopRwe90gh8SgjRSxgt9bUWbGAPMo9W0TZLA8SqiQH7khtagFfeEUjG3NBPwJu/+9uX5pMvunKaPvrQ==} + engines: {node: '>= 16'} + dependencies: + deeks: 3.1.0 + doc-path: 4.1.1 + dev: false + /json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} @@ -19191,12 +19187,10 @@ packages: dependencies: chalk: 2.4.2 lodash.get: 4.4.2 - dev: true /json-cycle@1.5.0: resolution: {integrity: sha512-GOehvd5PO2FeZ5T4c+RxobeT5a1PiGpF4u9/3+UvrMU4bhnVqzJY7hm39wg8PDCqkU91fWGH8qjWR4bn+wgq9w==} engines: {node: '>= 4'} - dev: true /json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} @@ -19216,7 +19210,6 @@ packages: uri-js: 4.4.1 transitivePeerDependencies: - supports-color - dev: true /json-schema-to-ts@1.6.5: resolution: {integrity: sha512-BLUdzgz50XV+NMrSg8+KrUvV7Oh1eb/kLsyPbkWXFTXTloWkAsq7MbAppibE+DyMy4PasS/7bFQPwTIHx35r+A==} @@ -19260,6 +19253,11 @@ packages: optionalDependencies: graceful-fs: 4.2.11 + /jsonpath-plus@7.2.0: + resolution: {integrity: sha512-zBfiUPM5nD0YZSBT/o/fbCUlCcepMIdP0CJZxM1+KgA4f2T206f6VAg9e7mX35+KlMaIc5qXW34f3BnwJ3w+RA==} + engines: {node: '>=12.0.0'} + dev: false + /jsonpath@1.1.1: resolution: {integrity: sha512-l6Cg7jRpixfbgoWgkrl77dgEj8RPvND0wMH6TwQmi9Qs4TFfS9u5cUFnbeKTwj5ga5Y3BTGGNI28k117LJ009w==} dependencies: @@ -19300,7 +19298,6 @@ packages: pako: 1.0.11 readable-stream: 2.3.8 setimmediate: 1.0.5 - dev: true /jwa@1.4.1: resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==} @@ -19319,11 +19316,9 @@ packages: /jwt-decode@2.2.0: resolution: {integrity: sha512-86GgN2vzfUu7m9Wcj63iUkuDzFNYFVmjeDm2GzWpUk+opB0pEpMsw6ePCMrhYkumz2C1ihqtZzOMAg7FiXcNoQ==} - dev: true /jwt-decode@3.1.2: resolution: {integrity: sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A==} - dev: true /katex@0.16.10: resolution: {integrity: sha512-ZiqaC04tp2O5utMsl2TEZTXxa6WSC4yo0fv5ML++D3QZv/vx2Mct0mTlRx3O+uUkjfuAgOkzsCmq5MiUEsDDdA==} @@ -19460,7 +19455,6 @@ packages: resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} dependencies: immediate: 3.0.6 - dev: true /lilconfig@2.1.0: resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} @@ -19480,7 +19474,7 @@ packages: dependencies: chalk: 5.3.0 commander: 11.0.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4(supports-color@5.5.0) execa: 7.2.0 lilconfig: 2.1.0 listr2: 6.6.1 @@ -19590,19 +19584,15 @@ packages: /lodash.defaults@4.2.0: resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} - dev: true /lodash.difference@4.5.0: resolution: {integrity: sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==} - dev: true /lodash.flatten@4.4.0: resolution: {integrity: sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==} - dev: true /lodash.get@4.4.2: resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} - dev: true /lodash.includes@4.3.0: resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} @@ -19648,7 +19638,6 @@ packages: /lodash.union@4.6.0: resolution: {integrity: sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==} - dev: true /lodash.uniq@4.5.0: resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} @@ -19672,7 +19661,6 @@ packages: sprintf-kit: 2.0.1 supports-color: 8.1.1 type: 2.7.2 - dev: true /log-symbols@4.1.0: resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} @@ -19680,7 +19668,6 @@ packages: dependencies: chalk: 4.1.2 is-unicode-supported: 0.1.0 - dev: true /log-symbols@5.1.0: resolution: {integrity: sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==} @@ -19711,7 +19698,6 @@ packages: sprintf-kit: 2.0.1 type: 2.7.2 uni-global: 1.0.0 - dev: true /logform@2.6.0: resolution: {integrity: sha512-1ulHeNPp6k/LD8H91o7VYFBng5i1BDE7HoKxVbZiGFidS1Rj65qcywLxX+pVfAPoQJEjRdvKcusKwOupHCVOVQ==} @@ -19749,7 +19735,6 @@ packages: /lowercase-keys@2.0.0: resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} engines: {node: '>=8'} - dev: true /lowercase-keys@3.0.0: resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} @@ -19775,7 +19760,6 @@ packages: resolution: {integrity: sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==} dependencies: es5-ext: 0.10.64 - dev: true /lucide-react@0.378.0(react@18.3.1): resolution: {integrity: sha512-u6EPU8juLUk9ytRcyapkWI18epAv3RU+6+TC23ivjR0e+glWKBobFeSgRwOIJihzktILQuy6E0E80P2jVTDR5g==} @@ -19805,7 +19789,6 @@ packages: engines: {node: '>=4'} dependencies: pify: 3.0.0 - dev: true /make-dir@2.1.0: resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} @@ -19827,7 +19810,6 @@ packages: engines: {node: '>=10'} dependencies: semver: 7.6.2 - dev: true /make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} @@ -20309,7 +20291,6 @@ packages: lru-queue: 0.1.0 next-tick: 1.1.0 timers-ext: 0.1.7 - dev: true /memoizerific@1.11.3: resolution: {integrity: sha512-/EuHYwAPdLtXwAwSZkh/Gutery6pD2KYd44oQLhAvQp/50mpyduZh8Q7PYHXTCJ+wuXxt7oij2LXyIJOOYFPog==} @@ -20992,7 +20973,7 @@ packages: resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==} dependencies: '@types/debug': 4.1.12 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4(supports-color@5.5.0) decode-named-character-reference: 1.0.2 micromark-core-commonmark: 1.1.0 micromark-factory-space: 1.1.0 @@ -21016,7 +20997,7 @@ packages: resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==} dependencies: '@types/debug': 4.1.12 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4(supports-color@5.5.0) decode-named-character-reference: 1.0.2 devlop: 1.1.0 micromark-core-commonmark: 2.0.1 @@ -21070,7 +21051,6 @@ packages: resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} engines: {node: '>=4.0.0'} hasBin: true - dev: true /mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} @@ -21083,7 +21063,6 @@ packages: /mimic-response@1.0.1: resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} engines: {node: '>=4'} - dev: true /mimic-response@3.1.0: resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} @@ -21269,7 +21248,6 @@ packages: /mute-stream@0.0.8: resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} - dev: true /mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} @@ -21307,7 +21285,6 @@ packages: /native-promise-only@0.8.1: resolution: {integrity: sha512-zkVhZUA3y8mbz652WrL5x0fB0ehrBkulWT3TomAQ9iDtyXZvzKeEA6GPxAItBYeNYl5yngKRX612qHOhvMkDeg==} - dev: true /natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} @@ -21323,7 +21300,6 @@ packages: find-requires: 1.0.0 fs2: 0.3.9 type: 2.7.2 - dev: true /needle@3.3.1: resolution: {integrity: sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==} @@ -21383,7 +21359,6 @@ packages: /next-tick@1.1.0: resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} - dev: true /next@14.2.3(@babel/core@7.24.5)(@playwright/test@1.44.1)(react-dom@18.3.1)(react@18.3.1)(sass@1.77.0): resolution: {integrity: sha512-dowFkFTR8v79NPJO4QsBUtxv0g9BrS/phluVpMAt2ku7H+cbcBJlopXjkWlwxrk/xGqMemr7JkGPGemPrLLX7A==} @@ -21430,7 +21405,6 @@ packages: /nice-try@1.0.5: resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} - dev: true /nlcst-to-string@3.1.1: resolution: {integrity: sha512-63mVyqaqt0cmn2VcI2aH6kxe1rLAmSROqHMA0i4qqg1tidkfExgpb0FGMikMCn86mw5dFtBtEANfmSSK7TjNHw==} @@ -21471,7 +21445,6 @@ packages: engines: {node: '>= 0.10.5'} dependencies: minimatch: 3.1.2 - dev: true /node-domexception@1.0.0: resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} @@ -21594,7 +21567,6 @@ packages: /normalize-url@6.1.0: resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} engines: {node: '>=10'} - dev: true /normalize-url@8.0.1: resolution: {integrity: sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==} @@ -21614,7 +21586,6 @@ packages: validate-npm-package-name: 3.0.0 transitivePeerDependencies: - encoding - dev: true /npm-run-path@2.0.2: resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} @@ -21798,7 +21769,6 @@ packages: dependencies: is-docker: 2.2.1 is-wsl: 2.2.0 - dev: true /open@8.4.2: resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} @@ -21853,7 +21823,6 @@ packages: log-symbols: 4.1.0 strip-ansi: 6.0.1 wcwidth: 1.0.1 - dev: true /ora@6.3.1: resolution: {integrity: sha512-ERAyNnZOfqM+Ao3RAvIXkYh5joP220yf59gVe2X/cI6SiCxIdi4c9HZKZD8R6q/RDXEje1THBju6iExiSsgJaQ==} @@ -21887,7 +21856,6 @@ packages: /os-tmpdir@1.0.2: resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} engines: {node: '>=0.10.0'} - dev: true /p-any@4.0.0: resolution: {integrity: sha512-S/B50s+pAVe0wmEZHmBs/9yJXeZ5KhHzOsgKzt0hRdgkoR3DxW9ts46fcsWi/r3VnzsnkKS7q4uimze+zjdryw==} @@ -21900,7 +21868,6 @@ packages: /p-cancelable@2.1.1: resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} engines: {node: '>=8'} - dev: true /p-cancelable@3.0.0: resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==} @@ -21912,7 +21879,6 @@ packages: engines: {node: '>=8'} dependencies: p-timeout: 3.2.0 - dev: true /p-finally@1.0.0: resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} @@ -22032,7 +21998,6 @@ packages: /pako@1.0.11: resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} - dev: true /param-case@3.0.4: resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} @@ -22171,7 +22136,6 @@ packages: superagent: 7.1.6(supports-color@8.1.1) transitivePeerDependencies: - supports-color - dev: true /path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} @@ -22202,7 +22166,6 @@ packages: /path2@0.1.0: resolution: {integrity: sha512-TX+cz8Jk+ta7IvRy2FAej8rdlbrP0+uBIkP/5DTODez/AuL/vSb30KuAdDxGVREXzn8QfAiu5mJYJ1XjbOhEPA==} - dev: true /pathe@1.1.2: resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} @@ -22234,7 +22197,6 @@ packages: /peek-readable@4.1.0: resolution: {integrity: sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg==} engines: {node: '>=8'} - dev: true /peek-stream@1.1.3: resolution: {integrity: sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==} @@ -22246,7 +22208,6 @@ packages: /pend@1.2.0: resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} - dev: true /periscopic@3.1.0: resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} @@ -22276,7 +22237,6 @@ packages: /pify@3.0.0: resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} engines: {node: '>=4'} - dev: true /pify@4.0.1: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} @@ -22296,7 +22256,6 @@ packages: engines: {node: '>=0.10.0'} dependencies: pinkie: 2.0.4 - dev: true /pinkie@1.0.0: resolution: {integrity: sha512-VFVaU1ysKakao68ktZm76PIdOhvEfoNNRaGkyLln9Os7r0/MCxqHjHyBM7dT3pgTiBybqiPtpqKfpENwdBp50Q==} @@ -22306,7 +22265,6 @@ packages: /pinkie@2.0.4: resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} engines: {node: '>=0.10.0'} - dev: true /pirates@4.0.6: resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} @@ -22961,7 +22919,6 @@ packages: fs2: 0.3.9 memoizee: 0.4.15 type: 2.7.2 - dev: true /process@0.11.10: resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} @@ -22975,7 +22932,6 @@ packages: /promise-queue@2.2.5: resolution: {integrity: sha512-p/iXrPSVfnqPft24ZdNNLECw/UrtLTpT3jpAAMzl/o5/rDsGCPo3/CQS2611flL6LkoEJ3oQZw7C8Q80ZISXRQ==} engines: {node: '>= 0.8.0'} - dev: true /prompts@2.4.2: resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} @@ -23058,7 +23014,6 @@ packages: dependencies: end-of-stream: 1.4.4 once: 1.4.0 - dev: true /pumpify@1.5.1: resolution: {integrity: sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==} @@ -23070,7 +23025,6 @@ packages: /punycode@1.3.2: resolution: {integrity: sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==} - dev: true /punycode@1.4.1: resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} @@ -23116,13 +23070,11 @@ packages: resolution: {integrity: sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==} engines: {node: '>=0.4.x'} deprecated: The querystring API is considered Legacy. new code should use the URLSearchParams API instead. - dev: true /querystring@0.2.1: resolution: {integrity: sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg==} engines: {node: '>=0.4.x'} deprecated: The querystring API is considered Legacy. new code should use the URLSearchParams API instead. - dev: true /querystringify@2.2.0: resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} @@ -23545,7 +23497,6 @@ packages: engines: {node: '>=8'} dependencies: readable-stream: 3.6.2 - dev: true /readdir-glob@1.1.3: resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==} @@ -24040,7 +23991,6 @@ packages: resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} dependencies: lowercase-keys: 2.0.0 - dev: true /responselike@3.0.0: resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==} @@ -24055,7 +24005,6 @@ packages: dependencies: onetime: 5.1.2 signal-exit: 3.0.7 - dev: true /restore-cursor@4.0.0: resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} @@ -24176,13 +24125,11 @@ packages: /run-async@2.4.1: resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} engines: {node: '>=0.12.0'} - dev: true /run-parallel-limit@1.1.0: resolution: {integrity: sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw==} dependencies: queue-microtask: 1.2.3 - dev: true /run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} @@ -24193,7 +24140,6 @@ packages: resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} dependencies: tslib: 2.6.2 - dev: true /sade@1.8.1: resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} @@ -24272,7 +24218,6 @@ packages: /sax@1.3.0: resolution: {integrity: sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==} - dev: true /saxes@6.0.0: resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} @@ -24325,7 +24270,6 @@ packages: hasBin: true dependencies: commander: 2.20.3 - dev: true /selderee@0.11.0: resolution: {integrity: sha512-5TF+l7p4+OsnP8BCCvSyZiSPc4x4//p5uPwK8TCnVPJYRmU2aYKMpOXvw8zM5a5JvuuCGN1jmsMwuU2W02ukfA==} @@ -24364,7 +24308,6 @@ packages: /semver@5.7.2: resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} hasBin: true - dev: true /semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} @@ -24437,6 +24380,22 @@ packages: semver: 7.6.2 dev: true + /serverless-step-functions@3.21.0(serverless@3.38.0): + resolution: {integrity: sha512-u6rMkTQaM4z/GSSy36Q/Utl0c7zaOv3i7sqVpZfvKVSV7LH+E40tptSSKRddECFWIKVERaT14JI7Dnwx9luoCQ==} + peerDependencies: + serverless: ^2.32.0 || 3 + dependencies: + '@serverless/utils': 6.15.0 + asl-validator: 3.8.2 + bluebird: 3.7.2 + chalk: 4.1.2 + joi: 17.13.3 + lodash: 4.17.21 + serverless: 3.38.0 + transitivePeerDependencies: + - encoding + dev: false + /serverless@3.38.0: resolution: {integrity: sha512-NJE1vOn8XmQEqfU9UxmVhkUFaCRmx6FhYw/jITN863WlOt4Y3PQbj3hwQyIb5QS1ZrXFq5ojklwewUXH7xGpdA==} engines: {node: '>=12.0'} @@ -24450,7 +24409,7 @@ packages: ajv: 8.13.0 ajv-formats: 2.1.1(ajv@8.13.0) archiver: 5.3.2 - aws-sdk: 2.1617.0 + aws-sdk: 2.1646.0 bluebird: 3.7.2 cachedir: 2.4.0 chalk: 4.1.2 @@ -24505,7 +24464,6 @@ packages: - debug - encoding - utf-8-validate - dev: true /set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} @@ -24534,7 +24492,6 @@ packages: /setimmediate@1.0.5: resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} - dev: true /setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} @@ -24666,6 +24623,15 @@ packages: simple-concat: 1.0.1 dev: true + /simple-git@3.24.0: + resolution: {integrity: sha512-QqAKee9Twv+3k8IFOFfPB2hnk6as6Y6ACUpwCtQvRYBAes23Wv3SZlHVobAzqcE8gfsisCvPw3HGW3HYM+VYYw==} + dependencies: + '@kwsites/file-exists': 1.1.1 + '@kwsites/promise-deferred': 1.1.1 + debug: 4.3.4(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + /simple-git@3.24.0(supports-color@8.1.1): resolution: {integrity: sha512-QqAKee9Twv+3k8IFOFfPB2hnk6as6Y6ACUpwCtQvRYBAes23Wv3SZlHVobAzqcE8gfsisCvPw3HGW3HYM+VYYw==} dependencies: @@ -24739,7 +24705,7 @@ packages: /socket.io-adapter@2.5.4: resolution: {integrity: sha512-wDNHGXGewWAjQPt3pyeYBtpWSq9cLE5UW1ZUPL/2eGK9jtse/FpXib7epSTsz0Q0m+6sg6Y4KtcFTlah1bdOVg==} dependencies: - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4(supports-color@5.5.0) ws: 8.11.0 transitivePeerDependencies: - bufferutil @@ -24752,7 +24718,7 @@ packages: engines: {node: '>=10.0.0'} dependencies: '@socket.io/component-emitter': 3.1.2 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4(supports-color@5.5.0) transitivePeerDependencies: - supports-color dev: false @@ -24764,7 +24730,7 @@ packages: accepts: 1.3.8 base64id: 2.0.0 cors: 2.8.5 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4(supports-color@5.5.0) engine.io: 6.5.4 socket.io-adapter: 2.5.4 socket.io-parser: 4.2.4 @@ -24789,14 +24755,12 @@ packages: engines: {node: '>=0.10.0'} dependencies: sort-keys: 1.1.2 - dev: true /sort-keys@1.1.2: resolution: {integrity: sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg==} engines: {node: '>=0.10.0'} dependencies: is-plain-obj: 1.1.0 - dev: true /source-map-js@1.2.0: resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} @@ -24864,7 +24828,6 @@ packages: resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} dependencies: readable-stream: 3.6.2 - dev: true /split@0.3.3: resolution: {integrity: sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA==} @@ -24879,7 +24842,6 @@ packages: resolution: {integrity: sha512-2PNlcs3j5JflQKcg4wpdqpZ+AjhQJ2OZEo34NXDtlB0tIPG84xaaXhpA8XFacFiwjKA4m49UOYG83y3hbMn/gQ==} dependencies: es5-ext: 0.10.64 - dev: true /stack-generator@2.0.10: resolution: {integrity: sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ==} @@ -24996,7 +24958,6 @@ packages: /stream-buffers@3.0.2: resolution: {integrity: sha512-DQi1h8VEBA/lURbSwFtEHnSTb9s2/pwLEaFuNhXwy1Dx3Sa0lOuYT2yNUr4/j2fs8oCAMANtrZ5OrPZtyVs3MQ==} engines: {node: '>= 0.10.0'} - dev: true /stream-combiner@0.0.4: resolution: {integrity: sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw==} @@ -25019,7 +24980,6 @@ packages: 2-thenable: 1.0.0 es5-ext: 0.10.64 is-stream: 1.1.0 - dev: true /stream-shift@1.0.3: resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} @@ -25178,7 +25138,6 @@ packages: resolution: {integrity: sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==} dependencies: is-natural-number: 4.0.1 - dev: true /strip-eof@1.0.0: resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} @@ -25224,7 +25183,6 @@ packages: engines: {node: '>=0.10.0'} dependencies: escape-string-regexp: 1.0.5 - dev: true /strnum@1.0.5: resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} @@ -25235,7 +25193,6 @@ packages: dependencies: '@tokenizer/token': 0.3.0 peek-readable: 4.1.0 - dev: true /style-loader@3.3.4(webpack@5.91.0): resolution: {integrity: sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==} @@ -25394,7 +25351,7 @@ packages: cosmiconfig: 9.0.0(typescript@5.4.3) css-functions-list: 3.2.2 css-tree: 2.3.1 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4(supports-color@5.5.0) fast-glob: 3.3.2 fastest-levenshtein: 1.0.16 file-entry-cache: 8.0.0 @@ -25437,7 +25394,7 @@ packages: hasBin: true dependencies: '@adobe/css-tools': 4.3.3 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4(supports-color@5.5.0) glob: 7.2.3 sax: 1.3.0 source-map: 0.7.4 @@ -25476,7 +25433,6 @@ packages: semver: 7.6.2 transitivePeerDependencies: - supports-color - dev: true /supports-color@2.0.0: resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} @@ -25501,7 +25457,6 @@ packages: engines: {node: '>=6'} dependencies: has-flag: 3.0.0 - dev: true /supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} @@ -25647,7 +25602,6 @@ packages: readable-stream: 2.3.8 to-buffer: 1.1.1 xtend: 4.0.2 - dev: true /tar-stream@2.2.0: resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} @@ -25658,7 +25612,6 @@ packages: fs-constants: 1.0.0 inherits: 2.0.4 readable-stream: 3.6.2 - dev: true /tar-stream@3.1.7: resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} @@ -25773,7 +25726,6 @@ packages: /throat@5.0.0: resolution: {integrity: sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==} - dev: true /throttle-debounce@3.0.1: resolution: {integrity: sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg==} @@ -25801,7 +25753,6 @@ packages: dependencies: es5-ext: 0.10.64 next-tick: 1.1.0 - dev: true /tiny-invariant@1.3.3: resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} @@ -25853,7 +25804,6 @@ packages: engines: {node: '>=0.6.0'} dependencies: os-tmpdir: 1.0.2 - dev: true /tmp@0.2.3: resolution: {integrity: sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==} @@ -25865,7 +25815,6 @@ packages: /to-buffer@1.1.1: resolution: {integrity: sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==} - dev: true /to-fast-properties@2.0.0: resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} @@ -25895,7 +25844,6 @@ packages: dependencies: '@tokenizer/token': 0.3.0 ieee754: 1.2.1 - dev: true /totalist@3.0.1: resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} @@ -25940,7 +25888,6 @@ packages: gopd: 1.0.1 typedarray.prototype.slice: 1.0.3 which-typed-array: 1.1.15 - dev: true /tree-kill@1.2.2: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} @@ -25961,7 +25908,6 @@ packages: engines: {node: '>=0.10.0'} dependencies: escape-string-regexp: 1.0.5 - dev: true /trim-trailing-lines@2.1.0: resolution: {integrity: sha512-5UR5Biq4VlVOtzqkm2AZlgvSlDJtME46uV0br0gENbwN4l5+mMKT4b9gJKqWtuL2zAIqajGJGuvbCbcAJUZqBg==} @@ -26153,7 +26099,7 @@ packages: bundle-require: 4.1.0(esbuild@0.20.2) cac: 6.7.14 chokidar: 3.6.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4(supports-color@5.5.0) esbuild: 0.20.2 execa: 5.1.1 globby: 11.1.0 @@ -26302,7 +26248,6 @@ packages: /type-fest@0.21.3: resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} engines: {node: '>=10'} - dev: true /type-fest@0.6.0: resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} @@ -26337,7 +26282,6 @@ packages: /type@2.7.2: resolution: {integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==} - dev: true /typed-array-buffer@1.0.2: resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} @@ -26389,7 +26333,6 @@ packages: es-errors: 1.3.0 typed-array-buffer: 1.0.2 typed-array-byte-offset: 1.0.2 - dev: true /typescript-plugin-css-modules@5.1.0(ts-node@10.9.2)(typescript@5.4.3): resolution: {integrity: sha512-6h+sLBa4l+XYSTn/31vZHd/1c3SvAbLpobY6FxDiUOHJQG1eD9Gh3eCs12+Eqc+TCOAdxcO+zAPvUq0jBfdciw==} @@ -26456,7 +26399,6 @@ packages: dependencies: buffer: 5.7.1 through: 2.3.8 - dev: true /undefsafe@2.0.5: resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} @@ -26477,7 +26419,6 @@ packages: resolution: {integrity: sha512-WWM3HP+siTxzIWPNUg7hZ4XO8clKi6NoCAJJWnuRL+BAqyFXF8gC03WNyTefGoUXYc47uYgXxpKLIEvo65PEHw==} dependencies: type: 2.7.2 - dev: true /unicode-canonical-property-names-ecmascript@2.0.0: resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} @@ -26757,7 +26698,6 @@ packages: dependencies: punycode: 1.3.2 querystring: 0.2.0 - dev: true /url@0.11.3: resolution: {integrity: sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw==} @@ -26825,7 +26765,6 @@ packages: /uuid@8.0.0: resolution: {integrity: sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==} hasBin: true - dev: true /uuid@8.3.2: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} @@ -26869,7 +26808,6 @@ packages: resolution: {integrity: sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==} dependencies: builtins: 1.0.3 - dev: true /vary@1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} @@ -26934,7 +26872,7 @@ packages: hasBin: true dependencies: cac: 6.7.14 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4(supports-color@5.5.0) pathe: 1.1.2 picocolors: 1.0.0 vite: 5.2.11(@types/node@18.19.33)(sass@1.77.0) @@ -27054,7 +26992,7 @@ packages: '@vitest/utils': 1.6.0 acorn-walk: 8.3.2 chai: 4.4.1 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4(supports-color@5.5.0) execa: 8.0.1 local-pkg: 0.5.0 magic-string: 0.30.10 @@ -27109,7 +27047,7 @@ packages: '@vitest/utils': 1.6.0 acorn-walk: 8.3.2 chai: 4.4.1 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4(supports-color@5.5.0) execa: 8.0.1 jsdom: 24.0.0 local-pkg: 0.5.0 @@ -27417,7 +27355,6 @@ packages: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - dev: true /wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} @@ -27452,7 +27389,6 @@ packages: dependencies: imurmurhash: 0.1.4 signal-exit: 3.0.7 - dev: true /write-file-atomic@5.0.1: resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} @@ -27473,7 +27409,6 @@ packages: optional: true utf-8-validate: optional: true - dev: true /ws@8.11.0: resolution: {integrity: sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==} @@ -27508,7 +27443,7 @@ packages: resolution: {integrity: sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==} engines: {node: '>=4.0.0'} dependencies: - sax: 1.2.1 + sax: 1.3.0 xmlbuilder: 11.0.1 /xmlbuilder@11.0.1: @@ -27537,7 +27472,6 @@ packages: /yaml-ast-parser@0.0.43: resolution: {integrity: sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A==} - dev: true /yaml@1.10.2: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} @@ -27560,7 +27494,6 @@ packages: dependencies: argparse: 1.0.10 glob: 7.2.3 - dev: true /yargs-parser@20.2.9: resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} @@ -27599,7 +27532,6 @@ packages: dependencies: buffer-crc32: 0.2.13 fd-slicer: 1.1.0 - dev: true /yn@3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} @@ -27620,7 +27552,6 @@ packages: archiver-utils: 3.0.4 compress-commons: 4.1.2 readable-stream: 3.6.2 - dev: true /zip-stream@6.0.1: resolution: {integrity: sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==} diff --git a/servers/fern-bot/.gitignore b/servers/fern-bot/.gitignore index 6b24eaba41..6770657411 100644 --- a/servers/fern-bot/.gitignore +++ b/servers/fern-bot/.gitignore @@ -10,4 +10,5 @@ jspm_packages # local env files .env.local +.env.dev .env.prod \ No newline at end of file diff --git a/servers/fern-bot/README.md b/servers/fern-bot/README.md index a0f8c9c545..de84073672 100644 --- a/servers/fern-bot/README.md +++ b/servers/fern-bot/README.md @@ -1,19 +1,15 @@ -# Serverless - AWS Node.js Typescript +# Fern Bot - Serverless Framework Project For detailed instructions, please refer to the [documentation](https://www.serverless.com/framework/docs/providers/aws/). ## Installation/deployment instructions -> **Requirements**: NodeJS `lts/fermium (v.14.15.0)`. If you're using [nvm](https://github.com/nvm-sh/nvm), run `nvm use` to ensure you're using the same Node version in local and in your lambda's runtime. - - Run `pnpm install` to install the project dependencies - Run `pnpm deploy` to deploy this stack to AWS ## Deployment -You may notice there is no Github action explicitly configured to deploy this bot, that is because we're using Serverless' platform to monitor + deploy for us for now. This handles preview deploys as well as true production deploys. - -More information on this can be found here: https://www.serverless.com/framework/docs/guides/dashboard/cicd +Take a look at `deploy-fern-bot-dev.yml` and `deploy-fern-bot-prod.yml` for how we currently deploy fern-bot's lambda functions. ## Bots @@ -22,6 +18,8 @@ We have two bots, one for staging/testing, and another that's the production app - **Test:** [[Development] Fern Bot](https://github.com/organizations/fern-api/settings/apps/development-fern-bot) - **Production:** [Fern API](https://github.com/organizations/fern-api/settings/apps/fern-api) +Credentials to both live within 1Password, and so you can easily create a `.env.dev` and a `.env.prod` to test your functions with fern-bot creds. + ## Testing locally (There's a way to write tests, but for now let's talk about invoking this) @@ -65,11 +63,6 @@ curl --location --request POST 'https://myApiEndpoint/dev/hello' \ ## Project structure -> [!NOTE] -> -> This structure was the default structure that came with the template we used, but it is still representative of where files should go, -> what files are meant to do and how the project is generally structured. - The project code base is mainly located within the `src` folder. This folder is divided in: - `functions` - containing code base and configuration for your lambda functions @@ -79,13 +72,11 @@ The project code base is mainly located within the `src` folder. This folder is . ├── src │ ├── functions # Lambda configuration and source code folder -│ │ ├── hello -│ │ │ ├── handler.ts # `Hello` lambda source code -│ │ │ ├── index.ts # `Hello` lambda Serverless configuration -│ │ │ ├── mock.json # `Hello` lambda input parameter, if any, for local invocation -│ │ │ └── schema.ts # `Hello` lambda input event JSON-Schema -│ │ │ -│ │ └── index.ts # Import/export of all lambda configurations +│ │ └── hello +│ │ ├── actions +│ │ │ └── hello.ts # `Hello` lambda source code +│ │ └── hello.ts # `Hello` lambda handler code +│ │ │ │ │ └── libs # Lambda shared code │ └── apiGateway.ts # API Gateway specific helpers @@ -97,3 +88,37 @@ The project code base is mainly located within the `src` folder. This folder is ├── tsconfig.json # Typescript compiler configuration └── tsconfig.paths.json # Typescript paths ``` + +## Adding a new function + +1. Create a new folder within `./src/functions` +2. Create a handler file, this is mostly boiler plate, so I'd look at the other functions to see how they export their handlers look for `export const handler` +3. Write the actual logic for the function +4. Write the `serverless` configuration for your function to get it depolyed + + 1. In most cases, this should be as simple as adding an entry to the `functions` block: + ``` + reallyCoolFunction: + handler: "src/functions/my-new-function/myNewFunction.handler" + ``` + 2. If your function interacts with git, you'll need to add the following layer to ensure git is installed within the lambda's execution environment: + ``` + reallyCoolFunction: + handler: "src/functions/my-new-function/myNewFunction.handler" + layers: + - arn:aws:lambda:us-east-1:553035198032:layer:git-lambda2:8 + ``` + 3. Specify your trigger: + ``` + reallyCoolFunction: + handler: "src/functions/my-new-function/myNewFunction.handler" + events: + - schedule: + rate: cron(0 0 * * ? *) + enabled: true + ``` + View the full list of events here: https://www.serverless.com/framework/docs/providers/aws/guide/events + +5. Test your function locally (as explained above): `dotenv -e .env.local -- pnpm invoke local --function reallyCoolFunction` +6. [Optional] Deploy to dev and test it within the AWS console +7. Submit a PR! The existing GitHub actions deploy the whole project, which will then include your new function already diff --git a/servers/fern-bot/package.json b/servers/fern-bot/package.json index 75896ed431..11dc4d085d 100644 --- a/servers/fern-bot/package.json +++ b/servers/fern-bot/package.json @@ -17,6 +17,7 @@ "node": ">=14.15.0" }, "dependencies": { + "@aws-sdk/client-s3": "^3.335.0", "@fern-api/core-utils": "0.15.0-rc63", "@fern-api/fs-utils": "0.15.0-rc63", "@octokit/openapi-types": "^22.1.0", @@ -24,7 +25,9 @@ "fern-api": "^0.21.0", "find-up": "^7.0.0", "js-yaml": "^4.1.0", + "json-2-csv": "^5.5.1", "octokit": "^3.2.0", + "serverless-step-functions": "^3.21.0", "simple-git": "^3.24.0", "tmp-promise": "^3.0.3", "zod": "^3.22.4" diff --git a/servers/fern-bot/serverless.yml b/servers/fern-bot/serverless.yml index 163aa26511..0e3d17f112 100644 --- a/servers/fern-bot/serverless.yml +++ b/servers/fern-bot/serverless.yml @@ -1,6 +1,8 @@ service: "fern-bot" frameworkVersion: "3" -plugins: ["serverless-esbuild"] +plugins: + - "serverless-esbuild" + - "serverless-step-functions" provider: name: aws runtime: nodejs18.x @@ -22,23 +24,111 @@ provider: GITHUB_APP_WEBHOOK_SECRET: ${env:GITHUB_APP_WEBHOOK_SECRET, 'placeholder'} CO_API_KEY: ${env:CO_API_KEY, 'placeholder'} REPO_TO_RUN_ON: ${env:REPO_TO_RUN_ON, 'OMIT'} + # Roles for the lambda functions + iam: + role: + statements: + - Effect: "Allow" + Action: + - s3:ListBucket + Resource: arn:aws:s3:::fern-bot-${opt:stage} + - Effect: "Allow" + Action: + - s3:GetObject + - s3:PutObject + - s3:DeleteObject + Resource: arn:aws:s3:::fern-bot-${opt:stage}/* + functions: - updateOpenApiSpec: + # ========== Updater Step Function ============ + # The functions needed for the step function + # + # Gets metadata on repo installations for the github app + updateRepoDataset: # 900 second timeout, e.g. 15 minutes timeout: 900 # 10GB memory memorySize: 10240 # 10GB storage ephemeralStorageSize: 10240 - handler: "src/functions/oas-cron/updateOpenApiSpec.handler" + handler: "src/functions/update-repo-data/updateRepoData.handler" # Adding a layer to have git available in the lambda # https://github.com/lambci/git-lambda-layer layers: - arn:aws:lambda:us-east-1:553035198032:layer:git-lambda2:8 - events: - - schedule: - rate: cron(0 0 * * ? *) - enabled: true + environment: + REPO_DATA_S3_BUCKET: "fern-bot-${opt:stage}" + REPO_DATA_S3_KEY: "lambdas/repos.csv" + + # Processes one repo at a time, from the updateRepoDataset metadata + updateOpenApiSpec: + timeout: 900 + memorySize: 10240 + ephemeralStorageSize: 10240 + handler: "src/functions/oas-cron/updateOpenApiSpec.handler" + layers: + - arn:aws:lambda:us-east-1:553035198032:layer:git-lambda2:8 + + # ============================================= + + # For on-demand invoking update, especially useful for triggering one-off updates + updateOpenApiSpecs: + timeout: 900 + memorySize: 10240 + ephemeralStorageSize: 10240 + handler: "src/functions/oas-cron/updateOpenApiSpecs.handler" + layers: + - arn:aws:lambda:us-east-1:553035198032:layer:git-lambda2:8 + +stepFunctions: + stateMachines: + updateSpecs: + name: updateSpecs-${opt:stage} + events: + - schedule: + rate: cron(0 0 * * ? *) + enabled: true + definition: + StartAt: UpdateRepoDataInS3 + States: + UpdateRepoDataInS3: + Type: Task + Resource: + Fn::Sub: "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:fern-bot-${opt:stage}-updateRepoDataset" + Next: UpdateSpecsInRepo + UpdateSpecsInRepo: + Type: Map + ItemReader: + ReaderConfig: + InputType: CSV + CSVHeaderLocation: FIRST_ROW + Resource: "arn:aws:states:::s3:getObject" + Parameters: + Bucket: "fern-bot-${opt:stage}" + Key: "lambdas/repos.csv" + ItemProcessor: + ProcessorConfig: + Mode: DISTRIBUTED + ExecutionType: STANDARD + StartAt: HandleRepo + States: + HandleRepo: + Type: Task + Resource: "arn:aws:states:::lambda:invoke" + Parameters: + "Payload.$": "$" + FunctionName: + Fn::GetAtt: [updateOpenApiSpec, Arn] + End: true + End: true + +resources: + Resources: + BotBucket: + Type: AWS::S3::Bucket + Properties: + BucketName: fern-bot-${opt:stage} + custom: esbuild: minify: true diff --git a/servers/fern-bot/src/functions/oas-cron/actions/updateOpenApiSpec.ts b/servers/fern-bot/src/functions/oas-cron/actions/updateOpenApiSpec.ts new file mode 100644 index 0000000000..4bc75441c1 --- /dev/null +++ b/servers/fern-bot/src/functions/oas-cron/actions/updateOpenApiSpec.ts @@ -0,0 +1,21 @@ +import { Env } from "@libs/env"; +import { setupGithubApp } from "@libs/github"; +import { RepoData } from "@libs/schemas"; +import { App } from "octokit"; +import { updateSpecInternal } from "../shared/updateSpecInternal"; + +export async function updateOpenApiSpecInternal(env: Env, repoData: RepoData): Promise { + const app: App = setupGithubApp(env); + + // There has to be a better way to do this, but I couldn't find a great way to get the installation ID + await app.eachRepository(async (installation) => { + if (installation.repository.full_name === repoData.full_name) { + await updateSpecInternal( + installation.octokit, + repoData, + env.GITHUB_APP_LOGIN_NAME, + env.GITHUB_APP_LOGIN_ID, + ); + } + }); +} diff --git a/servers/fern-bot/src/functions/oas-cron/actions/updateOpenApiSpecs.ts b/servers/fern-bot/src/functions/oas-cron/actions/updateOpenApiSpecs.ts index 98172ddc2b..c50e837cfa 100644 --- a/servers/fern-bot/src/functions/oas-cron/actions/updateOpenApiSpecs.ts +++ b/servers/fern-bot/src/functions/oas-cron/actions/updateOpenApiSpecs.ts @@ -1,101 +1,7 @@ -import { AbsoluteFilePath, doesPathExist } from "@fern-api/fs-utils"; -import { generateChangelog, generateCommitMessage } from "@libs/cohere"; import { Env } from "@libs/env"; -import { components } from "@octokit/openapi-types"; -import { mkdir } from "fs/promises"; -import { App, Octokit } from "octokit"; -import * as path from "path"; -import simpleGit from "simple-git"; -import tmp from "tmp-promise"; -import { execFernCli } from "../../../libs/fern"; -import { setupGithubApp } from "../github/octokit"; -import { createOrUpdatePullRequest } from "../github/utilities"; - -const OPENAPI_UPDATE_BRANCH = "fern/update-api-specs"; -type Repository = components["schemas"]["repository"]; - -async function updateOpenApiSpecInternal( - octokit: Octokit, - repository: Repository, - fernBotLoginName: string, - fernBotLoginId: string, -): Promise { - const tmpDir = await tmp.dir(); - const fullRepoPath = AbsoluteFilePath.of(path.join(tmpDir.path, repository.id.toString(), repository.name)); - - const branchRemoteName = "origin"; - const originDefaultBranch = `${branchRemoteName}/${repository.default_branch}`; - - console.log(`Cloning repo: ${repository.clone_url} to ${fullRepoPath}`); - if (!(await doesPathExist(fullRepoPath))) { - await mkdir(fullRepoPath, { recursive: true }); - } - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const installationToken = ((await octokit.auth({ type: "installation" })) as any).token; - const git = simpleGit(fullRepoPath); - - const authedCloneUrl = repository.clone_url.replace("https://", `https://x-access-token:${installationToken}@`); - // Clone the repo to fullRepoPath and update the branch - await git.clone(authedCloneUrl, "."); - // Configure git to show the app as the committer - await git.addConfig("user.name", fernBotLoginName); - await git.addConfig("user.email", `${fernBotLoginId}+${fernBotLoginName}@users.noreply.github.com`); - try { - // If you can fetch the branch, checkout the branch - await git.fetch(branchRemoteName, OPENAPI_UPDATE_BRANCH); - console.log("Branch exists, checking out"); - await git.checkout(OPENAPI_UPDATE_BRANCH); - // Merge the default branch into this branch to update it - // prefer the default branch changes - // - // TODO: we could honestly probably just delete the branch and recreate it - // my concern with that is if there are more changes we decide to make in other actions - // to the same branch that are not OpenAPI related, that we'd lose if we deleted and reupdated the spec. - await git.merge(["-X", "theirs", originDefaultBranch]); - } catch (e) { - console.log("Branch does not exist, create and checkout"); - await git.checkoutBranch(OPENAPI_UPDATE_BRANCH, branchRemoteName); - } - - try { - // Run API update command which will pull the new spec from the specified - // origin and write it to disk we can then commit it to github from there. - await execFernCli("api update", fullRepoPath); - } catch (error) { - return; - } - - console.log("Checking for changes to commit and push"); - if (!(await git.status()).isClean()) { - console.log("Changes detected, committing and pushing"); - // Add + commit files - const commitDiff = await git.diff(); - await git.add(["-A"]); - await git.commit(await generateCommitMessage(commitDiff)); - - // Push the changes - await git.push([ - "--force-with-lease", - branchRemoteName, - `${OPENAPI_UPDATE_BRANCH}:refs/heads/${OPENAPI_UPDATE_BRANCH}`, - ]); - - const fullDiff = await git.diff([originDefaultBranch]); - // Open a PR - await createOrUpdatePullRequest( - octokit, - { - title: ":herb: :sparkles: [Scheduled] Update API Spec", - base: "main", - body: await generateChangelog(fullDiff), - }, - repository.full_name, - repository.full_name, - OPENAPI_UPDATE_BRANCH, - ); - } -} +import { setupGithubApp } from "@libs/github"; +import { App } from "octokit"; +import { updateSpecInternal } from "../shared/updateSpecInternal"; export async function updateOpenApiSpecsInternal(env: Env): Promise { const app: App = setupGithubApp(env); @@ -113,10 +19,16 @@ export async function updateOpenApiSpecsInternal(env: Env): Promise { } else if (env.REPO_TO_RUN_ON !== undefined) { console.log("REPO_TO_RUN_ON has been found, running logic."); } - console.log("Encountered installation", installation.repository.full_name); - await updateOpenApiSpecInternal( + + await updateSpecInternal( installation.octokit, - installation.repository, + { + id: installation.repository.id.toString(), + name: installation.repository.name, + full_name: installation.repository.full_name, + default_branch: installation.repository.default_branch, + clone_url: installation.repository.clone_url, + }, env.GITHUB_APP_LOGIN_NAME, env.GITHUB_APP_LOGIN_ID, ); diff --git a/servers/fern-bot/src/functions/oas-cron/mock.json b/servers/fern-bot/src/functions/oas-cron/mock.json deleted file mode 100644 index 6b1c818c96..0000000000 --- a/servers/fern-bot/src/functions/oas-cron/mock.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "headers": { - "Content-Type": "application/json" - }, - "body": "{\"name\": \"Frederic\"}" -} diff --git a/servers/fern-bot/src/functions/oas-cron/schema.ts b/servers/fern-bot/src/functions/oas-cron/schema.ts deleted file mode 100644 index 78e8dfee91..0000000000 --- a/servers/fern-bot/src/functions/oas-cron/schema.ts +++ /dev/null @@ -1,7 +0,0 @@ -export default { - type: "object", - properties: { - name: { type: "string" }, - }, - required: ["name"], -} as const; diff --git a/servers/fern-bot/src/functions/oas-cron/shared/updateSpecInternal.ts b/servers/fern-bot/src/functions/oas-cron/shared/updateSpecInternal.ts new file mode 100644 index 0000000000..8cd8b96e04 --- /dev/null +++ b/servers/fern-bot/src/functions/oas-cron/shared/updateSpecInternal.ts @@ -0,0 +1,95 @@ +import { AbsoluteFilePath, doesPathExist } from "@fern-api/fs-utils"; +import { generateChangelog, generateCommitMessage } from "@libs/cohere"; +import { execFernCli } from "@libs/fern"; +import { createOrUpdatePullRequest } from "@libs/github"; +import { RepoData } from "@libs/schemas"; +import { mkdir } from "fs/promises"; +import { Octokit } from "octokit"; +import * as path from "path"; +import simpleGit from "simple-git"; +import tmp from "tmp-promise"; + +const OPENAPI_UPDATE_BRANCH = "fern/update-api-specs"; + +export async function updateSpecInternal( + octokit: Octokit, + repository: RepoData, + fernBotLoginName: string, + fernBotLoginId: string, +): Promise { + const tmpDir = await tmp.dir(); + const fullRepoPath = AbsoluteFilePath.of(path.join(tmpDir.path, repository.id.toString(), repository.name)); + + const branchRemoteName = "origin"; + const originDefaultBranch = `${branchRemoteName}/${repository.default_branch}`; + + console.log(`Cloning repo: ${repository.clone_url} to ${fullRepoPath}`); + if (!(await doesPathExist(fullRepoPath))) { + await mkdir(fullRepoPath, { recursive: true }); + } + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const installationToken = ((await octokit.auth({ type: "installation" })) as any).token; + const git = simpleGit(fullRepoPath); + + const authedCloneUrl = repository.clone_url.replace("https://", `https://x-access-token:${installationToken}@`); + // Clone the repo to fullRepoPath and update the branch + await git.clone(authedCloneUrl, "."); + // Configure git to show the app as the committer + await git.addConfig("user.name", fernBotLoginName); + await git.addConfig("user.email", `${fernBotLoginId}+${fernBotLoginName}@users.noreply.github.com`); + try { + // If you can fetch the branch, checkout the branch + await git.fetch(branchRemoteName, OPENAPI_UPDATE_BRANCH); + console.log("Branch exists, checking out"); + await git.checkout(OPENAPI_UPDATE_BRANCH); + // Merge the default branch into this branch to update it + // prefer the default branch changes + // + // TODO: we could honestly probably just delete the branch and recreate it + // my concern with that is if there are more changes we decide to make in other actions + // to the same branch that are not OpenAPI related, that we'd lose if we deleted and reupdated the spec. + await git.merge(["-X", "theirs", originDefaultBranch]); + } catch (e) { + console.log("Branch does not exist, create and checkout"); + await git.checkoutBranch(OPENAPI_UPDATE_BRANCH, branchRemoteName); + } + + try { + // Run API update command which will pull the new spec from the specified + // origin and write it to disk we can then commit it to github from there. + await execFernCli("api update", fullRepoPath); + } catch (error) { + return; + } + + console.log("Checking for changes to commit and push"); + if (!(await git.status()).isClean()) { + console.log("Changes detected, committing and pushing"); + // Add + commit files + const commitDiff = await git.diff(); + await git.add(["-A"]); + await git.commit(await generateCommitMessage(commitDiff)); + + // Push the changes + await git.push([ + "--force-with-lease", + branchRemoteName, + `${OPENAPI_UPDATE_BRANCH}:refs/heads/${OPENAPI_UPDATE_BRANCH}`, + ]); + + const fullDiff = await git.diff([originDefaultBranch]); + // Open a PR + await createOrUpdatePullRequest( + octokit, + { + title: ":herb: :sparkles: [Scheduled] Update API Spec", + base: "main", + body: await generateChangelog(fullDiff), + }, + repository.full_name, + repository.full_name, + OPENAPI_UPDATE_BRANCH, + ); + } +} diff --git a/servers/fern-bot/src/functions/oas-cron/updateOpenApiSpec.ts b/servers/fern-bot/src/functions/oas-cron/updateOpenApiSpec.ts index e9d266477d..d520f14d24 100644 --- a/servers/fern-bot/src/functions/oas-cron/updateOpenApiSpec.ts +++ b/servers/fern-bot/src/functions/oas-cron/updateOpenApiSpec.ts @@ -1,12 +1,13 @@ import { evaluateEnv } from "@libs/env"; import { handlerWrapper } from "@libs/handler-wrapper"; -import { updateOpenApiSpecsInternal } from "./actions/updateOpenApiSpecs"; +import { RepoData } from "@libs/schemas"; +import { updateOpenApiSpecInternal } from "./actions/updateOpenApiSpec"; -const updateOpenApiSpec = async (_event: unknown) => { - console.debug("Beginning scheduled run of `updateOpenApiSpec`, received event:", _event); +const updateOpenApiSpec = async (event: unknown) => { + console.debug("Beginning scheduled run of `updateOpenApiSpecs`, received event:", event); const env = evaluateEnv(); console.debug("Environment evaluated, continuing to actual action execution."); - return updateOpenApiSpecsInternal(env); + return updateOpenApiSpecInternal(env, event as RepoData); }; export const handler = handlerWrapper(updateOpenApiSpec); diff --git a/servers/fern-bot/src/functions/oas-cron/updateOpenApiSpecs.ts b/servers/fern-bot/src/functions/oas-cron/updateOpenApiSpecs.ts new file mode 100644 index 0000000000..e9d266477d --- /dev/null +++ b/servers/fern-bot/src/functions/oas-cron/updateOpenApiSpecs.ts @@ -0,0 +1,12 @@ +import { evaluateEnv } from "@libs/env"; +import { handlerWrapper } from "@libs/handler-wrapper"; +import { updateOpenApiSpecsInternal } from "./actions/updateOpenApiSpecs"; + +const updateOpenApiSpec = async (_event: unknown) => { + console.debug("Beginning scheduled run of `updateOpenApiSpec`, received event:", _event); + const env = evaluateEnv(); + console.debug("Environment evaluated, continuing to actual action execution."); + return updateOpenApiSpecsInternal(env); +}; + +export const handler = handlerWrapper(updateOpenApiSpec); diff --git a/servers/fern-bot/src/functions/update-repo-data/actions/updateRepoData.ts b/servers/fern-bot/src/functions/update-repo-data/actions/updateRepoData.ts new file mode 100644 index 0000000000..4493858023 --- /dev/null +++ b/servers/fern-bot/src/functions/update-repo-data/actions/updateRepoData.ts @@ -0,0 +1,43 @@ +import { S3 } from "@aws-sdk/client-s3"; +import { Env } from "@libs/env"; +import { setupGithubApp } from "@libs/github"; +import { json2csv } from "json-2-csv"; +import { App } from "octokit"; + +interface RepoData { + id: string; + name: string; + full_name: string; + default_branch: string; + clone_url: string; +} + +// In order to parallelize actioning on the data (e.g. updating openapi specs) +// we first write the data to s3 and then trigger the action from there. +export async function updateRepoDataInternal(env: Env): Promise { + const app: App = setupGithubApp(env); + const repos: RepoData[] = []; + + // Get repo data + await app.eachRepository((installation) => { + repos.push({ + id: installation.repository.id.toString(), + name: installation.repository.name, + full_name: installation.repository.full_name, + default_branch: installation.repository.default_branch, + clone_url: installation.repository.clone_url, + }); + }); + + // Write the data to S3 + const csvContent = json2csv(repos); + const bucket = env.REPO_DATA_S3_BUCKET ?? "fern-bot-data"; + const key = env.REPO_DATA_S3_KEY ?? "lambdas/repos.csv"; + console.log(`Writing repo data to S3 at ${bucket}/${key}`); + const s3 = new S3(); + await s3.putObject({ + Bucket: bucket, + Key: key, + Body: csvContent, + }); +} diff --git a/servers/fern-bot/src/functions/update-repo-data/updateRepoData.ts b/servers/fern-bot/src/functions/update-repo-data/updateRepoData.ts new file mode 100644 index 0000000000..9ad9e20ecb --- /dev/null +++ b/servers/fern-bot/src/functions/update-repo-data/updateRepoData.ts @@ -0,0 +1,12 @@ +import { evaluateEnv } from "@libs/env"; +import { handlerWrapper } from "@libs/handler-wrapper"; +import { updateRepoDataInternal } from "./actions/updateRepoData"; + +const updateRepoData = async (event: unknown) => { + console.debug("Beginning scheduled run of `updateRepoData`, received event:", event); + const env = evaluateEnv(); + console.debug("Environment evaluated, continuing to actual action execution."); + return updateRepoDataInternal(env); +}; + +export const handler = handlerWrapper(updateRepoData); diff --git a/servers/fern-bot/src/libs/env.ts b/servers/fern-bot/src/libs/env.ts index bc23c741ae..0ee8ba08da 100644 --- a/servers/fern-bot/src/libs/env.ts +++ b/servers/fern-bot/src/libs/env.ts @@ -10,10 +10,14 @@ export interface Env { GITHUB_APP_CLIENT_SECRET: string; GITHUB_APP_WEBHOOK_SECRET: string; REPO_TO_RUN_ON?: string; + REPO_DATA_S3_BUCKET?: string; + REPO_DATA_S3_KEY?: string; } export function evaluateEnv(): Env { const repoToRunOn = process?.env.REPO_TO_RUN_ON; + const repoDataS3Bucket = process?.env.REPO_DATA_S3_BUCKET; + const repoDataS3Key = process?.env.REPO_DATA_S3_KEY; return { GITHUB_APP_LOGIN_NAME: process?.env.GITHUB_APP_LOGIN_NAME, GITHUB_APP_LOGIN_ID: process?.env.GITHUB_APP_LOGIN_ID, @@ -22,6 +26,8 @@ export function evaluateEnv(): Env { GITHUB_APP_CLIENT_ID: process?.env.GITHUB_APP_CLIENT_ID, GITHUB_APP_CLIENT_SECRET: process?.env.GITHUB_APP_CLIENT_SECRET, GITHUB_APP_WEBHOOK_SECRET: process?.env.GITHUB_APP_WEBHOOK_SECRET, - REPO_TO_RUN_ON: repoToRunOn == null || repoToRunOn == OMIT ? undefined : process?.env.REPO_TO_RUN_ON, + REPO_TO_RUN_ON: repoToRunOn == null || repoToRunOn == OMIT ? undefined : repoToRunOn, + REPO_DATA_S3_BUCKET: repoDataS3Bucket == null || repoDataS3Bucket == OMIT ? undefined : repoDataS3Bucket, + REPO_DATA_S3_KEY: repoDataS3Key == null || repoDataS3Key == OMIT ? undefined : repoDataS3Key, }; } diff --git a/servers/fern-bot/src/libs/github/index.ts b/servers/fern-bot/src/libs/github/index.ts new file mode 100644 index 0000000000..78e21ddad1 --- /dev/null +++ b/servers/fern-bot/src/libs/github/index.ts @@ -0,0 +1,3 @@ +export * from "./octokit"; +export * from "./octokitHooks"; +export * from "./utilities"; diff --git a/servers/fern-bot/src/functions/oas-cron/github/octokit.ts b/servers/fern-bot/src/libs/github/octokit.ts similarity index 100% rename from servers/fern-bot/src/functions/oas-cron/github/octokit.ts rename to servers/fern-bot/src/libs/github/octokit.ts diff --git a/servers/fern-bot/src/functions/oas-cron/github/octokitHooks.ts b/servers/fern-bot/src/libs/github/octokitHooks.ts similarity index 100% rename from servers/fern-bot/src/functions/oas-cron/github/octokitHooks.ts rename to servers/fern-bot/src/libs/github/octokitHooks.ts diff --git a/servers/fern-bot/src/functions/oas-cron/github/utilities.ts b/servers/fern-bot/src/libs/github/utilities.ts similarity index 100% rename from servers/fern-bot/src/functions/oas-cron/github/utilities.ts rename to servers/fern-bot/src/libs/github/utilities.ts diff --git a/servers/fern-bot/src/libs/index.ts b/servers/fern-bot/src/libs/index.ts new file mode 100644 index 0000000000..68797f109e --- /dev/null +++ b/servers/fern-bot/src/libs/index.ts @@ -0,0 +1,2 @@ +export * as github from "./github"; +export * as schemas from "./schemas"; diff --git a/servers/fern-bot/src/libs/schemas/RepoData.ts b/servers/fern-bot/src/libs/schemas/RepoData.ts new file mode 100644 index 0000000000..6764216a62 --- /dev/null +++ b/servers/fern-bot/src/libs/schemas/RepoData.ts @@ -0,0 +1,7 @@ +export interface RepoData { + id: string; + name: string; + full_name: string; + default_branch: string; + clone_url: string; +} diff --git a/servers/fern-bot/src/libs/schemas/index.ts b/servers/fern-bot/src/libs/schemas/index.ts new file mode 100644 index 0000000000..077ba09f7e --- /dev/null +++ b/servers/fern-bot/src/libs/schemas/index.ts @@ -0,0 +1 @@ +export { RepoData } from "./RepoData";