From 9c31810637ac2093425f3ec91f022c17628223fb Mon Sep 17 00:00:00 2001 From: sylvain-morin Date: Wed, 20 Sep 2023 11:46:10 +0200 Subject: [PATCH 01/31] Fix issues in projects endpoints (missing ID param, support array of IDs or slug, ...) --- lib/controllers/v1/projects_controller.js | 8 ++++---- lib/controllers/v2/projects_controller.js | 9 +-------- lib/views/swagger_v1.yml.ejs | 6 +++--- openapi/paths/v2/projects/{id}/members.js | 21 ++++++++++++++------ openapi/paths/v2/projects/{id}/membership.js | 5 +++-- openapi/paths/v2/projects/{id}/posts.js | 18 +++++++++++++---- openapi/schema/request/projects_members.js | 2 +- 7 files changed, 41 insertions(+), 28 deletions(-) diff --git a/lib/controllers/v1/projects_controller.js b/lib/controllers/v1/projects_controller.js index 42887d28..b714ef30 100644 --- a/lib/controllers/v1/projects_controller.js +++ b/lib/controllers/v1/projects_controller.js @@ -219,7 +219,7 @@ const ProjectsController = class ProjectsController { static async show( req ) { InaturalistAPI.setPerPage( req, { max: 100 } ); - const ids = _.filter( req.params.id.split( "," ), _.identity ); + const ids = _.filter( req.params.id.toString( ).split( "," ), _.identity ); if ( ids.length > req.query.per_page ) { throw util.httpError( 422, "Too many IDs" ); } @@ -288,7 +288,7 @@ const ProjectsController = class ProjectsController { null, "prup.owner_id = pu.id AND prup.owner_type = 'ProjectUser' AND prup.name = 'updates'" ) - .where( "p.id IN (?)", ids ) + .where( "p.id IN ?", ids ) .where( "pu.user_id = ?", req.userSession.user_id ); const { rows } = await pgClient.query( query.toString( ) ); _.each( rows, row => { @@ -342,13 +342,13 @@ const ProjectsController = class ProjectsController { static async posts( req ) { const { page, perPage } = InaturalistAPI.paginationData( req, { default: 10, max: 30 } ); - const ids = _.filter( req.params.id.split( "," ), _.identity ); + const ids = _.filter( req.params.id.toString( ).split( "," ), _.identity ); let numericIDs = _.filter( ids, id => Number( id ) ); if ( _.isEmpty( numericIDs ) ) { numericIDs = [-1]; } const query = squel.select( ).field( "posts.*, count(*) OVER() AS total_count" ) .from( "posts" ) .join( "projects", null, "posts.parent_id = projects.id AND parent_type='Project'" ) - .where( "projects.id IN (?) OR projects.slug IN (?)", numericIDs, ids ) + .where( "projects.id IN ? OR projects.slug IN ?", numericIDs, ids ) .where( "posts.published_at IS NOT NULL" ) .order( "posts.published_at", false ) .limit( perPage ) diff --git a/lib/controllers/v2/projects_controller.js b/lib/controllers/v2/projects_controller.js index 00c06787..3ff4e9ae 100644 --- a/lib/controllers/v2/projects_controller.js +++ b/lib/controllers/v2/projects_controller.js @@ -1,12 +1,5 @@ const ctrlv1 = require( "../v1/projects_controller" ); -const show = async req => { - if ( req.params.id && typeof ( req.params.id ) !== "string" ) { - req.params.id = req.params.id.join( "," ); - } - return ctrlv1.show( req ); -}; - module.exports = { join: ctrlv1.join, leave: ctrlv1.leave, @@ -14,5 +7,5 @@ module.exports = { membership: ctrlv1.membership, posts: ctrlv1.posts, search: ctrlv1.search, - show + show: ctrlv1.show }; diff --git a/lib/views/swagger_v1.yml.ejs b/lib/views/swagger_v1.yml.ejs index 93efd08e..d8811656 100644 --- a/lib/views/swagger_v1.yml.ejs +++ b/lib/views/swagger_v1.yml.ejs @@ -1562,10 +1562,10 @@ paths: get: summary: Membership of current user description: | - Given a project ID, return the details of the authenticated user's - membership in that project + Given an ID, or an array of IDs in comma-delimited format, return the details of the + authenticated user's membership in these projects parameters: - - $ref: "#/parameters/path_id" + - $ref: "#/parameters/path_multi_id" tags: - Projects security: diff --git a/openapi/paths/v2/projects/{id}/members.js b/openapi/paths/v2/projects/{id}/members.js index 11979d26..dab355ea 100644 --- a/openapi/paths/v2/projects/{id}/members.js +++ b/openapi/paths/v2/projects/{id}/members.js @@ -2,7 +2,7 @@ const _ = require( "lodash" ); const Joi = require( "joi" ); const transform = require( "../../../../joi_to_openapi_parameter" ); const ProjectsController = require( "../../../../../lib/controllers/v2/projects_controller" ); -const observationsSearchSchema = require( "../../../../schema/request/projects_members" ); +const projectsMembersSchema = require( "../../../../schema/request/projects_members" ); module.exports = sendWrapper => { async function GET( req, res ) { @@ -10,14 +10,23 @@ module.exports = sendWrapper => { sendWrapper( req, res, null, results ); } - const parameters = _.map( - observationsSearchSchema.$_terms.keys, - child => transform( child.schema.label( child.key ) ) + const parameters = [ + transform( + Joi.number( ).integer( ) + .label( "id" ) + .meta( { in: "path" } ) + .required( ) + .description( "A single ID" ) + ) + ].concat( + _.map( projectsMembersSchema.$_terms.keys, child => + ( transform( child.schema.label( child.key ) ) ) + ) ); parameters.push( transform( Joi.string( ).label( "X-HTTP-Method-Override" ).meta( { in: "header" } ) ) ); - + GET.apiDoc = { tags: ["Projects"], summary: "Fetch project members", @@ -27,7 +36,7 @@ module.exports = sendWrapper => { parameters, responses: { 200: { - description: "An array of project user membership information.", + description: "An array of project members.", content: { "application/json": { schema: { diff --git a/openapi/paths/v2/projects/{id}/membership.js b/openapi/paths/v2/projects/{id}/membership.js index c463d0b9..263a6175 100644 --- a/openapi/paths/v2/projects/{id}/membership.js +++ b/openapi/paths/v2/projects/{id}/membership.js @@ -16,11 +16,12 @@ module.exports = sendWrapper => { }], parameters: [ transform( - Joi.number( ).integer( ) + Joi.array( ) + .items( Joi.number( ).integer( ) ) .label( "id" ) .meta( { in: "path" } ) .required( ) - .description( "A single project ID" ) + .description( "A single ID or a comma-separated list of them" ) ), transform( Joi.string( ).label( "fields" ).meta( { in: "query" } ) ), transform( Joi.string( ).label( "X-HTTP-Method-Override" ).meta( { in: "header" } ) ) diff --git a/openapi/paths/v2/projects/{id}/posts.js b/openapi/paths/v2/projects/{id}/posts.js index 3d31b47d..2e40c214 100644 --- a/openapi/paths/v2/projects/{id}/posts.js +++ b/openapi/paths/v2/projects/{id}/posts.js @@ -10,14 +10,24 @@ module.exports = sendWrapper => { sendWrapper( req, res, null, results ); } - const parameters = _.map( - projectsPostsSchema.$_terms.keys, - child => transform( child.schema.label( child.key ) ) + const parameters = [ + transform( + Joi.array( ) + .items( Joi.number( ).integer( ) ) + .label( "id" ) + .meta( { in: "path" } ) + .required( ) + .description( "A single ID or a comma-separated list of them" ) + ) + ].concat( + _.map( projectsPostsSchema.$_terms.keys, child => + ( transform( child.schema.label( child.key ) ) ) + ) ); parameters.push( transform( Joi.string( ).label( "X-HTTP-Method-Override" ).meta( { in: "header" } ) ) ); - + GET.apiDoc = { tags: ["Projects"], summary: "Fetch project posts", diff --git a/openapi/schema/request/projects_members.js b/openapi/schema/request/projects_members.js index 169635e6..23870a4f 100644 --- a/openapi/schema/request/projects_members.js +++ b/openapi/schema/request/projects_members.js @@ -7,5 +7,5 @@ module.exports = Joi.object( ).keys( { order_by: Joi.array( ).items( Joi.string( ).valid( "observations_count", "login" - ) ).default( "observations_count" ) + ) ).default( [ "observations_count" ] ) } ).unknown( false ); From e2ebe97de01195ced180f39bddb4b781ee622b94 Mon Sep 17 00:00:00 2001 From: sylvain-morin Date: Wed, 20 Sep 2023 18:58:38 +0200 Subject: [PATCH 02/31] Fix issues in projects endpoints (missing ID param, support array of IDs or slug, ...) --- lib/controllers/v2/projects_controller.js | 11 ----------- openapi/paths/v2/projects/{id}.js | 2 +- openapi/paths/v2/projects/{id}/members.js | 14 +++++++------- openapi/paths/v2/projects/{id}/membership.js | 3 +-- openapi/paths/v2/projects/{id}/posts.js | 12 ++++++------ openapi/schema/request/projects_members.js | 4 ++-- 6 files changed, 17 insertions(+), 29 deletions(-) delete mode 100644 lib/controllers/v2/projects_controller.js diff --git a/lib/controllers/v2/projects_controller.js b/lib/controllers/v2/projects_controller.js deleted file mode 100644 index 3ff4e9ae..00000000 --- a/lib/controllers/v2/projects_controller.js +++ /dev/null @@ -1,11 +0,0 @@ -const ctrlv1 = require( "../v1/projects_controller" ); - -module.exports = { - join: ctrlv1.join, - leave: ctrlv1.leave, - members: ctrlv1.members, - membership: ctrlv1.membership, - posts: ctrlv1.posts, - search: ctrlv1.search, - show: ctrlv1.show -}; diff --git a/openapi/paths/v2/projects/{id}.js b/openapi/paths/v2/projects/{id}.js index 2f41c38d..35e9929b 100644 --- a/openapi/paths/v2/projects/{id}.js +++ b/openapi/paths/v2/projects/{id}.js @@ -1,6 +1,6 @@ const Joi = require( "joi" ); const transform = require( "../../../joi_to_openapi_parameter" ); -const projectsController = require( "../../../../lib/controllers/v2/projects_controller" ); +const projectsController = require( "../../../../lib/controllers/v1/projects_controller" ); module.exports = sendWrapper => { async function GET( req, res ) { diff --git a/openapi/paths/v2/projects/{id}/members.js b/openapi/paths/v2/projects/{id}/members.js index dab355ea..8703be3d 100644 --- a/openapi/paths/v2/projects/{id}/members.js +++ b/openapi/paths/v2/projects/{id}/members.js @@ -1,7 +1,7 @@ const _ = require( "lodash" ); const Joi = require( "joi" ); const transform = require( "../../../../joi_to_openapi_parameter" ); -const ProjectsController = require( "../../../../../lib/controllers/v2/projects_controller" ); +const ProjectsController = require( "../../../../../lib/controllers/v1/projects_controller" ); const projectsMembersSchema = require( "../../../../schema/request/projects_members" ); module.exports = sendWrapper => { @@ -18,15 +18,15 @@ module.exports = sendWrapper => { .required( ) .description( "A single ID" ) ) - ].concat( - _.map( projectsMembersSchema.$_terms.keys, child => - ( transform( child.schema.label( child.key ) ) ) - ) + ].concat( + _.map( projectsMembersSchema.$_terms.keys, child => ( + transform( child.schema.label( child.key ) ) + ) ) ); parameters.push( transform( Joi.string( ).label( "X-HTTP-Method-Override" ).meta( { in: "header" } ) ) ); - + GET.apiDoc = { tags: ["Projects"], summary: "Fetch project members", @@ -36,7 +36,7 @@ module.exports = sendWrapper => { parameters, responses: { 200: { - description: "An array of project members.", + description: "An array of project user membership information.", content: { "application/json": { schema: { diff --git a/openapi/paths/v2/projects/{id}/membership.js b/openapi/paths/v2/projects/{id}/membership.js index 263a6175..5f3e2284 100644 --- a/openapi/paths/v2/projects/{id}/membership.js +++ b/openapi/paths/v2/projects/{id}/membership.js @@ -1,6 +1,6 @@ const Joi = require( "joi" ); const transform = require( "../../../../joi_to_openapi_parameter" ); -const projectsController = require( "../../../../../lib/controllers/v2/projects_controller" ); +const projectsController = require( "../../../../../lib/controllers/v1/projects_controller" ); module.exports = sendWrapper => { async function GET( req, res ) { @@ -40,7 +40,6 @@ module.exports = sendWrapper => { } }; - async function POST( req, res ) { await projectsController.join( req ); sendWrapper( req, res.status( 204 ) ); diff --git a/openapi/paths/v2/projects/{id}/posts.js b/openapi/paths/v2/projects/{id}/posts.js index 2e40c214..c09d8bb5 100644 --- a/openapi/paths/v2/projects/{id}/posts.js +++ b/openapi/paths/v2/projects/{id}/posts.js @@ -1,7 +1,7 @@ const _ = require( "lodash" ); const Joi = require( "joi" ); const transform = require( "../../../../joi_to_openapi_parameter" ); -const ProjectsController = require( "../../../../../lib/controllers/v2/projects_controller" ); +const ProjectsController = require( "../../../../../lib/controllers/v1/projects_controller" ); const projectsPostsSchema = require( "../../../../schema/request/projects_posts" ); module.exports = sendWrapper => { @@ -19,15 +19,15 @@ module.exports = sendWrapper => { .required( ) .description( "A single ID or a comma-separated list of them" ) ) - ].concat( - _.map( projectsPostsSchema.$_terms.keys, child => - ( transform( child.schema.label( child.key ) ) ) - ) + ].concat( + _.map( projectsPostsSchema.$_terms.keys, child => ( + transform( child.schema.label( child.key ) ) + ) ) ); parameters.push( transform( Joi.string( ).label( "X-HTTP-Method-Override" ).meta( { in: "header" } ) ) ); - + GET.apiDoc = { tags: ["Projects"], summary: "Fetch project posts", diff --git a/openapi/schema/request/projects_members.js b/openapi/schema/request/projects_members.js index 23870a4f..3d896a8b 100644 --- a/openapi/schema/request/projects_members.js +++ b/openapi/schema/request/projects_members.js @@ -4,8 +4,8 @@ module.exports = Joi.object( ).keys( { page: Joi.number( ).integer( ), per_page: Joi.number( ).integer( ), fields: Joi.any( ), - order_by: Joi.array( ).items( Joi.string( ).valid( + order_by: Joi.string( ).valid( "observations_count", "login" - ) ).default( [ "observations_count" ] ) + ).default( "observations_count" ) } ).unknown( false ); From 279add9f4e674a5bfa2e8c39fc9d3ac3ec97ce5f Mon Sep 17 00:00:00 2001 From: sylvain-morin Date: Wed, 20 Sep 2023 19:19:48 +0200 Subject: [PATCH 03/31] Fix issues in projects endpoints (missing ID param, support array of IDs or slug, ...) --- openapi/paths/v2/projects.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openapi/paths/v2/projects.js b/openapi/paths/v2/projects.js index 2beeb144..0f2166ed 100644 --- a/openapi/paths/v2/projects.js +++ b/openapi/paths/v2/projects.js @@ -1,7 +1,7 @@ const _ = require( "lodash" ); const projectsSearchSchema = require( "../../schema/request/projects_search" ); const transform = require( "../../joi_to_openapi_parameter" ); -const ProjectsController = require( "../../../lib/controllers/v2/projects_controller" ); +const ProjectsController = require( "../../../lib/controllers/v1/projects_controller" ); module.exports = sendWrapper => { async function GET( req, res ) { From ec5ccbbab58ba7d442992a3d8ffa8fb9a95379b8 Mon Sep 17 00:00:00 2001 From: sylvain-morin Date: Wed, 4 Oct 2023 16:21:59 +0200 Subject: [PATCH 04/31] Run specs with docker compose - add tests related to user email/IP --- config.js.ci | 3 +- docker-compose.test.yml | 70 +++++++++ lib/map_generator.js | 9 ++ lib/test_helper.js | 40 +++++ schema/fixtures.js | 196 ++++++++++++++++++++++++- schema/indices/users.js | 6 + test/_initialize.js | 58 -------- test/hooks.js | 65 +++++++- test/integration/v1/identifications.js | 88 +++++++++++ test/integration/v1/observations.js | 42 ++++++ test/integration/v1/projects.js | 101 +++++++++++++ test/integration/v1/search.js | 26 ++++ test/integration/v1/users.js | 47 ++++++ test/integration/v2/identifications.js | 13 ++ test/integration/v2/observations.js | 56 +++++++ test/integration/v2/projects.js | 40 +++++ test/integration/v2/search.js | 26 ++++ test/integration/v2/users.js | 63 ++++++++ 18 files changed, 887 insertions(+), 62 deletions(-) create mode 100644 docker-compose.test.yml delete mode 100644 test/_initialize.js diff --git a/config.js.ci b/config.js.ci index c0b9a7c2..7a4c237b 100644 --- a/config.js.ci +++ b/config.js.ci @@ -10,8 +10,7 @@ module.exports = { user: "postgres", host: "127.0.0.1", port: 5432, - geometry_field: "geom", - dbname: "inaturalist_test" + geometry_field: "geom" }, websiteURL: "http://localhost:3000/", staticImagePrefix: "http://localhost:3000/attachments/", diff --git a/docker-compose.test.yml b/docker-compose.test.yml new file mode 100644 index 00000000..8879c6a1 --- /dev/null +++ b/docker-compose.test.yml @@ -0,0 +1,70 @@ +version: "2" +services: + + redis: + container_name: redis + image: redis:6.0.3 + ports: + - 6379:6379 + volumes: + - redis_data_test:/data + + memcached: + container_name: memcached + image: memcached:1.6.6 + ports: + - 11211:11211 + + pg: + container_name: pg + image: postgis/postgis:12-3.0 + environment: + POSTGRES_USER: 'inaturalist' + POSTGRES_PASSWORD: 'inaturalist' + POSTGRES_DB: inaturalist_test + ports: + - 5432:5432 + volumes: + - pg_data_test:/var/lib/postgresql/data + - ./schema/database.sql:/docker-entrypoint-initdb.d/database.sql + + es: + container_name: es + image: docker.elastic.co/elasticsearch/elasticsearch:8.9.1 + environment: + - discovery.type=single-node + - xpack.security.enabled=false + ports: + - 9200:9200 + volumes: + - es_data_test:/usr/share/elasticsearch/data + command: > + /bin/sh -c "bin/elasticsearch-plugin list | grep -q analysis-kuromoji + || bin/elasticsearch-plugin install analysis-kuromoji; + /usr/local/bin/docker-entrypoint.sh" + + api-test: + container_name: api-test + build: . + environment: + NODE_ENV: test + INAT_DB_HOST: pg + INAT_DB_USER : 'inaturalist' + INAT_DB_PASS: 'inaturalist' + INAT_ES_HOST: es + INAT_REDIS_HOST: redis + INAT_WEB_HOST: host.docker.internal + INAT_DB_NAME: inaturalist_test + INAT_ES_INDEX_PREFIX: test + DB_ALREADY_INITIALIZED: true + ports: + - 4000:4000 + command: + /bin/sh -c "npm install ; npm run coverage" + extra_hosts: + - "host.docker.internal:host-gateway" + +volumes: + redis_data_test: + pg_data_test: + es_data_test: diff --git a/lib/map_generator.js b/lib/map_generator.js index 4e2ea164..ac3331cf 100644 --- a/lib/map_generator.js +++ b/lib/map_generator.js @@ -30,6 +30,14 @@ const DEFAULT_POINTS_STYLE = ` const MapGenerator = { merc: null }; +MapGenerator.buildDbName = ( ) => { + // Throw exception is NODE_ENV is not set + if ( _.isEmpty( process.env.NODE_ENV ) ) { + throw new Error( "env.NODE_ENV is not set" ); + } + return process.env.NODE_ENV === "test" ? "inaturalist_test" : ( process.env.INAT_DB_NAME || `inaturalist_${process.env.NODE_ENV}` ); +}; + MapGenerator.blankImage = fs.readFileSync( path.join( __dirname, "assets/blank.png" ) ); MapGenerator.createMercator = ( ) => { @@ -63,6 +71,7 @@ MapGenerator.postgisDatasource = req => { const datasourceConfig = { ...config.database, ...( config.database.replica || { } ), + dbname: MapGenerator.buildDbName( ), type: "postgis", table: req.postgis.query, simplify_geometries: true, diff --git a/lib/test_helper.js b/lib/test_helper.js index 4c647d32..6ef27453 100644 --- a/lib/test_helper.js +++ b/lib/test_helper.js @@ -1,5 +1,6 @@ const fs = require( "fs" ); const _ = require( "lodash" ); +const timersPromises = require( "timers/promises" ); const Promise = require( "bluebird" ); const { expect } = require( "chai" ); // eslint-disable-line import/no-extraneous-dependencies const sinon = require( "sinon" ); // eslint-disable-line import/no-extraneous-dependencies @@ -8,6 +9,43 @@ const esClient = require( "./es_client" ); const testHelper = { }; +testHelper.waitForPG = async numberOfAttempts => { + console.log( "Awaiting PG connection..." ); + await timersPromises.setTimeout( 1000 ); + try { + if ( await pgClient.connect( ) ) { + return true; + } + } catch ( e ) { + // Do nothing + } + numberOfAttempts -= 1; + if ( numberOfAttempts === 0 ) { + process.exit( ); + } + return testHelper.waitForPG( numberOfAttempts ); +}; + +testHelper.waitForES = async numberOfAttempts => { + console.log( "Awaiting ES connection..." ); + await timersPromises.setTimeout( 1000 ); + try { + await esClient.connect(); + if ( esClient.connection ) { + if ( await esClient.connection.ping() ) { + return true; + } + } + } catch ( e ) { + // Do nothing + } + numberOfAttempts -= 1; + if ( numberOfAttempts === 0 ) { + process.exit( ); + } + return testHelper.waitForES( numberOfAttempts ); +}; + testHelper.forEachIndex = async action => { if ( process.env.NODE_ENV !== "test" ) { return; } const settings = JSON.parse( fs.readFileSync( "schema/settings.js" ) ); @@ -108,6 +146,8 @@ testHelper.testInatJSNoPreload = async ( controller, endpoint, method, done ) => }; module.exports = { + waitForPG: testHelper.waitForPG, + waitForES: testHelper.waitForES, createIndices: testHelper.createIndices, deleteIndices: testHelper.deleteIndices, loadElasticsearchFixtures: testHelper.loadElasticsearchFixtures, diff --git a/schema/fixtures.js b/schema/fixtures.js index f2ef08ec..fb509a12 100644 --- a/schema/fixtures.js +++ b/schema/fixtures.js @@ -445,6 +445,45 @@ "id": 122, "login": "user122" } + }, + { + "id": 2023092501, + "uuid": "09130216-6201-11ee-8c99-0242ac120002", + "user": { + "id": 2023092501, + "login": "user2023092501", + "spam" : false, + "suspended" : false + }, + "body": "2023092501", + "category": "leading", + "current": true, + "current_taxon": true, + "taxon": { + "id": 5, + "uuid": "e6c0f90f-8527-4b56-a552-fe2273b61ec4", + "min_species_taxon_id": 5, + "is_active": true, + "iconic_taxon_id": 1, + "ancestor_ids": [1,2,3,4,5], + "min_species_ancestry": "1,2,3,4,5", + "rank_level": 10, + "min_species_ancestors": [ + { "id": 1 }, { "id": 2 }, { "id": 3 }, { "id": 4 }, { "id": 5 } + ] + }, + "observation": { + "id": 2023092501, + "user_id": 2023092501, + "taxon": { + "id": 5, + "iconic_taxon_id": 1, + "ancestor_ids": [1,2,3,4,5], + "min_species_taxon_id": 5, + "min_species_ancestry": "1,2,3,4,5", + "rank_level": 10 + } + } } ] }, @@ -1115,6 +1154,21 @@ "user": { "id": 2021121602 }, "created_at": "2021-12-08T01:00:00", "description": "Obs by a user who blocks user 2021121601" + }, + { + "id": 2023092501, + "uuid": "78e0b6e4-61fa-11ee-8c99-0242ac120002", + "user": { + "id": 2023092501, + "login": "user2023092501", + "spam" : false, + "suspended" : false + }, + "location": "50,50", + "private_location": "3,4", + "private_geojson": { "type": "Point", "coordinates": [ 4, 3 ] }, + "place_guess": "Tangerina", + "captive": true } ] }, @@ -1278,6 +1332,33 @@ "user_id": 2020100101, "user_ids": [2020100101, 2020100102], "prefers_user_trust": false + }, + { + "id": 2023092501, + "title": "project-2023092501", + "title_autocomplete": "project-2023092501", + "title_exact": "project-2023092501", + "slug": "project-2023092501", + "search_parameters": [ + { + "field": "place_id", + "value": 2 + } + ], + "search_parameter_fields": { + "place_id": 2 + }, + "user_id": 2023092501, + "user_ids": [2023092501, 2023092502, 2023092503], + "admins" : [ + { + "id" : 2023092501, + "user_id" : 2023092501, + "project_id" : 2023092501, + "role" : "manager" + } + ], + "prefers_user_trust": false } ] }, @@ -1810,6 +1891,27 @@ "id": 2021121602, "login": "user2021121602", "name": "User that blocks user2021121601" + }, + { + "id": 2023092501, + "login": "user2023092501", + "name": "User2023092501 with email and IP", + "email": "user2023092501@gmail.com", + "last_ip": "192.168.0.1" + }, + { + "id": 2023092502, + "login": "user2023092502", + "name": "User2023092502 with email and IP", + "email": "user2023092502@gmail.com", + "last_ip": "192.168.0.2" + }, + { + "id": 2023092503, + "login": "user2023092503", + "name": "User2023092503 with email and IP", + "email": "user2023092503@gmail.com", + "last_ip": "192.168.0.3" } ] }, @@ -2074,6 +2176,14 @@ "category": "leading", "user_id": 122, "observation_id": 13 + }, + { + "id": 2023092501, + "current": true, + "created_at": "2023-09-25 00:00:00", + "category": "leading", + "user_id": 2023092501, + "observation_id": 2023092501 } ], "lists": [ @@ -2338,6 +2448,10 @@ { "id": 2021121601, "uuid": "b568967d-4f0e-430c-9cb9-e28db5004c37" + }, + { + "id": 2023092501, + "uuid": "78e0b6e4-61fa-11ee-8c99-0242ac120002" } ], "observation_photos": [ @@ -2657,6 +2771,23 @@ "id": 2020100102, "project_id": 2020100101, "user_id": 2020100102 + }, + { + "id": 2023092501, + "project_id": 2023092501, + "user_id": 2023092501, + "role": "manager" + }, + { + "id": 2023092502, + "project_id": 2023092501, + "user_id": 2023092502, + "role": "curator" + }, + { + "id": 2023092503, + "project_id": 2023092501, + "user_id": 2023092503 } ], "projects": [ @@ -2692,6 +2823,12 @@ "project_type": "collection", "title": "Redundant Observations in Massachusetts With Disabled Trust", "slug": "redundant-observations-in-massachusetts-with-disabled-trust" + }, + { + "id": 2023092501, + "slug": "project-2023092501", + "title": "project-2023092501", + "user_id": 2023092501 } ], "provider_authorizations": [ @@ -2723,6 +2860,33 @@ "title": "post 2 title", "body": "post 2 body2", "user_id": 1 + }, + { + "id": 2023092501, + "parent_id": 2023092501, + "parent_type": "Project", + "published_at": "2023-09-25 02:00:00", + "title": "2023092501 title", + "body": "2023092501 body", + "user_id": 2023092501 + }, + { + "id": 2023092502, + "parent_id": 2023092501, + "parent_type": "Project", + "published_at": "2023-09-25 02:00:00", + "title": "2023092502 title", + "body": "2023092502 body", + "user_id": 2023092502 + }, + { + "id": 2023092503, + "parent_id": 2023092501, + "parent_type": "Project", + "published_at": "2023-09-25 02:00:00", + "title": "2023092503 title", + "body": "2023092503 body", + "user_id": 2023092503 } ], "roles": [ @@ -2963,7 +3127,7 @@ "name": "username", "site_id": 1, "description": "a very original user", - "last_active": "2022-03-01" + "last_active": "2022-03-01" }, { "id": 5, @@ -3072,6 +3236,36 @@ "login": "user2021121602", "name": "User that blocks user2021121601", "description": "User that blocks user2021121601" + }, + { + "id": 2023092501, + "login": "user2023092501", + "name": "User2023092501 with email and IP", + "email": "user2023092501@gmail.com", + "last_ip": "192.168.0.1", + "created_at": "2020-01-01", + "updated_at": "2020-01-01", + "last_active": "2023-01-01" + }, + { + "id": 2023092502, + "login": "user2023092502", + "name": "User2023092502 with email and IP", + "email": "user2023092502@gmail.com", + "last_ip": "192.168.0.2", + "created_at": "2020-01-01", + "updated_at": "2020-01-01", + "last_active": "2023-01-01" + }, + { + "id": 2023092503, + "login": "user2023092503", + "name": "User2023092503 with email and IP", + "email": "user2023092503@gmail.com", + "last_ip": "192.168.0.3", + "created_at": "2020-01-01", + "updated_at": "2020-01-01", + "last_active": "2023-01-01" } ], "user_blocks": [ diff --git a/schema/indices/users.js b/schema/indices/users.js index 54c61204..cf43ef54 100644 --- a/schema/indices/users.js +++ b/schema/indices/users.js @@ -77,6 +77,12 @@ }, "uuid": { "type": "keyword" + }, + "email": { + "type": "keyword" + }, + "last_ip": { + "type": "keyword" } } } \ No newline at end of file diff --git a/test/_initialize.js b/test/_initialize.js deleted file mode 100644 index bd2ddebe..00000000 --- a/test/_initialize.js +++ /dev/null @@ -1,58 +0,0 @@ -/* eslint-disable no-console */ - -const { execSync } = require( "child_process" ); -const config = require( "../config" ); - -console.log( "INITIALIZING TEST ENVIRONMENT\n" ); - -// For tests, we want to make absolutely sure the test database is clean and -// new, and we need to make sure that happens before we try to connect to it, -// which happens every time we require pg_client, which happens inside of -// test_helper, so here we're setting up the database *before* we require -// anything that would require those modules. Naming this file _initialize.js -// ensures mocha runs this file first when running tests. -const dbname = "inaturalist_test"; -const testDbConnectionVar = `${config.database.host ? `PGHOST=${config.database.host}` : ""} \ - ${config.database.user ? `PGUSER=${config.database.user}` : ""} \ - ${config.database.password ? `PGPASSWORD=${config.database.password}` : ""}`; - -console.log( "Dropping existing test database" ); -execSync( `${testDbConnectionVar} dropdb --if-exists ${dbname}`, { stdio: [0, 1, 2] } ); -console.log( "Creating test database" ); -execSync( `${testDbConnectionVar} createdb -O ${config.database.user} ${dbname}`, { stdio: [0, 1, 2] } ); -console.log( "Loading test database schema" ); -execSync( `${testDbConnectionVar} psql -q -f schema/database.sql -d ${dbname}`, { stdio: [0, 1, 2] } ); - -/* eslint import/order: 0 */ -const testHelper = require( "../lib/test_helper" ); -const inaturalistjs = require( "inaturalistjs" ); -const Taxon = require( "../lib/models/taxon" ); - -// Note, these are mocha callbacks called at a global scope, so these run before -// or after *all* tests. Nothing special about initialize.js, it's just another -// test that specifies these before and after callbacks for all tests. - -before( async function ( ) { - this.timeout( 20000 ); - console.log( "Creating ES indices" ); - await testHelper.createIndices( ); - console.log( "Loading ES fixtures" ); - await testHelper.loadElasticsearchFixtures( ); - console.log( "Loading Postgres fixtures" ); - await testHelper.loadPostgresqlFixtures( ); - console.log( "Loading iconic taxa" ); - await Taxon.loadIconicTaxa( ); - console.log( "\nDONE INITIALIZING TEST ENVIRONMENT\n\n" ); -} ); - -after( async function ( ) { - this.timeout( 10000 ); - await testHelper.deleteIndices( ); -} ); - -beforeEach( ( ) => { - inaturalistjs.setConfig( { - apiURL: "http://localhost:3000", - writeApiURL: "http://localhost:3000" - } ); -} ); diff --git a/test/hooks.js b/test/hooks.js index 532e5369..46ff92b9 100644 --- a/test/hooks.js +++ b/test/hooks.js @@ -1,10 +1,73 @@ const { expect } = require( "chai" ); +const { execSync } = require( "child_process" ); +const inaturalistjs = require( "inaturalistjs" ); const app = require( "../app" ); +const testHelper = require( "../lib/test_helper" ); +const Taxon = require( "../lib/models/taxon" ); +const config = require( "../config" ); + +function initializeDb() { + // For tests, we want to make absolutely sure the test database is clean and + // new, and we need to make sure that happens before we try to connect to it, + // which happens every time we require pg_client, which happens inside of + // test_helper, so here we're setting up the database *before* we require + // anything that would require those modules. Naming this file _initialize.js + // ensures mocha runs this file first when running tests. + const dbname = "inaturalist_test"; + const testDbConnectionVar = `${config.database.host ? `PGHOST=${config.database.host}` : ""} \ + ${config.database.user ? `PGUSER=${config.database.user}` : ""} \ + ${config.database.password ? `PGPASSWORD=${config.database.password}` : ""}`; + + console.log( "Dropping existing test database" ); + execSync( `${testDbConnectionVar} dropdb --if-exists ${dbname}`, { stdio: [0, 1, 2] } ); + console.log( "Creating test database" ); + execSync( `${testDbConnectionVar} createdb -O ${config.database.user} ${dbname}`, { stdio: [0, 1, 2] } ); + console.log( "Loading test database schema" ); + execSync( `${testDbConnectionVar} psql -q -f schema/database.sql -d ${dbname}`, { stdio: [0, 1, 2] } ); +} + +exports.mochaGlobalSetup = async function () { + expect( process.env.NODE_ENV ).to.eq( "test" ); + + // Wait for Postgres + console.log( "Waiting for Postgres..." ); + await testHelper.waitForPG( 100 ); + + // Wait for ES + console.log( "Waiting for ElasticSearch..." ); + await testHelper.waitForES( 100 ); + + console.log( "\n\nINITIALIZING TEST ENVIRONMENT\n\n" ); + + if ( !process.env.DB_ALREADY_INITIALIZED ) { + initializeDb( ); + } + + console.log( "Creating ES indices" ); + await testHelper.createIndices( ); + console.log( "Loading ES fixtures" ); + await testHelper.loadElasticsearchFixtures( ); + console.log( "Loading Postgres fixtures" ); + await testHelper.loadPostgresqlFixtures( ); + console.log( "Loading iconic taxa" ); + await Taxon.loadIconicTaxa( ); + + console.log( "\n\nDONE INITIALIZING TEST ENVIRONMENT\n\n" ); +}; exports.mochaHooks = { async beforeAll( ) { - expect( process.env.NODE_ENV ).to.eq( "test" ); this.timeout( 20000 ); this.app = await app( ); + }, + async afterAll( ) { + this.timeout( 10000 ); + await testHelper.deleteIndices( ); + }, + async beforeEach( ) { + inaturalistjs.setConfig( { + apiURL: "http://localhost:3000", + writeApiURL: "http://localhost:3000" + } ); } }; diff --git a/test/integration/v1/identifications.js b/test/integration/v1/identifications.js index 5788b785..ccac585f 100644 --- a/test/integration/v1/identifications.js +++ b/test/integration/v1/identifications.js @@ -36,6 +36,94 @@ describe( "Identifications", ( ) => { expect( result.id ).to.eq( 102 ); } ).expect( 200, done ); } ); + + it( "never returns email or IP for user in identification", function ( done ) { + request( this.app ).get( "/v1/identifications?id=2023092501" ) + .expect( res => { + const identification = res.body.results[0]; + expect( res.body.page ).to.eq( 1 ); + expect( res.body.total_results ).to.eq( 1 ); + expect( res.body.results.length ).to.eq( 1 ); + expect( identification.id ).to.eq( 2023092501 ); + expect( identification.user ).not.to.be.undefined; + expect( identification.user.id ).to.eq( 2023092501 ); + expect( identification.user.email ).to.be.undefined; + expect( identification.user.last_ip ).to.be.undefined; + expect( identification.observation ).not.to.be.undefined; + expect( identification.observation.user ).not.to.be.undefined; + expect( identification.observation.user.id ).to.eq( 2023092501 ); + expect( identification.observation.user.email ).to.be.undefined; + expect( identification.observation.user.last_ip ).to.be.undefined; + expect( identification.observation.identifications ).not.to.be.undefined; + expect( identification.observation.identifications.length ).to.eq( 1 ); + expect( identification.observation.identifications[0].user ).not.to.be.undefined; + expect( identification.observation.identifications[0].user.id ).to.eq( 2023092501 ); + expect( identification.observation.identifications[0].user.email ).to.be.undefined; + expect( identification.observation.identifications[0].user.last_ip ).to.be.undefined; + } ).expect( 200, done ); + } ); + } ); + + describe( "details", ( ) => { + it( "never returns email or IP for user in identification", function ( done ) { + request( this.app ).get( "/v1/identifications/2023092501" ) + .expect( res => { + const identification = res.body.results[0]; + expect( res.body.page ).to.eq( 1 ); + expect( res.body.total_results ).to.eq( 1 ); + expect( res.body.results.length ).to.eq( 1 ); + expect( identification.id ).to.eq( 2023092501 ); + expect( identification.user ).not.to.be.undefined; + expect( identification.user.id ).to.eq( 2023092501 ); + expect( identification.user.email ).to.be.undefined; + expect( identification.user.last_ip ).to.be.undefined; + expect( identification.observation ).not.to.be.undefined; + expect( identification.observation.user ).not.to.be.undefined; + expect( identification.observation.user.id ).to.eq( 2023092501 ); + expect( identification.observation.user.email ).to.be.undefined; + expect( identification.observation.user.last_ip ).to.be.undefined; + expect( identification.observation.identifications ).not.to.be.undefined; + expect( identification.observation.identifications.length ).to.eq( 1 ); + expect( identification.observation.identifications[0].user ).not.to.be.undefined; + expect( identification.observation.identifications[0].user.id ).to.eq( 2023092501 ); + expect( identification.observation.identifications[0].user.email ).to.be.undefined; + expect( identification.observation.identifications[0].user.last_ip ).to.be.undefined; + } ).expect( 200, done ); + } ); + } ); + + describe( "identifiers", ( ) => { + it( "never returns email or IP for user in identification", function ( done ) { + request( this.app ).get( "/v1/identifications/identifiers?id=2023092501" ) + .expect( res => { + const identification = res.body.results[0]; + expect( res.body.page ).to.eq( 1 ); + expect( res.body.total_results ).to.eq( 1 ); + expect( res.body.results.length ).to.eq( 1 ); + expect( identification.user_id ).to.eq( 2023092501 ); + expect( identification.user ).not.to.be.undefined; + expect( identification.user.id ).to.eq( 2023092501 ); + expect( identification.user.email ).to.be.undefined; + expect( identification.user.last_ip ).to.be.undefined; + } ).expect( 200, done ); + } ); + } ); + + describe( "observers", ( ) => { + it( "never returns email or IP for user in identification", function ( done ) { + request( this.app ).get( "/v1/identifications/observers?id=2023092501" ) + .expect( res => { + const identification = res.body.results[0]; + expect( res.body.page ).to.eq( 1 ); + expect( res.body.total_results ).to.eq( 1 ); + expect( res.body.results.length ).to.eq( 1 ); + expect( identification.user_id ).to.eq( 2023092501 ); + expect( identification.user ).not.to.be.undefined; + expect( identification.user.id ).to.eq( 2023092501 ); + expect( identification.user.email ).to.be.undefined; + expect( identification.user.last_ip ).to.be.undefined; + } ).expect( 200, done ); + } ); } ); describe( "species_counts", ( ) => { diff --git a/test/integration/v1/observations.js b/test/integration/v1/observations.js index 52bf2967..bff8fd7c 100644 --- a/test/integration/v1/observations.js +++ b/test/integration/v1/observations.js @@ -210,6 +210,27 @@ describe( "Observations", ( ) => { .expect( "Content-Type", /json/ ) .expect( 200, done ); } ); + + it( "never returns email or IP for user in observation", function ( done ) { + request( this.app ).get( "/v1/observations/2023092501" ).expect( res => { + const observation = res.body.results[0]; + expect( res.body.page ).to.eq( 1 ); + expect( res.body.total_results ).to.eq( 1 ); + expect( res.body.results.length ).to.eq( 1 ); + expect( observation.id ).to.eq( 2023092501 ); + expect( observation.user ).not.to.be.undefined; + expect( observation.user.id ).to.eq( 2023092501 ); + expect( observation.user.email ).to.be.undefined; + expect( observation.user.last_ip ).to.be.undefined; + expect( observation.identifications ).not.to.be.undefined; + expect( observation.identifications.length ).to.eq( 1 ); + expect( observation.identifications[0].user ).not.to.be.undefined; + expect( observation.identifications[0].user.id ).to.eq( 2023092501 ); + expect( observation.identifications[0].user.email ).to.be.undefined; + expect( observation.identifications[0].user.last_ip ).to.be.undefined; + } ).expect( "Content-Type", /json/ ) + .expect( 200, done ); + } ); } ); describe( "create", ( ) => { @@ -1223,6 +1244,27 @@ describe( "Observations", ( ) => { .expect( "Content-Type", /json/ ) .expect( 200, done ); } ); + + it( "never returns email or IP for user in observation", function ( done ) { + request( this.app ).get( "/v1/observations?id=2023092501" ).expect( res => { + const observation = res.body.results[0]; + expect( res.body.page ).to.eq( 1 ); + expect( res.body.total_results ).to.eq( 1 ); + expect( res.body.results.length ).to.eq( 1 ); + expect( observation.id ).to.eq( 2023092501 ); + expect( observation.user ).not.to.be.undefined; + expect( observation.user.id ).to.eq( 2023092501 ); + expect( observation.user.email ).to.be.undefined; + expect( observation.user.last_ip ).to.be.undefined; + expect( observation.identifications ).not.to.be.undefined; + expect( observation.identifications.length ).to.eq( 1 ); + expect( observation.identifications[0].user ).not.to.be.undefined; + expect( observation.identifications[0].user.id ).to.eq( 2023092501 ); + expect( observation.identifications[0].user.email ).to.be.undefined; + expect( observation.identifications[0].user.last_ip ).to.be.undefined; + } ).expect( "Content-Type", /json/ ) + .expect( 200, done ); + } ); } ); describe( "histogram", ( ) => { diff --git a/test/integration/v1/projects.js b/test/integration/v1/projects.js index a9611c5d..03d10e3c 100644 --- a/test/integration/v1/projects.js +++ b/test/integration/v1/projects.js @@ -70,6 +70,25 @@ describe( "Projects", ( ) => { } ) .expect( 200, done ); } ); + it( "never returns email or IP for user in project", function ( done ) { + request( this.app ).get( "/v1/projects?q=project-2023092501" ) + .expect( res => { + const project = res.body.results[0]; + expect( res.body.page ).to.eq( 1 ); + expect( res.body.per_page ).to.eq( 1 ); + expect( res.body.total_results ).to.eq( 1 ); + expect( project.id ).to.eq( 2023092501 ); + expect( project.admins ).not.to.be.undefined; + expect( project.admins[0] ).not.to.be.undefined; + expect( project.admins[0].user ).not.to.be.undefined; + expect( project.admins[0].user.email ).to.be.undefined; + expect( project.admins[0].user.last_ip ).to.be.undefined; + expect( project.user ).not.to.be.undefined; + expect( project.user.email ).to.be.undefined; + expect( project.user.last_ip ).to.be.undefined; + } ) + .expect( 200, done ); + } ); } ); describe( "show", ( ) => { @@ -110,6 +129,27 @@ describe( "Projects", ( ) => { } ).expect( "Content-Type", /json/ ) .expect( 422, done ); } ); + + it( "never returns email or IP for user in project", function ( done ) { + request( this.app ).get( "/v1/projects/2023092501" ) + .expect( res => { + const project = res.body.results[0]; + expect( res.body.page ).to.eq( 1 ); + expect( res.body.per_page ).to.eq( 1 ); + expect( res.body.total_results ).to.eq( 1 ); + expect( res.body.results.length ).to.eq( 1 ); + expect( project.id ).to.eq( 2023092501 ); + expect( project.admins ).not.to.be.undefined; + expect( project.admins[0] ).not.to.be.undefined; + expect( project.admins[0].user ).not.to.be.undefined; + expect( project.admins[0].user.email ).to.be.undefined; + expect( project.admins[0].user.last_ip ).to.be.undefined; + expect( project.user ).not.to.be.undefined; + expect( project.user.email ).to.be.undefined; + expect( project.user.last_ip ).to.be.undefined; + } ).expect( "Content-Type", /json/ ) + .expect( 200, done ); + } ); } ); describe( "autocomplete", ( ) => { @@ -182,6 +222,27 @@ describe( "Projects", ( ) => { } ) .expect( 200, done ); } ); + + it( "never returns email or IP for user in project", function ( done ) { + request( this.app ).get( "/v1/projects/autocomplete?q=2023092501" ) + .expect( res => { + const project = res.body.results[0]; + expect( res.body.page ).to.eq( 1 ); + expect( res.body.per_page ).to.eq( 1 ); + expect( res.body.total_results ).to.eq( 1 ); + expect( res.body.results.length ).to.eq( 1 ); + expect( project.id ).to.eq( 2023092501 ); + expect( project.admins ).not.to.be.undefined; + expect( project.admins[0] ).not.to.be.undefined; + expect( project.admins[0].user ).not.to.be.undefined; + expect( project.admins[0].user.email ).to.be.undefined; + expect( project.admins[0].user.last_ip ).to.be.undefined; + expect( project.user ).not.to.be.undefined; + expect( project.user.email ).to.be.undefined; + expect( project.user.last_ip ).to.be.undefined; + } ).expect( "Content-Type", /json/ ) + .expect( 200, done ); + } ); } ); describe( "members", ( ) => { @@ -233,6 +294,29 @@ describe( "Projects", ( ) => { } ).expect( "Content-Type", /json/ ) .expect( 200, done ); } ); + + it( "never returns email or IP for user in project", function ( done ) { + request( this.app ).get( "/v1/projects/2023092501/members" ) + .expect( res => { + expect( res.body.page ).to.eq( 1 ); + expect( res.body.per_page ).to.eq( 3 ); + expect( res.body.total_results ).to.eq( 3 ); + expect( res.body.results.length ).to.eq( 3 ); + expect( res.body.results[0].user.id ).to.eq( 2023092501 ); + expect( res.body.results[0].user ).not.to.be.undefined; + expect( res.body.results[0].user.email ).to.be.undefined; + expect( res.body.results[0].user.last_ip ).to.be.undefined; + expect( res.body.results[1].user.id ).to.eq( 2023092502 ); + expect( res.body.results[1].user ).not.to.be.undefined; + expect( res.body.results[1].user.email ).to.be.undefined; + expect( res.body.results[1].user.last_ip ).to.be.undefined; + expect( res.body.results[2].user.id ).to.eq( 2023092503 ); + expect( res.body.results[2].user ).not.to.be.undefined; + expect( res.body.results[2].user.email ).to.be.undefined; + expect( res.body.results[2].user.last_ip ).to.be.undefined; + } ).expect( "Content-Type", /json/ ) + .expect( 200, done ); + } ); } ); describe( "posts", ( ) => { @@ -268,6 +352,23 @@ describe( "Projects", ( ) => { .expect( "Content-Type", /json/ ) .expect( 200, done ); } ); + + it( "never returns email or IP for user in project", function ( done ) { + request( this.app ).get( "/v1/projects/2023092501/posts" ) + .expect( res => { + expect( res.body.total_results ).to.eq( 3 ); + expect( res.body.results[0].user ).not.to.be.undefined; + expect( res.body.results[0].user.email ).to.be.undefined; + expect( res.body.results[0].user.last_ip ).to.be.undefined; + expect( res.body.results[1].user ).not.to.be.undefined; + expect( res.body.results[1].user.email ).to.be.undefined; + expect( res.body.results[1].user.last_ip ).to.be.undefined; + expect( res.body.results[2].user ).not.to.be.undefined; + expect( res.body.results[2].user.email ).to.be.undefined; + expect( res.body.results[2].user.last_ip ).to.be.undefined; + } ).expect( "Content-Type", /json/ ) + .expect( 200, done ); + } ); } ); describe( "subscriptions", ( ) => { diff --git a/test/integration/v1/search.js b/test/integration/v1/search.js index 5b9596ea..93c25c61 100644 --- a/test/integration/v1/search.js +++ b/test/integration/v1/search.js @@ -58,5 +58,31 @@ describe( "Search", ( ) => { } ).expect( "Content-Type", /json/ ) .expect( 200, done ); } ); + + it( "never returns email or IP for user", function ( done ) { + request( this.app ).get( "/v1/search?q=User2023092501" ).expect( res => { + const user = res.body.results[0]; + expect( user.type ).to.eq( "User" ); + expect( user.record ).not.to.be.undefined; + expect( user.record.id ).to.eq( 2023092501 ); + expect( user.record.email ).to.be.undefined; + expect( user.record.last_ip ).to.be.undefined; + } ).expect( "Content-Type", /json/ ) + .expect( 200, done ); + } ); + + it( "never returns email or IP for user in project", function ( done ) { + request( this.app ).get( "/v1/search?q=project-2023092501" ).expect( res => { + const project = res.body.results[0]; + expect( project.type ).to.eq( "Project" ); + expect( project.record ).not.to.be.undefined; + expect( project.record.id ).to.eq( 2023092501 ); + expect( project.record.admins ).not.to.be.undefined; + expect( project.record.admins[0] ).not.to.be.undefined; + expect( project.record.admins[0].email ).to.be.undefined; + expect( project.record.admins[0].last_ip ).to.be.undefined; + } ).expect( "Content-Type", /json/ ) + .expect( 200, done ); + } ); } ); } ); diff --git a/test/integration/v1/users.js b/test/integration/v1/users.js index 71369cb2..78e145c3 100644 --- a/test/integration/v1/users.js +++ b/test/integration/v1/users.js @@ -39,6 +39,21 @@ describe( "Users", ( ) => { request( this.app ).get( "/v1/users/123123" ) .expect( "Content-Type", /json/ ).expect( 404, done ); } ); + + it( "never returns email or IP for user", function ( done ) { + request( this.app ).get( "/v1/users/2023092501" ) + .expect( res => { + const user = res.body.results[0]; + expect( res.body.page ).to.eq( 1 ); + expect( res.body.per_page ).to.eq( 1 ); + expect( res.body.total_results ).to.eq( 1 ); + expect( res.body.results.length ).to.eq( 1 ); + expect( user.id ).to.eq( 2023092501 ); + expect( user ).to.not.have.property( "email" ); + expect( user ).to.not.have.property( "last_ip" ); + } ).expect( "Content-Type", /json/ ) + .expect( 200, done ); + } ); } ); describe( "update", ( ) => { @@ -96,6 +111,20 @@ describe( "Users", ( ) => { } ).expect( "Content-Type", /json/ ) .expect( 200, done ); } ); + + it( "never returns email or IP for user", function ( done ) { + request( this.app ).get( "/v1/users/autocomplete?q=user2023092501" ) + .expect( res => { + const user = res.body.results[0]; + expect( res.body.page ).to.eq( 1 ); + expect( res.body.per_page ).to.eq( 1 ); + expect( res.body.total_results ).to.eq( 1 ); + expect( user.id ).to.eq( 2023092501 ); + expect( user ).to.not.have.property( "email" ); + expect( user ).to.not.have.property( "last_ip" ); + } ).expect( "Content-Type", /json/ ) + .expect( 200, done ); + } ); } ); describe( "projects", ( ) => { @@ -121,6 +150,24 @@ describe( "Users", ( ) => { } ).expect( "Content-Type", /json/ ) .expect( 200, done ); } ); + + it( "never returns email or IP for user in project", function ( done ) { + request( this.app ).get( "/v1/users/2023092501/projects" ) + .expect( res => { + expect( res.body.page ).to.eq( 1 ); + const project = _.find( res.body.results, p => p.slug === "project-2023092501" ); + expect( project ).not.to.be.undefined; + expect( project.admins ).not.to.be.undefined; + expect( project.admins[0] ).not.to.be.undefined; + expect( project.admins[0].user ).not.to.be.undefined; + expect( project.admins[0].user.email ).to.be.undefined; + expect( project.admins[0].user.last_ip ).to.be.undefined; + expect( project.user ).not.to.be.undefined; + expect( project.user.email ).to.be.undefined; + expect( project.user.last_ip ).to.be.undefined; + } ).expect( "Content-Type", /json/ ) + .expect( 200, done ); + } ); } ); describe( "me", ( ) => { diff --git a/test/integration/v2/identifications.js b/test/integration/v2/identifications.js index 0f343be6..350fd459 100644 --- a/test/integration/v2/identifications.js +++ b/test/integration/v2/identifications.js @@ -52,6 +52,19 @@ describe( "Identifications", ( ) => { .expect( "Content-Type", /json/ ) .expect( 200, done ); } ); + it( "never returns email or IP for user in identification", function ( done ) { + request( this.app ).get( "/v2/identifications/identifiers?per_page=100&fields=all" ) + .expect( res => { + expect( res.body.page ).to.eq( 1 ); + const record = _.find( res.body.results, u => u.user_id === 2023092501 ); + expect( record ).not.to.be.undefined; + expect( record.user ).not.to.be.undefined; + expect( record.user.id ).eq( 2023092501 ); + expect( record.user.email ).to.be.undefined; + expect( record.user.last_ip ).to.be.undefined; + } ).expect( "Content-Type", /json/ ) + .expect( 200, done ); + } ); } ); describe( "update", ( ) => { diff --git a/test/integration/v2/observations.js b/test/integration/v2/observations.js index cc0cdf72..0dc036e4 100644 --- a/test/integration/v2/observations.js +++ b/test/integration/v2/observations.js @@ -144,6 +144,27 @@ describe( "Observations", ( ) => { .expect( 200, done ); } ); + it( "never returns email or IP for user in observation", function ( done ) { + request( this.app ).get( "/v2/observations/78e0b6e4-61fa-11ee-8c99-0242ac120002?fields=all" ).expect( res => { + const observation = res.body.results[0]; + expect( res.body.page ).to.eq( 1 ); + expect( res.body.total_results ).to.eq( 1 ); + expect( res.body.results.length ).to.eq( 1 ); + expect( observation.id ).to.eq( 2023092501 ); + expect( observation.user ).not.to.be.undefined; + expect( observation.user.id ).to.eq( 2023092501 ); + expect( observation.user.email ).to.be.undefined; + expect( observation.user.last_ip ).to.be.undefined; + expect( observation.identifications ).not.to.be.undefined; + expect( observation.identifications.length ).to.eq( 1 ); + expect( observation.identifications[0].user ).not.to.be.undefined; + expect( observation.identifications[0].user.id ).to.eq( 2023092501 ); + expect( observation.identifications[0].user.email ).to.be.undefined; + expect( observation.identifications[0].user.last_ip ).to.be.undefined; + } ).expect( "Content-Type", /json/ ) + .expect( 200, done ); + } ); + // the observations.show endpoint should use the ES mget method to fetch observations for the // show endpoint, unless there are additional parameters that will filter the observations // returned. This is because the mget method is not affected by the normal ES refresh cycle, @@ -371,6 +392,27 @@ describe( "Observations", ( ) => { } ) .expect( 500, done ); } ); + + it( "never returns email or IP for user in observation", function ( done ) { + request( this.app ).get( "/v2/observations?id=2023092501&fields=all" ).expect( res => { + const observation = res.body.results[0]; + expect( res.body.page ).to.eq( 1 ); + expect( res.body.total_results ).to.eq( 1 ); + expect( res.body.results.length ).to.eq( 1 ); + expect( observation.id ).to.eq( 2023092501 ); + expect( observation.user ).not.to.be.undefined; + expect( observation.user.id ).to.eq( 2023092501 ); + expect( observation.user.email ).to.be.undefined; + expect( observation.user.last_ip ).to.be.undefined; + expect( observation.identifications ).not.to.be.undefined; + expect( observation.identifications.length ).to.eq( 1 ); + expect( observation.identifications[0].user ).not.to.be.undefined; + expect( observation.identifications[0].user.id ).to.eq( 2023092501 ); + expect( observation.identifications[0].user.email ).to.be.undefined; + expect( observation.identifications[0].user.last_ip ).to.be.undefined; + } ).expect( "Content-Type", /json/ ) + .expect( 200, done ); + } ); } ); describe( "create", ( ) => { @@ -585,6 +627,20 @@ describe( "Observations", ( ) => { .expect( "Content-Type", /json/ ) .expect( 200, done ); } ); + + it( "never returns email or IP for user in observation", function ( done ) { + request( this.app ).get( "/v2/observations/observers?user_id=2023092501&fields=all" ).expect( res => { + const observation = res.body.results[0]; + expect( res.body.page ).to.eq( 1 ); + expect( res.body.total_results ).to.eq( 1 ); + expect( res.body.results.length ).to.eq( 1 ); + expect( observation.user ).not.to.be.undefined; + expect( observation.user.id ).to.eq( 2023092501 ); + expect( observation.user.email ).to.be.undefined; + expect( observation.user.last_ip ).to.be.undefined; + } ).expect( "Content-Type", /json/ ) + .expect( 200, done ); + } ); } ); describe( "popularFieldValues", ( ) => { diff --git a/test/integration/v2/projects.js b/test/integration/v2/projects.js index de570897..75e1ce24 100644 --- a/test/integration/v2/projects.js +++ b/test/integration/v2/projects.js @@ -46,6 +46,26 @@ describe( "Projects", ( ) => { } ) .expect( 200, done ); } ); + it( "never returns email or IP for user in project", function ( done ) { + request( this.app ).get( "/v2/projects/2023092501?fields=all" ) + .expect( res => { + const p = res.body.results[0]; + expect( res.body.page ).to.eq( 1 ); + expect( res.body.per_page ).to.eq( 1 ); + expect( res.body.total_results ).to.eq( 1 ); + expect( res.body.results.length ).to.eq( 1 ); + expect( p.id ).to.eq( 2023092501 ); + expect( p.admins ).not.to.be.undefined; + expect( p.admins[0] ).not.to.be.undefined; + expect( p.admins[0].user ).not.to.be.undefined; + expect( p.admins[0].user.email ).to.be.undefined; + expect( p.admins[0].user.last_ip ).to.be.undefined; + expect( p.user ).not.to.be.undefined; + expect( p.user.email ).to.be.undefined; + expect( p.user.last_ip ).to.be.undefined; + } ).expect( "Content-Type", /json/ ) + .expect( 200, done ); + } ); } ); describe( "search", ( ) => { @@ -79,5 +99,25 @@ describe( "Projects", ( ) => { } ) .expect( 200, done ); } ); + + it( "never returns email or IP for user in project", function ( done ) { + request( this.app ).get( "/v2/projects?q=project-2023092501&fields=all" ) + .expect( res => { + const project = res.body.results[0]; + expect( res.body.page ).to.eq( 1 ); + expect( res.body.per_page ).to.eq( 1 ); + expect( res.body.total_results ).to.eq( 1 ); + expect( project.id ).to.eq( 2023092501 ); + expect( project.admins ).not.to.be.undefined; + expect( project.admins[0] ).not.to.be.undefined; + expect( project.admins[0].user ).not.to.be.undefined; + expect( project.admins[0].user.email ).to.be.undefined; + expect( project.admins[0].user.last_ip ).to.be.undefined; + expect( project.user ).not.to.be.undefined; + expect( project.user.email ).to.be.undefined; + expect( project.user.last_ip ).to.be.undefined; + } ) + .expect( 200, done ); + } ); } ); } ); diff --git a/test/integration/v2/search.js b/test/integration/v2/search.js index e651fa6b..4ef5fc91 100644 --- a/test/integration/v2/search.js +++ b/test/integration/v2/search.js @@ -58,5 +58,31 @@ describe( "Search", ( ) => { } ).expect( "Content-Type", /json/ ) .expect( 200, done ); } ); + + it( "never returns email or IP for user", function ( done ) { + request( this.app ).get( "/v2/search?q=User2023092501&fields=all" ).expect( res => { + const record = res.body.results[0]; + expect( record.type ).to.eq( "user" ); + expect( record.user ).not.to.be.undefined; + expect( record.user.id ).to.eq( 2023092501 ); + expect( record.user.email ).to.be.undefined; + expect( record.user.last_ip ).to.be.undefined; + } ).expect( "Content-Type", /json/ ) + .expect( 200, done ); + } ); + + it( "never returns email or IP for user in project", function ( done ) { + request( this.app ).get( "/v2/search?q=project-2023092501&fields=all" ).expect( res => { + const record = res.body.results[0]; + expect( record.type ).to.eq( "project" ); + expect( record.project ).not.to.be.undefined; + expect( record.project.id ).to.eq( 2023092501 ); + expect( record.project.admins ).not.to.be.undefined; + expect( record.project.admins[0] ).not.to.be.undefined; + expect( record.project.admins[0].email ).to.be.undefined; + expect( record.project.admins[0].last_ip ).to.be.undefined; + } ).expect( "Content-Type", /json/ ) + .expect( 200, done ); + } ); } ); } ); diff --git a/test/integration/v2/users.js b/test/integration/v2/users.js index 67aadf79..7189081c 100644 --- a/test/integration/v2/users.js +++ b/test/integration/v2/users.js @@ -40,7 +40,38 @@ describe( "Users", ( ) => { } ) .expect( 200, done ); } ); + it( "never returns email or IP for user", function ( done ) { + request( this.app ).get( "/v2/users/2023092501?fields=all" ) + .expect( res => { + const user = res.body.results[0]; + expect( res.body.page ).to.eq( 1 ); + expect( res.body.per_page ).to.eq( 1 ); + expect( res.body.total_results ).to.eq( 1 ); + expect( res.body.results.length ).to.eq( 1 ); + expect( user.id ).to.eq( 2023092501 ); + expect( user ).to.not.have.property( "email" ); + expect( user ).to.not.have.property( "last_ip" ); + } ).expect( "Content-Type", /json/ ) + .expect( 200, done ); + } ); } ); + + describe( "autocomplete", ( ) => { + it( "never returns email or IP for user", function ( done ) { + request( this.app ).get( "/v2/users/autocomplete?q=user2023092501&fields=all" ) + .expect( res => { + const user = res.body.results[0]; + expect( res.body.page ).to.eq( 1 ); + expect( res.body.per_page ).to.eq( 1 ); + expect( res.body.total_results ).to.eq( 1 ); + expect( user.id ).to.eq( 2023092501 ); + expect( user ).to.not.have.property( "email" ); + expect( user ).to.not.have.property( "last_ip" ); + } ).expect( "Content-Type", /json/ ) + .expect( 200, done ); + } ); + } ); + describe( "update_session", ( ) => { it( "should fail without auth", function ( done ) { request( this.app ).put( "/v2/users/update_session" ) @@ -70,6 +101,27 @@ describe( "Users", ( ) => { .expect( 204, done ); } ); } ); + + describe( "projects", ( ) => { + it( "never returns email or IP for user in project", function ( done ) { + request( this.app ).get( "/v2/users/2023092501/projects?fields=all" ) + .expect( res => { + expect( res.body.page ).to.eq( 1 ); + const project = _.find( res.body.results, p => p.slug === "project-2023092501" ); + expect( project ).not.to.be.undefined; + expect( project.admins ).not.to.be.undefined; + expect( project.admins[0] ).not.to.be.undefined; + expect( project.admins[0].user ).not.to.be.undefined; + expect( project.admins[0].user.email ).to.be.undefined; + expect( project.admins[0].user.last_ip ).to.be.undefined; + expect( project.user ).not.to.be.undefined; + expect( project.user.email ).to.be.undefined; + expect( project.user.last_ip ).to.be.undefined; + } ).expect( "Content-Type", /json/ ) + .expect( 200, done ); + } ); + } ); + describe( "index", ( ) => { it( "should return JSON", function ( done ) { request( this.app ).get( "/v2/users?fields=login" ) @@ -162,6 +214,17 @@ describe( "Users", ( ) => { } ) .expect( 200, done ); } ); + it( "never returns email or IP for user in project", function ( done ) { + request( this.app ).get( "/v2/users?fields=all&per_page=100" ) + .expect( res => { + const user = _.find( res.body.results, u => u.id === 2023092501 ); + expect( user ).not.to.be.undefined; + expect( user.id ).to.eq( 2023092501 ); + expect( user ).to.not.have.property( "email" ); + expect( user ).to.not.have.property( "last_ip" ); + } ).expect( "Content-Type", /json/ ) + .expect( 200, done ); + } ); } ); describe( "update", ( ) => { From 88304d45db42db238ec442c0455645427bc8ac7f Mon Sep 17 00:00:00 2001 From: sylvain-morin Date: Wed, 4 Oct 2023 17:09:03 +0200 Subject: [PATCH 05/31] Run specs with docker compose - add tests related to user email/IP --- test/hooks.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/test/hooks.js b/test/hooks.js index 46ff92b9..039c6392 100644 --- a/test/hooks.js +++ b/test/hooks.js @@ -29,6 +29,12 @@ function initializeDb() { exports.mochaGlobalSetup = async function () { expect( process.env.NODE_ENV ).to.eq( "test" ); + console.log( "\n\nINITIALIZING TEST ENVIRONMENT\n\n" ); + + if ( !process.env.DB_ALREADY_INITIALIZED ) { + initializeDb( ); + } + // Wait for Postgres console.log( "Waiting for Postgres..." ); await testHelper.waitForPG( 100 ); @@ -37,12 +43,6 @@ exports.mochaGlobalSetup = async function () { console.log( "Waiting for ElasticSearch..." ); await testHelper.waitForES( 100 ); - console.log( "\n\nINITIALIZING TEST ENVIRONMENT\n\n" ); - - if ( !process.env.DB_ALREADY_INITIALIZED ) { - initializeDb( ); - } - console.log( "Creating ES indices" ); await testHelper.createIndices( ); console.log( "Loading ES fixtures" ); From e8adcea7483b5b3fd295b5d0aa71faaacd78f72b Mon Sep 17 00:00:00 2001 From: sylvain-morin Date: Wed, 4 Oct 2023 17:20:32 +0200 Subject: [PATCH 06/31] Run specs with docker compose - add tests related to user email/IP --- test/integration/v1/projects.js | 45 ++++++++++++++++++--------------- 1 file changed, 24 insertions(+), 21 deletions(-) diff --git a/test/integration/v1/projects.js b/test/integration/v1/projects.js index 03d10e3c..c6c557c1 100644 --- a/test/integration/v1/projects.js +++ b/test/integration/v1/projects.js @@ -302,18 +302,18 @@ describe( "Projects", ( ) => { expect( res.body.per_page ).to.eq( 3 ); expect( res.body.total_results ).to.eq( 3 ); expect( res.body.results.length ).to.eq( 3 ); - expect( res.body.results[0].user.id ).to.eq( 2023092501 ); - expect( res.body.results[0].user ).not.to.be.undefined; - expect( res.body.results[0].user.email ).to.be.undefined; - expect( res.body.results[0].user.last_ip ).to.be.undefined; - expect( res.body.results[1].user.id ).to.eq( 2023092502 ); - expect( res.body.results[1].user ).not.to.be.undefined; - expect( res.body.results[1].user.email ).to.be.undefined; - expect( res.body.results[1].user.last_ip ).to.be.undefined; - expect( res.body.results[2].user.id ).to.eq( 2023092503 ); - expect( res.body.results[2].user ).not.to.be.undefined; - expect( res.body.results[2].user.email ).to.be.undefined; - expect( res.body.results[2].user.last_ip ).to.be.undefined; + const user1 = _.find( res.body.results, u => u.id === 2023092501 ); + expect( user1 ).not.to.be.undefined; + expect( user1.email ).to.be.undefined; + expect( user1.last_ip ).to.be.undefined; + const user2 = _.find( res.body.results, u => u.id === 2023092502 ); + expect( user2 ).not.to.be.undefined; + expect( user2.email ).to.be.undefined; + expect( user2.last_ip ).to.be.undefined; + const user3 = _.find( res.body.results, u => u.id === 2023092503 ); + expect( user3 ).not.to.be.undefined; + expect( user3.email ).to.be.undefined; + expect( user3.last_ip ).to.be.undefined; } ).expect( "Content-Type", /json/ ) .expect( 200, done ); } ); @@ -357,15 +357,18 @@ describe( "Projects", ( ) => { request( this.app ).get( "/v1/projects/2023092501/posts" ) .expect( res => { expect( res.body.total_results ).to.eq( 3 ); - expect( res.body.results[0].user ).not.to.be.undefined; - expect( res.body.results[0].user.email ).to.be.undefined; - expect( res.body.results[0].user.last_ip ).to.be.undefined; - expect( res.body.results[1].user ).not.to.be.undefined; - expect( res.body.results[1].user.email ).to.be.undefined; - expect( res.body.results[1].user.last_ip ).to.be.undefined; - expect( res.body.results[2].user ).not.to.be.undefined; - expect( res.body.results[2].user.email ).to.be.undefined; - expect( res.body.results[2].user.last_ip ).to.be.undefined; + const user1 = _.find( res.body.results, u => u.id === 2023092501 ); + expect( user1 ).not.to.be.undefined; + expect( user1.email ).to.be.undefined; + expect( user1.last_ip ).to.be.undefined; + const user2 = _.find( res.body.results, u => u.id === 2023092502 ); + expect( user2 ).not.to.be.undefined; + expect( user2.email ).to.be.undefined; + expect( user2.last_ip ).to.be.undefined; + const user3 = _.find( res.body.results, u => u.id === 2023092503 ); + expect( user3 ).not.to.be.undefined; + expect( user3.email ).to.be.undefined; + expect( user3.last_ip ).to.be.undefined; } ).expect( "Content-Type", /json/ ) .expect( 200, done ); } ); From 8ce588e3d72a516318584ebcb5b5953ae3ea35ff Mon Sep 17 00:00:00 2001 From: Patrick Leary Date: Thu, 12 Oct 2023 12:32:56 -0400 Subject: [PATCH 07/31] taxon preferred_common_name contains a concatenated list of names matching user taxon name priorities --- lib/models/taxon.js | 6 +- openapi/schema/response/private_user.js | 4 +- .../schema/response/taxon_name_priority.js | 6 + schema/database.sql | 266 +++++++++++++++--- test/models/taxon.js | 171 ++++++----- 5 files changed, 335 insertions(+), 118 deletions(-) diff --git a/lib/models/taxon.js b/lib/models/taxon.js index 7193ac58..4bc43dd8 100644 --- a/lib/models/taxon.js +++ b/lib/models/taxon.js @@ -187,8 +187,12 @@ const Taxon = class Taxon extends Model { // default to undefined which will not include these attributes in the response, // rather than including them with a value of `null` which was causing the Android // app to erronously present the common name as the string "null" - this.preferred_common_name = _.defaultTo( this.preferredCommonName( localeOpts ), undefined ); this.preferred_common_names = _.defaultTo( this.preferredCommonNames( localeOpts ), undefined ); + if ( !_.isEmpty( this.preferred_common_names ) ) { + this.preferred_common_name = _.join( _.uniq( _.map( this.preferred_common_names, "name" ) ), " · " ); + } else { + this.preferred_common_name = _.defaultTo( this.preferredCommonName( localeOpts ), undefined ); + } if ( this.default_photo ) { this.default_photo.url = util.fixHttps( this.default_photo.url ); this.default_photo.medium_url = util.fixHttps( this.default_photo.medium_url ); diff --git a/openapi/schema/response/private_user.js b/openapi/schema/response/private_user.js index 6f1fd13e..ea1d4822 100644 --- a/openapi/schema/response/private_user.js +++ b/openapi/schema/response/private_user.js @@ -1,6 +1,6 @@ const Joi = require( "joi" ); const user = require( "./user" ); -const taxonNamePreferece = require( "./taxon_name_priority" ); +const taxonNamePriority = require( "./taxon_name_priority" ); module.exports = user.append( { activity_count: Joi.number( ).integer( ), @@ -55,7 +55,7 @@ module.exports = user.append( { prefers_user_observation_email_notification: Joi.boolean( ).valid( null ), privileges: Joi.array( ).items( Joi.string( ) ).valid( null ), search_place_id: Joi.number( ).integer( ).valid( null ), - taxon_name_priorities: Joi.array( ).items( taxonNamePreferece ), + taxon_name_priorities: Joi.array( ).items( taxonNamePriority ), time_zone: Joi.string( ).valid( null ), unconfirmed_email: Joi.string( ).valid( null ), universal_search_rank: Joi.number( ).integer( ) diff --git a/openapi/schema/response/taxon_name_priority.js b/openapi/schema/response/taxon_name_priority.js index 984879af..e9288422 100644 --- a/openapi/schema/response/taxon_name_priority.js +++ b/openapi/schema/response/taxon_name_priority.js @@ -4,6 +4,12 @@ module.exports = Joi.object( ).keys( { id: Joi.number( ).integer( ).required( ), user_id: Joi.number( ).integer( ).required( ), place_id: Joi.number( ).integer( ).valid( null ), + place: { + id: Joi.number( ).integer( ).required( ), + uuid: Joi.string( ).guid( { version: "uuidv4" } ), + display_name: Joi.string( ).valid( null ), + name: Joi.string( ) + }, lexicon: Joi.string( ).required( ).valid( null ), position: Joi.number( ).integer( ).required( ).valid( null ) } ).unknown( false ).meta( { className: "TaxonNamePriority" } ); diff --git a/schema/database.sql b/schema/database.sql index 54d3b325..bd2d6bc8 100644 --- a/schema/database.sql +++ b/schema/database.sql @@ -9,6 +9,7 @@ SET xmloption = content; SET client_min_messages = warning; SET row_security = off; + -- -- Name: postgis; Type: EXTENSION; Schema: -; Owner: - -- @@ -241,6 +242,31 @@ CREATE FUNCTION public.st_aslatlontext(public.geometry) RETURNS text LANGUAGE sql IMMUTABLE STRICT AS $_$ SELECT ST_AsLatLonText($1, '') $_$; + +-- +-- Name: median(anyelement); Type: AGGREGATE; Schema: public; Owner: - +-- + +CREATE AGGREGATE public.median(anyelement) ( + SFUNC = array_append, + STYPE = anyarray, + INITCOND = '{}', + FINALFUNC = public._final_median +); + + +-- +-- Name: median(numeric); Type: AGGREGATE; Schema: public; Owner: - +-- + +CREATE AGGREGATE public.median(numeric) ( + SFUNC = array_append, + STYPE = numeric[], + INITCOND = '{}', + FINALFUNC = public._final_median +); + + SET default_tablespace = ''; SET default_table_access_method = heap; @@ -1113,7 +1139,8 @@ CREATE TABLE public.deleted_observations ( user_id integer, observation_id integer, created_at timestamp without time zone NOT NULL, - updated_at timestamp without time zone NOT NULL + updated_at timestamp without time zone NOT NULL, + observation_created_at timestamp without time zone ); @@ -1423,7 +1450,9 @@ CREATE TABLE public.flags ( resolved_at timestamp without time zone, flaggable_user_id integer, flaggable_content text, - uuid uuid DEFAULT public.uuid_generate_v4() + uuid uuid DEFAULT public.uuid_generate_v4(), + flaggable_parent_type character varying, + flaggable_parent_id bigint ); @@ -1675,6 +1704,42 @@ CREATE SEQUENCE public.friendships_id_seq ALTER SEQUENCE public.friendships_id_seq OWNED BY public.friendships.id; +-- +-- Name: geo_model_taxa; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE public.geo_model_taxa ( + id bigint NOT NULL, + taxon_id integer, + prauc double precision, + "precision" double precision, + recall double precision, + f1 double precision, + threshold double precision, + created_at timestamp(6) without time zone NOT NULL, + updated_at timestamp(6) without time zone NOT NULL +); + + +-- +-- Name: geo_model_taxa_id_seq; Type: SEQUENCE; Schema: public; Owner: - +-- + +CREATE SEQUENCE public.geo_model_taxa_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +-- +-- Name: geo_model_taxa_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - +-- + +ALTER SEQUENCE public.geo_model_taxa_id_seq OWNED BY public.geo_model_taxa.id; + + -- -- Name: goal_contributions; Type: TABLE; Schema: public; Owner: - -- @@ -3802,7 +3867,6 @@ CREATE TABLE public.schema_migrations ( -- CREATE TABLE public.sessions ( - id integer NOT NULL, session_id character varying NOT NULL, data text, created_at timestamp without time zone, @@ -3810,25 +3874,6 @@ CREATE TABLE public.sessions ( ); --- --- Name: sessions_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE public.sessions_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: sessions_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - --- - -ALTER SEQUENCE public.sessions_id_seq OWNED BY public.sessions.id; - - -- -- Name: simplified_tree_milestone_taxa; Type: TABLE; Schema: public; Owner: - -- @@ -4578,7 +4623,7 @@ CREATE TABLE public.taxon_name_priorities ( "position" smallint, user_id integer NOT NULL, place_id integer, - lexicon character varying NOT NULL, + lexicon character varying, created_at timestamp(6) without time zone NOT NULL, updated_at timestamp(6) without time zone NOT NULL ); @@ -4597,6 +4642,13 @@ CREATE SEQUENCE public.taxon_name_priorities_id_seq CACHE 1; +-- +-- Name: taxon_name_priorities_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - +-- + +ALTER SEQUENCE public.taxon_name_priorities_id_seq OWNED BY public.taxon_name_priorities.id; + + -- -- Name: taxon_names; Type: TABLE; Schema: public; Owner: - -- @@ -4791,11 +4843,32 @@ ALTER SEQUENCE public.taxon_schemes_id_seq OWNED BY public.taxon_schemes.id; -- CREATE TABLE public.time_zone_geometries ( - tzid character varying, + ogc_fid integer NOT NULL, + tzid character varying(80), geom public.geometry(MultiPolygon) ); +-- +-- Name: time_zone_geometries_ogc_fid_seq; Type: SEQUENCE; Schema: public; Owner: - +-- + +CREATE SEQUENCE public.time_zone_geometries_ogc_fid_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +-- +-- Name: time_zone_geometries_ogc_fid_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - +-- + +ALTER SEQUENCE public.time_zone_geometries_ogc_fid_seq OWNED BY public.time_zone_geometries.ogc_fid; + + -- -- Name: trip_purposes; Type: TABLE; Schema: public; Owner: - -- @@ -5582,6 +5655,13 @@ ALTER TABLE ONLY public.friendly_id_slugs ALTER COLUMN id SET DEFAULT nextval('p ALTER TABLE ONLY public.friendships ALTER COLUMN id SET DEFAULT nextval('public.friendships_id_seq'::regclass); +-- +-- Name: geo_model_taxa id; Type: DEFAULT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.geo_model_taxa ALTER COLUMN id SET DEFAULT nextval('public.geo_model_taxa_id_seq'::regclass); + + -- -- Name: goal_contributions id; Type: DEFAULT; Schema: public; Owner: - -- @@ -5925,13 +6005,6 @@ ALTER TABLE ONLY public.rules ALTER COLUMN id SET DEFAULT nextval('public.rules_ ALTER TABLE ONLY public.saved_locations ALTER COLUMN id SET DEFAULT nextval('public.saved_locations_id_seq'::regclass); --- --- Name: sessions id; Type: DEFAULT; Schema: public; Owner: - --- - -ALTER TABLE ONLY public.sessions ALTER COLUMN id SET DEFAULT nextval('public.sessions_id_seq'::regclass); - - -- -- Name: simplified_tree_milestone_taxa id; Type: DEFAULT; Schema: public; Owner: - -- @@ -6114,6 +6187,13 @@ ALTER TABLE ONLY public.taxon_scheme_taxa ALTER COLUMN id SET DEFAULT nextval('p ALTER TABLE ONLY public.taxon_schemes ALTER COLUMN id SET DEFAULT nextval('public.taxon_schemes_id_seq'::regclass); +-- +-- Name: time_zone_geometries ogc_fid; Type: DEFAULT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.time_zone_geometries ALTER COLUMN ogc_fid SET DEFAULT nextval('public.time_zone_geometries_ogc_fid_seq'::regclass); + + -- -- Name: trip_purposes id; Type: DEFAULT; Schema: public; Owner: - -- @@ -6525,6 +6605,14 @@ ALTER TABLE ONLY public.friendships ADD CONSTRAINT friendships_pkey PRIMARY KEY (id); +-- +-- Name: geo_model_taxa geo_model_taxa_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.geo_model_taxa + ADD CONSTRAINT geo_model_taxa_pkey PRIMARY KEY (id); + + -- -- Name: goal_contributions goal_contributions_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- @@ -6922,7 +7010,7 @@ ALTER TABLE ONLY public.saved_locations -- ALTER TABLE ONLY public.sessions - ADD CONSTRAINT sessions_pkey PRIMARY KEY (id); + ADD CONSTRAINT sessions_pkey PRIMARY KEY (session_id); -- @@ -7133,6 +7221,14 @@ ALTER TABLE ONLY public.taxon_schemes ADD CONSTRAINT taxon_schemes_pkey PRIMARY KEY (id); +-- +-- Name: time_zone_geometries time_zone_geometries_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.time_zone_geometries + ADD CONSTRAINT time_zone_geometries_pkey PRIMARY KEY (ogc_fid); + + -- -- Name: trip_purposes trip_purposes_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- @@ -7272,6 +7368,13 @@ CREATE INDEX index_annotations_on_controlled_attribute_id ON public.annotations CREATE INDEX index_annotations_on_controlled_value_id ON public.annotations USING btree (controlled_value_id); +-- +-- Name: index_annotations_on_observation_field_value_id; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX index_annotations_on_observation_field_value_id ON public.annotations USING btree (observation_field_value_id); + + -- -- Name: index_annotations_on_resource_id_and_resource_type; Type: INDEX; Schema: public; Owner: - -- @@ -7434,10 +7537,17 @@ CREATE INDEX index_colors_taxa_on_taxon_id_and_color_id ON public.colors_taxa US -- --- Name: index_comments_on_parent_type_and_parent_id; Type: INDEX; Schema: public; Owner: - +-- Name: index_comments_on_parent_id_and_parent_type; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX index_comments_on_parent_id_and_parent_type ON public.comments USING btree (parent_id, parent_type); + + +-- +-- Name: index_comments_on_parent_type; Type: INDEX; Schema: public; Owner: - -- -CREATE INDEX index_comments_on_parent_type_and_parent_id ON public.comments USING btree (parent_type, parent_id); +CREATE INDEX index_comments_on_parent_type ON public.comments USING btree (parent_type); -- @@ -7692,6 +7802,13 @@ CREATE INDEX index_file_prefixes_on_prefix ON public.file_prefixes USING btree ( CREATE INDEX index_flags_on_flaggable_id_and_flaggable_type ON public.flags USING btree (flaggable_id, flaggable_type); +-- +-- Name: index_flags_on_flaggable_parent_type_and_flaggable_parent_id; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX index_flags_on_flaggable_parent_type_and_flaggable_parent_id ON public.flags USING btree (flaggable_parent_type, flaggable_parent_id); + + -- -- Name: index_flags_on_uuid; Type: INDEX; Schema: public; Owner: - -- @@ -7776,6 +7893,13 @@ CREATE INDEX index_friendships_on_trust ON public.friendships USING btree (trust CREATE UNIQUE INDEX index_friendships_on_user_id_and_friend_id ON public.friendships USING btree (user_id, friend_id); +-- +-- Name: index_geo_model_taxa_on_taxon_id; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX index_geo_model_taxa_on_taxon_id ON public.geo_model_taxa USING btree (taxon_id); + + -- -- Name: index_guide_photos_on_guide_taxon_id; Type: INDEX; Schema: public; Owner: - -- @@ -8105,6 +8229,13 @@ CREATE INDEX index_lists_on_user_id ON public.lists USING btree (user_id); CREATE INDEX index_messages_on_user_id_and_from_user_id ON public.messages USING btree (user_id, from_user_id); +-- +-- Name: index_messages_on_user_id_and_thread_id; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX index_messages_on_user_id_and_thread_id ON public.messages USING btree (user_id, thread_id); + + -- -- Name: index_messages_on_user_id_and_to_user_id_and_read_at; Type: INDEX; Schema: public; Owner: - -- @@ -9008,13 +9139,6 @@ CREATE INDEX index_saved_locations_on_title ON public.saved_locations USING btre CREATE INDEX index_saved_locations_on_user_id ON public.saved_locations USING btree (user_id); --- --- Name: index_sessions_on_session_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_sessions_on_session_id ON public.sessions USING btree (session_id); - - -- -- Name: index_sessions_on_updated_at; Type: INDEX; Schema: public; Owner: - -- @@ -9141,6 +9265,13 @@ CREATE INDEX index_subscriptions_on_taxon_id ON public.subscriptions USING btree CREATE INDEX index_subscriptions_on_user_id ON public.subscriptions USING btree (user_id); +-- +-- Name: index_subscriptions_on_user_id_and_resource_type; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX index_subscriptions_on_user_id_and_resource_type ON public.subscriptions USING btree (user_id, resource_type); + + -- -- Name: index_taggings_on_taggable_id_and_taggable_type_and_context; Type: INDEX; Schema: public; Owner: - -- @@ -9316,6 +9447,13 @@ CREATE INDEX index_taxon_links_on_taxon_id_and_show_for_descendent_taxa ON publi CREATE INDEX index_taxon_links_on_user_id ON public.taxon_links USING btree (user_id); +-- +-- Name: index_taxon_name_priorities_on_user_id; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX index_taxon_name_priorities_on_user_id ON public.taxon_name_priorities USING btree (user_id); + + -- -- Name: index_taxon_names_on_lexicon; Type: INDEX; Schema: public; Owner: - -- @@ -9505,6 +9643,13 @@ CREATE INDEX index_user_privileges_on_revoke_user_id ON public.user_privileges U CREATE INDEX index_user_privileges_on_user_id ON public.user_privileges USING btree (user_id); +-- +-- Name: index_users_on_confirmation_token; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX index_users_on_confirmation_token ON public.users USING btree (confirmation_token); + + -- -- Name: index_users_on_curator_sponsor_id; Type: INDEX; Schema: public; Owner: - -- @@ -9589,6 +9734,13 @@ CREATE INDEX index_users_on_observations_count ON public.users USING btree (obse CREATE INDEX index_users_on_place_id ON public.users USING btree (place_id); +-- +-- Name: index_users_on_reset_password_token; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX index_users_on_reset_password_token ON public.users USING btree (reset_password_token); + + -- -- Name: index_users_on_site_id; Type: INDEX; Schema: public; Owner: - -- @@ -9610,6 +9762,13 @@ CREATE INDEX index_users_on_spammer ON public.users USING btree (spammer); CREATE INDEX index_users_on_state ON public.users USING btree (state); +-- +-- Name: index_users_on_unconfirmed_email; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX index_users_on_unconfirmed_email ON public.users USING btree (unconfirmed_email); + + -- -- Name: index_users_on_unlock_token; Type: INDEX; Schema: public; Owner: - -- @@ -9736,6 +9895,13 @@ CREATE UNIQUE INDEX taggings_idx ON public.taggings USING btree (tag_id, taggabl CREATE INDEX taxon_names_lower_name_index ON public.taxon_names USING btree (lower((name)::text)); +-- +-- Name: time_zone_geometries_geom_geom_idx; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX time_zone_geometries_geom_geom_idx ON public.time_zone_geometries USING gist (geom); + + -- -- Name: unique_schema_migrations; Type: INDEX; Schema: public; Owner: - -- @@ -10196,14 +10362,28 @@ INSERT INTO "schema_migrations" (version) VALUES ('20211001151300'), ('20211109220615'), ('20211216171216'), +('20220105014844'), +('20220127195113'), ('20220209191328'), ('20220217224804'), ('20220224012321'), ('20220225054243'), +('20220305012626'), ('20220308015748'), ('20220310001916'), ('20220317205240'), ('20220317210522'), -('20220407173712'); - +('20220407173712'), +('20221129175508'), +('20221214192739'), +('20221219015021'), +('20230224230316'), +('20230407150700'), +('20230504154134'), +('20230504154207'), +('20230504154224'), +('20230504154236'), +('20230504154248'), +('20230504154302'), +('20230907210748'); diff --git a/test/models/taxon.js b/test/models/taxon.js index 503b17e6..80d31d1c 100644 --- a/test/models/taxon.js +++ b/test/models/taxon.js @@ -1,3 +1,4 @@ +const _ = require( "lodash" ); const chai = require( "chai" ); const chaiAsPromised = require( "chai-as-promised" ); const Taxon = require( "../../lib/models/taxon" ); @@ -5,61 +6,62 @@ const Taxon = require( "../../lib/models/taxon" ); const { expect } = chai; chai.use( chaiAsPromised ); let t; +const stubTaxon = new Taxon( { + id: 123, + names: [ + { + name: "BestEnglish", + locale: "en", + lexicon: "english", + position: 0 + }, + { + name: "BestInAmerica", + locale: "en", + lexicon: "english", + position: 1, + place_taxon_names: [ + { place_id: 111, position: 0 } + ] + }, + { + name: "BestInCalifornia", + locale: "en", + lexicon: "english", + position: 3, + place_taxon_names: [ + { place_id: 222, position: 0 } + ] + }, + { + name: "SecondBestInCalifornia", + locale: "en", + lexicon: "english", + position: 2, + place_taxon_names: [ + { place_id: 222, position: 1 } + ] + }, + { + name: "BestSpanish", + locale: "es", + lexicon: "spanish", + position: 4 + } + ], + statuses: [ + { place_id: null, iucn: 20 }, + { place_id: 111, iucn: 30 }, + { place_id: 222, iucn: 50 }], + listed_taxa: [ + { place_id: 111, establishment_means: "endemic" }, + { place_id: 444 }, + { place_id: 222, establishment_means: "introduced" }] +} ); describe( "Taxon", ( ) => { - before( ( ) => { - t = new Taxon( { - id: 123, - names: [ - { - name: "BestEnglish", - locale: "en", - lexicon: "english", - position: 0 - }, - { - name: "BestInAmerica", - locale: "en", - lexicon: "english", - position: 1, - place_taxon_names: [ - { place_id: 111, position: 0 } - ] - }, - { - name: "BestInCalifornia", - locale: "en", - lexicon: "english", - position: 3, - place_taxon_names: [ - { place_id: 222, position: 0 } - ] - }, - { - name: "SecondBestInCalifornia", - locale: "en", - lexicon: "english", - position: 2, - place_taxon_names: [ - { place_id: 222, position: 1 } - ] - }, - { - name: "BestSpanish", - locale: "es", - lexicon: "spanish", - position: 4 - } - ], - statuses: [ - { place_id: null, iucn: 20 }, - { place_id: 111, iucn: 30 }, - { place_id: 222, iucn: 50 }], - listed_taxa: [ - { place_id: 111, establishment_means: "endemic" }, - { place_id: 444 }, - { place_id: 222, establishment_means: "introduced" }] - } ); + beforeEach( ( ) => { + t = _.cloneDeep( stubTaxon ); } ); describe( "constructor", ( ) => { @@ -156,9 +158,10 @@ describe( "Taxon", ( ) => { position: 1 }] }; - const preferredCommonNames = t.preferredCommonNames( { userSession } ); - expect( preferredCommonNames[0].name ).to.eq( "BestEnglish" ); - expect( preferredCommonNames[1].name ).to.eq( "BestSpanish" ); + t.prepareForResponse( { userSession } ); + expect( t.preferred_common_name ).to.eq( "BestEnglish · BestSpanish" ); + expect( t.preferred_common_names[0].name ).to.eq( "BestEnglish" ); + expect( t.preferred_common_names[1].name ).to.eq( "BestSpanish" ); } ); it( "does not return anything if the userSession requests no common names", ( ) => { @@ -172,7 +175,9 @@ describe( "Taxon", ( ) => { position: 1 }] }; - expect( t.preferredCommonNames( { userSession } ) ).to.be.null; + t.prepareForResponse( { userSession } ); + expect( t.preferred_common_name ).to.be.undefined; + expect( t.preferred_common_names ).to.be.undefined; } ); it( "returns names in the proper order", ( ) => { @@ -185,9 +190,10 @@ describe( "Taxon", ( ) => { position: 1 }] }; - const preferredCommonNames = t.preferredCommonNames( { userSession } ); - expect( preferredCommonNames[0].name ).to.eq( "BestSpanish" ); - expect( preferredCommonNames[1].name ).to.eq( "BestEnglish" ); + t.prepareForResponse( { userSession } ); + expect( t.preferred_common_name ).to.eq( "BestSpanish · BestEnglish" ); + expect( t.preferred_common_names[0].name ).to.eq( "BestSpanish" ); + expect( t.preferred_common_names[1].name ).to.eq( "BestEnglish" ); } ); it( "returns nothing for unmatched locales", ( ) => { @@ -197,7 +203,9 @@ describe( "Taxon", ( ) => { position: 0 }] }; - expect( t.preferredCommonNames( { userSession } ) ).to.be.empty; + t.prepareForResponse( { userSession } ); + expect( t.preferred_common_name ).to.be.undefined; + expect( t.preferred_common_names ).to.be.empty; } ); it( "uses the locale when preferred name lexicon is null", ( ) => { @@ -207,8 +215,13 @@ describe( "Taxon", ( ) => { position: 0 }] }; - expect( t.preferredCommonNames( { locale: "en", userSession } )[0].name ).to.eq( "BestEnglish" ); - expect( t.preferredCommonNames( { locale: "es", userSession } )[0].name ).to.eq( "BestSpanish" ); + t.prepareForResponse( { locale: "en", userSession } ); + expect( t.preferred_common_name ).to.eq( "BestEnglish" ); + expect( t.preferred_common_names[0].name ).to.eq( "BestEnglish" ); + t = _.cloneDeep( stubTaxon ); + t.prepareForResponse( { locale: "es", userSession } ); + expect( t.preferred_common_name ).to.eq( "BestSpanish" ); + expect( t.preferred_common_names[0].name ).to.eq( "BestSpanish" ); } ); it( "uses returns names in the right order when inferring locale", ( ) => { @@ -222,14 +235,22 @@ describe( "Taxon", ( ) => { }] }; // en - expect( t.preferredCommonNames( { locale: "en", userSession } )[0].name ).to.eq( "BestEnglish" ); - expect( t.preferredCommonNames( { locale: "en", userSession } )[1].name ).to.eq( "BestEnglish" ); + t.prepareForResponse( { locale: "en", userSession } ); + expect( t.preferred_common_name ).to.eq( "BestEnglish" ); + expect( t.preferred_common_names[0].name ).to.eq( "BestEnglish" ); + expect( t.preferred_common_names[1].name ).to.eq( "BestEnglish" ); // es - expect( t.preferredCommonNames( { locale: "es", userSession } )[0].name ).to.eq( "BestEnglish" ); - expect( t.preferredCommonNames( { locale: "es", userSession } )[1].name ).to.eq( "BestSpanish" ); + t = _.cloneDeep( stubTaxon ); + t.prepareForResponse( { locale: "es", userSession } ); + expect( t.preferred_common_name ).to.eq( "BestEnglish · BestSpanish" ); + expect( t.preferred_common_names[0].name ).to.eq( "BestEnglish" ); + expect( t.preferred_common_names[1].name ).to.eq( "BestSpanish" ); // es-mx - expect( t.preferredCommonNames( { locale: "es-mx", userSession } )[0].name ).to.eq( "BestEnglish" ); - expect( t.preferredCommonNames( { locale: "es-mx", userSession } )[1].name ).to.eq( "BestSpanish" ); + t = _.cloneDeep( stubTaxon ); + t.prepareForResponse( { locale: "es-mx", userSession } ); + expect( t.preferred_common_name ).to.eq( "BestEnglish · BestSpanish" ); + expect( t.preferred_common_names[0].name ).to.eq( "BestEnglish" ); + expect( t.preferred_common_names[1].name ).to.eq( "BestSpanish" ); } ); it( "returns the best name given a place", ( ) => { @@ -240,7 +261,9 @@ describe( "Taxon", ( ) => { place_id: 222 }] }; - expect( t.preferredCommonNames( { locale: "en", userSession } )[0].name ).to.eq( "BestInCalifornia" ); + t.prepareForResponse( { locale: "en", userSession } ); + expect( t.preferred_common_name ).to.eq( "BestInCalifornia" ); + expect( t.preferred_common_names[0].name ).to.eq( "BestInCalifornia" ); } ); it( "does not return an exact place match when locale doesn't match", ( ) => { @@ -251,7 +274,9 @@ describe( "Taxon", ( ) => { place_id: 222 }] }; - expect( t.preferredCommonNames( { locale: "de", userSession } ) ).to.be.empty; + t.prepareForResponse( { locale: "de", userSession } ); + expect( t.preferred_common_name ).to.be.undefined; + expect( t.preferred_common_names ).to.be.empty; } ); it( "return the best name from an ancestor place", ( ) => { @@ -263,7 +288,9 @@ describe( "Taxon", ( ) => { ancestor_place_ids: [111, 333] }] }; - expect( t.preferredCommonNames( { locale: "en", userSession } )[0].name ).to.eq( "BestInAmerica" ); + t.prepareForResponse( { locale: "en", userSession } ); + expect( t.preferred_common_name ).to.eq( "BestInAmerica" ); + expect( t.preferred_common_names[0].name ).to.eq( "BestInAmerica" ); } ); } ); From 3f4c40755fd29eb1330e1336ee631d6dfd3ce4ca Mon Sep 17 00:00:00 2001 From: sylvain-morin Date: Mon, 16 Oct 2023 15:24:38 +0200 Subject: [PATCH 08/31] Run specs with docker compose --- Dockerfile | 18 +++++++++++++++++- README.md | 23 +++++++++++++++++++++++ docker-compose.test.yml | 8 ++++---- lib/test_helper.js | 12 ++++++++++++ test/hooks.js | 17 +++++++++++------ 5 files changed, 67 insertions(+), 11 deletions(-) diff --git a/Dockerfile b/Dockerfile index b7472fd7..bba8ffc8 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,6 @@ -FROM node:16 +# Platform should be forced to amd64 +# because node-mapnik is not available in arm64 +FROM --platform=linux/amd64 node:16 as base ENV NODE_ENV=development @@ -10,6 +12,20 @@ COPY config_example.js config.js RUN npm install +FROM base as test + +ENV NODE_ENV=test + +RUN apt-get update -qq && apt-get install -y postgresql-client-11 + +COPY . . + +CMD [ "npm", "run", "coverage" ] + +FROM base as development + +ENV NODE_ENV=development + COPY . . EXPOSE 4000 diff --git a/README.md b/README.md index f455fe77..628938df 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,29 @@ Filter by pattern: `NODE_ENV=test ./node_modules/mocha/bin/_mocha --recursive -- You can also add `.only` to a `describe` or `it` call to only run that test when you run `npm test`, e.g. `it.only( "should only run this test" )`. +# Running Tests with Docker + +You can run the tests with Docker Compose. +All required services will be started by the `docker-compose.test.yml` compose file: + +``` +docker compose -f docker-compose.test.yml up -d +``` + +You can follow the tests execution in the logs: + +``` +docker logs -f api-test +``` + +The first time you run the compose file, a local docker image for the API service will be automatically built, from you local GIT checkout. But if later you do some code changes, or update your GIT checkout, you need to re-build the docker image with: + +``` +docker compose -f docker-compose.test.yml build +``` + +This compose build is using the `test` target of the Dockerfile. + # ESLint Please run ESLint to check for syntax formatting errors. To run ESLint, run: `npm run eslint`. Please address any syntax errors before submitting pull requests. ESLint will also run automatically via Github Actions on submitted pull requests along with tests. diff --git a/docker-compose.test.yml b/docker-compose.test.yml index 8879c6a1..da59823f 100644 --- a/docker-compose.test.yml +++ b/docker-compose.test.yml @@ -45,7 +45,10 @@ services: api-test: container_name: api-test - build: . + build: + context: . + dockerfile: Dockerfile + target: test environment: NODE_ENV: test INAT_DB_HOST: pg @@ -56,11 +59,8 @@ services: INAT_WEB_HOST: host.docker.internal INAT_DB_NAME: inaturalist_test INAT_ES_INDEX_PREFIX: test - DB_ALREADY_INITIALIZED: true ports: - 4000:4000 - command: - /bin/sh -c "npm install ; npm run coverage" extra_hosts: - "host.docker.internal:host-gateway" diff --git a/lib/test_helper.js b/lib/test_helper.js index 6ef27453..7ddd0dbf 100644 --- a/lib/test_helper.js +++ b/lib/test_helper.js @@ -1,3 +1,4 @@ +/* eslint-disable no-console */ const fs = require( "fs" ); const _ = require( "lodash" ); const timersPromises = require( "timers/promises" ); @@ -46,6 +47,15 @@ testHelper.waitForES = async numberOfAttempts => { return testHelper.waitForES( numberOfAttempts ); }; +testHelper.closePGConnection = async ( ) => { + await pgClient.connection.end( ); + delete pgClient.connection; +}; + +testHelper.reconnectPGConnection = async ( ) => { + await pgClient.connect( ); +}; + testHelper.forEachIndex = async action => { if ( process.env.NODE_ENV !== "test" ) { return; } const settings = JSON.parse( fs.readFileSync( "schema/settings.js" ) ); @@ -148,6 +158,8 @@ testHelper.testInatJSNoPreload = async ( controller, endpoint, method, done ) => module.exports = { waitForPG: testHelper.waitForPG, waitForES: testHelper.waitForES, + closePGConnection: testHelper.closePGConnection, + reconnectPGConnection: testHelper.reconnectPGConnection, createIndices: testHelper.createIndices, deleteIndices: testHelper.deleteIndices, loadElasticsearchFixtures: testHelper.loadElasticsearchFixtures, diff --git a/test/hooks.js b/test/hooks.js index 039c6392..840f4cf0 100644 --- a/test/hooks.js +++ b/test/hooks.js @@ -1,3 +1,4 @@ +/* eslint-disable no-console */ const { expect } = require( "chai" ); const { execSync } = require( "child_process" ); const inaturalistjs = require( "inaturalistjs" ); @@ -6,7 +7,7 @@ const testHelper = require( "../lib/test_helper" ); const Taxon = require( "../lib/models/taxon" ); const config = require( "../config" ); -function initializeDb() { +async function initializeDb() { // For tests, we want to make absolutely sure the test database is clean and // new, and we need to make sure that happens before we try to connect to it, // which happens every time we require pg_client, which happens inside of @@ -18,12 +19,18 @@ function initializeDb() { ${config.database.user ? `PGUSER=${config.database.user}` : ""} \ ${config.database.password ? `PGPASSWORD=${config.database.password}` : ""}`; + // Close connection before dropping DB + await testHelper.closePGConnection( ); + console.log( "Dropping existing test database" ); execSync( `${testDbConnectionVar} dropdb --if-exists ${dbname}`, { stdio: [0, 1, 2] } ); console.log( "Creating test database" ); execSync( `${testDbConnectionVar} createdb -O ${config.database.user} ${dbname}`, { stdio: [0, 1, 2] } ); console.log( "Loading test database schema" ); execSync( `${testDbConnectionVar} psql -q -f schema/database.sql -d ${dbname}`, { stdio: [0, 1, 2] } ); + + // Reconnecto to DB + await testHelper.reconnectPGConnection( ); } exports.mochaGlobalSetup = async function () { @@ -31,10 +38,6 @@ exports.mochaGlobalSetup = async function () { console.log( "\n\nINITIALIZING TEST ENVIRONMENT\n\n" ); - if ( !process.env.DB_ALREADY_INITIALIZED ) { - initializeDb( ); - } - // Wait for Postgres console.log( "Waiting for Postgres..." ); await testHelper.waitForPG( 100 ); @@ -43,6 +46,8 @@ exports.mochaGlobalSetup = async function () { console.log( "Waiting for ElasticSearch..." ); await testHelper.waitForES( 100 ); + initializeDb( ); + console.log( "Creating ES indices" ); await testHelper.createIndices( ); console.log( "Loading ES fixtures" ); @@ -57,7 +62,7 @@ exports.mochaGlobalSetup = async function () { exports.mochaHooks = { async beforeAll( ) { - this.timeout( 20000 ); + this.timeout( 60000 ); this.app = await app( ); }, async afterAll( ) { From 64f248633a66c816796f962ec80ba01ec3a6594d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 16 Oct 2023 15:55:24 +0000 Subject: [PATCH 09/31] Bump undici from 5.22.1 to 5.26.3 Bumps [undici](https://github.com/nodejs/undici) from 5.22.1 to 5.26.3. - [Release notes](https://github.com/nodejs/undici/releases) - [Commits](https://github.com/nodejs/undici/compare/v5.22.1...v5.26.3) --- updated-dependencies: - dependency-name: undici dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index df928a5a..84c07400 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3371,6 +3371,14 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.5.tgz", "integrity": "sha512-LMy+vDDcQR48EZdEx5wRX1q/sEl6NdGuHXPnfeL8ixkwCOSZ2qnIyIZmcCbdX0MeRqHhAcHmX+haCbrS8Run+A==" }, + "node_modules/@fastify/busboy": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.0.0.tgz", + "integrity": "sha512-JUFJad5lv7jxj926GPgymrWQxxjPYuJNiNjNMzqT+HiuP6Vl3dk5xzG+8sTX96np0ZAluvaMzPsjhHZ5rNuNQQ==", + "engines": { + "node": ">=14" + } + }, "node_modules/@grpc/grpc-js": { "version": "1.8.16", "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.8.16.tgz", @@ -11826,11 +11834,11 @@ } }, "node_modules/undici": { - "version": "5.22.1", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.22.1.tgz", - "integrity": "sha512-Ji2IJhFXZY0x/0tVBXeQwgPlLWw13GVzpsWPQ3rV50IFMMof2I55PZZxtm4P6iNq+L5znYN9nSTAq0ZyE6lSJw==", + "version": "5.26.3", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.26.3.tgz", + "integrity": "sha512-H7n2zmKEWgOllKkIUkLvFmsJQj062lSm3uA4EYApG8gLuiOM0/go9bIoC3HVaSnfg4xunowDE2i9p8drkXuvDw==", "dependencies": { - "busboy": "^1.6.0" + "@fastify/busboy": "^2.0.0" }, "engines": { "node": ">=14.0" @@ -15001,6 +15009,11 @@ } } }, + "@fastify/busboy": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.0.0.tgz", + "integrity": "sha512-JUFJad5lv7jxj926GPgymrWQxxjPYuJNiNjNMzqT+HiuP6Vl3dk5xzG+8sTX96np0ZAluvaMzPsjhHZ5rNuNQQ==" + }, "@grpc/grpc-js": { "version": "1.8.16", "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.8.16.tgz", @@ -21564,11 +21577,11 @@ } }, "undici": { - "version": "5.22.1", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.22.1.tgz", - "integrity": "sha512-Ji2IJhFXZY0x/0tVBXeQwgPlLWw13GVzpsWPQ3rV50IFMMof2I55PZZxtm4P6iNq+L5znYN9nSTAq0ZyE6lSJw==", + "version": "5.26.3", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.26.3.tgz", + "integrity": "sha512-H7n2zmKEWgOllKkIUkLvFmsJQj062lSm3uA4EYApG8gLuiOM0/go9bIoC3HVaSnfg4xunowDE2i9p8drkXuvDw==", "requires": { - "busboy": "^1.6.0" + "@fastify/busboy": "^2.0.0" } }, "unescape": { From 8a4e0282ae68ac98ce82e42583438f0271498ed1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 17 Oct 2023 14:15:53 +0000 Subject: [PATCH 10/31] Bump @babel/traverse from 7.22.5 to 7.23.2 Bumps [@babel/traverse](https://github.com/babel/babel/tree/HEAD/packages/babel-traverse) from 7.22.5 to 7.23.2. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.23.2/packages/babel-traverse) --- updated-dependencies: - dependency-name: "@babel/traverse" dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 202 +++++++++++++++++++++++----------------------- 1 file changed, 102 insertions(+), 100 deletions(-) diff --git a/package-lock.json b/package-lock.json index 84c07400..0da37d96 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2868,12 +2868,13 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", - "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", "dev": true, "dependencies": { - "@babel/highlight": "^7.22.5" + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" }, "engines": { "node": ">=6.9.0" @@ -2937,12 +2938,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.5.tgz", - "integrity": "sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5", + "@babel/types": "^7.23.0", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -2986,22 +2987,22 @@ "dev": true }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", - "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", - "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dev": true, "dependencies": { - "@babel/template": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" @@ -3063,9 +3064,9 @@ } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.5.tgz", - "integrity": "sha512-thqK5QFghPKWLhAV321lxF95yCg2K3Ob5yw+M3VHWfdia0IkPXUtoLH8x/6Fh486QUvzhb8YOWHChTVen2/PoQ==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, "dependencies": { "@babel/types": "^7.22.5" @@ -3084,9 +3085,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", - "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "dev": true, "engines": { "node": ">=6.9.0" @@ -3116,13 +3117,13 @@ } }, "node_modules/@babel/highlight": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", - "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.22.5", - "chalk": "^2.0.0", + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, "engines": { @@ -3130,9 +3131,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.5.tgz", - "integrity": "sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -3167,33 +3168,33 @@ } }, "node_modules/@babel/template": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", - "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.22.5", - "@babel/parser": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.5.tgz", - "integrity": "sha512-7DuIjPgERaNo6r+PZwItpjCZEa5vyw4eJGufeLxrPdBXBoLcCJCIasvK6pK/9DVNrLZTLFhUGqaC6X/PA007TQ==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", + "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.22.5", - "@babel/generator": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.5", - "@babel/parser": "^7.22.5", - "@babel/types": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.0", + "@babel/types": "^7.23.0", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -3202,13 +3203,13 @@ } }, "node_modules/@babel/types": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz", - "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, "engines": { @@ -14604,12 +14605,13 @@ } }, "@babel/code-frame": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", - "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", "dev": true, "requires": { - "@babel/highlight": "^7.22.5" + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" } }, "@babel/compat-data": { @@ -14653,12 +14655,12 @@ } }, "@babel/generator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.5.tgz", - "integrity": "sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", "dev": true, "requires": { - "@babel/types": "^7.22.5", + "@babel/types": "^7.23.0", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -14695,19 +14697,19 @@ } }, "@babel/helper-environment-visitor": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", - "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", "dev": true }, "@babel/helper-function-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", - "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dev": true, "requires": { - "@babel/template": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" } }, "@babel/helper-hoist-variables": { @@ -14754,9 +14756,9 @@ } }, "@babel/helper-split-export-declaration": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.5.tgz", - "integrity": "sha512-thqK5QFghPKWLhAV321lxF95yCg2K3Ob5yw+M3VHWfdia0IkPXUtoLH8x/6Fh486QUvzhb8YOWHChTVen2/PoQ==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, "requires": { "@babel/types": "^7.22.5" @@ -14769,9 +14771,9 @@ "dev": true }, "@babel/helper-validator-identifier": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", - "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "dev": true }, "@babel/helper-validator-option": { @@ -14792,20 +14794,20 @@ } }, "@babel/highlight": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", - "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.22.5", - "chalk": "^2.0.0", + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.5.tgz", - "integrity": "sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", "dev": true }, "@babel/runtime": { @@ -14828,42 +14830,42 @@ } }, "@babel/template": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", - "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dev": true, "requires": { - "@babel/code-frame": "^7.22.5", - "@babel/parser": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" } }, "@babel/traverse": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.5.tgz", - "integrity": "sha512-7DuIjPgERaNo6r+PZwItpjCZEa5vyw4eJGufeLxrPdBXBoLcCJCIasvK6pK/9DVNrLZTLFhUGqaC6X/PA007TQ==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", + "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", "dev": true, "requires": { - "@babel/code-frame": "^7.22.5", - "@babel/generator": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.5", - "@babel/parser": "^7.22.5", - "@babel/types": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.0", + "@babel/types": "^7.23.0", "debug": "^4.1.0", "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz", - "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", "dev": true, "requires": { "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" } }, From 49499569f750c3cc7369b1caa25d7031d8235531 Mon Sep 17 00:00:00 2001 From: Patrick Leary Date: Thu, 19 Oct 2023 09:53:22 -0400 Subject: [PATCH 11/31] add platform parameter to announcements endpoint --- .../v1/announcements_controller.js | 11 ++++++++- .../schema/request/announcements_search.js | 6 +++++ openapi/schema/response/announcement.js | 1 + schema/database.sql | 3 ++- schema/fixtures.js | 24 +++++++++++++++---- test/integration/v2/announcements.js | 22 +++++++++++++++++ 6 files changed, 61 insertions(+), 6 deletions(-) diff --git a/lib/controllers/v1/announcements_controller.js b/lib/controllers/v1/announcements_controller.js index 8cff39bc..3b229e14 100644 --- a/lib/controllers/v1/announcements_controller.js +++ b/lib/controllers/v1/announcements_controller.js @@ -8,7 +8,7 @@ const Site = require( "../../models/site" ); const AnnouncementsController = class AnnouncementsController { static async search( req ) { let query = squel.select( ) - .field( "announcements.id, body, placement, dismissible, locales, start, \"end\"" ) + .field( "announcements.id, body, placement, dismissible, locales, platforms, start, \"end\"" ) .from( "announcements" ) .where( "NOW() at time zone 'utc' between start and \"end\"" ) .order( "announcements.id" ); @@ -29,6 +29,15 @@ const AnnouncementsController = class AnnouncementsController { query = query.where( placementClause ); } + if ( req.query.platform ) { + // given a platform parameter, return only announcements that include that platform, + // or announcements with no platform specified + query = query.where( "? = ANY( platforms ) OR platforms IS NULL OR platforms = '{}'", req.query.platform ); + } else { + // if there is no platform parameter, return only announcements with no platform specified + query = query.where( "platforms IS NULL OR platforms = '{}'" ); + } + // site_id filter if ( req.userSession ) { // authenticated requests include announcements targeted at the users site, diff --git a/openapi/schema/request/announcements_search.js b/openapi/schema/request/announcements_search.js index c3de620f..b8ce8935 100644 --- a/openapi/schema/request/announcements_search.js +++ b/openapi/schema/request/announcements_search.js @@ -8,6 +8,12 @@ module.exports = Joi.object( ).keys( { "mobile/home", "mobile" ), + platform: Joi.string( ).valid( + "inat-ios", + "inat-android", + "seek", + "inatrn" + ), locale: Joi.string( ), fields: Joi.any( ) } ).unknown( false ); diff --git a/openapi/schema/response/announcement.js b/openapi/schema/response/announcement.js index 8dde9cd1..f9e8f8e4 100644 --- a/openapi/schema/response/announcement.js +++ b/openapi/schema/response/announcement.js @@ -4,6 +4,7 @@ module.exports = Joi.object( ).keys( { id: Joi.number( ).integer( ).required( ), body: Joi.string( ), placement: Joi.string( ), + platforms: Joi.array( ).items( Joi.string( ) ), dismissible: Joi.boolean( ), locales: Joi.array( ).items( Joi.string( ) ), start: Joi.date( ), diff --git a/schema/database.sql b/schema/database.sql index bd2d6bc8..0cd3df9e 100644 --- a/schema/database.sql +++ b/schema/database.sql @@ -322,7 +322,8 @@ CREATE TABLE public.announcements ( updated_at timestamp without time zone, locales text[] DEFAULT '{}'::text[], dismiss_user_ids integer[] DEFAULT '{}'::integer[], - dismissible boolean DEFAULT false + dismissible boolean DEFAULT false, + platforms text[] DEFAULT '{}'::text[] ); diff --git a/schema/fixtures.js b/schema/fixtures.js index f2ef08ec..5a278458 100644 --- a/schema/fixtures.js +++ b/schema/fixtures.js @@ -1851,7 +1851,8 @@ "updated_at": "2023-01-01 00:00:00", "placement": "mobile/home", "locales": "{}", - "dismissible": true + "dismissible": true, + "platforms": "{}" }, { "id": 2, @@ -1862,7 +1863,8 @@ "updated_at": "2023-01-01 00:00:00", "placement": "mobile/home", "locales": "{}", - "dismissible": true + "dismissible": true, + "platforms": "{}" }, { "id": 3, @@ -1873,7 +1875,8 @@ "updated_at": "2023-01-01 00:00:00", "placement": "mobile/home", "locales": "{en-US,fr}", - "dismissible": true + "dismissible": true, + "platforms": "{}" }, { "id": 4, @@ -1884,7 +1887,20 @@ "updated_at": "2023-01-01 00:00:00", "placement": "mobile/home", "locales": "{en}", - "dismissible": true + "dismissible": true, + "platforms": "{}" + }, + { + "id": 5, + "body": "Active announcement for inat-ios and inat-android", + "start": "2023-01-01 00:00:00", + "end": "2100-01-01 00:00:00", + "created_at": "2023-01-01 00:00:00", + "updated_at": "2023-01-01 00:00:00", + "placement": "mobile/home", + "locales": "{}", + "dismissible": true, + "platforms": "{inat-ios,inat-android}" } ], "comments": [ diff --git a/test/integration/v2/announcements.js b/test/integration/v2/announcements.js index 2a23dcd6..2ad4d50d 100644 --- a/test/integration/v2/announcements.js +++ b/test/integration/v2/announcements.js @@ -69,6 +69,28 @@ describe( "Announcements", ( ) => { } ).expect( "Content-Type", /json/ ) .expect( 200, done ); } ); + + it( "returns announcements based on platform", function ( done ) { + const inatiOSAnnouncement = _.find( + fixtures.postgresql.announcements, a => a.platforms.match( /inat-ios/ ) + ); + request( this.app ).get( "/v2/announcements?fields=all&platform=inat-ios" ).expect( res => { + expect( res.body.results ).to.not.be.empty; + expect( _.every( res.body.results, r => ( + r.platforms.includes( "inat-ios" ) || _.isEmpty( r.platforms ) + ) ) ).to.be.true; + expect( _.map( res.body.results, "id" ) ).to.include( inatiOSAnnouncement.id ); + } ).expect( "Content-Type", /json/ ) + .expect( 200, done ); + } ); + + it( "does not return announcements with a platform not matching parameter", function ( done ) { + request( this.app ).get( "/v2/announcements?fields=all&platform=seek" ).expect( res => { + expect( res.body.results ).to.not.be.empty; + expect( _.every( res.body.results, r => _.isEmpty( r.platforms ) ) ).to.be.true; + } ).expect( "Content-Type", /json/ ) + .expect( 200, done ); + } ); } ); describe( "dismiss", ( ) => { From aeb0e7f1cccd280d7a34f989cac4d973e865f055 Mon Sep 17 00:00:00 2001 From: Patrick Leary Date: Fri, 20 Oct 2023 13:21:43 -0400 Subject: [PATCH 12/31] rename announcement platforms to clients; add auto-detection of announcement client using user agent --- .../v1/announcements_controller.js | 17 +++--- lib/util.js | 21 ++++++++ .../schema/request/announcements_search.js | 2 +- openapi/schema/response/announcement.js | 2 +- schema/database.sql | 2 +- schema/fixtures.js | 10 ++-- test/integration/v2/announcements.js | 44 ++++++++++++--- test/util.js | 54 +++++++++++++++++++ 8 files changed, 130 insertions(+), 22 deletions(-) diff --git a/lib/controllers/v1/announcements_controller.js b/lib/controllers/v1/announcements_controller.js index 3b229e14..d5ff5536 100644 --- a/lib/controllers/v1/announcements_controller.js +++ b/lib/controllers/v1/announcements_controller.js @@ -4,11 +4,12 @@ const { announcements } = require( "inaturalistjs" ); const InaturalistAPI = require( "../../inaturalist_api" ); const pgClient = require( "../../pg_client" ); const Site = require( "../../models/site" ); +const util = require( "../../util" ); const AnnouncementsController = class AnnouncementsController { static async search( req ) { let query = squel.select( ) - .field( "announcements.id, body, placement, dismissible, locales, platforms, start, \"end\"" ) + .field( "announcements.id, body, placement, dismissible, locales, clients, start, \"end\"" ) .from( "announcements" ) .where( "NOW() at time zone 'utc' between start and \"end\"" ) .order( "announcements.id" ); @@ -29,13 +30,15 @@ const AnnouncementsController = class AnnouncementsController { query = query.where( placementClause ); } - if ( req.query.platform ) { - // given a platform parameter, return only announcements that include that platform, - // or announcements with no platform specified - query = query.where( "? = ANY( platforms ) OR platforms IS NULL OR platforms = '{}'", req.query.platform ); + const userAgentClient = util.userAgentClient( req ); + if ( req.query.client || userAgentClient ) { + // given a client parameter, return only announcements that include that client, + // or announcements with no client specified + query = query.where( "? = ANY( clients ) OR clients IS NULL OR clients = '{}'", + req.query.client || userAgentClient ); } else { - // if there is no platform parameter, return only announcements with no platform specified - query = query.where( "platforms IS NULL OR platforms = '{}'" ); + // if there is no client parameter, return only announcements with no client specified + query = query.where( "clients IS NULL OR clients = '{}'" ); } // site_id filter diff --git a/lib/util.js b/lib/util.js index c86ba302..87d133c8 100644 --- a/lib/util.js +++ b/lib/util.js @@ -610,6 +610,27 @@ const util = class util { } return arr[Math.floor( length / 2 )]; } + + static userAgentClient( req ) { + const userAgent = req.headers["user-agent"]; + if ( _.isEmpty( userAgent ) ) { + return null; + } + if ( userAgent.match( /iNaturalistReactNative\// ) + || userAgent.match( /iNaturalistRN\// ) ) { + return "inatrn"; + } + if ( userAgent.match( /Seek\// ) ) { + return "seek"; + } + if ( userAgent.match( /iNaturalist\/.*Darwin/ ) ) { + return "inat-ios"; + } + if ( userAgent.match( /iNaturalist\/.*Android/ ) ) { + return "inat-android"; + } + return null; + } }; util.iucnValues = { diff --git a/openapi/schema/request/announcements_search.js b/openapi/schema/request/announcements_search.js index b8ce8935..2838c4a1 100644 --- a/openapi/schema/request/announcements_search.js +++ b/openapi/schema/request/announcements_search.js @@ -8,7 +8,7 @@ module.exports = Joi.object( ).keys( { "mobile/home", "mobile" ), - platform: Joi.string( ).valid( + client: Joi.string( ).valid( "inat-ios", "inat-android", "seek", diff --git a/openapi/schema/response/announcement.js b/openapi/schema/response/announcement.js index f9e8f8e4..3946501e 100644 --- a/openapi/schema/response/announcement.js +++ b/openapi/schema/response/announcement.js @@ -4,7 +4,7 @@ module.exports = Joi.object( ).keys( { id: Joi.number( ).integer( ).required( ), body: Joi.string( ), placement: Joi.string( ), - platforms: Joi.array( ).items( Joi.string( ) ), + clients: Joi.array( ).items( Joi.string( ) ), dismissible: Joi.boolean( ), locales: Joi.array( ).items( Joi.string( ) ), start: Joi.date( ), diff --git a/schema/database.sql b/schema/database.sql index 0cd3df9e..ad6d3233 100644 --- a/schema/database.sql +++ b/schema/database.sql @@ -323,7 +323,7 @@ CREATE TABLE public.announcements ( locales text[] DEFAULT '{}'::text[], dismiss_user_ids integer[] DEFAULT '{}'::integer[], dismissible boolean DEFAULT false, - platforms text[] DEFAULT '{}'::text[] + clients text[] DEFAULT '{}'::text[] ); diff --git a/schema/fixtures.js b/schema/fixtures.js index 5a278458..528b50e0 100644 --- a/schema/fixtures.js +++ b/schema/fixtures.js @@ -1852,7 +1852,7 @@ "placement": "mobile/home", "locales": "{}", "dismissible": true, - "platforms": "{}" + "clients": "{}" }, { "id": 2, @@ -1864,7 +1864,7 @@ "placement": "mobile/home", "locales": "{}", "dismissible": true, - "platforms": "{}" + "clients": "{}" }, { "id": 3, @@ -1876,7 +1876,7 @@ "placement": "mobile/home", "locales": "{en-US,fr}", "dismissible": true, - "platforms": "{}" + "clients": "{}" }, { "id": 4, @@ -1888,7 +1888,7 @@ "placement": "mobile/home", "locales": "{en}", "dismissible": true, - "platforms": "{}" + "clients": "{}" }, { "id": 5, @@ -1900,7 +1900,7 @@ "placement": "mobile/home", "locales": "{}", "dismissible": true, - "platforms": "{inat-ios,inat-android}" + "clients": "{inat-ios,inat-android}" } ], "comments": [ diff --git a/test/integration/v2/announcements.js b/test/integration/v2/announcements.js index 2ad4d50d..2a63342f 100644 --- a/test/integration/v2/announcements.js +++ b/test/integration/v2/announcements.js @@ -70,27 +70,57 @@ describe( "Announcements", ( ) => { .expect( 200, done ); } ); - it( "returns announcements based on platform", function ( done ) { + it( "returns announcements based on client", function ( done ) { const inatiOSAnnouncement = _.find( - fixtures.postgresql.announcements, a => a.platforms.match( /inat-ios/ ) + fixtures.postgresql.announcements, a => a.clients.match( /inat-ios/ ) ); - request( this.app ).get( "/v2/announcements?fields=all&platform=inat-ios" ).expect( res => { + request( this.app ).get( "/v2/announcements?fields=all&client=inat-ios" ).expect( res => { expect( res.body.results ).to.not.be.empty; expect( _.every( res.body.results, r => ( - r.platforms.includes( "inat-ios" ) || _.isEmpty( r.platforms ) + r.clients.includes( "inat-ios" ) || _.isEmpty( r.clients ) ) ) ).to.be.true; expect( _.map( res.body.results, "id" ) ).to.include( inatiOSAnnouncement.id ); } ).expect( "Content-Type", /json/ ) .expect( 200, done ); } ); - it( "does not return announcements with a platform not matching parameter", function ( done ) { - request( this.app ).get( "/v2/announcements?fields=all&platform=seek" ).expect( res => { + it( "returns announcements based on user agent", function ( done ) { + const inatiOSAnnouncement = _.find( + fixtures.postgresql.announcements, a => a.clients.match( /inat-ios/ ) + ); + request( this.app ) + .get( "/v2/announcements?fields=all" ) + .set( "User-Agent", "iNaturalist/708 CFNetwork/1410.0.3 Darwin/22.6.0" ) + .expect( res => { + expect( res.body.results ).to.not.be.empty; + expect( _.every( res.body.results, r => ( + r.clients.includes( "inat-ios" ) || _.isEmpty( r.clients ) + ) ) ).to.be.true; + expect( _.map( res.body.results, "id" ) ).to.include( inatiOSAnnouncement.id ); + } ) + .expect( "Content-Type", /json/ ) + .expect( 200, done ); + } ); + + it( "does not return announcements with a client not matching parameter", function ( done ) { + request( this.app ).get( "/v2/announcements?fields=all&client=seek" ).expect( res => { expect( res.body.results ).to.not.be.empty; - expect( _.every( res.body.results, r => _.isEmpty( r.platforms ) ) ).to.be.true; + expect( _.every( res.body.results, r => _.isEmpty( r.clients ) ) ).to.be.true; } ).expect( "Content-Type", /json/ ) .expect( 200, done ); } ); + + it( "does not return announcements with a client not matching parameter", function ( done ) { + request( this.app ) + .get( "/v2/announcements?fields=all" ) + .set( "User-Agent", "Seek/2.15.3 Handset (Build 316) Android/13" ) + .expect( res => { + expect( res.body.results ).to.not.be.empty; + expect( _.every( res.body.results, r => _.isEmpty( r.clients ) ) ).to.be.true; + } ) + .expect( "Content-Type", /json/ ) + .expect( 200, done ); + } ); } ); describe( "dismiss", ( ) => { diff --git a/test/util.js b/test/util.js index c3345c4a..a5b9bca1 100644 --- a/test/util.js +++ b/test/util.js @@ -101,4 +101,58 @@ describe( "util", ( ) => { expect( opts.locale ).to.eq( "he-il" ); // not sure why it's lowercase... } ); } ); + + describe( "userAgentClient", ( ) => { + it( "returns nil when request user agent is empty", ( ) => { + expect( util.userAgentClient( { headers: { } } ) ).to.be.null; + expect( util.userAgentClient( { headers: { "user-agent": null } } ) ).to.be.null; + expect( util.userAgentClient( { headers: { "user-agent": "" } } ) ).to.be.null; + } ); + + it( "returns nil when request user agent is unrecognized", ( ) => { + expect( util.userAgentClient( { headers: { "user-agent": "nonsense" } } ) ).to.be.null; + } ); + + it( "recognizes inatrn client user agents", ( ) => { + expect( util.userAgentClient( { + headers: { + "user-agent": "iNaturalistReactNative/60 CFNetwork/1474 Darwin/23.0.0" + } + } ) ).to.eq( "inatrn" ); + expect( util.userAgentClient( { + headers: { + "user-agent": "iNaturalistRN/0.14.0 Handset (Build 60) iOS/17.0.3" + } + } ) ).to.eq( "inatrn" ); + } ); + + it( "recognizes seek client user agents", ( ) => { + expect( util.userAgentClient( { + headers: { + "user-agent": "Seek/2.15.3 Handset (Build 316) iOS/17.0.3" + } + } ) ).to.eq( "seek" ); + expect( util.userAgentClient( { + headers: { + "user-agent": "Seek/2.15.3 Handset (Build 316) Android/13" + } + } ) ).to.eq( "seek" ); + } ); + + it( "recognizes inat-ios client user agents", ( ) => { + expect( util.userAgentClient( { + headers: { + "user-agent": "iNaturalist/708 CFNetwork/1410.0.3 Darwin/22.6.0" + } + } ) ).to.eq( "inat-ios" ); + } ); + + it( "recognizes inat-android client user agents", ( ) => { + expect( util.userAgentClient( { + headers: { + "user-agent": "iNaturalist/1.29.18 (Build 592; Android 5.10.157-android13-4-00001-g5c7ff5dc7aac-ab10381520 10754064; SDK 34; bluejay Pixel 6a bluejay; OS Version 14)" + } + } ) ).to.eq( "inat-android" ); + } ); + } ); } ); From 181eb83d86f6083e2131497dd8726132677033a4 Mon Sep 17 00:00:00 2001 From: Patrick Leary Date: Fri, 27 Oct 2023 10:19:23 -0400 Subject: [PATCH 13/31] add without_field obs search parameter #410; add outlink_source parameter --- lib/models/observation_query_builder.js | 21 ++++++++++++++++++- openapi/schema/request/observations_search.js | 2 ++ .../controllers/v1/observations_controller.js | 11 +++++++++- test/integration/v2/announcements.js | 2 +- test/util.js | 8 +++++++ 5 files changed, 41 insertions(+), 3 deletions(-) diff --git a/lib/models/observation_query_builder.js b/lib/models/observation_query_builder.js index b7a21a80..9b739041 100644 --- a/lib/models/observation_query_builder.js +++ b/lib/models/observation_query_builder.js @@ -366,7 +366,8 @@ ObservationQueryBuilder.reqToElasticQueryComponents = async req => { { http_param: "license", es_field: "license_code" }, { http_param: "photo_license", es_field: ["photos.license_code", "photo_licenses"] }, { http_param: "sound_license", es_field: ["sounds.license_code", "sound_licenses"] }, - { http_param: "oauth_application_id", es_field: "oauth_application_id.keyword" } + { http_param: "oauth_application_id", es_field: "oauth_application_id.keyword" }, + { http_param: "outlink_source", es_field: "outlinks.source" } ], filter => { if ( params[filter.http_param] && params[filter.http_param] !== "any" ) { if ( _.isArray( filter.es_field ) ) { @@ -1021,6 +1022,24 @@ ObservationQueryBuilder.reqToElasticQueryComponents = async req => { } ); } + if ( params.without_field ) { + const fields = util.paramArray( params.without_field ); + inverseFilters.push( { + nested: { + path: "ofvs", + query: { + bool: { + filter: [{ + terms: { + "ofvs.name": fields + } + }] + } + } + } + } ); + } + // conservation status let values; if ( params.cs ) { diff --git a/openapi/schema/request/observations_search.js b/openapi/schema/request/observations_search.js index efcfbde7..7024b2c1 100644 --- a/openapi/schema/request/observations_search.js +++ b/openapi/schema/request/observations_search.js @@ -273,6 +273,8 @@ module.exports = Joi.object( ).keys( { "needs_id", "research" ) ), + without_field: Joi.string( ), + outlink_source: Joi.string( ), updated_since: Joi.string( ), viewer_id: Joi.number( ).integer( ), reviewed: Joi.boolean( ), diff --git a/test/controllers/v1/observations_controller.js b/test/controllers/v1/observations_controller.js index a494372d..0168f47b 100644 --- a/test/controllers/v1/observations_controller.js +++ b/test/controllers/v1/observations_controller.js @@ -249,7 +249,9 @@ describe( "ObservationsController", ( ) => { { http_param: "site_id", es_field: "site_id.keyword" }, { http_param: "license", es_field: "license_code" }, { http_param: "photo_license", es_field: ["photos.license_code", "photo_licenses"] }, - { http_param: "sound_license", es_field: ["sounds.license_code", "sound_licenses"] } + { http_param: "sound_license", es_field: ["sounds.license_code", "sound_licenses"] }, + { http_param: "oauth_application_id", es_field: "oauth_application_id.keyword" }, + { http_param: "outlink_source", es_field: "outlinks.source" } ], f => asyncTest( f ) ) ); } ); @@ -607,6 +609,13 @@ describe( "ObservationsController", ( ) => { expect( q.filters[0].nested.query.bool.filter[1].match["ofvs.value_ci"] ).to.eql( "marine" ); } ); + it( "filters by missing observation field", async ( ) => { + const q = await Q( { without_field: "habitat" } ); + expect( q.inverse_filters[0].nested.query.bool.filter.length ).to.eql( 1 ); + expect( q.inverse_filters[0].nested.query.bool.filter[0].terms["ofvs.name"] ) + .to.deep.eql( ["habitat"] ); + } ); + it( "filters by conservation status", async ( ) => { const q = await Q( { cs: "endangered" } ); expect( q.filters[0].nested.query.bool.must_not[0].exists.field ) diff --git a/test/integration/v2/announcements.js b/test/integration/v2/announcements.js index 2a63342f..f56c7ca0 100644 --- a/test/integration/v2/announcements.js +++ b/test/integration/v2/announcements.js @@ -110,7 +110,7 @@ describe( "Announcements", ( ) => { .expect( 200, done ); } ); - it( "does not return announcements with a client not matching parameter", function ( done ) { + it( "does not return announcements with a client not matching user agent", function ( done ) { request( this.app ) .get( "/v2/announcements?fields=all" ) .set( "User-Agent", "Seek/2.15.3 Handset (Build 316) Android/13" ) diff --git a/test/util.js b/test/util.js index a5b9bca1..5741e4c8 100644 --- a/test/util.js +++ b/test/util.js @@ -154,5 +154,13 @@ describe( "util", ( ) => { } } ) ).to.eq( "inat-android" ); } ); + + it( "returns nil for unrecognized user agents", ( ) => { + expect( util.userAgentClient( { + headers: { + "user-agent": "nonsense" + } + } ) ).to.be.null; + } ); } ); } ); From ad5112cf4ca300763775607e6188ba8e27c72023 Mon Sep 17 00:00:00 2001 From: Patrick Leary Date: Wed, 1 Nov 2023 10:36:13 -0400 Subject: [PATCH 14/31] when no names match taxonNamePriorities, do not fallback to request locale --- lib/models/taxon.js | 16 ++++++++++++---- test/models/taxon.js | 14 +++++++++++++- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/lib/models/taxon.js b/lib/models/taxon.js index 4bc43dd8..c0a3bb12 100644 --- a/lib/models/taxon.js +++ b/lib/models/taxon.js @@ -184,14 +184,22 @@ const Taxon = class Taxon extends Model { prepareForResponse( localeOptions = { }, opts = { } ) { const localeOpts = { ...localeOptions }; const options = { ...opts }; + const userPreferredCommonNames = this.preferredCommonNames( localeOpts ); // default to undefined which will not include these attributes in the response, // rather than including them with a value of `null` which was causing the Android // app to erronously present the common name as the string "null" - this.preferred_common_names = _.defaultTo( this.preferredCommonNames( localeOpts ), undefined ); - if ( !_.isEmpty( this.preferred_common_names ) ) { - this.preferred_common_name = _.join( _.uniq( _.map( this.preferred_common_names, "name" ) ), " · " ); - } else { + this.preferred_common_names = _.defaultTo( userPreferredCommonNames, undefined ); + if ( _.isNull( userPreferredCommonNames ) ) { + // userPreferredCommonNames is null, so taxonNamePriorities weren't used. Lookup + // preferred_common_name based on requested locale and preferredPlace this.preferred_common_name = _.defaultTo( this.preferredCommonName( localeOpts ), undefined ); + } else if ( _.isEmpty( userPreferredCommonNames ) ) { + // userPreferredCommonNames is empty, so taxonNamePriorities were used but + // there weren't any matching names. Set preferred_common_name to undefined + this.preferred_common_name = undefined; + } else { + // userPreferredCommonNames is not empty, so concatenate its values for preferred_common_names + this.preferred_common_name = _.join( _.uniq( _.map( this.preferred_common_names, "name" ) ), " · " ); } if ( this.default_photo ) { this.default_photo.url = util.fixHttps( this.default_photo.url ); diff --git a/test/models/taxon.js b/test/models/taxon.js index 80d31d1c..0096b345 100644 --- a/test/models/taxon.js +++ b/test/models/taxon.js @@ -224,7 +224,7 @@ describe( "Taxon", ( ) => { expect( t.preferred_common_names[0].name ).to.eq( "BestSpanish" ); } ); - it( "uses returns names in the right order when inferring locale", ( ) => { + it( "returns names in the right order when inferring locale", ( ) => { const userSession = { taxonNamePriorities: [{ lexicon: "english", @@ -292,6 +292,18 @@ describe( "Taxon", ( ) => { expect( t.preferred_common_name ).to.eq( "BestInAmerica" ); expect( t.preferred_common_names[0].name ).to.eq( "BestInAmerica" ); } ); + + it( "does not fall back to returning a common name in the user locale when there are taxonNamePriorities", ( ) => { + const userSession = { + taxonNamePriorities: [{ + lexicon: "nonsense", + position: 0 + }] + }; + t.prepareForResponse( { locale: "en", userSession } ); + expect( t.preferred_common_name ).to.be.undefined; + expect( t.preferred_common_names ).to.be.empty; + } ); } ); describe( "conservationStatus", ( ) => { From 3edfb9bf785ba0abbdb463a95231c9096c6f6615 Mon Sep 17 00:00:00 2001 From: Ken-ichi Ueda Date: Thu, 2 Nov 2023 10:54:59 -0400 Subject: [PATCH 15/31] Added instructions about new required NODE_ENV var --- README.md | 5 +++-- config_example.js | 3 +++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 628938df..59dddd10 100644 --- a/README.md +++ b/README.md @@ -12,8 +12,9 @@ Our API is documented using the [Swagger](http://swagger.io/)/[OpenAPI](https:// npm install # Fill in vals to connect to Rails, Postgres, and elasticsearch cp config_example.js config.js -# Run the node app on port 4000 -node app.js +# Run the node app on port 4000. NODE_ENV is required, so you'll need to set +# it here or elsewhere in your environment +NODE_ENV=development node app.js ``` # Running Tests diff --git a/config_example.js b/config_example.js index caa620b6..7da64c1d 100644 --- a/config_example.js +++ b/config_example.js @@ -18,6 +18,9 @@ module.exports = { host: INAT_ES_HOST ? `http://${INAT_ES_HOST}:9200` : "http://localhost:9200", geoPointField: "location" }, + // Note that the database name will be inferred from the NODE_ENV + // environment variable, e.g. `inaturalist_${process.env.NODE_ENV}`, or it + // be set explicitly with process.env.INAT_DB_NAME database: { user: INAT_DB_USER || "inaturalist", host: INAT_DB_HOST || "127.0.0.1", From 444364f8415697cd4d75a6863ecd9a3d01b24778 Mon Sep 17 00:00:00 2001 From: Ken-ichi Date: Fri, 3 Nov 2023 15:19:47 -0400 Subject: [PATCH 16/31] Add iconic_taxon_name to observations.taxonomy response (#414) Include iconic_taxon_name in observations.taxonomy response --- lib/models/taxon.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/models/taxon.js b/lib/models/taxon.js index c0a3bb12..dd19642d 100644 --- a/lib/models/taxon.js +++ b/lib/models/taxon.js @@ -540,9 +540,10 @@ const Taxon = class Taxon extends Model { const taxonIDs = _.map( taxa, "id" ); if ( _.isEmpty( taxonIDs ) ) { return; } const query = squel.select( ) - .field( "id, name, rank, rank_level, ancestry, is_active" ) + .field( "taxa.id, taxa.name, taxa.rank, taxa.rank_level, taxa.ancestry, taxa.is_active, iconic_taxa.name AS iconic_taxon_name" ) .from( "taxa" ) - .where( "id IN ?", util.paramArray( taxonIDs ) ); + .join( "taxa iconic_taxa", null, "taxa.iconic_taxon_id = iconic_taxa.id" ) + .where( "taxa.id IN ?", util.paramArray( taxonIDs ) ); const result = await pgClient.query( query.toString( ) ); const taxonDetails = { }; _.each( result.rows, row => { From 0da39177af94e70b13be73badfbb2c7b49a3a67d Mon Sep 17 00:00:00 2001 From: Patrick Leary Date: Fri, 3 Nov 2023 16:58:09 -0400 Subject: [PATCH 17/31] increase shard_size for some observers requests; fix bug with some observation endpoints when id is the only param #407; add rank_level to taxa fetch #367 --- lib/controllers/v1/observations_controller.js | 9 +++++---- lib/controllers/v1/taxa_controller.js | 3 +++ lib/views/swagger_v1.yml.ejs | 1 + openapi/paths/v2/taxa/{id}.js | 1 + openapi/schema/request/taxa_search.js | 2 +- test/integration/v1/observations.js | 7 +++++++ 6 files changed, 18 insertions(+), 5 deletions(-) diff --git a/lib/controllers/v1/observations_controller.js b/lib/controllers/v1/observations_controller.js index 3747d877..62af3101 100644 --- a/lib/controllers/v1/observations_controller.js +++ b/lib/controllers/v1/observations_controller.js @@ -235,6 +235,7 @@ ObservationsController.elasticResults = async function observationElasticResults && ( _.isEmpty( query.inverse_filters ) || excludingOnlyUserIDs ) && _.isEmpty( query.grouped_inverse_filters ) && _.isEqual( query.sort, { created_at: "desc" } ) + && _.isEmpty( req.query.aggs ) ) { const sourceParams = util.sourceParams( returnOnlyID ? ["id"] : { includes: opts.includes, @@ -1238,8 +1239,8 @@ ObservationsController.observationsObserverCounts = async req => { }; // attempting to account for inaccurate counts for queries with a small size // see https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-terms-aggregation.html#search-aggregations-bucket-terms-aggregation-shard-size - if ( ( ( aggSize * 1.5 ) + 10 ) < 200 ) { - countQuery.aggs.top_observers.terms.shard_size = 200; + if ( ( ( aggSize * 1.5 ) + 10 ) < 500 ) { + countQuery.aggs.top_observers.terms.shard_size = 500; } } countQuery.per_page = 0; @@ -1289,8 +1290,8 @@ ObservationsController.observationsSpeciesObserverCounts = async req => { }; // attempting to account for inaccurate counts for queries with a small size // see https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-terms-aggregation.html#search-aggregations-bucket-terms-aggregation-shard-size - if ( ( ( aggSize * 1.5 ) + 10 ) < 200 ) { - countQuery.aggs.user_taxa.terms.shard_size = 200; + if ( ( ( aggSize * 1.5 ) + 10 ) < 500 ) { + countQuery.aggs.user_taxa.terms.shard_size = 500; } if ( aggSize > 0 ) { countQuery.aggs.user_taxa.aggs = { diff --git a/lib/controllers/v1/taxa_controller.js b/lib/controllers/v1/taxa_controller.js index 9d4bd11f..e6b6255e 100644 --- a/lib/controllers/v1/taxa_controller.js +++ b/lib/controllers/v1/taxa_controller.js @@ -20,6 +20,9 @@ TaxaController.show = async req => { throw util.httpError( 422, "Too many IDs" ); } const filters = [{ terms: { id: ids } }]; + if ( req.query.rank_level ) { + filters.push( esClient.termFilter( "rank_level", req.query.rank_level ) ); + } return TaxaController.searchQuery( req, { filters, details: true, diff --git a/lib/views/swagger_v1.yml.ejs b/lib/views/swagger_v1.yml.ejs index 93efd08e..982a68b6 100644 --- a/lib/views/swagger_v1.yml.ejs +++ b/lib/views/swagger_v1.yml.ejs @@ -1691,6 +1691,7 @@ paths: corresponding taxa. A maximum of 30 results will be returned parameters: - $ref: "#/parameters/path_multi_id" + - $ref: "#/parameters/rank_level" tags: - Taxa responses: diff --git a/openapi/paths/v2/taxa/{id}.js b/openapi/paths/v2/taxa/{id}.js index 1dc7a184..81c267e4 100644 --- a/openapi/paths/v2/taxa/{id}.js +++ b/openapi/paths/v2/taxa/{id}.js @@ -22,6 +22,7 @@ module.exports = sendWrapper => { .meta( { in: "path" } ) .required( ) ), + transform( Joi.array( ).items( Joi.number( ) ).label( "rank_level" ).meta( { in: "query" } ) ), transform( Joi.string( ).label( "fields" ).meta( { in: "query" } ) ), transform( Joi.string( ).label( "X-HTTP-Method-Override" ).meta( { in: "header" } ) ) ], diff --git a/openapi/schema/request/taxa_search.js b/openapi/schema/request/taxa_search.js index 3e81c773..edbd1340 100644 --- a/openapi/schema/request/taxa_search.js +++ b/openapi/schema/request/taxa_search.js @@ -32,7 +32,7 @@ module.exports = Joi.object( ).keys( { "variety", "form" ) ), - rank_level: Joi.number( ), + rank_level: Joi.array( ).items( Joi.number( ) ), id_above: Joi.number( ).integer( ), id_below: Joi.number( ).integer( ), per_page: Joi.number( ).integer( ), diff --git a/test/integration/v1/observations.js b/test/integration/v1/observations.js index bff8fd7c..9a54da9e 100644 --- a/test/integration/v1/observations.js +++ b/test/integration/v1/observations.js @@ -1329,6 +1329,13 @@ describe( "Observations", ( ) => { } ).expect( "Content-Type", /json/ ) .expect( 200, done ); } ); + + it( "can filter on id alone", function ( done ) { + request( this.app ).get( "/v1/observations/observers?id=1" ).expect( res => { + expect( res.body.total_results ).to.eq( 1 ); + } ).expect( "Content-Type", /json/ ) + .expect( 200, done ); + } ); } ); describe( "species_counts", ( ) => { From 8657ccb58de29ace787254c969ac231543fac9b3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 10 Nov 2023 17:04:57 +0000 Subject: [PATCH 18/31] Bump axios and newrelic Bumps [axios](https://github.com/axios/axios) to 1.6.0 and updates ancestor dependency [newrelic](https://github.com/newrelic/node-newrelic). These dependencies need to be updated together. Updates `axios` from 0.21.4 to 1.6.0 - [Release notes](https://github.com/axios/axios/releases) - [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md) - [Commits](https://github.com/axios/axios/compare/v0.21.4...v1.6.0) Updates `newrelic` from 10.6.1 to 11.5.0 - [Release notes](https://github.com/newrelic/node-newrelic/releases) - [Changelog](https://github.com/newrelic/node-newrelic/blob/main/changelog.json) - [Commits](https://github.com/newrelic/node-newrelic/compare/v10.6.1...v11.5.0) --- updated-dependencies: - dependency-name: axios dependency-type: indirect - dependency-name: newrelic dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- package-lock.json | 3004 ++++++++++++++++++++++++--------------------- package.json | 2 +- 2 files changed, 1630 insertions(+), 1376 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0da37d96..652e9df9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -46,7 +46,7 @@ "moment": "^2.29.1", "moment-timezone": "^0.5.34", "multer": "1.4.5-lts.1", - "newrelic": "^10.3.1", + "newrelic": "^11.5.0", "node-fetch": "^2.6.7", "node.extend": "^2.0.2", "openapi-request-coercer": "^12.0.1", @@ -250,50 +250,53 @@ } }, "node_modules/@aws-sdk/client-lambda": { - "version": "3.379.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-lambda/-/client-lambda-3.379.1.tgz", - "integrity": "sha512-hQCVmcEglNGvEQjTNvut+NDL0orp97GaVOg4h+ZHIjsdNds0jFqWsoItSzfUeSy66YiMNoPwTWfjTc8jZQr5xg==", + "version": "3.448.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-lambda/-/client-lambda-3.448.0.tgz", + "integrity": "sha512-Px2DwJF65vsi7NwHZBZa3rzxRvOX5x5XYZx9P3NoYAevwH5htyiTG8TpndgmBi2PdeCOpb5lKuqorne5+WuwXg==", "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.379.1", - "@aws-sdk/credential-provider-node": "3.379.1", - "@aws-sdk/middleware-host-header": "3.379.1", - "@aws-sdk/middleware-logger": "3.378.0", - "@aws-sdk/middleware-recursion-detection": "3.378.0", - "@aws-sdk/middleware-signing": "3.379.1", - "@aws-sdk/middleware-user-agent": "3.379.1", - "@aws-sdk/types": "3.378.0", - "@aws-sdk/util-endpoints": "3.378.0", - "@aws-sdk/util-user-agent-browser": "3.378.0", - "@aws-sdk/util-user-agent-node": "3.378.0", - "@smithy/config-resolver": "^2.0.1", - "@smithy/eventstream-serde-browser": "^2.0.1", - "@smithy/eventstream-serde-config-resolver": "^2.0.1", - "@smithy/eventstream-serde-node": "^2.0.1", - "@smithy/fetch-http-handler": "^2.0.1", - "@smithy/hash-node": "^2.0.1", - "@smithy/invalid-dependency": "^2.0.1", - "@smithy/middleware-content-length": "^2.0.1", - "@smithy/middleware-endpoint": "^2.0.1", - "@smithy/middleware-retry": "^2.0.1", - "@smithy/middleware-serde": "^2.0.1", - "@smithy/middleware-stack": "^2.0.0", - "@smithy/node-config-provider": "^2.0.1", - "@smithy/node-http-handler": "^2.0.1", - "@smithy/protocol-http": "^2.0.1", - "@smithy/smithy-client": "^2.0.1", - "@smithy/types": "^2.0.2", - "@smithy/url-parser": "^2.0.1", + "@aws-sdk/client-sts": "3.445.0", + "@aws-sdk/core": "3.445.0", + "@aws-sdk/credential-provider-node": "3.445.0", + "@aws-sdk/middleware-host-header": "3.433.0", + "@aws-sdk/middleware-logger": "3.433.0", + "@aws-sdk/middleware-recursion-detection": "3.433.0", + "@aws-sdk/middleware-signing": "3.433.0", + "@aws-sdk/middleware-user-agent": "3.438.0", + "@aws-sdk/region-config-resolver": "3.433.0", + "@aws-sdk/types": "3.433.0", + "@aws-sdk/util-endpoints": "3.438.0", + "@aws-sdk/util-user-agent-browser": "3.433.0", + "@aws-sdk/util-user-agent-node": "3.437.0", + "@smithy/config-resolver": "^2.0.16", + "@smithy/eventstream-serde-browser": "^2.0.12", + "@smithy/eventstream-serde-config-resolver": "^2.0.12", + "@smithy/eventstream-serde-node": "^2.0.12", + "@smithy/fetch-http-handler": "^2.2.4", + "@smithy/hash-node": "^2.0.12", + "@smithy/invalid-dependency": "^2.0.12", + "@smithy/middleware-content-length": "^2.0.14", + "@smithy/middleware-endpoint": "^2.1.3", + "@smithy/middleware-retry": "^2.0.18", + "@smithy/middleware-serde": "^2.0.12", + "@smithy/middleware-stack": "^2.0.6", + "@smithy/node-config-provider": "^2.1.3", + "@smithy/node-http-handler": "^2.1.8", + "@smithy/protocol-http": "^3.0.8", + "@smithy/smithy-client": "^2.1.12", + "@smithy/types": "^2.4.0", + "@smithy/url-parser": "^2.0.12", "@smithy/util-base64": "^2.0.0", "@smithy/util-body-length-browser": "^2.0.0", - "@smithy/util-body-length-node": "^2.0.0", - "@smithy/util-defaults-mode-browser": "^2.0.1", - "@smithy/util-defaults-mode-node": "^2.0.1", - "@smithy/util-retry": "^2.0.0", - "@smithy/util-stream": "^2.0.1", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.16", + "@smithy/util-defaults-mode-node": "^2.0.21", + "@smithy/util-endpoints": "^1.0.2", + "@smithy/util-retry": "^2.0.5", + "@smithy/util-stream": "^2.0.17", "@smithy/util-utf8": "^2.0.0", - "@smithy/util-waiter": "^2.0.1", + "@smithy/util-waiter": "^2.0.12", "tslib": "^2.5.0" }, "engines": { @@ -301,84 +304,44 @@ } }, "node_modules/@aws-sdk/client-lambda/node_modules/@aws-sdk/client-sso": { - "version": "3.379.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.379.1.tgz", - "integrity": "sha512-2N16TPnRcq+seNP8VY/Zq7kfnrUOrJMbVNpyDZWGe5Qglua3n8v/FzxmXFNI87MiSODq8IHtiXhggWhefCd+TA==", + "version": "3.445.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.445.0.tgz", + "integrity": "sha512-me4LvqNnu6kxi+sW7t0AgMv1Yi64ikas0x2+5jv23o6Csg32w0S0xOjCTKQYahOA5CMFunWvlkFIfxbqs+Uo7w==", "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/middleware-host-header": "3.379.1", - "@aws-sdk/middleware-logger": "3.378.0", - "@aws-sdk/middleware-recursion-detection": "3.378.0", - "@aws-sdk/middleware-user-agent": "3.379.1", - "@aws-sdk/types": "3.378.0", - "@aws-sdk/util-endpoints": "3.378.0", - "@aws-sdk/util-user-agent-browser": "3.378.0", - "@aws-sdk/util-user-agent-node": "3.378.0", - "@smithy/config-resolver": "^2.0.1", - "@smithy/fetch-http-handler": "^2.0.1", - "@smithy/hash-node": "^2.0.1", - "@smithy/invalid-dependency": "^2.0.1", - "@smithy/middleware-content-length": "^2.0.1", - "@smithy/middleware-endpoint": "^2.0.1", - "@smithy/middleware-retry": "^2.0.1", - "@smithy/middleware-serde": "^2.0.1", - "@smithy/middleware-stack": "^2.0.0", - "@smithy/node-config-provider": "^2.0.1", - "@smithy/node-http-handler": "^2.0.1", - "@smithy/protocol-http": "^2.0.1", - "@smithy/smithy-client": "^2.0.1", - "@smithy/types": "^2.0.2", - "@smithy/url-parser": "^2.0.1", + "@aws-sdk/core": "3.445.0", + "@aws-sdk/middleware-host-header": "3.433.0", + "@aws-sdk/middleware-logger": "3.433.0", + "@aws-sdk/middleware-recursion-detection": "3.433.0", + "@aws-sdk/middleware-user-agent": "3.438.0", + "@aws-sdk/region-config-resolver": "3.433.0", + "@aws-sdk/types": "3.433.0", + "@aws-sdk/util-endpoints": "3.438.0", + "@aws-sdk/util-user-agent-browser": "3.433.0", + "@aws-sdk/util-user-agent-node": "3.437.0", + "@smithy/config-resolver": "^2.0.16", + "@smithy/fetch-http-handler": "^2.2.4", + "@smithy/hash-node": "^2.0.12", + "@smithy/invalid-dependency": "^2.0.12", + "@smithy/middleware-content-length": "^2.0.14", + "@smithy/middleware-endpoint": "^2.1.3", + "@smithy/middleware-retry": "^2.0.18", + "@smithy/middleware-serde": "^2.0.12", + "@smithy/middleware-stack": "^2.0.6", + "@smithy/node-config-provider": "^2.1.3", + "@smithy/node-http-handler": "^2.1.8", + "@smithy/protocol-http": "^3.0.8", + "@smithy/smithy-client": "^2.1.12", + "@smithy/types": "^2.4.0", + "@smithy/url-parser": "^2.0.12", "@smithy/util-base64": "^2.0.0", "@smithy/util-body-length-browser": "^2.0.0", - "@smithy/util-body-length-node": "^2.0.0", - "@smithy/util-defaults-mode-browser": "^2.0.1", - "@smithy/util-defaults-mode-node": "^2.0.1", - "@smithy/util-retry": "^2.0.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/client-lambda/node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.379.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.379.1.tgz", - "integrity": "sha512-B6hZ2ysPyvafCMf6gls1jHI/IUviVZ4+TURpNfUBqThg/hZ1IMxc4BLkXca6VlgzYR+bWU8GKiClS9fFH6mu0g==", - "dependencies": { - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/middleware-host-header": "3.379.1", - "@aws-sdk/middleware-logger": "3.378.0", - "@aws-sdk/middleware-recursion-detection": "3.378.0", - "@aws-sdk/middleware-user-agent": "3.379.1", - "@aws-sdk/types": "3.378.0", - "@aws-sdk/util-endpoints": "3.378.0", - "@aws-sdk/util-user-agent-browser": "3.378.0", - "@aws-sdk/util-user-agent-node": "3.378.0", - "@smithy/config-resolver": "^2.0.1", - "@smithy/fetch-http-handler": "^2.0.1", - "@smithy/hash-node": "^2.0.1", - "@smithy/invalid-dependency": "^2.0.1", - "@smithy/middleware-content-length": "^2.0.1", - "@smithy/middleware-endpoint": "^2.0.1", - "@smithy/middleware-retry": "^2.0.1", - "@smithy/middleware-serde": "^2.0.1", - "@smithy/middleware-stack": "^2.0.0", - "@smithy/node-config-provider": "^2.0.1", - "@smithy/node-http-handler": "^2.0.1", - "@smithy/protocol-http": "^2.0.1", - "@smithy/smithy-client": "^2.0.1", - "@smithy/types": "^2.0.2", - "@smithy/url-parser": "^2.0.1", - "@smithy/util-base64": "^2.0.0", - "@smithy/util-body-length-browser": "^2.0.0", - "@smithy/util-body-length-node": "^2.0.0", - "@smithy/util-defaults-mode-browser": "^2.0.1", - "@smithy/util-defaults-mode-node": "^2.0.1", - "@smithy/util-retry": "^2.0.0", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.16", + "@smithy/util-defaults-mode-node": "^2.0.21", + "@smithy/util-endpoints": "^1.0.2", + "@smithy/util-retry": "^2.0.5", "@smithy/util-utf8": "^2.0.0", "tslib": "^2.5.0" }, @@ -387,44 +350,47 @@ } }, "node_modules/@aws-sdk/client-lambda/node_modules/@aws-sdk/client-sts": { - "version": "3.379.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.379.1.tgz", - "integrity": "sha512-gEnKuk9bYjThvmxCgOgCn1qa+rRX8IgIRE2+xhbWhlpDanozhkDq9aMB5moX4tBNYQEmi1LtGD+JOvOoZRnToQ==", + "version": "3.445.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.445.0.tgz", + "integrity": "sha512-ogbdqrS8x9O5BTot826iLnTQ6i4/F5BSi/74gycneCxYmAnYnyUBNOWVnynv6XZiEWyDJQCU2UtMd52aNGW1GA==", "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/credential-provider-node": "3.379.1", - "@aws-sdk/middleware-host-header": "3.379.1", - "@aws-sdk/middleware-logger": "3.378.0", - "@aws-sdk/middleware-recursion-detection": "3.378.0", - "@aws-sdk/middleware-sdk-sts": "3.379.1", - "@aws-sdk/middleware-signing": "3.379.1", - "@aws-sdk/middleware-user-agent": "3.379.1", - "@aws-sdk/types": "3.378.0", - "@aws-sdk/util-endpoints": "3.378.0", - "@aws-sdk/util-user-agent-browser": "3.378.0", - "@aws-sdk/util-user-agent-node": "3.378.0", - "@smithy/config-resolver": "^2.0.1", - "@smithy/fetch-http-handler": "^2.0.1", - "@smithy/hash-node": "^2.0.1", - "@smithy/invalid-dependency": "^2.0.1", - "@smithy/middleware-content-length": "^2.0.1", - "@smithy/middleware-endpoint": "^2.0.1", - "@smithy/middleware-retry": "^2.0.1", - "@smithy/middleware-serde": "^2.0.1", - "@smithy/middleware-stack": "^2.0.0", - "@smithy/node-config-provider": "^2.0.1", - "@smithy/node-http-handler": "^2.0.1", - "@smithy/protocol-http": "^2.0.1", - "@smithy/smithy-client": "^2.0.1", - "@smithy/types": "^2.0.2", - "@smithy/url-parser": "^2.0.1", + "@aws-sdk/core": "3.445.0", + "@aws-sdk/credential-provider-node": "3.445.0", + "@aws-sdk/middleware-host-header": "3.433.0", + "@aws-sdk/middleware-logger": "3.433.0", + "@aws-sdk/middleware-recursion-detection": "3.433.0", + "@aws-sdk/middleware-sdk-sts": "3.433.0", + "@aws-sdk/middleware-signing": "3.433.0", + "@aws-sdk/middleware-user-agent": "3.438.0", + "@aws-sdk/region-config-resolver": "3.433.0", + "@aws-sdk/types": "3.433.0", + "@aws-sdk/util-endpoints": "3.438.0", + "@aws-sdk/util-user-agent-browser": "3.433.0", + "@aws-sdk/util-user-agent-node": "3.437.0", + "@smithy/config-resolver": "^2.0.16", + "@smithy/fetch-http-handler": "^2.2.4", + "@smithy/hash-node": "^2.0.12", + "@smithy/invalid-dependency": "^2.0.12", + "@smithy/middleware-content-length": "^2.0.14", + "@smithy/middleware-endpoint": "^2.1.3", + "@smithy/middleware-retry": "^2.0.18", + "@smithy/middleware-serde": "^2.0.12", + "@smithy/middleware-stack": "^2.0.6", + "@smithy/node-config-provider": "^2.1.3", + "@smithy/node-http-handler": "^2.1.8", + "@smithy/protocol-http": "^3.0.8", + "@smithy/smithy-client": "^2.1.12", + "@smithy/types": "^2.4.0", + "@smithy/url-parser": "^2.0.12", "@smithy/util-base64": "^2.0.0", "@smithy/util-body-length-browser": "^2.0.0", - "@smithy/util-body-length-node": "^2.0.0", - "@smithy/util-defaults-mode-browser": "^2.0.1", - "@smithy/util-defaults-mode-node": "^2.0.1", - "@smithy/util-retry": "^2.0.0", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.16", + "@smithy/util-defaults-mode-node": "^2.0.21", + "@smithy/util-endpoints": "^1.0.2", + "@smithy/util-retry": "^2.0.5", "@smithy/util-utf8": "^2.0.0", "fast-xml-parser": "4.2.5", "tslib": "^2.5.0" @@ -434,13 +400,13 @@ } }, "node_modules/@aws-sdk/client-lambda/node_modules/@aws-sdk/credential-provider-env": { - "version": "3.378.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.378.0.tgz", - "integrity": "sha512-B2OVdO9kBClDwGgWTBLAQwFV8qYTYGyVujg++1FZFSFMt8ORFdZ5fNpErvJtiSjYiOOQMzyBeSNhKyYNXCiJjQ==", + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.433.0.tgz", + "integrity": "sha512-Vl7Qz5qYyxBurMn6hfSiNJeUHSqfVUlMt0C1Bds3tCkl3IzecRWwyBOlxtxO3VCrgVeW3HqswLzCvhAFzPH6nQ==", "dependencies": { - "@aws-sdk/types": "3.378.0", + "@aws-sdk/types": "3.433.0", "@smithy/property-provider": "^2.0.0", - "@smithy/types": "^2.0.2", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -448,19 +414,19 @@ } }, "node_modules/@aws-sdk/client-lambda/node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.379.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.379.1.tgz", - "integrity": "sha512-YhEsJIskzCFwIIKiMN9GSHQkgWwj/b7rq0ofhsXsCRimFtdVkmMlB9veE6vtFAuXpX/WOGWdlWek1az0V22uuw==", - "dependencies": { - "@aws-sdk/credential-provider-env": "3.378.0", - "@aws-sdk/credential-provider-process": "3.378.0", - "@aws-sdk/credential-provider-sso": "3.379.1", - "@aws-sdk/credential-provider-web-identity": "3.378.0", - "@aws-sdk/types": "3.378.0", + "version": "3.445.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.445.0.tgz", + "integrity": "sha512-R7IYSGjNZ5KKJwQJ2HNPemjpAMWvdce91i8w+/aHfqeGfTXrmYJu99PeGRyyBTKEumBaojyjTRvmO8HzS+/l7g==", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.433.0", + "@aws-sdk/credential-provider-process": "3.433.0", + "@aws-sdk/credential-provider-sso": "3.445.0", + "@aws-sdk/credential-provider-web-identity": "3.433.0", + "@aws-sdk/types": "3.433.0", "@smithy/credential-provider-imds": "^2.0.0", "@smithy/property-provider": "^2.0.0", - "@smithy/shared-ini-file-loader": "^2.0.0", - "@smithy/types": "^2.0.2", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -468,20 +434,20 @@ } }, "node_modules/@aws-sdk/client-lambda/node_modules/@aws-sdk/credential-provider-node": { - "version": "3.379.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.379.1.tgz", - "integrity": "sha512-39Y4OHKn6a8lY8YJhSLLw08aZytWxfvSjM4ObIEnE6hjLl8gsL9vROKKITsh3q6iGQ1EDSWMWZL50aOh3LJUIg==", - "dependencies": { - "@aws-sdk/credential-provider-env": "3.378.0", - "@aws-sdk/credential-provider-ini": "3.379.1", - "@aws-sdk/credential-provider-process": "3.378.0", - "@aws-sdk/credential-provider-sso": "3.379.1", - "@aws-sdk/credential-provider-web-identity": "3.378.0", - "@aws-sdk/types": "3.378.0", + "version": "3.445.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.445.0.tgz", + "integrity": "sha512-zI4k4foSjQRKNEsouculRcz7IbLfuqdFxypDLYwn+qPNMqJwWJ7VxOOeBSPUpHFcd7CLSfbHN2JAhQ7M02gPTA==", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.433.0", + "@aws-sdk/credential-provider-ini": "3.445.0", + "@aws-sdk/credential-provider-process": "3.433.0", + "@aws-sdk/credential-provider-sso": "3.445.0", + "@aws-sdk/credential-provider-web-identity": "3.433.0", + "@aws-sdk/types": "3.433.0", "@smithy/credential-provider-imds": "^2.0.0", "@smithy/property-provider": "^2.0.0", - "@smithy/shared-ini-file-loader": "^2.0.0", - "@smithy/types": "^2.0.2", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -489,14 +455,14 @@ } }, "node_modules/@aws-sdk/client-lambda/node_modules/@aws-sdk/credential-provider-process": { - "version": "3.378.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.378.0.tgz", - "integrity": "sha512-KFTIy7u+wXj3eDua4rgS0tODzMnXtXhAm1RxzCW9FL5JLBBrd82ymCj1Dp72217Sw5Do6NjCnDTTNkCHZMA77w==", + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.433.0.tgz", + "integrity": "sha512-W7FcGlQjio9Y/PepcZGRyl5Bpwb0uWU7qIUCh+u4+q2mW4D5ZngXg8V/opL9/I/p4tUH9VXZLyLGwyBSkdhL+A==", "dependencies": { - "@aws-sdk/types": "3.378.0", + "@aws-sdk/types": "3.433.0", "@smithy/property-provider": "^2.0.0", - "@smithy/shared-ini-file-loader": "^2.0.0", - "@smithy/types": "^2.0.2", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -504,16 +470,16 @@ } }, "node_modules/@aws-sdk/client-lambda/node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.379.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.379.1.tgz", - "integrity": "sha512-PhGtu1+JbUntYP/5CSfazQhWsjUBiksEuhg9fLhYl5OAgZVjVygbgoNVUz/gM7gZJSEMsasTazkn7yZVzO/k7w==", + "version": "3.445.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.445.0.tgz", + "integrity": "sha512-gJz7kAiDecdhtApgXnxfZsXKsww8BnifDF9MAx9Dr4X6no47qYsCCS3XPuEyRiF9VebXvHOH0H260Zp3bVyniQ==", "dependencies": { - "@aws-sdk/client-sso": "3.379.1", - "@aws-sdk/token-providers": "3.379.1", - "@aws-sdk/types": "3.378.0", + "@aws-sdk/client-sso": "3.445.0", + "@aws-sdk/token-providers": "3.438.0", + "@aws-sdk/types": "3.433.0", "@smithy/property-provider": "^2.0.0", - "@smithy/shared-ini-file-loader": "^2.0.0", - "@smithy/types": "^2.0.2", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -521,13 +487,13 @@ } }, "node_modules/@aws-sdk/client-lambda/node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.378.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.378.0.tgz", - "integrity": "sha512-GWjydOszhc4xDF8xuPtBvboglXQr0gwCW1oHAvmLcOT38+Hd6qnKywnMSeoXYRPgoKfF9TkWQgW1jxplzCG0UA==", + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.433.0.tgz", + "integrity": "sha512-RlwjP1I5wO+aPpwyCp23Mk8nmRbRL33hqRASy73c4JA2z2YiRua+ryt6MalIxehhwQU6xvXUKulJnPG9VaMFZg==", "dependencies": { - "@aws-sdk/types": "3.378.0", + "@aws-sdk/types": "3.433.0", "@smithy/property-provider": "^2.0.0", - "@smithy/types": "^2.0.2", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -535,13 +501,13 @@ } }, "node_modules/@aws-sdk/client-lambda/node_modules/@aws-sdk/middleware-host-header": { - "version": "3.379.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.379.1.tgz", - "integrity": "sha512-LI4KpAFWNWVr2aH2vRVblr0Y8tvDz23lj8LOmbDmCrzd5M21nxuocI/8nEAQj55LiTIf9Zs+dHCdsyegnFXdrA==", + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.433.0.tgz", + "integrity": "sha512-mBTq3UWv1UzeHG+OfUQ2MB/5GEkt5LTKFaUqzL7ESwzW8XtpBgXnjZvIwu3Vcd3sEetMwijwaGiJhY0ae/YyaA==", "dependencies": { - "@aws-sdk/types": "3.378.0", - "@smithy/protocol-http": "^2.0.1", - "@smithy/types": "^2.0.2", + "@aws-sdk/types": "3.433.0", + "@smithy/protocol-http": "^3.0.8", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -549,12 +515,12 @@ } }, "node_modules/@aws-sdk/client-lambda/node_modules/@aws-sdk/middleware-logger": { - "version": "3.378.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.378.0.tgz", - "integrity": "sha512-l1DyaDLm3KeBMNMuANI3scWh8Xvu248x+vw6Z7ExWOhGXFmQ1MW7YvASg/SdxWkhlF9HmkkTif1LdMB22x6QDA==", + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.433.0.tgz", + "integrity": "sha512-We346Fb5xGonTGVZC9Nvqtnqy74VJzYuTLLiuuftA5sbNzftBDy/22QCfvYSTOAl3bvif+dkDUzQY2ihc5PwOQ==", "dependencies": { - "@aws-sdk/types": "3.378.0", - "@smithy/types": "^2.0.2", + "@aws-sdk/types": "3.433.0", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -562,13 +528,13 @@ } }, "node_modules/@aws-sdk/client-lambda/node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.378.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.378.0.tgz", - "integrity": "sha512-mUMfHAz0oGNIWiTZHTVJb+I515Hqs2zx1j36Le4MMiiaMkPW1SRUF1FIwGuc1wh6E8jB5q+XfEMriDjRi4TZRA==", + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.433.0.tgz", + "integrity": "sha512-HEvYC9PQlWY/ccUYtLvAlwwf1iCif2TSAmLNr3YTBRVa98x6jKL0hlCrHWYklFeqOGSKy6XhE+NGJMUII0/HaQ==", "dependencies": { - "@aws-sdk/types": "3.378.0", - "@smithy/protocol-http": "^2.0.1", - "@smithy/types": "^2.0.2", + "@aws-sdk/types": "3.433.0", + "@smithy/protocol-http": "^3.0.8", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -576,13 +542,13 @@ } }, "node_modules/@aws-sdk/client-lambda/node_modules/@aws-sdk/middleware-sdk-sts": { - "version": "3.379.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.379.1.tgz", - "integrity": "sha512-SK3gSyT0XbLiY12+AjLFYL9YngxOXHnZF3Z33Cdd4a+AUYrVBV7JBEEGD1Nlwrcmko+3XgaKlmgUaR5s91MYvg==", + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.433.0.tgz", + "integrity": "sha512-ORYbJnBejUyonFl5FwIqhvI3Cq6sAp9j+JpkKZtFNma9tFPdrhmYgfCeNH32H/wGTQV/tUoQ3luh0gA4cuk6DA==", "dependencies": { - "@aws-sdk/middleware-signing": "3.379.1", - "@aws-sdk/types": "3.378.0", - "@smithy/types": "^2.0.2", + "@aws-sdk/middleware-signing": "3.433.0", + "@aws-sdk/types": "3.433.0", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -590,16 +556,16 @@ } }, "node_modules/@aws-sdk/client-lambda/node_modules/@aws-sdk/middleware-signing": { - "version": "3.379.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.379.1.tgz", - "integrity": "sha512-kBk2ZUvR84EM4fICjr8K+Ykpf8SI1UzzPp2/UVYZ0X+4H/ZCjfSqohGRwHykMqeplne9qHSL7/rGJs1H3l3gPg==", + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.433.0.tgz", + "integrity": "sha512-jxPvt59NZo/epMNLNTu47ikmP8v0q217I6bQFGJG7JVFnfl36zDktMwGw+0xZR80qiK47/2BWrNpta61Zd2FxQ==", "dependencies": { - "@aws-sdk/types": "3.378.0", + "@aws-sdk/types": "3.433.0", "@smithy/property-provider": "^2.0.0", - "@smithy/protocol-http": "^2.0.1", + "@smithy/protocol-http": "^3.0.8", "@smithy/signature-v4": "^2.0.0", - "@smithy/types": "^2.0.2", - "@smithy/util-middleware": "^2.0.0", + "@smithy/types": "^2.4.0", + "@smithy/util-middleware": "^2.0.5", "tslib": "^2.5.0" }, "engines": { @@ -607,14 +573,14 @@ } }, "node_modules/@aws-sdk/client-lambda/node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.379.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.379.1.tgz", - "integrity": "sha512-4zIGeAIuutcRieAvovs82uBNhJBHuxfxaAUqrKiw49xUBG7xeNVUl+DYPSpbALbEIy4ujfwWCBOOWVCt6dyUZg==", + "version": "3.438.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.438.0.tgz", + "integrity": "sha512-a+xHT1wOxT6EA6YyLmrfaroKWOkwwyiktUfXKM0FsUutGzNi4fKhb5NZ2al58NsXzHgHFrasSDp+Lqbd/X2cEw==", "dependencies": { - "@aws-sdk/types": "3.378.0", - "@aws-sdk/util-endpoints": "3.378.0", - "@smithy/protocol-http": "^2.0.1", - "@smithy/types": "^2.0.2", + "@aws-sdk/types": "3.433.0", + "@aws-sdk/util-endpoints": "3.438.0", + "@smithy/protocol-http": "^3.0.8", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -622,15 +588,46 @@ } }, "node_modules/@aws-sdk/client-lambda/node_modules/@aws-sdk/token-providers": { - "version": "3.379.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.379.1.tgz", - "integrity": "sha512-NlYPkArJ7A/txCrjqqkje+4hsv7pSOqm+Qdx3BUIOc7PRYrBVs/XwThxUkGceSntVXoNlO8g9DFL0NY53/wb8Q==", + "version": "3.438.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.438.0.tgz", + "integrity": "sha512-G2fUfTtU6/1ayYRMu0Pd9Ln4qYSvwJOWCqJMdkDgvXSwdgcOSOLsnAIk1AHGJDAvgLikdCzuyOsdJiexr9Vnww==", "dependencies": { - "@aws-sdk/client-sso-oidc": "3.379.1", - "@aws-sdk/types": "3.378.0", + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/middleware-host-header": "3.433.0", + "@aws-sdk/middleware-logger": "3.433.0", + "@aws-sdk/middleware-recursion-detection": "3.433.0", + "@aws-sdk/middleware-user-agent": "3.438.0", + "@aws-sdk/region-config-resolver": "3.433.0", + "@aws-sdk/types": "3.433.0", + "@aws-sdk/util-endpoints": "3.438.0", + "@aws-sdk/util-user-agent-browser": "3.433.0", + "@aws-sdk/util-user-agent-node": "3.437.0", + "@smithy/config-resolver": "^2.0.16", + "@smithy/fetch-http-handler": "^2.2.4", + "@smithy/hash-node": "^2.0.12", + "@smithy/invalid-dependency": "^2.0.12", + "@smithy/middleware-content-length": "^2.0.14", + "@smithy/middleware-endpoint": "^2.1.3", + "@smithy/middleware-retry": "^2.0.18", + "@smithy/middleware-serde": "^2.0.12", + "@smithy/middleware-stack": "^2.0.6", + "@smithy/node-config-provider": "^2.1.3", + "@smithy/node-http-handler": "^2.1.8", "@smithy/property-provider": "^2.0.0", - "@smithy/shared-ini-file-loader": "^2.0.0", - "@smithy/types": "^2.0.2", + "@smithy/protocol-http": "^3.0.8", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/smithy-client": "^2.1.12", + "@smithy/types": "^2.4.0", + "@smithy/url-parser": "^2.0.12", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.16", + "@smithy/util-defaults-mode-node": "^2.0.21", + "@smithy/util-endpoints": "^1.0.2", + "@smithy/util-retry": "^2.0.5", + "@smithy/util-utf8": "^2.0.0", "tslib": "^2.5.0" }, "engines": { @@ -638,11 +635,11 @@ } }, "node_modules/@aws-sdk/client-lambda/node_modules/@aws-sdk/types": { - "version": "3.378.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.378.0.tgz", - "integrity": "sha512-qP0CvR/ItgktmN8YXpGQglzzR/6s0nrsQ4zIfx3HMwpsBTwuouYahcCtF1Vr82P4NFcoDA412EJahJ2pIqEd+w==", + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.433.0.tgz", + "integrity": "sha512-0jEE2mSrNDd8VGFjTc1otYrwYPIkzZJEIK90ZxisKvQ/EURGBhNzWn7ejWB9XCMFT6XumYLBR0V9qq5UPisWtA==", "dependencies": { - "@smithy/types": "^2.0.2", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -650,11 +647,12 @@ } }, "node_modules/@aws-sdk/client-lambda/node_modules/@aws-sdk/util-endpoints": { - "version": "3.378.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.378.0.tgz", - "integrity": "sha512-NU5C2l2xAXxpyB5nT0fIhahLPlJoJdzHWw4uC53KH9b4PrjHtgvgCN8beIsD3QxyfgeoM4A5J9Auo6WurfRnLw==", + "version": "3.438.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.438.0.tgz", + "integrity": "sha512-6VyPTq1kN3GWxwFt5DdZfOsr6cJZPLjWh0troY/0uUv3hK74C9o3Y0Xf/z8UAUvQFkVqZse12O0/BgPVMImvfA==", "dependencies": { - "@aws-sdk/types": "3.378.0", + "@aws-sdk/types": "3.433.0", + "@smithy/util-endpoints": "^1.0.2", "tslib": "^2.5.0" }, "engines": { @@ -662,24 +660,24 @@ } }, "node_modules/@aws-sdk/client-lambda/node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.378.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.378.0.tgz", - "integrity": "sha512-FSCpagzftK1W+m7Ar6lpX7/Gr9y5P56nhFYz8U4EYQ4PkufS6czWX9YW+/FA5OYV0vlQ/SvPqMnzoHIPUNhZrQ==", + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.433.0.tgz", + "integrity": "sha512-2Cf/Lwvxbt5RXvWFXrFr49vXv0IddiUwrZoAiwhDYxvsh+BMnh+NUFot+ZQaTrk/8IPZVDeLPWZRdVy00iaVXQ==", "dependencies": { - "@aws-sdk/types": "3.378.0", - "@smithy/types": "^2.0.2", + "@aws-sdk/types": "3.433.0", + "@smithy/types": "^2.4.0", "bowser": "^2.11.0", "tslib": "^2.5.0" } }, "node_modules/@aws-sdk/client-lambda/node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.378.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.378.0.tgz", - "integrity": "sha512-IdwVJV0E96MkJeFte4dlWqvB+oiqCiZ5lOlheY3W9NynTuuX0GGYNC8Y9yIsV8Oava1+ujpJq0ww6qXdYxmO4A==", + "version": "3.437.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.437.0.tgz", + "integrity": "sha512-JVEcvWaniamtYVPem4UthtCNoTBCfFTwYj7Y3CrWZ2Qic4TqrwLkAfaBGtI2TGrhIClVr77uzLI6exqMTN7orA==", "dependencies": { - "@aws-sdk/types": "3.378.0", - "@smithy/node-config-provider": "^2.0.1", - "@smithy/types": "^2.0.2", + "@aws-sdk/types": "3.433.0", + "@smithy/node-config-provider": "^2.1.3", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -695,11 +693,11 @@ } }, "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/protocol-http": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-2.0.1.tgz", - "integrity": "sha512-mrkMAp0wtaDEIkgRObWYxI1Kun1tm6Iu6rK+X4utb6Ah7Uc3Kk4VIWwK/rBHdYGReiLIrxFCB1rq4a2gyZnSgg==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.8.tgz", + "integrity": "sha512-SHJvYeWq8q0FK8xHk+xjV9dzDUDjFMT+G1pZbV+XB6OVoac/FSVshlMNPeUJ8AmSkcDKHRu5vASnRqZHgD3qhw==", "dependencies": { - "@smithy/types": "^2.0.2", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -707,9 +705,9 @@ } }, "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.0.2.tgz", - "integrity": "sha512-wcymEjIXQ9+NEfE5Yt5TInAqe1o4n+Nh+rh00AwoazppmUt8tdo6URhc5gkDcOYrcvlDVAZE7uG69nDpEGUKxw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", + "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", "dependencies": { "tslib": "^2.5.0" }, @@ -1338,6 +1336,18 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/core": { + "version": "3.445.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.445.0.tgz", + "integrity": "sha512-6GYLElUG1QTOdmXG8zXa+Ull9IUeSeItKDYHKzHYfIkbsagMfYlf7wm9XIYlatjtgodNfZ3gPHAJfRyPmwKrsg==", + "dependencies": { + "@smithy/smithy-client": "^2.1.12", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@aws-sdk/credential-provider-env": { "version": "3.357.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.357.0.tgz", @@ -2370,6 +2380,32 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/region-config-resolver": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.433.0.tgz", + "integrity": "sha512-xpjRjCZW+CDFdcMmmhIYg81ST5UAnJh61IHziQEk0FXONrg4kjyYPZAOjEdzXQ+HxJQuGQLKPhRdzxmQnbX7pg==", + "dependencies": { + "@smithy/node-config-provider": "^2.1.3", + "@smithy/types": "^2.4.0", + "@smithy/util-config-provider": "^2.0.0", + "@smithy/util-middleware": "^2.0.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/region-config-resolver/node_modules/@smithy/types": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", + "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@aws-sdk/service-error-classification": { "version": "3.357.0", "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.357.0.tgz", @@ -3216,35 +3252,6 @@ "node": ">=6.9.0" } }, - "node_modules/@chevrotain/cst-dts-gen": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/@chevrotain/cst-dts-gen/-/cst-dts-gen-10.5.0.tgz", - "integrity": "sha512-lhmC/FyqQ2o7pGK4Om+hzuDrm9rhFYIJ/AXoQBeongmn870Xeb0L6oGEiuR8nohFNL5sMaQEJWCxr1oIVIVXrw==", - "dependencies": { - "@chevrotain/gast": "10.5.0", - "@chevrotain/types": "10.5.0", - "lodash": "4.17.21" - } - }, - "node_modules/@chevrotain/gast": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/@chevrotain/gast/-/gast-10.5.0.tgz", - "integrity": "sha512-pXdMJ9XeDAbgOWKuD1Fldz4ieCs6+nLNmyVhe2gZVqoO7v8HXuHYs5OV2EzUtbuai37TlOAQHrTDvxMnvMJz3A==", - "dependencies": { - "@chevrotain/types": "10.5.0", - "lodash": "4.17.21" - } - }, - "node_modules/@chevrotain/types": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/@chevrotain/types/-/types-10.5.0.tgz", - "integrity": "sha512-f1MAia0x/pAVPWH/T73BJVyO2XU5tI4/iE7cnxb7tqdNTNhQI3Uq3XkqcoteTmD4t1aM0LbHCJOhgIDn07kl2A==" - }, - "node_modules/@chevrotain/utils": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/@chevrotain/utils/-/utils-10.5.0.tgz", - "integrity": "sha512-hBzuU5+JjB2cqNZyszkDHZgOSrUUT8V3dhgRl8Q9Gp6dAj/H5+KILGjbhDpc3Iy9qmqlm/akuOI2ut9VUtzJxQ==" - }, "node_modules/@colors/colors": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", @@ -3381,11 +3388,11 @@ } }, "node_modules/@grpc/grpc-js": { - "version": "1.8.16", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.8.16.tgz", - "integrity": "sha512-Nvlq4V7XQmdRVDGgecR8ZPPCeY+uH1LhzbC+QxklwAahpQlq8YLsiOQgfkub9FiakRiohaDy361xqlTLkq9EHw==", + "version": "1.9.9", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.9.tgz", + "integrity": "sha512-vQ1qwi/Kiyprt+uhb1+rHMpyk4CVRMTGNUGGPRGS7pLNfWkdCHrGEnT6T3/JyC2VZgoOX/X1KwdoU0WYQAeYcQ==", "dependencies": { - "@grpc/proto-loader": "^0.7.0", + "@grpc/proto-loader": "^0.7.8", "@types/node": ">=12.12.47" }, "engines": { @@ -3393,14 +3400,13 @@ } }, "node_modules/@grpc/proto-loader": { - "version": "0.7.7", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.7.tgz", - "integrity": "sha512-1TIeXOi8TuSCQprPItwoMymZXxWT0CPxUhkrkeCUH+D8U7QDwQ6b7SUz2MaLuWM2llT+J/TVFLmQI5KtML3BhQ==", + "version": "0.7.10", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.10.tgz", + "integrity": "sha512-CAqDfoaQ8ykFd9zqBDn4k6iWT9loLAlc2ETmDFS9JCD70gDcnA4L3AFEo2iV7KyAtAAHFW9ftq1Fz+Vsgq80RQ==", "dependencies": { - "@types/long": "^4.0.1", "lodash.camelcase": "^4.3.0", - "long": "^4.0.0", - "protobufjs": "^7.0.0", + "long": "^5.0.0", + "protobufjs": "^7.2.4", "yargs": "^17.7.2" }, "bin": { @@ -3730,43 +3736,26 @@ "xyz": "bin/xyz.js" } }, - "node_modules/@mrleebo/prisma-ast": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@mrleebo/prisma-ast/-/prisma-ast-0.5.2.tgz", - "integrity": "sha512-v2jwtrLt/x5/MaF7Sucsz/do8tDUmiq3KA+UYdyZfr3OQ2IGXUtpNSXmdlvyRM+vQ7Abn/FxpLW/qqhZGB9vhQ==", - "dependencies": { - "chevrotain": "^10.4.2" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/@newrelic/aws-sdk": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@newrelic/aws-sdk/-/aws-sdk-6.0.0.tgz", - "integrity": "sha512-17DwEvyDS9pAkV5kBSGtm2oIQbII0qOSAXSlU51MLA0Vp/PxNDTCBBFVgpKbGyKpPfudIJMGvh4jAmlzH3xIng==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@newrelic/aws-sdk/-/aws-sdk-7.0.2.tgz", + "integrity": "sha512-nT19hzId0MbjR3v1ks5YetvNfrwIEgMfeai+T2pQkuWkjCsYm3z+OybLOYMCN66gueqOOqGTq60qhM4dFu5s5w==", "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "newrelic": ">=8.7.0" + "node": ">=16.0.0" } }, "node_modules/@newrelic/koa": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@newrelic/koa/-/koa-7.1.1.tgz", - "integrity": "sha512-QvO6Wmz+wws0vtrpqsZz3KVMbDySY7VbdIu99f9fuWd775yNCTz2n2VfQhdkBxWlSQSlR4gO0Uh8RWa4HUzb3g==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@newrelic/koa/-/koa-8.0.1.tgz", + "integrity": "sha512-GyeZGKPllpUu6gWXRwVP/FlvE9+tU2lOprRiTdoXNM8jdVGL02IfHnvAzrIANoZoUdf3+Vev8NNeCup2Eojcvg==", "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "newrelic": ">=6.11.0" + "node": ">=16.0.0" } }, "node_modules/@newrelic/native-metrics": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/@newrelic/native-metrics/-/native-metrics-9.0.1.tgz", - "integrity": "sha512-ZMCd6xW9PWhrWvg8Ik0oFU+XGFLbqRujh15qu3+7FJRI8163RBOD6SS8tsU0ydG8+LlaPDZQp/ODD4LvBXu5UA==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@newrelic/native-metrics/-/native-metrics-10.0.1.tgz", + "integrity": "sha512-XJlKF3mCiFS/tZj6C79gdRYj+vQQtFSxbL83MMOVK/N025UHk8Oo8lF1ir7GOWk+Ll2xH4WI/t7i9SqDouXX+g==", "hasInstallScript": true, "optional": true, "dependencies": { @@ -3775,7 +3764,7 @@ "semver": "^7.5.2" }, "engines": { - "node": ">=14", + "node": ">=16", "npm": ">=6" } }, @@ -3795,13 +3784,13 @@ } }, "node_modules/@newrelic/security-agent": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@newrelic/security-agent/-/security-agent-0.2.0.tgz", - "integrity": "sha512-sPUlYI99ursxaNq07TznLczmEWOjvOe5PkHe1ghjxolsZb5wy/DZYSmqIk9WuW5kNqyizUz+NNxc/7XqIAhpMw==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@newrelic/security-agent/-/security-agent-0.4.0.tgz", + "integrity": "sha512-NWwKf1yBKOscdASGLsO3U7op8cH3k+WrGrge6Q8BY2bR/LWn4HJ6kLLIWwrUso77mYDWHtgxG0YteUCIRvUOlQ==", "dependencies": { - "@aws-sdk/client-lambda": "^3.348.0", - "axios": "0.21.4", - "check-disk-space": "^3.4.0", + "@aws-sdk/client-lambda": "^3.405.0", + "axios": "1.6.0", + "check-disk-space": "3.3.1", "content-type": "^1.0.5", "fast-safe-stringify": "^2.1.1", "find-package-json": "^1.2.0", @@ -3815,11 +3804,11 @@ "pretty-bytes": "^5.6.0", "request-ip": "^3.3.0", "ringbufferjs": "^2.0.0", - "semver": "^7.5.3", + "semver": "^7.5.4", "sync-request": "^6.1.0", "unescape": "^1.0.1", "unescape-js": "^1.1.4", - "uuid": "^9.0.0", + "uuid": "^9.0.1", "ws": "^7.5.9" } }, @@ -3838,22 +3827,23 @@ } }, "node_modules/@newrelic/security-agent/node_modules/uuid": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], "bin": { "uuid": "dist/bin/uuid" } }, "node_modules/@newrelic/superagent": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@newrelic/superagent/-/superagent-6.0.0.tgz", - "integrity": "sha512-5nClQp9ACd4BvLusAgFHjjKLDgAaC+dKmIsRNOPC82LOLFaoOgxxtbecnDIJ0NWCKQS+WOdmXdgYutwH+e5dsA==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@newrelic/superagent/-/superagent-7.0.1.tgz", + "integrity": "sha512-QZlW0VxHSVOXcMAtlkg+Mth0Nz3vFku8rfzTEmoI/pXcckHXGEYuiVUhhboCTD3xTKVgnZRUp9BWF6SOggGUSw==", "engines": { - "node": ">=14.0" - }, - "peerDependencies": { - "newrelic": ">=6.11.0" + "node": ">=16.0" } }, "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { @@ -3903,6 +3893,12 @@ "@node-redis/client": "^1.0.0" } }, + "node_modules/@prisma/prisma-fmt-wasm": { + "version": "4.17.0-16.27eb2449f178cd9fe1a4b892d732cc4795f75085", + "resolved": "https://registry.npmjs.org/@prisma/prisma-fmt-wasm/-/prisma-fmt-wasm-4.17.0-16.27eb2449f178cd9fe1a4b892d732cc4795f75085.tgz", + "integrity": "sha512-zYz3rFwPB82mVlHGknAPdnSY/a308dhPOblxQLcZgZTDRtDXOE1MgxoRAys+jekwR4/bm3+rZDPs1xsFMsPZig==", + "optional": true + }, "node_modules/@protobufjs/aspromise": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", @@ -4011,11 +4007,11 @@ "dev": true }, "node_modules/@smithy/abort-controller": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.0.1.tgz", - "integrity": "sha512-0s7XjIbsTwZyUW9OwXQ8J6x1UiA1TNCh60Vaw56nHahL7kUZsLhmTlWiaxfLkFtO2Utkj8YewcpHTYpxaTzO+w==", + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.0.12.tgz", + "integrity": "sha512-YIJyefe1mi3GxKdZxEBEuzYOeQ9xpYfqnFmWzojCssRAuR7ycxwpoRQgp965vuW426xUAQhCV5rCaWElQ7XsaA==", "dependencies": { - "@smithy/types": "^2.0.2", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -4023,9 +4019,9 @@ } }, "node_modules/@smithy/abort-controller/node_modules/@smithy/types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.0.2.tgz", - "integrity": "sha512-wcymEjIXQ9+NEfE5Yt5TInAqe1o4n+Nh+rh00AwoazppmUt8tdo6URhc5gkDcOYrcvlDVAZE7uG69nDpEGUKxw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", + "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", "dependencies": { "tslib": "^2.5.0" }, @@ -4034,13 +4030,14 @@ } }, "node_modules/@smithy/config-resolver": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.0.1.tgz", - "integrity": "sha512-l83Pm7hV+8CBQOCmBRopWDtF+CURUJol7NsuPYvimiDhkC2F8Ba9T1imSFE+pD1UIJ9jlsDPAnZfPJT5cjnuEw==", + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.0.17.tgz", + "integrity": "sha512-iQ8Q8ojqiPqRKdybDI1g7HvG8EcnekRnH3DYeNTrT26vDuPq2nomyMCc0DZnPW+uAUcLCGZpAmGTAvEOYX55wA==", "dependencies": { - "@smithy/types": "^2.0.2", + "@smithy/node-config-provider": "^2.1.4", + "@smithy/types": "^2.4.0", "@smithy/util-config-provider": "^2.0.0", - "@smithy/util-middleware": "^2.0.0", + "@smithy/util-middleware": "^2.0.5", "tslib": "^2.5.0" }, "engines": { @@ -4048,9 +4045,9 @@ } }, "node_modules/@smithy/config-resolver/node_modules/@smithy/types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.0.2.tgz", - "integrity": "sha512-wcymEjIXQ9+NEfE5Yt5TInAqe1o4n+Nh+rh00AwoazppmUt8tdo6URhc5gkDcOYrcvlDVAZE7uG69nDpEGUKxw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", + "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", "dependencies": { "tslib": "^2.5.0" }, @@ -4059,14 +4056,14 @@ } }, "node_modules/@smithy/credential-provider-imds": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.0.1.tgz", - "integrity": "sha512-8VxriuRINNEfVZjEFKBY75y9ZWAx73DZ5K/u+3LmB6r8WR2h3NaFxFKMlwlq0uzNdGhD1ouKBn9XWEGYHKiPLw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.1.0.tgz", + "integrity": "sha512-amqeueHM3i02S6z35WlXp7gejBnRloT5ctR/mQLlg/6LWGd70Avc2epzuuWtCptNg2ak5/yODD1fAVs9NPCyqg==", "dependencies": { - "@smithy/node-config-provider": "^2.0.1", - "@smithy/property-provider": "^2.0.1", - "@smithy/types": "^2.0.2", - "@smithy/url-parser": "^2.0.1", + "@smithy/node-config-provider": "^2.1.4", + "@smithy/property-provider": "^2.0.13", + "@smithy/types": "^2.4.0", + "@smithy/url-parser": "^2.0.12", "tslib": "^2.5.0" }, "engines": { @@ -4074,9 +4071,9 @@ } }, "node_modules/@smithy/credential-provider-imds/node_modules/@smithy/types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.0.2.tgz", - "integrity": "sha512-wcymEjIXQ9+NEfE5Yt5TInAqe1o4n+Nh+rh00AwoazppmUt8tdo6URhc5gkDcOYrcvlDVAZE7uG69nDpEGUKxw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", + "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", "dependencies": { "tslib": "^2.5.0" }, @@ -4085,20 +4082,20 @@ } }, "node_modules/@smithy/eventstream-codec": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-2.0.1.tgz", - "integrity": "sha512-/IiNB7gQM2y2ZC/GAWOWDa8+iXfhr1g9Xe5979cQEOdCWDISvrAiv18cn3OtIQUhbYOR3gm7QtCpkq1to2takQ==", + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-2.0.12.tgz", + "integrity": "sha512-ZZQLzHBJkbiAAdj2C5K+lBlYp/XJ+eH2uy+jgJgYIFW/o5AM59Hlj7zyI44/ZTDIQWmBxb3EFv/c5t44V8/g8A==", "dependencies": { "@aws-crypto/crc32": "3.0.0", - "@smithy/types": "^2.0.2", + "@smithy/types": "^2.4.0", "@smithy/util-hex-encoding": "^2.0.0", "tslib": "^2.5.0" } }, "node_modules/@smithy/eventstream-codec/node_modules/@smithy/types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.0.2.tgz", - "integrity": "sha512-wcymEjIXQ9+NEfE5Yt5TInAqe1o4n+Nh+rh00AwoazppmUt8tdo6URhc5gkDcOYrcvlDVAZE7uG69nDpEGUKxw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", + "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", "dependencies": { "tslib": "^2.5.0" }, @@ -4107,12 +4104,12 @@ } }, "node_modules/@smithy/eventstream-serde-browser": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-2.0.1.tgz", - "integrity": "sha512-9E1/6ZGF7nB/Td3G1kcatU7VjjP8eZ/p/Q+0KsZc1AUPyv4lR15pmWnWj3iGBEGYI9qZBJ/7a/wPEPayabmA3Q==", + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-2.0.12.tgz", + "integrity": "sha512-0pi8QlU/pwutNshoeJcbKR1p7Ie5STd8UFAMX5xhSoSJjNlxIv/OsHbF023jscMRN2Prrqd6ToGgdCnsZVQjvg==", "dependencies": { - "@smithy/eventstream-serde-universal": "^2.0.1", - "@smithy/types": "^2.0.2", + "@smithy/eventstream-serde-universal": "^2.0.12", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -4120,9 +4117,9 @@ } }, "node_modules/@smithy/eventstream-serde-browser/node_modules/@smithy/types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.0.2.tgz", - "integrity": "sha512-wcymEjIXQ9+NEfE5Yt5TInAqe1o4n+Nh+rh00AwoazppmUt8tdo6URhc5gkDcOYrcvlDVAZE7uG69nDpEGUKxw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", + "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", "dependencies": { "tslib": "^2.5.0" }, @@ -4131,11 +4128,11 @@ } }, "node_modules/@smithy/eventstream-serde-config-resolver": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-2.0.1.tgz", - "integrity": "sha512-J8a+8HH8oDPIgq8Px/nPLfu9vpIjQ7XUPtP3orbs8KUh0GznNthSTy1xZP5RXjRqGQEkxPvsHf1po2+QOsgNFw==", + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-2.0.12.tgz", + "integrity": "sha512-I0XfwQkIX3gAnbrU5rLMkBSjTM9DHttdbLwf12CXmj7SSI5dT87PxtKLRrZGanaCMbdf2yCep+MW5/4M7IbvQA==", "dependencies": { - "@smithy/types": "^2.0.2", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -4143,9 +4140,9 @@ } }, "node_modules/@smithy/eventstream-serde-config-resolver/node_modules/@smithy/types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.0.2.tgz", - "integrity": "sha512-wcymEjIXQ9+NEfE5Yt5TInAqe1o4n+Nh+rh00AwoazppmUt8tdo6URhc5gkDcOYrcvlDVAZE7uG69nDpEGUKxw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", + "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", "dependencies": { "tslib": "^2.5.0" }, @@ -4154,12 +4151,12 @@ } }, "node_modules/@smithy/eventstream-serde-node": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-2.0.1.tgz", - "integrity": "sha512-wklowUz0zXJuqC7FMpriz66J8OAko3z6INTg+iMJWYB1bWv4pc5V7q36PxlZ0RKRbj0u+EThlozWgzE7Stz2Sw==", + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-2.0.12.tgz", + "integrity": "sha512-vf1vMHGOkG3uqN9x1zKOhnvW/XgvhJXWqjV6zZiT2FMjlEayugQ1mzpSqr7uf89+BzjTzuZKERmOsEAmewLbxw==", "dependencies": { - "@smithy/eventstream-serde-universal": "^2.0.1", - "@smithy/types": "^2.0.2", + "@smithy/eventstream-serde-universal": "^2.0.12", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -4167,9 +4164,9 @@ } }, "node_modules/@smithy/eventstream-serde-node/node_modules/@smithy/types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.0.2.tgz", - "integrity": "sha512-wcymEjIXQ9+NEfE5Yt5TInAqe1o4n+Nh+rh00AwoazppmUt8tdo6URhc5gkDcOYrcvlDVAZE7uG69nDpEGUKxw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", + "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", "dependencies": { "tslib": "^2.5.0" }, @@ -4178,12 +4175,12 @@ } }, "node_modules/@smithy/eventstream-serde-universal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-2.0.1.tgz", - "integrity": "sha512-WPPylIgVZ6wOYVgpF0Rs1LlocYyj248MRtKEEehnDvC+0tV7wmGt7H/SchCh10W4y4YUxuzPlW+mUvVMGmLSVg==", + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-2.0.12.tgz", + "integrity": "sha512-xZ3ZNpCxIND+q+UCy7y1n1/5VQEYicgSTNCcPqsKawX+Vd+6OcFX7gUHMyPzL8cZr+GdmJuxNleqHlH4giK2tw==", "dependencies": { - "@smithy/eventstream-codec": "^2.0.1", - "@smithy/types": "^2.0.2", + "@smithy/eventstream-codec": "^2.0.12", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -4191,9 +4188,9 @@ } }, "node_modules/@smithy/eventstream-serde-universal/node_modules/@smithy/types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.0.2.tgz", - "integrity": "sha512-wcymEjIXQ9+NEfE5Yt5TInAqe1o4n+Nh+rh00AwoazppmUt8tdo6URhc5gkDcOYrcvlDVAZE7uG69nDpEGUKxw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", + "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", "dependencies": { "tslib": "^2.5.0" }, @@ -4202,23 +4199,23 @@ } }, "node_modules/@smithy/fetch-http-handler": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.0.1.tgz", - "integrity": "sha512-/SoU/ClazgcdOxgE4zA7RX8euiELwpsrKCSvulVQvu9zpmqJRyEJn8ZTWYFV17/eHOBdHTs9kqodhNhsNT+cUw==", + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.2.4.tgz", + "integrity": "sha512-gIPRFEGi+c6V52eauGKrjDzPWF2Cu7Z1r5F8A3j2wcwz25sPG/t8kjsbEhli/tS/2zJp/ybCZXe4j4ro3yv/HA==", "dependencies": { - "@smithy/protocol-http": "^2.0.1", - "@smithy/querystring-builder": "^2.0.1", - "@smithy/types": "^2.0.2", + "@smithy/protocol-http": "^3.0.8", + "@smithy/querystring-builder": "^2.0.12", + "@smithy/types": "^2.4.0", "@smithy/util-base64": "^2.0.0", "tslib": "^2.5.0" } }, "node_modules/@smithy/fetch-http-handler/node_modules/@smithy/protocol-http": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-2.0.1.tgz", - "integrity": "sha512-mrkMAp0wtaDEIkgRObWYxI1Kun1tm6Iu6rK+X4utb6Ah7Uc3Kk4VIWwK/rBHdYGReiLIrxFCB1rq4a2gyZnSgg==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.8.tgz", + "integrity": "sha512-SHJvYeWq8q0FK8xHk+xjV9dzDUDjFMT+G1pZbV+XB6OVoac/FSVshlMNPeUJ8AmSkcDKHRu5vASnRqZHgD3qhw==", "dependencies": { - "@smithy/types": "^2.0.2", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -4226,9 +4223,9 @@ } }, "node_modules/@smithy/fetch-http-handler/node_modules/@smithy/types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.0.2.tgz", - "integrity": "sha512-wcymEjIXQ9+NEfE5Yt5TInAqe1o4n+Nh+rh00AwoazppmUt8tdo6URhc5gkDcOYrcvlDVAZE7uG69nDpEGUKxw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", + "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", "dependencies": { "tslib": "^2.5.0" }, @@ -4237,11 +4234,11 @@ } }, "node_modules/@smithy/hash-node": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.0.1.tgz", - "integrity": "sha512-oTKYimQdF4psX54ZonpcIE+MXjMUWFxLCNosjPkJPFQ9whRX0K/PFX/+JZGRQh3zO9RlEOEUIbhy9NO+Wha6hw==", + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.0.12.tgz", + "integrity": "sha512-fDZnTr5j9t5qcbeJ037aMZXxMka13Znqwrgy3PAqYj6Dm3XHXHftTH3q+NWgayUxl1992GFtQt1RuEzRMy3NnQ==", "dependencies": { - "@smithy/types": "^2.0.2", + "@smithy/types": "^2.4.0", "@smithy/util-buffer-from": "^2.0.0", "@smithy/util-utf8": "^2.0.0", "tslib": "^2.5.0" @@ -4251,9 +4248,9 @@ } }, "node_modules/@smithy/hash-node/node_modules/@smithy/types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.0.2.tgz", - "integrity": "sha512-wcymEjIXQ9+NEfE5Yt5TInAqe1o4n+Nh+rh00AwoazppmUt8tdo6URhc5gkDcOYrcvlDVAZE7uG69nDpEGUKxw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", + "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", "dependencies": { "tslib": "^2.5.0" }, @@ -4262,18 +4259,18 @@ } }, "node_modules/@smithy/invalid-dependency": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.0.1.tgz", - "integrity": "sha512-2q/Eb0AE662zwyMV+z+TL7deBwcHCgaZZGc0RItamBE8kak3MzCi/EZCNoFWoBfxgQ4jfR12wm8KKsSXhJzJtQ==", + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.0.12.tgz", + "integrity": "sha512-p5Y+iMHV3SoEpy3VSR7mifbreHQwVSvHSAz/m4GdoXfOzKzaYC8hYv10Ks7Deblkf7lhas8U+lAp9ThbBM+ZXA==", "dependencies": { - "@smithy/types": "^2.0.2", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" } }, "node_modules/@smithy/invalid-dependency/node_modules/@smithy/types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.0.2.tgz", - "integrity": "sha512-wcymEjIXQ9+NEfE5Yt5TInAqe1o4n+Nh+rh00AwoazppmUt8tdo6URhc5gkDcOYrcvlDVAZE7uG69nDpEGUKxw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", + "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", "dependencies": { "tslib": "^2.5.0" }, @@ -4293,12 +4290,12 @@ } }, "node_modules/@smithy/middleware-content-length": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.0.1.tgz", - "integrity": "sha512-IZhRSk5GkVBcrKaqPXddBS2uKhaqwBgaSgbBb1OJyGsKe7SxRFbclWS0LqOR9fKUkDl+3lL8E2ffpo6EQg0igw==", + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.0.14.tgz", + "integrity": "sha512-poUNgKTw9XwPXfX9nEHpVgrMNVpaSMZbshqvPxFVoalF4wp6kRzYKOfdesSVectlQ51VtigoLfbXcdyPwvxgTg==", "dependencies": { - "@smithy/protocol-http": "^2.0.1", - "@smithy/types": "^2.0.2", + "@smithy/protocol-http": "^3.0.8", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -4306,11 +4303,11 @@ } }, "node_modules/@smithy/middleware-content-length/node_modules/@smithy/protocol-http": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-2.0.1.tgz", - "integrity": "sha512-mrkMAp0wtaDEIkgRObWYxI1Kun1tm6Iu6rK+X4utb6Ah7Uc3Kk4VIWwK/rBHdYGReiLIrxFCB1rq4a2gyZnSgg==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.8.tgz", + "integrity": "sha512-SHJvYeWq8q0FK8xHk+xjV9dzDUDjFMT+G1pZbV+XB6OVoac/FSVshlMNPeUJ8AmSkcDKHRu5vASnRqZHgD3qhw==", "dependencies": { - "@smithy/types": "^2.0.2", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -4318,9 +4315,9 @@ } }, "node_modules/@smithy/middleware-content-length/node_modules/@smithy/types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.0.2.tgz", - "integrity": "sha512-wcymEjIXQ9+NEfE5Yt5TInAqe1o4n+Nh+rh00AwoazppmUt8tdo6URhc5gkDcOYrcvlDVAZE7uG69nDpEGUKxw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", + "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", "dependencies": { "tslib": "^2.5.0" }, @@ -4329,14 +4326,16 @@ } }, "node_modules/@smithy/middleware-endpoint": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.0.1.tgz", - "integrity": "sha512-uz/KI1MBd9WHrrkVFZO4L4Wyv24raf0oR4EsOYEeG5jPJO5U+C7MZGLcMxX8gWERDn1sycBDqmGv8fjUMLxT6w==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.1.4.tgz", + "integrity": "sha512-fNUTsdTkM/RUu77AljH7fD3O0sFKDPNn1dFMR1oLAuJLOq4r6yjnL7Uc/F7wOgzgw1KRqqEnqAZccyAX2iEa4Q==", "dependencies": { - "@smithy/middleware-serde": "^2.0.1", - "@smithy/types": "^2.0.2", - "@smithy/url-parser": "^2.0.1", - "@smithy/util-middleware": "^2.0.0", + "@smithy/middleware-serde": "^2.0.12", + "@smithy/node-config-provider": "^2.1.4", + "@smithy/shared-ini-file-loader": "^2.2.3", + "@smithy/types": "^2.4.0", + "@smithy/url-parser": "^2.0.12", + "@smithy/util-middleware": "^2.0.5", "tslib": "^2.5.0" }, "engines": { @@ -4344,9 +4343,9 @@ } }, "node_modules/@smithy/middleware-endpoint/node_modules/@smithy/types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.0.2.tgz", - "integrity": "sha512-wcymEjIXQ9+NEfE5Yt5TInAqe1o4n+Nh+rh00AwoazppmUt8tdo6URhc5gkDcOYrcvlDVAZE7uG69nDpEGUKxw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", + "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", "dependencies": { "tslib": "^2.5.0" }, @@ -4355,15 +4354,16 @@ } }, "node_modules/@smithy/middleware-retry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.0.1.tgz", - "integrity": "sha512-NKHF4i0gjSyjO6C0ZyjEpNqzGgIu7s8HOK6oT/1Jqws2Q1GynR1xV8XTUs1gKXeaNRzbzKQRewHHmfPwZjOtHA==", - "dependencies": { - "@smithy/protocol-http": "^2.0.1", - "@smithy/service-error-classification": "^2.0.0", - "@smithy/types": "^2.0.2", - "@smithy/util-middleware": "^2.0.0", - "@smithy/util-retry": "^2.0.0", + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.0.19.tgz", + "integrity": "sha512-VMS1GHxLpRnuLHrPTj/nb9aD99jJsNzWX07F00fIuV9lkz3lWP7RUM7P1aitm0+4YfhShPn+Wri8/CuoqPOziA==", + "dependencies": { + "@smithy/node-config-provider": "^2.1.4", + "@smithy/protocol-http": "^3.0.8", + "@smithy/service-error-classification": "^2.0.5", + "@smithy/types": "^2.4.0", + "@smithy/util-middleware": "^2.0.5", + "@smithy/util-retry": "^2.0.5", "tslib": "^2.5.0", "uuid": "^8.3.2" }, @@ -4372,11 +4372,11 @@ } }, "node_modules/@smithy/middleware-retry/node_modules/@smithy/protocol-http": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-2.0.1.tgz", - "integrity": "sha512-mrkMAp0wtaDEIkgRObWYxI1Kun1tm6Iu6rK+X4utb6Ah7Uc3Kk4VIWwK/rBHdYGReiLIrxFCB1rq4a2gyZnSgg==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.8.tgz", + "integrity": "sha512-SHJvYeWq8q0FK8xHk+xjV9dzDUDjFMT+G1pZbV+XB6OVoac/FSVshlMNPeUJ8AmSkcDKHRu5vASnRqZHgD3qhw==", "dependencies": { - "@smithy/types": "^2.0.2", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -4384,9 +4384,9 @@ } }, "node_modules/@smithy/middleware-retry/node_modules/@smithy/types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.0.2.tgz", - "integrity": "sha512-wcymEjIXQ9+NEfE5Yt5TInAqe1o4n+Nh+rh00AwoazppmUt8tdo6URhc5gkDcOYrcvlDVAZE7uG69nDpEGUKxw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", + "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", "dependencies": { "tslib": "^2.5.0" }, @@ -4395,11 +4395,11 @@ } }, "node_modules/@smithy/middleware-serde": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.0.1.tgz", - "integrity": "sha512-uKxPaC6ItH9ZXdpdqNtf8sda7GcU4SPMp0tomq/5lUg9oiMa/Q7+kD35MUrpKaX3IVXVrwEtkjCU9dogZ/RAUA==", + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.0.12.tgz", + "integrity": "sha512-IBeco157lIScecq2Z+n0gq56i4MTnfKxS7rbfrAORveDJgnbBAaEQgYqMqp/cYqKrpvEXcyTjwKHrBjCCIZh2A==", "dependencies": { - "@smithy/types": "^2.0.2", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -4407,9 +4407,9 @@ } }, "node_modules/@smithy/middleware-serde/node_modules/@smithy/types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.0.2.tgz", - "integrity": "sha512-wcymEjIXQ9+NEfE5Yt5TInAqe1o4n+Nh+rh00AwoazppmUt8tdo6URhc5gkDcOYrcvlDVAZE7uG69nDpEGUKxw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", + "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", "dependencies": { "tslib": "^2.5.0" }, @@ -4418,9 +4418,21 @@ } }, "node_modules/@smithy/middleware-stack": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-2.0.0.tgz", - "integrity": "sha512-31XC1xNF65nlbc16yuh3wwTudmqs6qy4EseQUGF8A/p2m/5wdd/cnXJqpniy/XvXVwkHPz/GwV36HqzHtIKATQ==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-2.0.6.tgz", + "integrity": "sha512-YSvNZeOKWLJ0M/ycxwDIe2Ztkp6Qixmcml1ggsSv2fdHKGkBPhGrX5tMzPGMI1yyx55UEYBi2OB4s+RriXX48A==", + "dependencies": { + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-stack/node_modules/@smithy/types": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", + "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", "dependencies": { "tslib": "^2.5.0" }, @@ -4429,13 +4441,13 @@ } }, "node_modules/@smithy/node-config-provider": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.0.1.tgz", - "integrity": "sha512-Zoel4CPkKRTQ2XxmozZUfqBYqjPKL53/SvTDhJHj+VBSiJy6MXRav1iDCyFPS92t40Uh+Yi+Km5Ch3hQ+c/zSA==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.1.4.tgz", + "integrity": "sha512-kROLnHFatpimtmZ8YefsRRb5OJ8LVIVNhUWp67KHL4D2Vjd+WpIHMzWtkLLV4p0qXpY+IxmwcL2d2XMPn8ppsQ==", "dependencies": { - "@smithy/property-provider": "^2.0.1", - "@smithy/shared-ini-file-loader": "^2.0.1", - "@smithy/types": "^2.0.2", + "@smithy/property-provider": "^2.0.13", + "@smithy/shared-ini-file-loader": "^2.2.3", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -4443,9 +4455,9 @@ } }, "node_modules/@smithy/node-config-provider/node_modules/@smithy/types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.0.2.tgz", - "integrity": "sha512-wcymEjIXQ9+NEfE5Yt5TInAqe1o4n+Nh+rh00AwoazppmUt8tdo6URhc5gkDcOYrcvlDVAZE7uG69nDpEGUKxw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", + "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", "dependencies": { "tslib": "^2.5.0" }, @@ -4454,14 +4466,14 @@ } }, "node_modules/@smithy/node-http-handler": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.0.1.tgz", - "integrity": "sha512-Zv3fxk3p9tsmPT2CKMsbuwbbxnq2gzLDIulxv+yI6aE+02WPYorObbbe9gh7SW3weadMODL1vTfOoJ9yFypDzg==", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.1.8.tgz", + "integrity": "sha512-KZylM7Wff/So5SmCiwg2kQNXJ+RXgz34wkxS7WNwIUXuZrZZpY/jKJCK+ZaGyuESDu3TxcaY+zeYGJmnFKbQsA==", "dependencies": { - "@smithy/abort-controller": "^2.0.1", - "@smithy/protocol-http": "^2.0.1", - "@smithy/querystring-builder": "^2.0.1", - "@smithy/types": "^2.0.2", + "@smithy/abort-controller": "^2.0.12", + "@smithy/protocol-http": "^3.0.8", + "@smithy/querystring-builder": "^2.0.12", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -4469,11 +4481,11 @@ } }, "node_modules/@smithy/node-http-handler/node_modules/@smithy/protocol-http": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-2.0.1.tgz", - "integrity": "sha512-mrkMAp0wtaDEIkgRObWYxI1Kun1tm6Iu6rK+X4utb6Ah7Uc3Kk4VIWwK/rBHdYGReiLIrxFCB1rq4a2gyZnSgg==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.8.tgz", + "integrity": "sha512-SHJvYeWq8q0FK8xHk+xjV9dzDUDjFMT+G1pZbV+XB6OVoac/FSVshlMNPeUJ8AmSkcDKHRu5vASnRqZHgD3qhw==", "dependencies": { - "@smithy/types": "^2.0.2", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -4481,9 +4493,9 @@ } }, "node_modules/@smithy/node-http-handler/node_modules/@smithy/types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.0.2.tgz", - "integrity": "sha512-wcymEjIXQ9+NEfE5Yt5TInAqe1o4n+Nh+rh00AwoazppmUt8tdo6URhc5gkDcOYrcvlDVAZE7uG69nDpEGUKxw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", + "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", "dependencies": { "tslib": "^2.5.0" }, @@ -4492,11 +4504,11 @@ } }, "node_modules/@smithy/property-provider": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.0.1.tgz", - "integrity": "sha512-pmJRyY9SF6sutWIktIhe+bUdSQDxv/qZ4mYr3/u+u45riTPN7nmRxPo+e4sjWVoM0caKFjRSlj3tf5teRFy0Vg==", + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.0.13.tgz", + "integrity": "sha512-VJqUf2CbsQX6uUiC5dUPuoEATuFjkbkW3lJHbRnpk9EDC9X+iKqhfTK+WP+lve5EQ9TcCI1Q6R7hrg41FyC54w==", "dependencies": { - "@smithy/types": "^2.0.2", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -4504,9 +4516,9 @@ } }, "node_modules/@smithy/property-provider/node_modules/@smithy/types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.0.2.tgz", - "integrity": "sha512-wcymEjIXQ9+NEfE5Yt5TInAqe1o4n+Nh+rh00AwoazppmUt8tdo6URhc5gkDcOYrcvlDVAZE7uG69nDpEGUKxw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", + "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", "dependencies": { "tslib": "^2.5.0" }, @@ -4527,11 +4539,11 @@ } }, "node_modules/@smithy/querystring-builder": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.0.1.tgz", - "integrity": "sha512-bp+93WFzx1FojVEIeFPtG0A1pKsFdCUcZvVdZdRlmNooOUrz9Mm9bneRd8hDwAQ37pxiZkCOxopSXXRQN10mYw==", + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.0.12.tgz", + "integrity": "sha512-cDbF07IuCjiN8CdGvPzfJjXIrmDSelScRfyJYrYBNBbKl2+k7QD/KqiHhtRyEKgID5mmEVrV6KE6L/iPJ98sFw==", "dependencies": { - "@smithy/types": "^2.0.2", + "@smithy/types": "^2.4.0", "@smithy/util-uri-escape": "^2.0.0", "tslib": "^2.5.0" }, @@ -4540,9 +4552,9 @@ } }, "node_modules/@smithy/querystring-builder/node_modules/@smithy/types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.0.2.tgz", - "integrity": "sha512-wcymEjIXQ9+NEfE5Yt5TInAqe1o4n+Nh+rh00AwoazppmUt8tdo6URhc5gkDcOYrcvlDVAZE7uG69nDpEGUKxw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", + "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", "dependencies": { "tslib": "^2.5.0" }, @@ -4551,11 +4563,11 @@ } }, "node_modules/@smithy/querystring-parser": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.0.1.tgz", - "integrity": "sha512-h+e7k1z+IvI2sSbUBG9Aq46JsgLl4UqIUl6aigAlRBj+P6ocNXpM6Yn1vMBw5ijtXeZbYpd1YvCxwDgdw3jhmg==", + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.0.12.tgz", + "integrity": "sha512-fytyTcXaMzPBuNtPlhj5v6dbl4bJAnwKZFyyItAGt4Tgm9HFPZNo7a9r1SKPr/qdxUEBzvL9Rh+B9SkTX3kFxg==", "dependencies": { - "@smithy/types": "^2.0.2", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -4563,9 +4575,9 @@ } }, "node_modules/@smithy/querystring-parser/node_modules/@smithy/types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.0.2.tgz", - "integrity": "sha512-wcymEjIXQ9+NEfE5Yt5TInAqe1o4n+Nh+rh00AwoazppmUt8tdo6URhc5gkDcOYrcvlDVAZE7uG69nDpEGUKxw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", + "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", "dependencies": { "tslib": "^2.5.0" }, @@ -4574,19 +4586,33 @@ } }, "node_modules/@smithy/service-error-classification": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-2.0.0.tgz", - "integrity": "sha512-2z5Nafy1O0cTf69wKyNjGW/sNVMiqDnb4jgwfMG8ye8KnFJ5qmJpDccwIbJNhXIfbsxTg9SEec2oe1cexhMJvw==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-2.0.5.tgz", + "integrity": "sha512-M0SeJnEgD2ywJyV99Fb1yKFzmxDe9JfpJiYTVSRMyRLc467BPU0qsuuDPzMCdB1mU8M8u1rVOdkqdoyFN8UFTw==", + "dependencies": { + "@smithy/types": "^2.4.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/service-error-classification/node_modules/@smithy/types": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", + "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", + "dependencies": { + "tslib": "^2.5.0" + }, "engines": { "node": ">=14.0.0" } }, "node_modules/@smithy/shared-ini-file-loader": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.0.1.tgz", - "integrity": "sha512-a463YiZrPGvM+F336rIF8pLfQsHAdCRAn/BiI/EWzg5xLoxbC7GSxIgliDDXrOu0z8gT3nhVsif85eU6jyct3A==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.2.3.tgz", + "integrity": "sha512-VDyhCNycPbNkPidMnBgYQeSwJkoATRFm5VrveVqIPAjsdGutf7yZpPycuDWW9bRFnuuwaBhCC0pA7KCH0+2wrg==", "dependencies": { - "@smithy/types": "^2.0.2", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -4594,9 +4620,9 @@ } }, "node_modules/@smithy/shared-ini-file-loader/node_modules/@smithy/types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.0.2.tgz", - "integrity": "sha512-wcymEjIXQ9+NEfE5Yt5TInAqe1o4n+Nh+rh00AwoazppmUt8tdo6URhc5gkDcOYrcvlDVAZE7uG69nDpEGUKxw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", + "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", "dependencies": { "tslib": "^2.5.0" }, @@ -4605,15 +4631,15 @@ } }, "node_modules/@smithy/signature-v4": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.0.1.tgz", - "integrity": "sha512-jztv5Mirca42ilxmMDjzLdXcoAmRhZskGafGL49sRo5u7swEZcToEFrq6vtX5YMbSyTVrE9Teog5EFexY5Ff2Q==", + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.0.12.tgz", + "integrity": "sha512-6Kc2lCZEVmb1nNYngyNbWpq0d82OZwITH11SW/Q0U6PX5fH7B2cIcFe7o6eGEFPkTZTP8itTzmYiGcECL0D0Lw==", "dependencies": { - "@smithy/eventstream-codec": "^2.0.1", + "@smithy/eventstream-codec": "^2.0.12", "@smithy/is-array-buffer": "^2.0.0", - "@smithy/types": "^2.0.2", + "@smithy/types": "^2.4.0", "@smithy/util-hex-encoding": "^2.0.0", - "@smithy/util-middleware": "^2.0.0", + "@smithy/util-middleware": "^2.0.5", "@smithy/util-uri-escape": "^2.0.0", "@smithy/util-utf8": "^2.0.0", "tslib": "^2.5.0" @@ -4623,9 +4649,9 @@ } }, "node_modules/@smithy/signature-v4/node_modules/@smithy/types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.0.2.tgz", - "integrity": "sha512-wcymEjIXQ9+NEfE5Yt5TInAqe1o4n+Nh+rh00AwoazppmUt8tdo6URhc5gkDcOYrcvlDVAZE7uG69nDpEGUKxw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", + "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", "dependencies": { "tslib": "^2.5.0" }, @@ -4634,13 +4660,13 @@ } }, "node_modules/@smithy/smithy-client": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.0.1.tgz", - "integrity": "sha512-LHC5m6tYpEu1iNbONfvMbwtErboyTZJfEIPoD78Ei5MVr36vZQCaCla5mvo36+q/a2NAk2//fA5Rx3I1Kf7+lQ==", + "version": "2.1.12", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.1.12.tgz", + "integrity": "sha512-XXqhridfkKnpj+lt8vM6HRlZbqUAqBjVC74JIi13F/AYQd/zTj9SOyGfxnbp4mjY9q28LityxIuV8CTinr9r5w==", "dependencies": { - "@smithy/middleware-stack": "^2.0.0", - "@smithy/types": "^2.0.2", - "@smithy/util-stream": "^2.0.1", + "@smithy/middleware-stack": "^2.0.6", + "@smithy/types": "^2.4.0", + "@smithy/util-stream": "^2.0.17", "tslib": "^2.5.0" }, "engines": { @@ -4648,9 +4674,9 @@ } }, "node_modules/@smithy/smithy-client/node_modules/@smithy/types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.0.2.tgz", - "integrity": "sha512-wcymEjIXQ9+NEfE5Yt5TInAqe1o4n+Nh+rh00AwoazppmUt8tdo6URhc5gkDcOYrcvlDVAZE7uG69nDpEGUKxw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", + "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", "dependencies": { "tslib": "^2.5.0" }, @@ -4670,19 +4696,19 @@ } }, "node_modules/@smithy/url-parser": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.0.1.tgz", - "integrity": "sha512-NpHVOAwddo+OyyIoujDL9zGL96piHWrTNXqltWmBvlUoWgt1HPyBuKs6oHjioyFnNZXUqveTOkEEq0U5w6Uv8A==", + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.0.12.tgz", + "integrity": "sha512-qgkW2mZqRvlNUcBkxYB/gYacRaAdck77Dk3/g2iw0S9F0EYthIS3loGfly8AwoWpIvHKhkTsCXXQfzksgZ4zIA==", "dependencies": { - "@smithy/querystring-parser": "^2.0.1", - "@smithy/types": "^2.0.2", + "@smithy/querystring-parser": "^2.0.12", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" } }, "node_modules/@smithy/url-parser/node_modules/@smithy/types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.0.2.tgz", - "integrity": "sha512-wcymEjIXQ9+NEfE5Yt5TInAqe1o4n+Nh+rh00AwoazppmUt8tdo6URhc5gkDcOYrcvlDVAZE7uG69nDpEGUKxw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", + "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", "dependencies": { "tslib": "^2.5.0" }, @@ -4711,9 +4737,9 @@ } }, "node_modules/@smithy/util-body-length-node": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-2.0.0.tgz", - "integrity": "sha512-ZV7Z/WHTMxHJe/xL/56qZwSUcl63/5aaPAGjkfynJm4poILjdD4GmFI+V+YWabh2WJIjwTKZ5PNsuvPQKt93Mg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-2.1.0.tgz", + "integrity": "sha512-/li0/kj/y3fQ3vyzn36NTLGmUwAICb7Jbe/CsWCktW363gh1MOcpEcSO3mJ344Gv2dqz8YJCLQpb6hju/0qOWw==", "dependencies": { "tslib": "^2.5.0" }, @@ -4745,12 +4771,13 @@ } }, "node_modules/@smithy/util-defaults-mode-browser": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.0.1.tgz", - "integrity": "sha512-w72Qwsb+IaEYEFtYICn0Do42eFju78hTaBzzJfT107lFOPdbjWjKnFutV+6GL/nZd5HWXY7ccAKka++C3NrjHw==", + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.0.16.tgz", + "integrity": "sha512-Uv5Cu8nVkuvLn0puX+R9zWbSNpLIR3AxUlPoLJ7hC5lvir8B2WVqVEkJLwtixKAncVLasnTVjPDCidtAUTGEQw==", "dependencies": { - "@smithy/property-provider": "^2.0.1", - "@smithy/types": "^2.0.2", + "@smithy/property-provider": "^2.0.13", + "@smithy/smithy-client": "^2.1.12", + "@smithy/types": "^2.4.0", "bowser": "^2.11.0", "tslib": "^2.5.0" }, @@ -4759,9 +4786,9 @@ } }, "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.0.2.tgz", - "integrity": "sha512-wcymEjIXQ9+NEfE5Yt5TInAqe1o4n+Nh+rh00AwoazppmUt8tdo6URhc5gkDcOYrcvlDVAZE7uG69nDpEGUKxw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", + "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", "dependencies": { "tslib": "^2.5.0" }, @@ -4770,15 +4797,16 @@ } }, "node_modules/@smithy/util-defaults-mode-node": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.0.1.tgz", - "integrity": "sha512-dNF45caelEBambo0SgkzQ0v76m4YM+aFKZNTtSafy7P5dVF8TbjZuR2UX1A5gJABD9XK6lzN+v/9Yfzj/EDgGg==", + "version": "2.0.22", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.0.22.tgz", + "integrity": "sha512-4nNsNBi4pj8nQX/cbRPzomyU/cptFr1OJckxo+nlRZdTZlj+raA8NI5sNF1kD4pyGyARuqDtWc9+xMhFHXIJmw==", "dependencies": { - "@smithy/config-resolver": "^2.0.1", - "@smithy/credential-provider-imds": "^2.0.1", - "@smithy/node-config-provider": "^2.0.1", - "@smithy/property-provider": "^2.0.1", - "@smithy/types": "^2.0.2", + "@smithy/config-resolver": "^2.0.17", + "@smithy/credential-provider-imds": "^2.1.0", + "@smithy/node-config-provider": "^2.1.4", + "@smithy/property-provider": "^2.0.13", + "@smithy/smithy-client": "^2.1.12", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -4786,9 +4814,33 @@ } }, "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.0.2.tgz", - "integrity": "sha512-wcymEjIXQ9+NEfE5Yt5TInAqe1o4n+Nh+rh00AwoazppmUt8tdo6URhc5gkDcOYrcvlDVAZE7uG69nDpEGUKxw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", + "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-endpoints": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-1.0.3.tgz", + "integrity": "sha512-rMYXLMdAMVbJAEHhNlCSJsAxo3NG3lcPja7WmesjAbNrMSyYZ6FnHHTy8kzRhddn4eAtLvPBSO6LiBB21gCoHQ==", + "dependencies": { + "@smithy/node-config-provider": "^2.1.4", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@smithy/util-endpoints/node_modules/@smithy/types": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", + "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", "dependencies": { "tslib": "^2.5.0" }, @@ -4808,9 +4860,21 @@ } }, "node_modules/@smithy/util-middleware": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-2.0.0.tgz", - "integrity": "sha512-eCWX4ECuDHn1wuyyDdGdUWnT4OGyIzV0LN1xRttBFMPI9Ff/4heSHVxneyiMtOB//zpXWCha1/SWHJOZstG7kA==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-2.0.5.tgz", + "integrity": "sha512-1lyT3TcaMJQe+OFfVI+TlomDkPuVzb27NZYdYtmSTltVmLaUjdCyt4KE+OH1CnhZKsz4/cdCL420Lg9UH5Z2Mw==", + "dependencies": { + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-middleware/node_modules/@smithy/types": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", + "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", "dependencies": { "tslib": "^2.5.0" }, @@ -4819,25 +4883,37 @@ } }, "node_modules/@smithy/util-retry": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-2.0.0.tgz", - "integrity": "sha512-/dvJ8afrElasuiiIttRJeoS2sy8YXpksQwiM/TcepqdRVp7u4ejd9C4IQURHNjlfPUT7Y6lCDSa2zQJbdHhVTg==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-2.0.5.tgz", + "integrity": "sha512-x3t1+MQAJ6QONk3GTbJNcugCFDVJ+Bkro5YqQQK1EyVesajNDqxFtCx9WdOFNGm/Cbm7tUdwVEmfKQOJoU2Vtw==", "dependencies": { - "@smithy/service-error-classification": "^2.0.0", + "@smithy/service-error-classification": "^2.0.5", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { "node": ">= 14.0.0" } }, + "node_modules/@smithy/util-retry/node_modules/@smithy/types": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", + "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@smithy/util-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.0.1.tgz", - "integrity": "sha512-2a0IOtwIKC46EEo7E7cxDN8u2jwOiYYJqcFKA6rd5rdXqKakHT2Gc+AqHWngr0IEHUfW92zX12wRQKwyoqZf2Q==", + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.0.17.tgz", + "integrity": "sha512-fP/ZQ27rRvHsqItds8yB7jerwMpZFTL3QqbQbidUiG0+mttMoKdP0ZqnvM8UK5q0/dfc3/pN7g4XKPXOU7oRWw==", "dependencies": { - "@smithy/fetch-http-handler": "^2.0.1", - "@smithy/node-http-handler": "^2.0.1", - "@smithy/types": "^2.0.2", + "@smithy/fetch-http-handler": "^2.2.4", + "@smithy/node-http-handler": "^2.1.8", + "@smithy/types": "^2.4.0", "@smithy/util-base64": "^2.0.0", "@smithy/util-buffer-from": "^2.0.0", "@smithy/util-hex-encoding": "^2.0.0", @@ -4849,9 +4925,9 @@ } }, "node_modules/@smithy/util-stream/node_modules/@smithy/types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.0.2.tgz", - "integrity": "sha512-wcymEjIXQ9+NEfE5Yt5TInAqe1o4n+Nh+rh00AwoazppmUt8tdo6URhc5gkDcOYrcvlDVAZE7uG69nDpEGUKxw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", + "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", "dependencies": { "tslib": "^2.5.0" }, @@ -4883,12 +4959,12 @@ } }, "node_modules/@smithy/util-waiter": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-2.0.1.tgz", - "integrity": "sha512-bSyGFicPRYuGFFWAr72UvYI7tE7KmEeFJJ5iaLuTTdo8RGaNBZ2kE25coGtzrejYh9AhwSfckBvbxgEDxIxhlA==", + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-2.0.12.tgz", + "integrity": "sha512-3sENmyVa1NnOPoiT2NCApPmu7ukP7S/v7kL9IxNmnygkDldn7/yK0TP42oPJLwB2k3mospNsSePIlqdXEUyPHA==", "dependencies": { - "@smithy/abort-controller": "^2.0.1", - "@smithy/types": "^2.0.2", + "@smithy/abort-controller": "^2.0.12", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -4896,9 +4972,9 @@ } }, "node_modules/@smithy/util-waiter/node_modules/@smithy/types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.0.2.tgz", - "integrity": "sha512-wcymEjIXQ9+NEfE5Yt5TInAqe1o4n+Nh+rh00AwoazppmUt8tdo6URhc5gkDcOYrcvlDVAZE7uG69nDpEGUKxw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", + "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", "dependencies": { "tslib": "^2.5.0" }, @@ -4928,20 +5004,18 @@ "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", "dev": true }, - "node_modules/@types/long": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", - "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" - }, "node_modules/@types/node": { - "version": "20.3.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.3.1.tgz", - "integrity": "sha512-EhcH/wvidPy1WeML3TtYFGR83UzjxeWRen9V402T8aUGYsCHOmfoisV3ZSg03gAFIbLq8TnWOJ0f4cALtnSEUg==" + "version": "20.9.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.9.0.tgz", + "integrity": "sha512-nekiGu2NDb1BcVofVcEKMIwzlx4NjHlcjhoxxKBNLtz15Y1z7MYf549DFvkHSId02Ax6kGwWntIBPC3l/JZcmw==", + "dependencies": { + "undici-types": "~5.26.4" + } }, "node_modules/@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + "version": "6.9.10", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.10.tgz", + "integrity": "sha512-3Gnx08Ns1sEoCrWssEgTSJs/rsT2vhGP+Ja9cnnk9k4ALxinORlQneLXFeFKOTJMOeZUFD1s7w+w2AphTpvzZw==" }, "node_modules/@tyriar/fibonacci-heap": { "version": "2.0.9", @@ -4972,10 +5046,9 @@ } }, "node_modules/acorn": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", - "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", - "dev": true, + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", "bin": { "acorn": "bin/acorn" }, @@ -4983,6 +5056,14 @@ "node": ">=0.4.0" } }, + "node_modules/acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "peerDependencies": { + "acorn": "^8" + } + }, "node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", @@ -5248,11 +5329,13 @@ } }, "node_modules/axios": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.0.tgz", + "integrity": "sha512-EZ1DYihju9pwVB+jg67ogm+Tmqc6JmhamRN6I4Zt8DfZu5lbcQGw3ozH9lFejSJgs/ibaef3A9PMXPLeefFGJg==", "dependencies": { - "follow-redirects": "^1.14.0" + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" } }, "node_modules/axobject-query": { @@ -5814,11 +5897,11 @@ } }, "node_modules/check-disk-space": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/check-disk-space/-/check-disk-space-3.4.0.tgz", - "integrity": "sha512-drVkSqfwA+TvuEhFipiR1OC9boEGZL5RrWvVsOthdcvQNXyCCuKkEiTOTXZ7qxSf/GLwq4GvzfrQD/Wz325hgw==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/check-disk-space/-/check-disk-space-3.3.1.tgz", + "integrity": "sha512-iOrT8yCZjSnyNZ43476FE2rnssvgw5hnuwOM0hm8Nj1qa0v4ieUUEbCyxxsEliaoDUb/75yCOL71zkDiDBLbMQ==", "engines": { - "node": ">=16" + "node": ">=12" } }, "node_modules/check-error": { @@ -5830,19 +5913,6 @@ "node": "*" } }, - "node_modules/chevrotain": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-10.5.0.tgz", - "integrity": "sha512-Pkv5rBY3+CsHOYfV5g/Vs5JY9WTHHDEKOlohI2XeygaZhUeqhAlldZ8Hz9cRmxu709bvS08YzxHdTPHhffc13A==", - "dependencies": { - "@chevrotain/cst-dts-gen": "10.5.0", - "@chevrotain/gast": "10.5.0", - "@chevrotain/types": "10.5.0", - "@chevrotain/utils": "10.5.0", - "lodash": "4.17.21", - "regexp-to-ast": "0.5.0" - } - }, "node_modules/chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", @@ -5895,6 +5965,11 @@ "resolved": "https://registry.npmjs.org/chroma-js/-/chroma-js-2.4.2.tgz", "integrity": "sha512-U9eDw6+wt7V8z5NncY2jJfZa+hUH8XEj8FQHgFJTrUFnJfXYf4Ml4adI2vXZOjqRDpFWtYVWypDfZwnJ+HIR4A==" }, + "node_modules/cjs-module-lexer": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==" + }, "node_modules/clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", @@ -7253,9 +7328,9 @@ "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==" }, "node_modules/follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", + "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", "funding": [ { "type": "individual", @@ -7415,9 +7490,12 @@ } }, "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/functional-red-black-tree": { "version": "1.0.1", @@ -7803,6 +7881,17 @@ "node": ">=8" } }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -7978,6 +8067,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/import-in-the-middle": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.4.2.tgz", + "integrity": "sha512-9WOz1Yh/cvO/p69sxRmhyQwrIGGSp7EIdcb+fFNVi7CzQGQB8U1/1XrKVSbEd/GNOAeM0peJtmi7+qphe7NvAw==", + "dependencies": { + "acorn": "^8.8.2", + "acorn-import-assertions": "^1.9.0", + "cjs-module-lexer": "^1.2.2", + "module-details-from-path": "^1.0.3" + } + }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -8126,12 +8226,11 @@ } }, "node_modules/is-core-module": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", - "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", - "dev": true, + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -8885,9 +8984,9 @@ } }, "node_modules/long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" }, "node_modules/lru-cache": { "version": "6.0.0", @@ -9261,6 +9360,11 @@ "node": ">=10" } }, + "node_modules/module-details-from-path": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz", + "integrity": "sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==" + }, "node_modules/moment": { "version": "2.29.4", "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", @@ -9354,23 +9458,25 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" }, "node_modules/newrelic": { - "version": "10.6.1", - "resolved": "https://registry.npmjs.org/newrelic/-/newrelic-10.6.1.tgz", - "integrity": "sha512-jtBOCcTDqEp7oWWpuFQQDhe4DEydxm6NzuloNzJANawWc94PT7abHknhXq+f4wtP6Ydzs8Uq9MdQBHkS9nQ2wQ==", + "version": "11.5.0", + "resolved": "https://registry.npmjs.org/newrelic/-/newrelic-11.5.0.tgz", + "integrity": "sha512-y1jZSAhcCKvzPXXTk29kEMKNl42RvN/nRe5WU7Fzi4nmxUxdn+m5GfSVu89hEsmJYJ8i2Rc6s4RGFX0kn9Hung==", "dependencies": { - "@grpc/grpc-js": "^1.8.10", + "@grpc/grpc-js": "^1.9.4", "@grpc/proto-loader": "^0.7.5", - "@mrleebo/prisma-ast": "^0.5.2", - "@newrelic/aws-sdk": "^6.0.0", - "@newrelic/koa": "^7.1.1", - "@newrelic/security-agent": "0.2.0", - "@newrelic/superagent": "^6.0.0", + "@newrelic/aws-sdk": "^7.0.2", + "@newrelic/koa": "^8.0.1", + "@newrelic/security-agent": "0.4.0", + "@newrelic/superagent": "^7.0.1", "@tyriar/fibonacci-heap": "^2.0.7", "concat-stream": "^2.0.0", - "https-proxy-agent": "^5.0.0", + "https-proxy-agent": "^7.0.1", + "import-in-the-middle": "^1.4.2", "json-bigint": "^1.0.0", "json-stringify-safe": "^5.0.0", + "module-details-from-path": "^1.0.3", "readable-stream": "^3.6.1", + "require-in-the-middle": "^7.2.0", "semver": "^7.5.2", "winston-transport": "^4.5.0" }, @@ -9378,12 +9484,36 @@ "newrelic-naming-rules": "bin/test-naming-rules.js" }, "engines": { - "node": ">=14", + "node": ">=16", "npm": ">=6.0.0" }, "optionalDependencies": { "@contrast/fn-inspect": "^3.3.0", - "@newrelic/native-metrics": "^9.0.1" + "@newrelic/native-metrics": "^10.0.0", + "@prisma/prisma-fmt-wasm": "^4.17.0-16.27eb2449f178cd9fe1a4b892d732cc4795f75085" + } + }, + "node_modules/newrelic/node_modules/agent-base": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/newrelic/node_modules/https-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz", + "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" } }, "node_modules/newrelic/node_modules/readable-stream": { @@ -10339,8 +10469,7 @@ "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "node_modules/path-to-regexp": { "version": "0.1.7", @@ -10642,9 +10771,9 @@ } }, "node_modules/protobufjs": { - "version": "7.2.4", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.4.tgz", - "integrity": "sha512-AT+RJgD2sH8phPmCf7OUZR8xGdcJRga4+1cOaXJ64hvcSkVhNcRHOwIxUatPH15+nj59WAGTDv3LSGZPEQbJaQ==", + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.5.tgz", + "integrity": "sha512-gGXRSXvxQ7UiPgfw8gevrfRWcTlSbOFg+p/N+JVJEK5VhueL2miT6qTymqAmjr1Q5WbOCyJbyrk6JfWKwlFn6A==", "hasInstallScript": true, "dependencies": { "@protobufjs/aspromise": "^1.1.2", @@ -10664,11 +10793,6 @@ "node": ">=12.0.0" } }, - "node_modules/protobufjs/node_modules/long": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", - "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" - }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -10681,6 +10805,11 @@ "node": ">= 0.10" } }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, "node_modules/pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", @@ -10842,11 +10971,6 @@ "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", "dev": true }, - "node_modules/regexp-to-ast": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/regexp-to-ast/-/regexp-to-ast-0.5.0.tgz", - "integrity": "sha512-tlbJqcMHnPKI9zSrystikWKwHkBqu2a/Sgw01h3zFjvYrMxEDYHzzoMZnUrbIfpTFEsoRnnviOXNCzFiSc54Qw==" - }, "node_modules/regexpp": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", @@ -10892,6 +11016,19 @@ "node": ">=0.10.0" } }, + "node_modules/require-in-the-middle": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.2.0.tgz", + "integrity": "sha512-3TLx5TGyAY6AOqLBoXmHkNql0HIf2RGbuMgCDT2WO/uGVAPJs6h7Kl+bN6TIZGd9bWhWPwnDnTHGtW8Iu77sdw==", + "dependencies": { + "debug": "^4.1.1", + "module-details-from-path": "^1.0.3", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=8.6.0" + } + }, "node_modules/require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", @@ -10906,12 +11043,11 @@ } }, "node_modules/resolve": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.21.0.tgz", - "integrity": "sha512-3wCbTpk5WJlyE4mSOtDLhqQmGFi0/TD9VPwmiolnk8U0wRgMEktqCXd3vy5buTO3tljvalNvKrjHEfrd2WpEKA==", - "dev": true, + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dependencies": { - "is-core-module": "^2.8.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -11522,7 +11658,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -11845,6 +11980,11 @@ "node": ">=14.0" } }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, "node_modules/unescape": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/unescape/-/unescape-1.0.1.tgz", @@ -12423,395 +12563,396 @@ } }, "@aws-sdk/client-lambda": { - "version": "3.379.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-lambda/-/client-lambda-3.379.1.tgz", - "integrity": "sha512-hQCVmcEglNGvEQjTNvut+NDL0orp97GaVOg4h+ZHIjsdNds0jFqWsoItSzfUeSy66YiMNoPwTWfjTc8jZQr5xg==", + "version": "3.448.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-lambda/-/client-lambda-3.448.0.tgz", + "integrity": "sha512-Px2DwJF65vsi7NwHZBZa3rzxRvOX5x5XYZx9P3NoYAevwH5htyiTG8TpndgmBi2PdeCOpb5lKuqorne5+WuwXg==", "requires": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.379.1", - "@aws-sdk/credential-provider-node": "3.379.1", - "@aws-sdk/middleware-host-header": "3.379.1", - "@aws-sdk/middleware-logger": "3.378.0", - "@aws-sdk/middleware-recursion-detection": "3.378.0", - "@aws-sdk/middleware-signing": "3.379.1", - "@aws-sdk/middleware-user-agent": "3.379.1", - "@aws-sdk/types": "3.378.0", - "@aws-sdk/util-endpoints": "3.378.0", - "@aws-sdk/util-user-agent-browser": "3.378.0", - "@aws-sdk/util-user-agent-node": "3.378.0", - "@smithy/config-resolver": "^2.0.1", - "@smithy/eventstream-serde-browser": "^2.0.1", - "@smithy/eventstream-serde-config-resolver": "^2.0.1", - "@smithy/eventstream-serde-node": "^2.0.1", - "@smithy/fetch-http-handler": "^2.0.1", - "@smithy/hash-node": "^2.0.1", - "@smithy/invalid-dependency": "^2.0.1", - "@smithy/middleware-content-length": "^2.0.1", - "@smithy/middleware-endpoint": "^2.0.1", - "@smithy/middleware-retry": "^2.0.1", - "@smithy/middleware-serde": "^2.0.1", - "@smithy/middleware-stack": "^2.0.0", - "@smithy/node-config-provider": "^2.0.1", - "@smithy/node-http-handler": "^2.0.1", - "@smithy/protocol-http": "^2.0.1", - "@smithy/smithy-client": "^2.0.1", - "@smithy/types": "^2.0.2", - "@smithy/url-parser": "^2.0.1", + "@aws-sdk/client-sts": "3.445.0", + "@aws-sdk/core": "3.445.0", + "@aws-sdk/credential-provider-node": "3.445.0", + "@aws-sdk/middleware-host-header": "3.433.0", + "@aws-sdk/middleware-logger": "3.433.0", + "@aws-sdk/middleware-recursion-detection": "3.433.0", + "@aws-sdk/middleware-signing": "3.433.0", + "@aws-sdk/middleware-user-agent": "3.438.0", + "@aws-sdk/region-config-resolver": "3.433.0", + "@aws-sdk/types": "3.433.0", + "@aws-sdk/util-endpoints": "3.438.0", + "@aws-sdk/util-user-agent-browser": "3.433.0", + "@aws-sdk/util-user-agent-node": "3.437.0", + "@smithy/config-resolver": "^2.0.16", + "@smithy/eventstream-serde-browser": "^2.0.12", + "@smithy/eventstream-serde-config-resolver": "^2.0.12", + "@smithy/eventstream-serde-node": "^2.0.12", + "@smithy/fetch-http-handler": "^2.2.4", + "@smithy/hash-node": "^2.0.12", + "@smithy/invalid-dependency": "^2.0.12", + "@smithy/middleware-content-length": "^2.0.14", + "@smithy/middleware-endpoint": "^2.1.3", + "@smithy/middleware-retry": "^2.0.18", + "@smithy/middleware-serde": "^2.0.12", + "@smithy/middleware-stack": "^2.0.6", + "@smithy/node-config-provider": "^2.1.3", + "@smithy/node-http-handler": "^2.1.8", + "@smithy/protocol-http": "^3.0.8", + "@smithy/smithy-client": "^2.1.12", + "@smithy/types": "^2.4.0", + "@smithy/url-parser": "^2.0.12", "@smithy/util-base64": "^2.0.0", "@smithy/util-body-length-browser": "^2.0.0", - "@smithy/util-body-length-node": "^2.0.0", - "@smithy/util-defaults-mode-browser": "^2.0.1", - "@smithy/util-defaults-mode-node": "^2.0.1", - "@smithy/util-retry": "^2.0.0", - "@smithy/util-stream": "^2.0.1", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.16", + "@smithy/util-defaults-mode-node": "^2.0.21", + "@smithy/util-endpoints": "^1.0.2", + "@smithy/util-retry": "^2.0.5", + "@smithy/util-stream": "^2.0.17", "@smithy/util-utf8": "^2.0.0", - "@smithy/util-waiter": "^2.0.1", + "@smithy/util-waiter": "^2.0.12", "tslib": "^2.5.0" }, "dependencies": { "@aws-sdk/client-sso": { - "version": "3.379.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.379.1.tgz", - "integrity": "sha512-2N16TPnRcq+seNP8VY/Zq7kfnrUOrJMbVNpyDZWGe5Qglua3n8v/FzxmXFNI87MiSODq8IHtiXhggWhefCd+TA==", - "requires": { - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/middleware-host-header": "3.379.1", - "@aws-sdk/middleware-logger": "3.378.0", - "@aws-sdk/middleware-recursion-detection": "3.378.0", - "@aws-sdk/middleware-user-agent": "3.379.1", - "@aws-sdk/types": "3.378.0", - "@aws-sdk/util-endpoints": "3.378.0", - "@aws-sdk/util-user-agent-browser": "3.378.0", - "@aws-sdk/util-user-agent-node": "3.378.0", - "@smithy/config-resolver": "^2.0.1", - "@smithy/fetch-http-handler": "^2.0.1", - "@smithy/hash-node": "^2.0.1", - "@smithy/invalid-dependency": "^2.0.1", - "@smithy/middleware-content-length": "^2.0.1", - "@smithy/middleware-endpoint": "^2.0.1", - "@smithy/middleware-retry": "^2.0.1", - "@smithy/middleware-serde": "^2.0.1", - "@smithy/middleware-stack": "^2.0.0", - "@smithy/node-config-provider": "^2.0.1", - "@smithy/node-http-handler": "^2.0.1", - "@smithy/protocol-http": "^2.0.1", - "@smithy/smithy-client": "^2.0.1", - "@smithy/types": "^2.0.2", - "@smithy/url-parser": "^2.0.1", - "@smithy/util-base64": "^2.0.0", - "@smithy/util-body-length-browser": "^2.0.0", - "@smithy/util-body-length-node": "^2.0.0", - "@smithy/util-defaults-mode-browser": "^2.0.1", - "@smithy/util-defaults-mode-node": "^2.0.1", - "@smithy/util-retry": "^2.0.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/client-sso-oidc": { - "version": "3.379.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.379.1.tgz", - "integrity": "sha512-B6hZ2ysPyvafCMf6gls1jHI/IUviVZ4+TURpNfUBqThg/hZ1IMxc4BLkXca6VlgzYR+bWU8GKiClS9fFH6mu0g==", + "version": "3.445.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.445.0.tgz", + "integrity": "sha512-me4LvqNnu6kxi+sW7t0AgMv1Yi64ikas0x2+5jv23o6Csg32w0S0xOjCTKQYahOA5CMFunWvlkFIfxbqs+Uo7w==", "requires": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/middleware-host-header": "3.379.1", - "@aws-sdk/middleware-logger": "3.378.0", - "@aws-sdk/middleware-recursion-detection": "3.378.0", - "@aws-sdk/middleware-user-agent": "3.379.1", - "@aws-sdk/types": "3.378.0", - "@aws-sdk/util-endpoints": "3.378.0", - "@aws-sdk/util-user-agent-browser": "3.378.0", - "@aws-sdk/util-user-agent-node": "3.378.0", - "@smithy/config-resolver": "^2.0.1", - "@smithy/fetch-http-handler": "^2.0.1", - "@smithy/hash-node": "^2.0.1", - "@smithy/invalid-dependency": "^2.0.1", - "@smithy/middleware-content-length": "^2.0.1", - "@smithy/middleware-endpoint": "^2.0.1", - "@smithy/middleware-retry": "^2.0.1", - "@smithy/middleware-serde": "^2.0.1", - "@smithy/middleware-stack": "^2.0.0", - "@smithy/node-config-provider": "^2.0.1", - "@smithy/node-http-handler": "^2.0.1", - "@smithy/protocol-http": "^2.0.1", - "@smithy/smithy-client": "^2.0.1", - "@smithy/types": "^2.0.2", - "@smithy/url-parser": "^2.0.1", + "@aws-sdk/core": "3.445.0", + "@aws-sdk/middleware-host-header": "3.433.0", + "@aws-sdk/middleware-logger": "3.433.0", + "@aws-sdk/middleware-recursion-detection": "3.433.0", + "@aws-sdk/middleware-user-agent": "3.438.0", + "@aws-sdk/region-config-resolver": "3.433.0", + "@aws-sdk/types": "3.433.0", + "@aws-sdk/util-endpoints": "3.438.0", + "@aws-sdk/util-user-agent-browser": "3.433.0", + "@aws-sdk/util-user-agent-node": "3.437.0", + "@smithy/config-resolver": "^2.0.16", + "@smithy/fetch-http-handler": "^2.2.4", + "@smithy/hash-node": "^2.0.12", + "@smithy/invalid-dependency": "^2.0.12", + "@smithy/middleware-content-length": "^2.0.14", + "@smithy/middleware-endpoint": "^2.1.3", + "@smithy/middleware-retry": "^2.0.18", + "@smithy/middleware-serde": "^2.0.12", + "@smithy/middleware-stack": "^2.0.6", + "@smithy/node-config-provider": "^2.1.3", + "@smithy/node-http-handler": "^2.1.8", + "@smithy/protocol-http": "^3.0.8", + "@smithy/smithy-client": "^2.1.12", + "@smithy/types": "^2.4.0", + "@smithy/url-parser": "^2.0.12", "@smithy/util-base64": "^2.0.0", "@smithy/util-body-length-browser": "^2.0.0", - "@smithy/util-body-length-node": "^2.0.0", - "@smithy/util-defaults-mode-browser": "^2.0.1", - "@smithy/util-defaults-mode-node": "^2.0.1", - "@smithy/util-retry": "^2.0.0", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.16", + "@smithy/util-defaults-mode-node": "^2.0.21", + "@smithy/util-endpoints": "^1.0.2", + "@smithy/util-retry": "^2.0.5", "@smithy/util-utf8": "^2.0.0", "tslib": "^2.5.0" } }, "@aws-sdk/client-sts": { - "version": "3.379.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.379.1.tgz", - "integrity": "sha512-gEnKuk9bYjThvmxCgOgCn1qa+rRX8IgIRE2+xhbWhlpDanozhkDq9aMB5moX4tBNYQEmi1LtGD+JOvOoZRnToQ==", + "version": "3.445.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.445.0.tgz", + "integrity": "sha512-ogbdqrS8x9O5BTot826iLnTQ6i4/F5BSi/74gycneCxYmAnYnyUBNOWVnynv6XZiEWyDJQCU2UtMd52aNGW1GA==", "requires": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/credential-provider-node": "3.379.1", - "@aws-sdk/middleware-host-header": "3.379.1", - "@aws-sdk/middleware-logger": "3.378.0", - "@aws-sdk/middleware-recursion-detection": "3.378.0", - "@aws-sdk/middleware-sdk-sts": "3.379.1", - "@aws-sdk/middleware-signing": "3.379.1", - "@aws-sdk/middleware-user-agent": "3.379.1", - "@aws-sdk/types": "3.378.0", - "@aws-sdk/util-endpoints": "3.378.0", - "@aws-sdk/util-user-agent-browser": "3.378.0", - "@aws-sdk/util-user-agent-node": "3.378.0", - "@smithy/config-resolver": "^2.0.1", - "@smithy/fetch-http-handler": "^2.0.1", - "@smithy/hash-node": "^2.0.1", - "@smithy/invalid-dependency": "^2.0.1", - "@smithy/middleware-content-length": "^2.0.1", - "@smithy/middleware-endpoint": "^2.0.1", - "@smithy/middleware-retry": "^2.0.1", - "@smithy/middleware-serde": "^2.0.1", - "@smithy/middleware-stack": "^2.0.0", - "@smithy/node-config-provider": "^2.0.1", - "@smithy/node-http-handler": "^2.0.1", - "@smithy/protocol-http": "^2.0.1", - "@smithy/smithy-client": "^2.0.1", - "@smithy/types": "^2.0.2", - "@smithy/url-parser": "^2.0.1", + "@aws-sdk/core": "3.445.0", + "@aws-sdk/credential-provider-node": "3.445.0", + "@aws-sdk/middleware-host-header": "3.433.0", + "@aws-sdk/middleware-logger": "3.433.0", + "@aws-sdk/middleware-recursion-detection": "3.433.0", + "@aws-sdk/middleware-sdk-sts": "3.433.0", + "@aws-sdk/middleware-signing": "3.433.0", + "@aws-sdk/middleware-user-agent": "3.438.0", + "@aws-sdk/region-config-resolver": "3.433.0", + "@aws-sdk/types": "3.433.0", + "@aws-sdk/util-endpoints": "3.438.0", + "@aws-sdk/util-user-agent-browser": "3.433.0", + "@aws-sdk/util-user-agent-node": "3.437.0", + "@smithy/config-resolver": "^2.0.16", + "@smithy/fetch-http-handler": "^2.2.4", + "@smithy/hash-node": "^2.0.12", + "@smithy/invalid-dependency": "^2.0.12", + "@smithy/middleware-content-length": "^2.0.14", + "@smithy/middleware-endpoint": "^2.1.3", + "@smithy/middleware-retry": "^2.0.18", + "@smithy/middleware-serde": "^2.0.12", + "@smithy/middleware-stack": "^2.0.6", + "@smithy/node-config-provider": "^2.1.3", + "@smithy/node-http-handler": "^2.1.8", + "@smithy/protocol-http": "^3.0.8", + "@smithy/smithy-client": "^2.1.12", + "@smithy/types": "^2.4.0", + "@smithy/url-parser": "^2.0.12", "@smithy/util-base64": "^2.0.0", "@smithy/util-body-length-browser": "^2.0.0", - "@smithy/util-body-length-node": "^2.0.0", - "@smithy/util-defaults-mode-browser": "^2.0.1", - "@smithy/util-defaults-mode-node": "^2.0.1", - "@smithy/util-retry": "^2.0.0", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.16", + "@smithy/util-defaults-mode-node": "^2.0.21", + "@smithy/util-endpoints": "^1.0.2", + "@smithy/util-retry": "^2.0.5", "@smithy/util-utf8": "^2.0.0", "fast-xml-parser": "4.2.5", "tslib": "^2.5.0" } }, "@aws-sdk/credential-provider-env": { - "version": "3.378.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.378.0.tgz", - "integrity": "sha512-B2OVdO9kBClDwGgWTBLAQwFV8qYTYGyVujg++1FZFSFMt8ORFdZ5fNpErvJtiSjYiOOQMzyBeSNhKyYNXCiJjQ==", + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.433.0.tgz", + "integrity": "sha512-Vl7Qz5qYyxBurMn6hfSiNJeUHSqfVUlMt0C1Bds3tCkl3IzecRWwyBOlxtxO3VCrgVeW3HqswLzCvhAFzPH6nQ==", "requires": { - "@aws-sdk/types": "3.378.0", + "@aws-sdk/types": "3.433.0", "@smithy/property-provider": "^2.0.0", - "@smithy/types": "^2.0.2", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" } }, "@aws-sdk/credential-provider-ini": { - "version": "3.379.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.379.1.tgz", - "integrity": "sha512-YhEsJIskzCFwIIKiMN9GSHQkgWwj/b7rq0ofhsXsCRimFtdVkmMlB9veE6vtFAuXpX/WOGWdlWek1az0V22uuw==", - "requires": { - "@aws-sdk/credential-provider-env": "3.378.0", - "@aws-sdk/credential-provider-process": "3.378.0", - "@aws-sdk/credential-provider-sso": "3.379.1", - "@aws-sdk/credential-provider-web-identity": "3.378.0", - "@aws-sdk/types": "3.378.0", + "version": "3.445.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.445.0.tgz", + "integrity": "sha512-R7IYSGjNZ5KKJwQJ2HNPemjpAMWvdce91i8w+/aHfqeGfTXrmYJu99PeGRyyBTKEumBaojyjTRvmO8HzS+/l7g==", + "requires": { + "@aws-sdk/credential-provider-env": "3.433.0", + "@aws-sdk/credential-provider-process": "3.433.0", + "@aws-sdk/credential-provider-sso": "3.445.0", + "@aws-sdk/credential-provider-web-identity": "3.433.0", + "@aws-sdk/types": "3.433.0", "@smithy/credential-provider-imds": "^2.0.0", "@smithy/property-provider": "^2.0.0", - "@smithy/shared-ini-file-loader": "^2.0.0", - "@smithy/types": "^2.0.2", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" } }, "@aws-sdk/credential-provider-node": { - "version": "3.379.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.379.1.tgz", - "integrity": "sha512-39Y4OHKn6a8lY8YJhSLLw08aZytWxfvSjM4ObIEnE6hjLl8gsL9vROKKITsh3q6iGQ1EDSWMWZL50aOh3LJUIg==", - "requires": { - "@aws-sdk/credential-provider-env": "3.378.0", - "@aws-sdk/credential-provider-ini": "3.379.1", - "@aws-sdk/credential-provider-process": "3.378.0", - "@aws-sdk/credential-provider-sso": "3.379.1", - "@aws-sdk/credential-provider-web-identity": "3.378.0", - "@aws-sdk/types": "3.378.0", + "version": "3.445.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.445.0.tgz", + "integrity": "sha512-zI4k4foSjQRKNEsouculRcz7IbLfuqdFxypDLYwn+qPNMqJwWJ7VxOOeBSPUpHFcd7CLSfbHN2JAhQ7M02gPTA==", + "requires": { + "@aws-sdk/credential-provider-env": "3.433.0", + "@aws-sdk/credential-provider-ini": "3.445.0", + "@aws-sdk/credential-provider-process": "3.433.0", + "@aws-sdk/credential-provider-sso": "3.445.0", + "@aws-sdk/credential-provider-web-identity": "3.433.0", + "@aws-sdk/types": "3.433.0", "@smithy/credential-provider-imds": "^2.0.0", "@smithy/property-provider": "^2.0.0", - "@smithy/shared-ini-file-loader": "^2.0.0", - "@smithy/types": "^2.0.2", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" } }, "@aws-sdk/credential-provider-process": { - "version": "3.378.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.378.0.tgz", - "integrity": "sha512-KFTIy7u+wXj3eDua4rgS0tODzMnXtXhAm1RxzCW9FL5JLBBrd82ymCj1Dp72217Sw5Do6NjCnDTTNkCHZMA77w==", + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.433.0.tgz", + "integrity": "sha512-W7FcGlQjio9Y/PepcZGRyl5Bpwb0uWU7qIUCh+u4+q2mW4D5ZngXg8V/opL9/I/p4tUH9VXZLyLGwyBSkdhL+A==", "requires": { - "@aws-sdk/types": "3.378.0", + "@aws-sdk/types": "3.433.0", "@smithy/property-provider": "^2.0.0", - "@smithy/shared-ini-file-loader": "^2.0.0", - "@smithy/types": "^2.0.2", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" } }, "@aws-sdk/credential-provider-sso": { - "version": "3.379.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.379.1.tgz", - "integrity": "sha512-PhGtu1+JbUntYP/5CSfazQhWsjUBiksEuhg9fLhYl5OAgZVjVygbgoNVUz/gM7gZJSEMsasTazkn7yZVzO/k7w==", + "version": "3.445.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.445.0.tgz", + "integrity": "sha512-gJz7kAiDecdhtApgXnxfZsXKsww8BnifDF9MAx9Dr4X6no47qYsCCS3XPuEyRiF9VebXvHOH0H260Zp3bVyniQ==", "requires": { - "@aws-sdk/client-sso": "3.379.1", - "@aws-sdk/token-providers": "3.379.1", - "@aws-sdk/types": "3.378.0", + "@aws-sdk/client-sso": "3.445.0", + "@aws-sdk/token-providers": "3.438.0", + "@aws-sdk/types": "3.433.0", "@smithy/property-provider": "^2.0.0", - "@smithy/shared-ini-file-loader": "^2.0.0", - "@smithy/types": "^2.0.2", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" } }, "@aws-sdk/credential-provider-web-identity": { - "version": "3.378.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.378.0.tgz", - "integrity": "sha512-GWjydOszhc4xDF8xuPtBvboglXQr0gwCW1oHAvmLcOT38+Hd6qnKywnMSeoXYRPgoKfF9TkWQgW1jxplzCG0UA==", + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.433.0.tgz", + "integrity": "sha512-RlwjP1I5wO+aPpwyCp23Mk8nmRbRL33hqRASy73c4JA2z2YiRua+ryt6MalIxehhwQU6xvXUKulJnPG9VaMFZg==", "requires": { - "@aws-sdk/types": "3.378.0", + "@aws-sdk/types": "3.433.0", "@smithy/property-provider": "^2.0.0", - "@smithy/types": "^2.0.2", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" } }, "@aws-sdk/middleware-host-header": { - "version": "3.379.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.379.1.tgz", - "integrity": "sha512-LI4KpAFWNWVr2aH2vRVblr0Y8tvDz23lj8LOmbDmCrzd5M21nxuocI/8nEAQj55LiTIf9Zs+dHCdsyegnFXdrA==", + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.433.0.tgz", + "integrity": "sha512-mBTq3UWv1UzeHG+OfUQ2MB/5GEkt5LTKFaUqzL7ESwzW8XtpBgXnjZvIwu3Vcd3sEetMwijwaGiJhY0ae/YyaA==", "requires": { - "@aws-sdk/types": "3.378.0", - "@smithy/protocol-http": "^2.0.1", - "@smithy/types": "^2.0.2", + "@aws-sdk/types": "3.433.0", + "@smithy/protocol-http": "^3.0.8", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" } }, "@aws-sdk/middleware-logger": { - "version": "3.378.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.378.0.tgz", - "integrity": "sha512-l1DyaDLm3KeBMNMuANI3scWh8Xvu248x+vw6Z7ExWOhGXFmQ1MW7YvASg/SdxWkhlF9HmkkTif1LdMB22x6QDA==", + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.433.0.tgz", + "integrity": "sha512-We346Fb5xGonTGVZC9Nvqtnqy74VJzYuTLLiuuftA5sbNzftBDy/22QCfvYSTOAl3bvif+dkDUzQY2ihc5PwOQ==", "requires": { - "@aws-sdk/types": "3.378.0", - "@smithy/types": "^2.0.2", + "@aws-sdk/types": "3.433.0", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" } }, "@aws-sdk/middleware-recursion-detection": { - "version": "3.378.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.378.0.tgz", - "integrity": "sha512-mUMfHAz0oGNIWiTZHTVJb+I515Hqs2zx1j36Le4MMiiaMkPW1SRUF1FIwGuc1wh6E8jB5q+XfEMriDjRi4TZRA==", + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.433.0.tgz", + "integrity": "sha512-HEvYC9PQlWY/ccUYtLvAlwwf1iCif2TSAmLNr3YTBRVa98x6jKL0hlCrHWYklFeqOGSKy6XhE+NGJMUII0/HaQ==", "requires": { - "@aws-sdk/types": "3.378.0", - "@smithy/protocol-http": "^2.0.1", - "@smithy/types": "^2.0.2", + "@aws-sdk/types": "3.433.0", + "@smithy/protocol-http": "^3.0.8", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" } }, "@aws-sdk/middleware-sdk-sts": { - "version": "3.379.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.379.1.tgz", - "integrity": "sha512-SK3gSyT0XbLiY12+AjLFYL9YngxOXHnZF3Z33Cdd4a+AUYrVBV7JBEEGD1Nlwrcmko+3XgaKlmgUaR5s91MYvg==", + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.433.0.tgz", + "integrity": "sha512-ORYbJnBejUyonFl5FwIqhvI3Cq6sAp9j+JpkKZtFNma9tFPdrhmYgfCeNH32H/wGTQV/tUoQ3luh0gA4cuk6DA==", "requires": { - "@aws-sdk/middleware-signing": "3.379.1", - "@aws-sdk/types": "3.378.0", - "@smithy/types": "^2.0.2", + "@aws-sdk/middleware-signing": "3.433.0", + "@aws-sdk/types": "3.433.0", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" } }, "@aws-sdk/middleware-signing": { - "version": "3.379.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.379.1.tgz", - "integrity": "sha512-kBk2ZUvR84EM4fICjr8K+Ykpf8SI1UzzPp2/UVYZ0X+4H/ZCjfSqohGRwHykMqeplne9qHSL7/rGJs1H3l3gPg==", + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.433.0.tgz", + "integrity": "sha512-jxPvt59NZo/epMNLNTu47ikmP8v0q217I6bQFGJG7JVFnfl36zDktMwGw+0xZR80qiK47/2BWrNpta61Zd2FxQ==", "requires": { - "@aws-sdk/types": "3.378.0", + "@aws-sdk/types": "3.433.0", "@smithy/property-provider": "^2.0.0", - "@smithy/protocol-http": "^2.0.1", + "@smithy/protocol-http": "^3.0.8", "@smithy/signature-v4": "^2.0.0", - "@smithy/types": "^2.0.2", - "@smithy/util-middleware": "^2.0.0", + "@smithy/types": "^2.4.0", + "@smithy/util-middleware": "^2.0.5", "tslib": "^2.5.0" } }, "@aws-sdk/middleware-user-agent": { - "version": "3.379.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.379.1.tgz", - "integrity": "sha512-4zIGeAIuutcRieAvovs82uBNhJBHuxfxaAUqrKiw49xUBG7xeNVUl+DYPSpbALbEIy4ujfwWCBOOWVCt6dyUZg==", - "requires": { - "@aws-sdk/types": "3.378.0", - "@aws-sdk/util-endpoints": "3.378.0", - "@smithy/protocol-http": "^2.0.1", - "@smithy/types": "^2.0.2", + "version": "3.438.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.438.0.tgz", + "integrity": "sha512-a+xHT1wOxT6EA6YyLmrfaroKWOkwwyiktUfXKM0FsUutGzNi4fKhb5NZ2al58NsXzHgHFrasSDp+Lqbd/X2cEw==", + "requires": { + "@aws-sdk/types": "3.433.0", + "@aws-sdk/util-endpoints": "3.438.0", + "@smithy/protocol-http": "^3.0.8", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" } }, "@aws-sdk/token-providers": { - "version": "3.379.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.379.1.tgz", - "integrity": "sha512-NlYPkArJ7A/txCrjqqkje+4hsv7pSOqm+Qdx3BUIOc7PRYrBVs/XwThxUkGceSntVXoNlO8g9DFL0NY53/wb8Q==", + "version": "3.438.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.438.0.tgz", + "integrity": "sha512-G2fUfTtU6/1ayYRMu0Pd9Ln4qYSvwJOWCqJMdkDgvXSwdgcOSOLsnAIk1AHGJDAvgLikdCzuyOsdJiexr9Vnww==", "requires": { - "@aws-sdk/client-sso-oidc": "3.379.1", - "@aws-sdk/types": "3.378.0", + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/middleware-host-header": "3.433.0", + "@aws-sdk/middleware-logger": "3.433.0", + "@aws-sdk/middleware-recursion-detection": "3.433.0", + "@aws-sdk/middleware-user-agent": "3.438.0", + "@aws-sdk/region-config-resolver": "3.433.0", + "@aws-sdk/types": "3.433.0", + "@aws-sdk/util-endpoints": "3.438.0", + "@aws-sdk/util-user-agent-browser": "3.433.0", + "@aws-sdk/util-user-agent-node": "3.437.0", + "@smithy/config-resolver": "^2.0.16", + "@smithy/fetch-http-handler": "^2.2.4", + "@smithy/hash-node": "^2.0.12", + "@smithy/invalid-dependency": "^2.0.12", + "@smithy/middleware-content-length": "^2.0.14", + "@smithy/middleware-endpoint": "^2.1.3", + "@smithy/middleware-retry": "^2.0.18", + "@smithy/middleware-serde": "^2.0.12", + "@smithy/middleware-stack": "^2.0.6", + "@smithy/node-config-provider": "^2.1.3", + "@smithy/node-http-handler": "^2.1.8", "@smithy/property-provider": "^2.0.0", - "@smithy/shared-ini-file-loader": "^2.0.0", - "@smithy/types": "^2.0.2", + "@smithy/protocol-http": "^3.0.8", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/smithy-client": "^2.1.12", + "@smithy/types": "^2.4.0", + "@smithy/url-parser": "^2.0.12", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.16", + "@smithy/util-defaults-mode-node": "^2.0.21", + "@smithy/util-endpoints": "^1.0.2", + "@smithy/util-retry": "^2.0.5", + "@smithy/util-utf8": "^2.0.0", "tslib": "^2.5.0" } }, "@aws-sdk/types": { - "version": "3.378.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.378.0.tgz", - "integrity": "sha512-qP0CvR/ItgktmN8YXpGQglzzR/6s0nrsQ4zIfx3HMwpsBTwuouYahcCtF1Vr82P4NFcoDA412EJahJ2pIqEd+w==", + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.433.0.tgz", + "integrity": "sha512-0jEE2mSrNDd8VGFjTc1otYrwYPIkzZJEIK90ZxisKvQ/EURGBhNzWn7ejWB9XCMFT6XumYLBR0V9qq5UPisWtA==", "requires": { - "@smithy/types": "^2.0.2", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" } }, "@aws-sdk/util-endpoints": { - "version": "3.378.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.378.0.tgz", - "integrity": "sha512-NU5C2l2xAXxpyB5nT0fIhahLPlJoJdzHWw4uC53KH9b4PrjHtgvgCN8beIsD3QxyfgeoM4A5J9Auo6WurfRnLw==", + "version": "3.438.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.438.0.tgz", + "integrity": "sha512-6VyPTq1kN3GWxwFt5DdZfOsr6cJZPLjWh0troY/0uUv3hK74C9o3Y0Xf/z8UAUvQFkVqZse12O0/BgPVMImvfA==", "requires": { - "@aws-sdk/types": "3.378.0", + "@aws-sdk/types": "3.433.0", + "@smithy/util-endpoints": "^1.0.2", "tslib": "^2.5.0" } }, "@aws-sdk/util-user-agent-browser": { - "version": "3.378.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.378.0.tgz", - "integrity": "sha512-FSCpagzftK1W+m7Ar6lpX7/Gr9y5P56nhFYz8U4EYQ4PkufS6czWX9YW+/FA5OYV0vlQ/SvPqMnzoHIPUNhZrQ==", + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.433.0.tgz", + "integrity": "sha512-2Cf/Lwvxbt5RXvWFXrFr49vXv0IddiUwrZoAiwhDYxvsh+BMnh+NUFot+ZQaTrk/8IPZVDeLPWZRdVy00iaVXQ==", "requires": { - "@aws-sdk/types": "3.378.0", - "@smithy/types": "^2.0.2", + "@aws-sdk/types": "3.433.0", + "@smithy/types": "^2.4.0", "bowser": "^2.11.0", "tslib": "^2.5.0" } }, "@aws-sdk/util-user-agent-node": { - "version": "3.378.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.378.0.tgz", - "integrity": "sha512-IdwVJV0E96MkJeFte4dlWqvB+oiqCiZ5lOlheY3W9NynTuuX0GGYNC8Y9yIsV8Oava1+ujpJq0ww6qXdYxmO4A==", + "version": "3.437.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.437.0.tgz", + "integrity": "sha512-JVEcvWaniamtYVPem4UthtCNoTBCfFTwYj7Y3CrWZ2Qic4TqrwLkAfaBGtI2TGrhIClVr77uzLI6exqMTN7orA==", "requires": { - "@aws-sdk/types": "3.378.0", - "@smithy/node-config-provider": "^2.0.1", - "@smithy/types": "^2.0.2", + "@aws-sdk/types": "3.433.0", + "@smithy/node-config-provider": "^2.1.3", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" } }, "@smithy/protocol-http": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-2.0.1.tgz", - "integrity": "sha512-mrkMAp0wtaDEIkgRObWYxI1Kun1tm6Iu6rK+X4utb6Ah7Uc3Kk4VIWwK/rBHdYGReiLIrxFCB1rq4a2gyZnSgg==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.8.tgz", + "integrity": "sha512-SHJvYeWq8q0FK8xHk+xjV9dzDUDjFMT+G1pZbV+XB6OVoac/FSVshlMNPeUJ8AmSkcDKHRu5vASnRqZHgD3qhw==", "requires": { - "@smithy/types": "^2.0.2", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" } }, "@smithy/types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.0.2.tgz", - "integrity": "sha512-wcymEjIXQ9+NEfE5Yt5TInAqe1o4n+Nh+rh00AwoazppmUt8tdo6URhc5gkDcOYrcvlDVAZE7uG69nDpEGUKxw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", + "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", "requires": { "tslib": "^2.5.0" } @@ -13344,6 +13485,15 @@ } } }, + "@aws-sdk/core": { + "version": "3.445.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.445.0.tgz", + "integrity": "sha512-6GYLElUG1QTOdmXG8zXa+Ull9IUeSeItKDYHKzHYfIkbsagMfYlf7wm9XIYlatjtgodNfZ3gPHAJfRyPmwKrsg==", + "requires": { + "@smithy/smithy-client": "^2.1.12", + "tslib": "^2.5.0" + } + }, "@aws-sdk/credential-provider-env": { "version": "3.357.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.357.0.tgz", @@ -14212,6 +14362,28 @@ "tslib": "^2.5.0" } }, + "@aws-sdk/region-config-resolver": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.433.0.tgz", + "integrity": "sha512-xpjRjCZW+CDFdcMmmhIYg81ST5UAnJh61IHziQEk0FXONrg4kjyYPZAOjEdzXQ+HxJQuGQLKPhRdzxmQnbX7pg==", + "requires": { + "@smithy/node-config-provider": "^2.1.3", + "@smithy/types": "^2.4.0", + "@smithy/util-config-provider": "^2.0.0", + "@smithy/util-middleware": "^2.0.5", + "tslib": "^2.5.0" + }, + "dependencies": { + "@smithy/types": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", + "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", + "requires": { + "tslib": "^2.5.0" + } + } + } + }, "@aws-sdk/service-error-classification": { "version": "3.357.0", "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.357.0.tgz", @@ -14869,35 +15041,6 @@ "to-fast-properties": "^2.0.0" } }, - "@chevrotain/cst-dts-gen": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/@chevrotain/cst-dts-gen/-/cst-dts-gen-10.5.0.tgz", - "integrity": "sha512-lhmC/FyqQ2o7pGK4Om+hzuDrm9rhFYIJ/AXoQBeongmn870Xeb0L6oGEiuR8nohFNL5sMaQEJWCxr1oIVIVXrw==", - "requires": { - "@chevrotain/gast": "10.5.0", - "@chevrotain/types": "10.5.0", - "lodash": "4.17.21" - } - }, - "@chevrotain/gast": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/@chevrotain/gast/-/gast-10.5.0.tgz", - "integrity": "sha512-pXdMJ9XeDAbgOWKuD1Fldz4ieCs6+nLNmyVhe2gZVqoO7v8HXuHYs5OV2EzUtbuai37TlOAQHrTDvxMnvMJz3A==", - "requires": { - "@chevrotain/types": "10.5.0", - "lodash": "4.17.21" - } - }, - "@chevrotain/types": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/@chevrotain/types/-/types-10.5.0.tgz", - "integrity": "sha512-f1MAia0x/pAVPWH/T73BJVyO2XU5tI4/iE7cnxb7tqdNTNhQI3Uq3XkqcoteTmD4t1aM0LbHCJOhgIDn07kl2A==" - }, - "@chevrotain/utils": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/@chevrotain/utils/-/utils-10.5.0.tgz", - "integrity": "sha512-hBzuU5+JjB2cqNZyszkDHZgOSrUUT8V3dhgRl8Q9Gp6dAj/H5+KILGjbhDpc3Iy9qmqlm/akuOI2ut9VUtzJxQ==" - }, "@colors/colors": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", @@ -15017,23 +15160,22 @@ "integrity": "sha512-JUFJad5lv7jxj926GPgymrWQxxjPYuJNiNjNMzqT+HiuP6Vl3dk5xzG+8sTX96np0ZAluvaMzPsjhHZ5rNuNQQ==" }, "@grpc/grpc-js": { - "version": "1.8.16", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.8.16.tgz", - "integrity": "sha512-Nvlq4V7XQmdRVDGgecR8ZPPCeY+uH1LhzbC+QxklwAahpQlq8YLsiOQgfkub9FiakRiohaDy361xqlTLkq9EHw==", + "version": "1.9.9", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.9.tgz", + "integrity": "sha512-vQ1qwi/Kiyprt+uhb1+rHMpyk4CVRMTGNUGGPRGS7pLNfWkdCHrGEnT6T3/JyC2VZgoOX/X1KwdoU0WYQAeYcQ==", "requires": { - "@grpc/proto-loader": "^0.7.0", + "@grpc/proto-loader": "^0.7.8", "@types/node": ">=12.12.47" } }, "@grpc/proto-loader": { - "version": "0.7.7", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.7.tgz", - "integrity": "sha512-1TIeXOi8TuSCQprPItwoMymZXxWT0CPxUhkrkeCUH+D8U7QDwQ6b7SUz2MaLuWM2llT+J/TVFLmQI5KtML3BhQ==", + "version": "0.7.10", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.10.tgz", + "integrity": "sha512-CAqDfoaQ8ykFd9zqBDn4k6iWT9loLAlc2ETmDFS9JCD70gDcnA4L3AFEo2iV7KyAtAAHFW9ftq1Fz+Vsgq80RQ==", "requires": { - "@types/long": "^4.0.1", "lodash.camelcase": "^4.3.0", - "long": "^4.0.0", - "protobufjs": "^7.0.0", + "long": "^5.0.0", + "protobufjs": "^7.2.4", "yargs": "^17.7.2" } }, @@ -15291,30 +15433,20 @@ "resolved": "https://registry.npmjs.org/@mapbox/sphericalmercator/-/sphericalmercator-1.2.0.tgz", "integrity": "sha512-ZTOuuwGuMOJN+HEmG/68bSEw15HHaMWmQ5gdTsWdWsjDe56K1kGvLOK6bOSC8gWgIvEO0w6un/2Gvv1q5hJSkQ==" }, - "@mrleebo/prisma-ast": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@mrleebo/prisma-ast/-/prisma-ast-0.5.2.tgz", - "integrity": "sha512-v2jwtrLt/x5/MaF7Sucsz/do8tDUmiq3KA+UYdyZfr3OQ2IGXUtpNSXmdlvyRM+vQ7Abn/FxpLW/qqhZGB9vhQ==", - "requires": { - "chevrotain": "^10.4.2" - } - }, "@newrelic/aws-sdk": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@newrelic/aws-sdk/-/aws-sdk-6.0.0.tgz", - "integrity": "sha512-17DwEvyDS9pAkV5kBSGtm2oIQbII0qOSAXSlU51MLA0Vp/PxNDTCBBFVgpKbGyKpPfudIJMGvh4jAmlzH3xIng==", - "requires": {} + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@newrelic/aws-sdk/-/aws-sdk-7.0.2.tgz", + "integrity": "sha512-nT19hzId0MbjR3v1ks5YetvNfrwIEgMfeai+T2pQkuWkjCsYm3z+OybLOYMCN66gueqOOqGTq60qhM4dFu5s5w==" }, "@newrelic/koa": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@newrelic/koa/-/koa-7.1.1.tgz", - "integrity": "sha512-QvO6Wmz+wws0vtrpqsZz3KVMbDySY7VbdIu99f9fuWd775yNCTz2n2VfQhdkBxWlSQSlR4gO0Uh8RWa4HUzb3g==", - "requires": {} + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@newrelic/koa/-/koa-8.0.1.tgz", + "integrity": "sha512-GyeZGKPllpUu6gWXRwVP/FlvE9+tU2lOprRiTdoXNM8jdVGL02IfHnvAzrIANoZoUdf3+Vev8NNeCup2Eojcvg==" }, "@newrelic/native-metrics": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/@newrelic/native-metrics/-/native-metrics-9.0.1.tgz", - "integrity": "sha512-ZMCd6xW9PWhrWvg8Ik0oFU+XGFLbqRujh15qu3+7FJRI8163RBOD6SS8tsU0ydG8+LlaPDZQp/ODD4LvBXu5UA==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@newrelic/native-metrics/-/native-metrics-10.0.1.tgz", + "integrity": "sha512-XJlKF3mCiFS/tZj6C79gdRYj+vQQtFSxbL83MMOVK/N025UHk8Oo8lF1ir7GOWk+Ll2xH4WI/t7i9SqDouXX+g==", "optional": true, "requires": { "https-proxy-agent": "^5.0.1", @@ -15334,13 +15466,13 @@ } }, "@newrelic/security-agent": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@newrelic/security-agent/-/security-agent-0.2.0.tgz", - "integrity": "sha512-sPUlYI99ursxaNq07TznLczmEWOjvOe5PkHe1ghjxolsZb5wy/DZYSmqIk9WuW5kNqyizUz+NNxc/7XqIAhpMw==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@newrelic/security-agent/-/security-agent-0.4.0.tgz", + "integrity": "sha512-NWwKf1yBKOscdASGLsO3U7op8cH3k+WrGrge6Q8BY2bR/LWn4HJ6kLLIWwrUso77mYDWHtgxG0YteUCIRvUOlQ==", "requires": { - "@aws-sdk/client-lambda": "^3.348.0", - "axios": "0.21.4", - "check-disk-space": "^3.4.0", + "@aws-sdk/client-lambda": "^3.405.0", + "axios": "1.6.0", + "check-disk-space": "3.3.1", "content-type": "^1.0.5", "fast-safe-stringify": "^2.1.1", "find-package-json": "^1.2.0", @@ -15354,11 +15486,11 @@ "pretty-bytes": "^5.6.0", "request-ip": "^3.3.0", "ringbufferjs": "^2.0.0", - "semver": "^7.5.3", + "semver": "^7.5.4", "sync-request": "^6.1.0", "unescape": "^1.0.1", "unescape-js": "^1.1.4", - "uuid": "^9.0.0", + "uuid": "^9.0.1", "ws": "^7.5.9" }, "dependencies": { @@ -15371,17 +15503,16 @@ } }, "uuid": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==" + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==" } } }, "@newrelic/superagent": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@newrelic/superagent/-/superagent-6.0.0.tgz", - "integrity": "sha512-5nClQp9ACd4BvLusAgFHjjKLDgAaC+dKmIsRNOPC82LOLFaoOgxxtbecnDIJ0NWCKQS+WOdmXdgYutwH+e5dsA==", - "requires": {} + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@newrelic/superagent/-/superagent-7.0.1.tgz", + "integrity": "sha512-QZlW0VxHSVOXcMAtlkg+Mth0Nz3vFku8rfzTEmoI/pXcckHXGEYuiVUhhboCTD3xTKVgnZRUp9BWF6SOggGUSw==" }, "@nicolo-ribaudo/eslint-scope-5-internals": { "version": "5.1.1-v1", @@ -15421,6 +15552,12 @@ "integrity": "sha512-QcaCIL/DlYJXedSfmjF+IRxKJbBUXBrjA5Gv0IiPlXXFFOkRnbPGKq6hmwBAAWyk1U03wyBHDFKVS3/9GnZV8g==", "requires": {} }, + "@prisma/prisma-fmt-wasm": { + "version": "4.17.0-16.27eb2449f178cd9fe1a4b892d732cc4795f75085", + "resolved": "https://registry.npmjs.org/@prisma/prisma-fmt-wasm/-/prisma-fmt-wasm-4.17.0-16.27eb2449f178cd9fe1a4b892d732cc4795f75085.tgz", + "integrity": "sha512-zYz3rFwPB82mVlHGknAPdnSY/a308dhPOblxQLcZgZTDRtDXOE1MgxoRAys+jekwR4/bm3+rZDPs1xsFMsPZig==", + "optional": true + }, "@protobufjs/aspromise": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", @@ -15529,18 +15666,18 @@ "dev": true }, "@smithy/abort-controller": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.0.1.tgz", - "integrity": "sha512-0s7XjIbsTwZyUW9OwXQ8J6x1UiA1TNCh60Vaw56nHahL7kUZsLhmTlWiaxfLkFtO2Utkj8YewcpHTYpxaTzO+w==", + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.0.12.tgz", + "integrity": "sha512-YIJyefe1mi3GxKdZxEBEuzYOeQ9xpYfqnFmWzojCssRAuR7ycxwpoRQgp965vuW426xUAQhCV5rCaWElQ7XsaA==", "requires": { - "@smithy/types": "^2.0.2", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "dependencies": { "@smithy/types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.0.2.tgz", - "integrity": "sha512-wcymEjIXQ9+NEfE5Yt5TInAqe1o4n+Nh+rh00AwoazppmUt8tdo6URhc5gkDcOYrcvlDVAZE7uG69nDpEGUKxw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", + "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", "requires": { "tslib": "^2.5.0" } @@ -15548,20 +15685,21 @@ } }, "@smithy/config-resolver": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.0.1.tgz", - "integrity": "sha512-l83Pm7hV+8CBQOCmBRopWDtF+CURUJol7NsuPYvimiDhkC2F8Ba9T1imSFE+pD1UIJ9jlsDPAnZfPJT5cjnuEw==", + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.0.17.tgz", + "integrity": "sha512-iQ8Q8ojqiPqRKdybDI1g7HvG8EcnekRnH3DYeNTrT26vDuPq2nomyMCc0DZnPW+uAUcLCGZpAmGTAvEOYX55wA==", "requires": { - "@smithy/types": "^2.0.2", + "@smithy/node-config-provider": "^2.1.4", + "@smithy/types": "^2.4.0", "@smithy/util-config-provider": "^2.0.0", - "@smithy/util-middleware": "^2.0.0", + "@smithy/util-middleware": "^2.0.5", "tslib": "^2.5.0" }, "dependencies": { "@smithy/types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.0.2.tgz", - "integrity": "sha512-wcymEjIXQ9+NEfE5Yt5TInAqe1o4n+Nh+rh00AwoazppmUt8tdo6URhc5gkDcOYrcvlDVAZE7uG69nDpEGUKxw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", + "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", "requires": { "tslib": "^2.5.0" } @@ -15569,21 +15707,21 @@ } }, "@smithy/credential-provider-imds": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.0.1.tgz", - "integrity": "sha512-8VxriuRINNEfVZjEFKBY75y9ZWAx73DZ5K/u+3LmB6r8WR2h3NaFxFKMlwlq0uzNdGhD1ouKBn9XWEGYHKiPLw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.1.0.tgz", + "integrity": "sha512-amqeueHM3i02S6z35WlXp7gejBnRloT5ctR/mQLlg/6LWGd70Avc2epzuuWtCptNg2ak5/yODD1fAVs9NPCyqg==", "requires": { - "@smithy/node-config-provider": "^2.0.1", - "@smithy/property-provider": "^2.0.1", - "@smithy/types": "^2.0.2", - "@smithy/url-parser": "^2.0.1", + "@smithy/node-config-provider": "^2.1.4", + "@smithy/property-provider": "^2.0.13", + "@smithy/types": "^2.4.0", + "@smithy/url-parser": "^2.0.12", "tslib": "^2.5.0" }, "dependencies": { "@smithy/types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.0.2.tgz", - "integrity": "sha512-wcymEjIXQ9+NEfE5Yt5TInAqe1o4n+Nh+rh00AwoazppmUt8tdo6URhc5gkDcOYrcvlDVAZE7uG69nDpEGUKxw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", + "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", "requires": { "tslib": "^2.5.0" } @@ -15591,20 +15729,20 @@ } }, "@smithy/eventstream-codec": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-2.0.1.tgz", - "integrity": "sha512-/IiNB7gQM2y2ZC/GAWOWDa8+iXfhr1g9Xe5979cQEOdCWDISvrAiv18cn3OtIQUhbYOR3gm7QtCpkq1to2takQ==", + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-2.0.12.tgz", + "integrity": "sha512-ZZQLzHBJkbiAAdj2C5K+lBlYp/XJ+eH2uy+jgJgYIFW/o5AM59Hlj7zyI44/ZTDIQWmBxb3EFv/c5t44V8/g8A==", "requires": { "@aws-crypto/crc32": "3.0.0", - "@smithy/types": "^2.0.2", + "@smithy/types": "^2.4.0", "@smithy/util-hex-encoding": "^2.0.0", "tslib": "^2.5.0" }, "dependencies": { "@smithy/types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.0.2.tgz", - "integrity": "sha512-wcymEjIXQ9+NEfE5Yt5TInAqe1o4n+Nh+rh00AwoazppmUt8tdo6URhc5gkDcOYrcvlDVAZE7uG69nDpEGUKxw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", + "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", "requires": { "tslib": "^2.5.0" } @@ -15612,19 +15750,19 @@ } }, "@smithy/eventstream-serde-browser": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-2.0.1.tgz", - "integrity": "sha512-9E1/6ZGF7nB/Td3G1kcatU7VjjP8eZ/p/Q+0KsZc1AUPyv4lR15pmWnWj3iGBEGYI9qZBJ/7a/wPEPayabmA3Q==", + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-2.0.12.tgz", + "integrity": "sha512-0pi8QlU/pwutNshoeJcbKR1p7Ie5STd8UFAMX5xhSoSJjNlxIv/OsHbF023jscMRN2Prrqd6ToGgdCnsZVQjvg==", "requires": { - "@smithy/eventstream-serde-universal": "^2.0.1", - "@smithy/types": "^2.0.2", + "@smithy/eventstream-serde-universal": "^2.0.12", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "dependencies": { "@smithy/types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.0.2.tgz", - "integrity": "sha512-wcymEjIXQ9+NEfE5Yt5TInAqe1o4n+Nh+rh00AwoazppmUt8tdo6URhc5gkDcOYrcvlDVAZE7uG69nDpEGUKxw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", + "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", "requires": { "tslib": "^2.5.0" } @@ -15632,18 +15770,18 @@ } }, "@smithy/eventstream-serde-config-resolver": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-2.0.1.tgz", - "integrity": "sha512-J8a+8HH8oDPIgq8Px/nPLfu9vpIjQ7XUPtP3orbs8KUh0GznNthSTy1xZP5RXjRqGQEkxPvsHf1po2+QOsgNFw==", + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-2.0.12.tgz", + "integrity": "sha512-I0XfwQkIX3gAnbrU5rLMkBSjTM9DHttdbLwf12CXmj7SSI5dT87PxtKLRrZGanaCMbdf2yCep+MW5/4M7IbvQA==", "requires": { - "@smithy/types": "^2.0.2", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "dependencies": { "@smithy/types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.0.2.tgz", - "integrity": "sha512-wcymEjIXQ9+NEfE5Yt5TInAqe1o4n+Nh+rh00AwoazppmUt8tdo6URhc5gkDcOYrcvlDVAZE7uG69nDpEGUKxw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", + "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", "requires": { "tslib": "^2.5.0" } @@ -15651,19 +15789,19 @@ } }, "@smithy/eventstream-serde-node": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-2.0.1.tgz", - "integrity": "sha512-wklowUz0zXJuqC7FMpriz66J8OAko3z6INTg+iMJWYB1bWv4pc5V7q36PxlZ0RKRbj0u+EThlozWgzE7Stz2Sw==", + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-2.0.12.tgz", + "integrity": "sha512-vf1vMHGOkG3uqN9x1zKOhnvW/XgvhJXWqjV6zZiT2FMjlEayugQ1mzpSqr7uf89+BzjTzuZKERmOsEAmewLbxw==", "requires": { - "@smithy/eventstream-serde-universal": "^2.0.1", - "@smithy/types": "^2.0.2", + "@smithy/eventstream-serde-universal": "^2.0.12", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "dependencies": { "@smithy/types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.0.2.tgz", - "integrity": "sha512-wcymEjIXQ9+NEfE5Yt5TInAqe1o4n+Nh+rh00AwoazppmUt8tdo6URhc5gkDcOYrcvlDVAZE7uG69nDpEGUKxw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", + "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", "requires": { "tslib": "^2.5.0" } @@ -15671,19 +15809,19 @@ } }, "@smithy/eventstream-serde-universal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-2.0.1.tgz", - "integrity": "sha512-WPPylIgVZ6wOYVgpF0Rs1LlocYyj248MRtKEEehnDvC+0tV7wmGt7H/SchCh10W4y4YUxuzPlW+mUvVMGmLSVg==", + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-2.0.12.tgz", + "integrity": "sha512-xZ3ZNpCxIND+q+UCy7y1n1/5VQEYicgSTNCcPqsKawX+Vd+6OcFX7gUHMyPzL8cZr+GdmJuxNleqHlH4giK2tw==", "requires": { - "@smithy/eventstream-codec": "^2.0.1", - "@smithy/types": "^2.0.2", + "@smithy/eventstream-codec": "^2.0.12", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "dependencies": { "@smithy/types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.0.2.tgz", - "integrity": "sha512-wcymEjIXQ9+NEfE5Yt5TInAqe1o4n+Nh+rh00AwoazppmUt8tdo6URhc5gkDcOYrcvlDVAZE7uG69nDpEGUKxw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", + "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", "requires": { "tslib": "^2.5.0" } @@ -15691,30 +15829,30 @@ } }, "@smithy/fetch-http-handler": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.0.1.tgz", - "integrity": "sha512-/SoU/ClazgcdOxgE4zA7RX8euiELwpsrKCSvulVQvu9zpmqJRyEJn8ZTWYFV17/eHOBdHTs9kqodhNhsNT+cUw==", + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.2.4.tgz", + "integrity": "sha512-gIPRFEGi+c6V52eauGKrjDzPWF2Cu7Z1r5F8A3j2wcwz25sPG/t8kjsbEhli/tS/2zJp/ybCZXe4j4ro3yv/HA==", "requires": { - "@smithy/protocol-http": "^2.0.1", - "@smithy/querystring-builder": "^2.0.1", - "@smithy/types": "^2.0.2", + "@smithy/protocol-http": "^3.0.8", + "@smithy/querystring-builder": "^2.0.12", + "@smithy/types": "^2.4.0", "@smithy/util-base64": "^2.0.0", "tslib": "^2.5.0" }, "dependencies": { "@smithy/protocol-http": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-2.0.1.tgz", - "integrity": "sha512-mrkMAp0wtaDEIkgRObWYxI1Kun1tm6Iu6rK+X4utb6Ah7Uc3Kk4VIWwK/rBHdYGReiLIrxFCB1rq4a2gyZnSgg==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.8.tgz", + "integrity": "sha512-SHJvYeWq8q0FK8xHk+xjV9dzDUDjFMT+G1pZbV+XB6OVoac/FSVshlMNPeUJ8AmSkcDKHRu5vASnRqZHgD3qhw==", "requires": { - "@smithy/types": "^2.0.2", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" } }, "@smithy/types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.0.2.tgz", - "integrity": "sha512-wcymEjIXQ9+NEfE5Yt5TInAqe1o4n+Nh+rh00AwoazppmUt8tdo6URhc5gkDcOYrcvlDVAZE7uG69nDpEGUKxw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", + "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", "requires": { "tslib": "^2.5.0" } @@ -15722,20 +15860,20 @@ } }, "@smithy/hash-node": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.0.1.tgz", - "integrity": "sha512-oTKYimQdF4psX54ZonpcIE+MXjMUWFxLCNosjPkJPFQ9whRX0K/PFX/+JZGRQh3zO9RlEOEUIbhy9NO+Wha6hw==", + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.0.12.tgz", + "integrity": "sha512-fDZnTr5j9t5qcbeJ037aMZXxMka13Znqwrgy3PAqYj6Dm3XHXHftTH3q+NWgayUxl1992GFtQt1RuEzRMy3NnQ==", "requires": { - "@smithy/types": "^2.0.2", + "@smithy/types": "^2.4.0", "@smithy/util-buffer-from": "^2.0.0", "@smithy/util-utf8": "^2.0.0", "tslib": "^2.5.0" }, "dependencies": { "@smithy/types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.0.2.tgz", - "integrity": "sha512-wcymEjIXQ9+NEfE5Yt5TInAqe1o4n+Nh+rh00AwoazppmUt8tdo6URhc5gkDcOYrcvlDVAZE7uG69nDpEGUKxw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", + "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", "requires": { "tslib": "^2.5.0" } @@ -15743,18 +15881,18 @@ } }, "@smithy/invalid-dependency": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.0.1.tgz", - "integrity": "sha512-2q/Eb0AE662zwyMV+z+TL7deBwcHCgaZZGc0RItamBE8kak3MzCi/EZCNoFWoBfxgQ4jfR12wm8KKsSXhJzJtQ==", + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.0.12.tgz", + "integrity": "sha512-p5Y+iMHV3SoEpy3VSR7mifbreHQwVSvHSAz/m4GdoXfOzKzaYC8hYv10Ks7Deblkf7lhas8U+lAp9ThbBM+ZXA==", "requires": { - "@smithy/types": "^2.0.2", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "dependencies": { "@smithy/types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.0.2.tgz", - "integrity": "sha512-wcymEjIXQ9+NEfE5Yt5TInAqe1o4n+Nh+rh00AwoazppmUt8tdo6URhc5gkDcOYrcvlDVAZE7uG69nDpEGUKxw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", + "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", "requires": { "tslib": "^2.5.0" } @@ -15770,28 +15908,28 @@ } }, "@smithy/middleware-content-length": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.0.1.tgz", - "integrity": "sha512-IZhRSk5GkVBcrKaqPXddBS2uKhaqwBgaSgbBb1OJyGsKe7SxRFbclWS0LqOR9fKUkDl+3lL8E2ffpo6EQg0igw==", + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.0.14.tgz", + "integrity": "sha512-poUNgKTw9XwPXfX9nEHpVgrMNVpaSMZbshqvPxFVoalF4wp6kRzYKOfdesSVectlQ51VtigoLfbXcdyPwvxgTg==", "requires": { - "@smithy/protocol-http": "^2.0.1", - "@smithy/types": "^2.0.2", + "@smithy/protocol-http": "^3.0.8", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "dependencies": { "@smithy/protocol-http": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-2.0.1.tgz", - "integrity": "sha512-mrkMAp0wtaDEIkgRObWYxI1Kun1tm6Iu6rK+X4utb6Ah7Uc3Kk4VIWwK/rBHdYGReiLIrxFCB1rq4a2gyZnSgg==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.8.tgz", + "integrity": "sha512-SHJvYeWq8q0FK8xHk+xjV9dzDUDjFMT+G1pZbV+XB6OVoac/FSVshlMNPeUJ8AmSkcDKHRu5vASnRqZHgD3qhw==", "requires": { - "@smithy/types": "^2.0.2", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" } }, "@smithy/types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.0.2.tgz", - "integrity": "sha512-wcymEjIXQ9+NEfE5Yt5TInAqe1o4n+Nh+rh00AwoazppmUt8tdo6URhc5gkDcOYrcvlDVAZE7uG69nDpEGUKxw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", + "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", "requires": { "tslib": "^2.5.0" } @@ -15799,21 +15937,23 @@ } }, "@smithy/middleware-endpoint": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.0.1.tgz", - "integrity": "sha512-uz/KI1MBd9WHrrkVFZO4L4Wyv24raf0oR4EsOYEeG5jPJO5U+C7MZGLcMxX8gWERDn1sycBDqmGv8fjUMLxT6w==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.1.4.tgz", + "integrity": "sha512-fNUTsdTkM/RUu77AljH7fD3O0sFKDPNn1dFMR1oLAuJLOq4r6yjnL7Uc/F7wOgzgw1KRqqEnqAZccyAX2iEa4Q==", "requires": { - "@smithy/middleware-serde": "^2.0.1", - "@smithy/types": "^2.0.2", - "@smithy/url-parser": "^2.0.1", - "@smithy/util-middleware": "^2.0.0", + "@smithy/middleware-serde": "^2.0.12", + "@smithy/node-config-provider": "^2.1.4", + "@smithy/shared-ini-file-loader": "^2.2.3", + "@smithy/types": "^2.4.0", + "@smithy/url-parser": "^2.0.12", + "@smithy/util-middleware": "^2.0.5", "tslib": "^2.5.0" }, "dependencies": { "@smithy/types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.0.2.tgz", - "integrity": "sha512-wcymEjIXQ9+NEfE5Yt5TInAqe1o4n+Nh+rh00AwoazppmUt8tdo6URhc5gkDcOYrcvlDVAZE7uG69nDpEGUKxw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", + "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", "requires": { "tslib": "^2.5.0" } @@ -15821,32 +15961,33 @@ } }, "@smithy/middleware-retry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.0.1.tgz", - "integrity": "sha512-NKHF4i0gjSyjO6C0ZyjEpNqzGgIu7s8HOK6oT/1Jqws2Q1GynR1xV8XTUs1gKXeaNRzbzKQRewHHmfPwZjOtHA==", - "requires": { - "@smithy/protocol-http": "^2.0.1", - "@smithy/service-error-classification": "^2.0.0", - "@smithy/types": "^2.0.2", - "@smithy/util-middleware": "^2.0.0", - "@smithy/util-retry": "^2.0.0", + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.0.19.tgz", + "integrity": "sha512-VMS1GHxLpRnuLHrPTj/nb9aD99jJsNzWX07F00fIuV9lkz3lWP7RUM7P1aitm0+4YfhShPn+Wri8/CuoqPOziA==", + "requires": { + "@smithy/node-config-provider": "^2.1.4", + "@smithy/protocol-http": "^3.0.8", + "@smithy/service-error-classification": "^2.0.5", + "@smithy/types": "^2.4.0", + "@smithy/util-middleware": "^2.0.5", + "@smithy/util-retry": "^2.0.5", "tslib": "^2.5.0", "uuid": "^8.3.2" }, "dependencies": { "@smithy/protocol-http": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-2.0.1.tgz", - "integrity": "sha512-mrkMAp0wtaDEIkgRObWYxI1Kun1tm6Iu6rK+X4utb6Ah7Uc3Kk4VIWwK/rBHdYGReiLIrxFCB1rq4a2gyZnSgg==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.8.tgz", + "integrity": "sha512-SHJvYeWq8q0FK8xHk+xjV9dzDUDjFMT+G1pZbV+XB6OVoac/FSVshlMNPeUJ8AmSkcDKHRu5vASnRqZHgD3qhw==", "requires": { - "@smithy/types": "^2.0.2", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" } }, "@smithy/types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.0.2.tgz", - "integrity": "sha512-wcymEjIXQ9+NEfE5Yt5TInAqe1o4n+Nh+rh00AwoazppmUt8tdo6URhc5gkDcOYrcvlDVAZE7uG69nDpEGUKxw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", + "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", "requires": { "tslib": "^2.5.0" } @@ -15854,18 +15995,18 @@ } }, "@smithy/middleware-serde": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.0.1.tgz", - "integrity": "sha512-uKxPaC6ItH9ZXdpdqNtf8sda7GcU4SPMp0tomq/5lUg9oiMa/Q7+kD35MUrpKaX3IVXVrwEtkjCU9dogZ/RAUA==", + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.0.12.tgz", + "integrity": "sha512-IBeco157lIScecq2Z+n0gq56i4MTnfKxS7rbfrAORveDJgnbBAaEQgYqMqp/cYqKrpvEXcyTjwKHrBjCCIZh2A==", "requires": { - "@smithy/types": "^2.0.2", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "dependencies": { "@smithy/types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.0.2.tgz", - "integrity": "sha512-wcymEjIXQ9+NEfE5Yt5TInAqe1o4n+Nh+rh00AwoazppmUt8tdo6URhc5gkDcOYrcvlDVAZE7uG69nDpEGUKxw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", + "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", "requires": { "tslib": "^2.5.0" } @@ -15873,28 +16014,39 @@ } }, "@smithy/middleware-stack": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-2.0.0.tgz", - "integrity": "sha512-31XC1xNF65nlbc16yuh3wwTudmqs6qy4EseQUGF8A/p2m/5wdd/cnXJqpniy/XvXVwkHPz/GwV36HqzHtIKATQ==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-2.0.6.tgz", + "integrity": "sha512-YSvNZeOKWLJ0M/ycxwDIe2Ztkp6Qixmcml1ggsSv2fdHKGkBPhGrX5tMzPGMI1yyx55UEYBi2OB4s+RriXX48A==", "requires": { + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" + }, + "dependencies": { + "@smithy/types": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", + "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", + "requires": { + "tslib": "^2.5.0" + } + } } }, "@smithy/node-config-provider": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.0.1.tgz", - "integrity": "sha512-Zoel4CPkKRTQ2XxmozZUfqBYqjPKL53/SvTDhJHj+VBSiJy6MXRav1iDCyFPS92t40Uh+Yi+Km5Ch3hQ+c/zSA==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.1.4.tgz", + "integrity": "sha512-kROLnHFatpimtmZ8YefsRRb5OJ8LVIVNhUWp67KHL4D2Vjd+WpIHMzWtkLLV4p0qXpY+IxmwcL2d2XMPn8ppsQ==", "requires": { - "@smithy/property-provider": "^2.0.1", - "@smithy/shared-ini-file-loader": "^2.0.1", - "@smithy/types": "^2.0.2", + "@smithy/property-provider": "^2.0.13", + "@smithy/shared-ini-file-loader": "^2.2.3", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "dependencies": { "@smithy/types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.0.2.tgz", - "integrity": "sha512-wcymEjIXQ9+NEfE5Yt5TInAqe1o4n+Nh+rh00AwoazppmUt8tdo6URhc5gkDcOYrcvlDVAZE7uG69nDpEGUKxw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", + "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", "requires": { "tslib": "^2.5.0" } @@ -15902,30 +16054,30 @@ } }, "@smithy/node-http-handler": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.0.1.tgz", - "integrity": "sha512-Zv3fxk3p9tsmPT2CKMsbuwbbxnq2gzLDIulxv+yI6aE+02WPYorObbbe9gh7SW3weadMODL1vTfOoJ9yFypDzg==", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.1.8.tgz", + "integrity": "sha512-KZylM7Wff/So5SmCiwg2kQNXJ+RXgz34wkxS7WNwIUXuZrZZpY/jKJCK+ZaGyuESDu3TxcaY+zeYGJmnFKbQsA==", "requires": { - "@smithy/abort-controller": "^2.0.1", - "@smithy/protocol-http": "^2.0.1", - "@smithy/querystring-builder": "^2.0.1", - "@smithy/types": "^2.0.2", + "@smithy/abort-controller": "^2.0.12", + "@smithy/protocol-http": "^3.0.8", + "@smithy/querystring-builder": "^2.0.12", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "dependencies": { "@smithy/protocol-http": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-2.0.1.tgz", - "integrity": "sha512-mrkMAp0wtaDEIkgRObWYxI1Kun1tm6Iu6rK+X4utb6Ah7Uc3Kk4VIWwK/rBHdYGReiLIrxFCB1rq4a2gyZnSgg==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.8.tgz", + "integrity": "sha512-SHJvYeWq8q0FK8xHk+xjV9dzDUDjFMT+G1pZbV+XB6OVoac/FSVshlMNPeUJ8AmSkcDKHRu5vASnRqZHgD3qhw==", "requires": { - "@smithy/types": "^2.0.2", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" } }, "@smithy/types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.0.2.tgz", - "integrity": "sha512-wcymEjIXQ9+NEfE5Yt5TInAqe1o4n+Nh+rh00AwoazppmUt8tdo6URhc5gkDcOYrcvlDVAZE7uG69nDpEGUKxw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", + "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", "requires": { "tslib": "^2.5.0" } @@ -15933,18 +16085,18 @@ } }, "@smithy/property-provider": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.0.1.tgz", - "integrity": "sha512-pmJRyY9SF6sutWIktIhe+bUdSQDxv/qZ4mYr3/u+u45riTPN7nmRxPo+e4sjWVoM0caKFjRSlj3tf5teRFy0Vg==", + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.0.13.tgz", + "integrity": "sha512-VJqUf2CbsQX6uUiC5dUPuoEATuFjkbkW3lJHbRnpk9EDC9X+iKqhfTK+WP+lve5EQ9TcCI1Q6R7hrg41FyC54w==", "requires": { - "@smithy/types": "^2.0.2", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "dependencies": { "@smithy/types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.0.2.tgz", - "integrity": "sha512-wcymEjIXQ9+NEfE5Yt5TInAqe1o4n+Nh+rh00AwoazppmUt8tdo6URhc5gkDcOYrcvlDVAZE7uG69nDpEGUKxw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", + "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", "requires": { "tslib": "^2.5.0" } @@ -15961,19 +16113,19 @@ } }, "@smithy/querystring-builder": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.0.1.tgz", - "integrity": "sha512-bp+93WFzx1FojVEIeFPtG0A1pKsFdCUcZvVdZdRlmNooOUrz9Mm9bneRd8hDwAQ37pxiZkCOxopSXXRQN10mYw==", + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.0.12.tgz", + "integrity": "sha512-cDbF07IuCjiN8CdGvPzfJjXIrmDSelScRfyJYrYBNBbKl2+k7QD/KqiHhtRyEKgID5mmEVrV6KE6L/iPJ98sFw==", "requires": { - "@smithy/types": "^2.0.2", + "@smithy/types": "^2.4.0", "@smithy/util-uri-escape": "^2.0.0", "tslib": "^2.5.0" }, "dependencies": { "@smithy/types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.0.2.tgz", - "integrity": "sha512-wcymEjIXQ9+NEfE5Yt5TInAqe1o4n+Nh+rh00AwoazppmUt8tdo6URhc5gkDcOYrcvlDVAZE7uG69nDpEGUKxw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", + "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", "requires": { "tslib": "^2.5.0" } @@ -15981,18 +16133,18 @@ } }, "@smithy/querystring-parser": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.0.1.tgz", - "integrity": "sha512-h+e7k1z+IvI2sSbUBG9Aq46JsgLl4UqIUl6aigAlRBj+P6ocNXpM6Yn1vMBw5ijtXeZbYpd1YvCxwDgdw3jhmg==", + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.0.12.tgz", + "integrity": "sha512-fytyTcXaMzPBuNtPlhj5v6dbl4bJAnwKZFyyItAGt4Tgm9HFPZNo7a9r1SKPr/qdxUEBzvL9Rh+B9SkTX3kFxg==", "requires": { - "@smithy/types": "^2.0.2", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "dependencies": { "@smithy/types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.0.2.tgz", - "integrity": "sha512-wcymEjIXQ9+NEfE5Yt5TInAqe1o4n+Nh+rh00AwoazppmUt8tdo6URhc5gkDcOYrcvlDVAZE7uG69nDpEGUKxw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", + "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", "requires": { "tslib": "^2.5.0" } @@ -16000,23 +16152,36 @@ } }, "@smithy/service-error-classification": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-2.0.0.tgz", - "integrity": "sha512-2z5Nafy1O0cTf69wKyNjGW/sNVMiqDnb4jgwfMG8ye8KnFJ5qmJpDccwIbJNhXIfbsxTg9SEec2oe1cexhMJvw==" + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-2.0.5.tgz", + "integrity": "sha512-M0SeJnEgD2ywJyV99Fb1yKFzmxDe9JfpJiYTVSRMyRLc467BPU0qsuuDPzMCdB1mU8M8u1rVOdkqdoyFN8UFTw==", + "requires": { + "@smithy/types": "^2.4.0" + }, + "dependencies": { + "@smithy/types": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", + "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", + "requires": { + "tslib": "^2.5.0" + } + } + } }, "@smithy/shared-ini-file-loader": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.0.1.tgz", - "integrity": "sha512-a463YiZrPGvM+F336rIF8pLfQsHAdCRAn/BiI/EWzg5xLoxbC7GSxIgliDDXrOu0z8gT3nhVsif85eU6jyct3A==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.2.3.tgz", + "integrity": "sha512-VDyhCNycPbNkPidMnBgYQeSwJkoATRFm5VrveVqIPAjsdGutf7yZpPycuDWW9bRFnuuwaBhCC0pA7KCH0+2wrg==", "requires": { - "@smithy/types": "^2.0.2", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "dependencies": { "@smithy/types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.0.2.tgz", - "integrity": "sha512-wcymEjIXQ9+NEfE5Yt5TInAqe1o4n+Nh+rh00AwoazppmUt8tdo6URhc5gkDcOYrcvlDVAZE7uG69nDpEGUKxw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", + "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", "requires": { "tslib": "^2.5.0" } @@ -16024,24 +16189,24 @@ } }, "@smithy/signature-v4": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.0.1.tgz", - "integrity": "sha512-jztv5Mirca42ilxmMDjzLdXcoAmRhZskGafGL49sRo5u7swEZcToEFrq6vtX5YMbSyTVrE9Teog5EFexY5Ff2Q==", + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.0.12.tgz", + "integrity": "sha512-6Kc2lCZEVmb1nNYngyNbWpq0d82OZwITH11SW/Q0U6PX5fH7B2cIcFe7o6eGEFPkTZTP8itTzmYiGcECL0D0Lw==", "requires": { - "@smithy/eventstream-codec": "^2.0.1", + "@smithy/eventstream-codec": "^2.0.12", "@smithy/is-array-buffer": "^2.0.0", - "@smithy/types": "^2.0.2", + "@smithy/types": "^2.4.0", "@smithy/util-hex-encoding": "^2.0.0", - "@smithy/util-middleware": "^2.0.0", + "@smithy/util-middleware": "^2.0.5", "@smithy/util-uri-escape": "^2.0.0", "@smithy/util-utf8": "^2.0.0", "tslib": "^2.5.0" }, "dependencies": { "@smithy/types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.0.2.tgz", - "integrity": "sha512-wcymEjIXQ9+NEfE5Yt5TInAqe1o4n+Nh+rh00AwoazppmUt8tdo6URhc5gkDcOYrcvlDVAZE7uG69nDpEGUKxw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", + "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", "requires": { "tslib": "^2.5.0" } @@ -16049,20 +16214,20 @@ } }, "@smithy/smithy-client": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.0.1.tgz", - "integrity": "sha512-LHC5m6tYpEu1iNbONfvMbwtErboyTZJfEIPoD78Ei5MVr36vZQCaCla5mvo36+q/a2NAk2//fA5Rx3I1Kf7+lQ==", + "version": "2.1.12", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.1.12.tgz", + "integrity": "sha512-XXqhridfkKnpj+lt8vM6HRlZbqUAqBjVC74JIi13F/AYQd/zTj9SOyGfxnbp4mjY9q28LityxIuV8CTinr9r5w==", "requires": { - "@smithy/middleware-stack": "^2.0.0", - "@smithy/types": "^2.0.2", - "@smithy/util-stream": "^2.0.1", + "@smithy/middleware-stack": "^2.0.6", + "@smithy/types": "^2.4.0", + "@smithy/util-stream": "^2.0.17", "tslib": "^2.5.0" }, "dependencies": { "@smithy/types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.0.2.tgz", - "integrity": "sha512-wcymEjIXQ9+NEfE5Yt5TInAqe1o4n+Nh+rh00AwoazppmUt8tdo6URhc5gkDcOYrcvlDVAZE7uG69nDpEGUKxw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", + "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", "requires": { "tslib": "^2.5.0" } @@ -16078,19 +16243,19 @@ } }, "@smithy/url-parser": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.0.1.tgz", - "integrity": "sha512-NpHVOAwddo+OyyIoujDL9zGL96piHWrTNXqltWmBvlUoWgt1HPyBuKs6oHjioyFnNZXUqveTOkEEq0U5w6Uv8A==", + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.0.12.tgz", + "integrity": "sha512-qgkW2mZqRvlNUcBkxYB/gYacRaAdck77Dk3/g2iw0S9F0EYthIS3loGfly8AwoWpIvHKhkTsCXXQfzksgZ4zIA==", "requires": { - "@smithy/querystring-parser": "^2.0.1", - "@smithy/types": "^2.0.2", + "@smithy/querystring-parser": "^2.0.12", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "dependencies": { "@smithy/types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.0.2.tgz", - "integrity": "sha512-wcymEjIXQ9+NEfE5Yt5TInAqe1o4n+Nh+rh00AwoazppmUt8tdo6URhc5gkDcOYrcvlDVAZE7uG69nDpEGUKxw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", + "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", "requires": { "tslib": "^2.5.0" } @@ -16115,9 +16280,9 @@ } }, "@smithy/util-body-length-node": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-2.0.0.tgz", - "integrity": "sha512-ZV7Z/WHTMxHJe/xL/56qZwSUcl63/5aaPAGjkfynJm4poILjdD4GmFI+V+YWabh2WJIjwTKZ5PNsuvPQKt93Mg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-2.1.0.tgz", + "integrity": "sha512-/li0/kj/y3fQ3vyzn36NTLGmUwAICb7Jbe/CsWCktW363gh1MOcpEcSO3mJ344Gv2dqz8YJCLQpb6hju/0qOWw==", "requires": { "tslib": "^2.5.0" } @@ -16140,20 +16305,21 @@ } }, "@smithy/util-defaults-mode-browser": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.0.1.tgz", - "integrity": "sha512-w72Qwsb+IaEYEFtYICn0Do42eFju78hTaBzzJfT107lFOPdbjWjKnFutV+6GL/nZd5HWXY7ccAKka++C3NrjHw==", + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.0.16.tgz", + "integrity": "sha512-Uv5Cu8nVkuvLn0puX+R9zWbSNpLIR3AxUlPoLJ7hC5lvir8B2WVqVEkJLwtixKAncVLasnTVjPDCidtAUTGEQw==", "requires": { - "@smithy/property-provider": "^2.0.1", - "@smithy/types": "^2.0.2", + "@smithy/property-provider": "^2.0.13", + "@smithy/smithy-client": "^2.1.12", + "@smithy/types": "^2.4.0", "bowser": "^2.11.0", "tslib": "^2.5.0" }, "dependencies": { "@smithy/types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.0.2.tgz", - "integrity": "sha512-wcymEjIXQ9+NEfE5Yt5TInAqe1o4n+Nh+rh00AwoazppmUt8tdo6URhc5gkDcOYrcvlDVAZE7uG69nDpEGUKxw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", + "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", "requires": { "tslib": "^2.5.0" } @@ -16161,22 +16327,43 @@ } }, "@smithy/util-defaults-mode-node": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.0.1.tgz", - "integrity": "sha512-dNF45caelEBambo0SgkzQ0v76m4YM+aFKZNTtSafy7P5dVF8TbjZuR2UX1A5gJABD9XK6lzN+v/9Yfzj/EDgGg==", + "version": "2.0.22", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.0.22.tgz", + "integrity": "sha512-4nNsNBi4pj8nQX/cbRPzomyU/cptFr1OJckxo+nlRZdTZlj+raA8NI5sNF1kD4pyGyARuqDtWc9+xMhFHXIJmw==", "requires": { - "@smithy/config-resolver": "^2.0.1", - "@smithy/credential-provider-imds": "^2.0.1", - "@smithy/node-config-provider": "^2.0.1", - "@smithy/property-provider": "^2.0.1", - "@smithy/types": "^2.0.2", + "@smithy/config-resolver": "^2.0.17", + "@smithy/credential-provider-imds": "^2.1.0", + "@smithy/node-config-provider": "^2.1.4", + "@smithy/property-provider": "^2.0.13", + "@smithy/smithy-client": "^2.1.12", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "dependencies": { "@smithy/types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.0.2.tgz", - "integrity": "sha512-wcymEjIXQ9+NEfE5Yt5TInAqe1o4n+Nh+rh00AwoazppmUt8tdo6URhc5gkDcOYrcvlDVAZE7uG69nDpEGUKxw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", + "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", + "requires": { + "tslib": "^2.5.0" + } + } + } + }, + "@smithy/util-endpoints": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-1.0.3.tgz", + "integrity": "sha512-rMYXLMdAMVbJAEHhNlCSJsAxo3NG3lcPja7WmesjAbNrMSyYZ6FnHHTy8kzRhddn4eAtLvPBSO6LiBB21gCoHQ==", + "requires": { + "@smithy/node-config-provider": "^2.1.4", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "dependencies": { + "@smithy/types": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", + "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", "requires": { "tslib": "^2.5.0" } @@ -16192,30 +16379,52 @@ } }, "@smithy/util-middleware": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-2.0.0.tgz", - "integrity": "sha512-eCWX4ECuDHn1wuyyDdGdUWnT4OGyIzV0LN1xRttBFMPI9Ff/4heSHVxneyiMtOB//zpXWCha1/SWHJOZstG7kA==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-2.0.5.tgz", + "integrity": "sha512-1lyT3TcaMJQe+OFfVI+TlomDkPuVzb27NZYdYtmSTltVmLaUjdCyt4KE+OH1CnhZKsz4/cdCL420Lg9UH5Z2Mw==", "requires": { + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" + }, + "dependencies": { + "@smithy/types": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", + "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", + "requires": { + "tslib": "^2.5.0" + } + } } }, "@smithy/util-retry": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-2.0.0.tgz", - "integrity": "sha512-/dvJ8afrElasuiiIttRJeoS2sy8YXpksQwiM/TcepqdRVp7u4ejd9C4IQURHNjlfPUT7Y6lCDSa2zQJbdHhVTg==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-2.0.5.tgz", + "integrity": "sha512-x3t1+MQAJ6QONk3GTbJNcugCFDVJ+Bkro5YqQQK1EyVesajNDqxFtCx9WdOFNGm/Cbm7tUdwVEmfKQOJoU2Vtw==", "requires": { - "@smithy/service-error-classification": "^2.0.0", + "@smithy/service-error-classification": "^2.0.5", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" + }, + "dependencies": { + "@smithy/types": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", + "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", + "requires": { + "tslib": "^2.5.0" + } + } } }, "@smithy/util-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.0.1.tgz", - "integrity": "sha512-2a0IOtwIKC46EEo7E7cxDN8u2jwOiYYJqcFKA6rd5rdXqKakHT2Gc+AqHWngr0IEHUfW92zX12wRQKwyoqZf2Q==", + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.0.17.tgz", + "integrity": "sha512-fP/ZQ27rRvHsqItds8yB7jerwMpZFTL3QqbQbidUiG0+mttMoKdP0ZqnvM8UK5q0/dfc3/pN7g4XKPXOU7oRWw==", "requires": { - "@smithy/fetch-http-handler": "^2.0.1", - "@smithy/node-http-handler": "^2.0.1", - "@smithy/types": "^2.0.2", + "@smithy/fetch-http-handler": "^2.2.4", + "@smithy/node-http-handler": "^2.1.8", + "@smithy/types": "^2.4.0", "@smithy/util-base64": "^2.0.0", "@smithy/util-buffer-from": "^2.0.0", "@smithy/util-hex-encoding": "^2.0.0", @@ -16224,9 +16433,9 @@ }, "dependencies": { "@smithy/types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.0.2.tgz", - "integrity": "sha512-wcymEjIXQ9+NEfE5Yt5TInAqe1o4n+Nh+rh00AwoazppmUt8tdo6URhc5gkDcOYrcvlDVAZE7uG69nDpEGUKxw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", + "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", "requires": { "tslib": "^2.5.0" } @@ -16251,19 +16460,19 @@ } }, "@smithy/util-waiter": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-2.0.1.tgz", - "integrity": "sha512-bSyGFicPRYuGFFWAr72UvYI7tE7KmEeFJJ5iaLuTTdo8RGaNBZ2kE25coGtzrejYh9AhwSfckBvbxgEDxIxhlA==", + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-2.0.12.tgz", + "integrity": "sha512-3sENmyVa1NnOPoiT2NCApPmu7ukP7S/v7kL9IxNmnygkDldn7/yK0TP42oPJLwB2k3mospNsSePIlqdXEUyPHA==", "requires": { - "@smithy/abort-controller": "^2.0.1", - "@smithy/types": "^2.0.2", + "@smithy/abort-controller": "^2.0.12", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "dependencies": { "@smithy/types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.0.2.tgz", - "integrity": "sha512-wcymEjIXQ9+NEfE5Yt5TInAqe1o4n+Nh+rh00AwoazppmUt8tdo6URhc5gkDcOYrcvlDVAZE7uG69nDpEGUKxw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", + "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", "requires": { "tslib": "^2.5.0" } @@ -16292,20 +16501,18 @@ "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", "dev": true }, - "@types/long": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", - "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" - }, "@types/node": { - "version": "20.3.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.3.1.tgz", - "integrity": "sha512-EhcH/wvidPy1WeML3TtYFGR83UzjxeWRen9V402T8aUGYsCHOmfoisV3ZSg03gAFIbLq8TnWOJ0f4cALtnSEUg==" + "version": "20.9.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.9.0.tgz", + "integrity": "sha512-nekiGu2NDb1BcVofVcEKMIwzlx4NjHlcjhoxxKBNLtz15Y1z7MYf549DFvkHSId02Ax6kGwWntIBPC3l/JZcmw==", + "requires": { + "undici-types": "~5.26.4" + } }, "@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + "version": "6.9.10", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.10.tgz", + "integrity": "sha512-3Gnx08Ns1sEoCrWssEgTSJs/rsT2vhGP+Ja9cnnk9k4ALxinORlQneLXFeFKOTJMOeZUFD1s7w+w2AphTpvzZw==" }, "@tyriar/fibonacci-heap": { "version": "2.0.9", @@ -16333,10 +16540,15 @@ } }, "acorn": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", - "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", - "dev": true + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==" + }, + "acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "requires": {} }, "acorn-jsx": { "version": "5.3.2", @@ -16547,11 +16759,13 @@ "dev": true }, "axios": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.0.tgz", + "integrity": "sha512-EZ1DYihju9pwVB+jg67ogm+Tmqc6JmhamRN6I4Zt8DfZu5lbcQGw3ozH9lFejSJgs/ibaef3A9PMXPLeefFGJg==", "requires": { - "follow-redirects": "^1.14.0" + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" } }, "axobject-query": { @@ -16957,9 +17171,9 @@ "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=" }, "check-disk-space": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/check-disk-space/-/check-disk-space-3.4.0.tgz", - "integrity": "sha512-drVkSqfwA+TvuEhFipiR1OC9boEGZL5RrWvVsOthdcvQNXyCCuKkEiTOTXZ7qxSf/GLwq4GvzfrQD/Wz325hgw==" + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/check-disk-space/-/check-disk-space-3.3.1.tgz", + "integrity": "sha512-iOrT8yCZjSnyNZ43476FE2rnssvgw5hnuwOM0hm8Nj1qa0v4ieUUEbCyxxsEliaoDUb/75yCOL71zkDiDBLbMQ==" }, "check-error": { "version": "1.0.2", @@ -16967,19 +17181,6 @@ "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", "dev": true }, - "chevrotain": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-10.5.0.tgz", - "integrity": "sha512-Pkv5rBY3+CsHOYfV5g/Vs5JY9WTHHDEKOlohI2XeygaZhUeqhAlldZ8Hz9cRmxu709bvS08YzxHdTPHhffc13A==", - "requires": { - "@chevrotain/cst-dts-gen": "10.5.0", - "@chevrotain/gast": "10.5.0", - "@chevrotain/types": "10.5.0", - "@chevrotain/utils": "10.5.0", - "lodash": "4.17.21", - "regexp-to-ast": "0.5.0" - } - }, "chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", @@ -17017,6 +17218,11 @@ "resolved": "https://registry.npmjs.org/chroma-js/-/chroma-js-2.4.2.tgz", "integrity": "sha512-U9eDw6+wt7V8z5NncY2jJfZa+hUH8XEj8FQHgFJTrUFnJfXYf4Ml4adI2vXZOjqRDpFWtYVWypDfZwnJ+HIR4A==" }, + "cjs-module-lexer": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==" + }, "clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", @@ -18099,9 +18305,9 @@ "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==" }, "follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", + "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==" }, "foreground-child": { "version": "2.0.0", @@ -18199,9 +18405,9 @@ "optional": true }, "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" }, "functional-red-black-tree": { "version": "1.0.1", @@ -18475,6 +18681,14 @@ } } }, + "hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "requires": { + "function-bind": "^1.1.2" + } + }, "he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -18597,6 +18811,17 @@ "resolve-from": "^4.0.0" } }, + "import-in-the-middle": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.4.2.tgz", + "integrity": "sha512-9WOz1Yh/cvO/p69sxRmhyQwrIGGSp7EIdcb+fFNVi7CzQGQB8U1/1XrKVSbEd/GNOAeM0peJtmi7+qphe7NvAw==", + "requires": { + "acorn": "^8.8.2", + "acorn-import-assertions": "^1.9.0", + "cjs-module-lexer": "^1.2.2", + "module-details-from-path": "^1.0.3" + } + }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -18708,12 +18933,11 @@ "dev": true }, "is-core-module": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", - "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", - "dev": true, + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", "requires": { - "has": "^1.0.3" + "hasown": "^2.0.0" } }, "is-date-object": { @@ -19293,9 +19517,9 @@ } }, "long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" }, "lru-cache": { "version": "6.0.0", @@ -19565,6 +19789,11 @@ } } }, + "module-details-from-path": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz", + "integrity": "sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==" + }, "moment": { "version": "2.29.4", "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", @@ -19639,29 +19868,49 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" }, "newrelic": { - "version": "10.6.1", - "resolved": "https://registry.npmjs.org/newrelic/-/newrelic-10.6.1.tgz", - "integrity": "sha512-jtBOCcTDqEp7oWWpuFQQDhe4DEydxm6NzuloNzJANawWc94PT7abHknhXq+f4wtP6Ydzs8Uq9MdQBHkS9nQ2wQ==", + "version": "11.5.0", + "resolved": "https://registry.npmjs.org/newrelic/-/newrelic-11.5.0.tgz", + "integrity": "sha512-y1jZSAhcCKvzPXXTk29kEMKNl42RvN/nRe5WU7Fzi4nmxUxdn+m5GfSVu89hEsmJYJ8i2Rc6s4RGFX0kn9Hung==", "requires": { "@contrast/fn-inspect": "^3.3.0", - "@grpc/grpc-js": "^1.8.10", + "@grpc/grpc-js": "^1.9.4", "@grpc/proto-loader": "^0.7.5", - "@mrleebo/prisma-ast": "^0.5.2", - "@newrelic/aws-sdk": "^6.0.0", - "@newrelic/koa": "^7.1.1", - "@newrelic/native-metrics": "^9.0.1", - "@newrelic/security-agent": "0.2.0", - "@newrelic/superagent": "^6.0.0", + "@newrelic/aws-sdk": "^7.0.2", + "@newrelic/koa": "^8.0.1", + "@newrelic/native-metrics": "^10.0.0", + "@newrelic/security-agent": "0.4.0", + "@newrelic/superagent": "^7.0.1", + "@prisma/prisma-fmt-wasm": "^4.17.0-16.27eb2449f178cd9fe1a4b892d732cc4795f75085", "@tyriar/fibonacci-heap": "^2.0.7", "concat-stream": "^2.0.0", - "https-proxy-agent": "^5.0.0", + "https-proxy-agent": "^7.0.1", + "import-in-the-middle": "^1.4.2", "json-bigint": "^1.0.0", "json-stringify-safe": "^5.0.0", + "module-details-from-path": "^1.0.3", "readable-stream": "^3.6.1", + "require-in-the-middle": "^7.2.0", "semver": "^7.5.2", "winston-transport": "^4.5.0" }, "dependencies": { + "agent-base": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", + "requires": { + "debug": "^4.3.4" + } + }, + "https-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz", + "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==", + "requires": { + "agent-base": "^7.0.2", + "debug": "4" + } + }, "readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", @@ -20415,8 +20664,7 @@ "path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "path-to-regexp": { "version": "0.1.7", @@ -20637,9 +20885,9 @@ "dev": true }, "protobufjs": { - "version": "7.2.4", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.4.tgz", - "integrity": "sha512-AT+RJgD2sH8phPmCf7OUZR8xGdcJRga4+1cOaXJ64hvcSkVhNcRHOwIxUatPH15+nj59WAGTDv3LSGZPEQbJaQ==", + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.5.tgz", + "integrity": "sha512-gGXRSXvxQ7UiPgfw8gevrfRWcTlSbOFg+p/N+JVJEK5VhueL2miT6qTymqAmjr1Q5WbOCyJbyrk6JfWKwlFn6A==", "requires": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", @@ -20653,13 +20901,6 @@ "@protobufjs/utf8": "^1.1.0", "@types/node": ">=13.7.0", "long": "^5.0.0" - }, - "dependencies": { - "long": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", - "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" - } } }, "proxy-addr": { @@ -20671,6 +20912,11 @@ "ipaddr.js": "1.9.1" } }, + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", @@ -20811,11 +21057,6 @@ "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", "dev": true }, - "regexp-to-ast": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/regexp-to-ast/-/regexp-to-ast-0.5.0.tgz", - "integrity": "sha512-tlbJqcMHnPKI9zSrystikWKwHkBqu2a/Sgw01h3zFjvYrMxEDYHzzoMZnUrbIfpTFEsoRnnviOXNCzFiSc54Qw==" - }, "regexpp": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", @@ -20846,6 +21087,16 @@ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" }, + "require-in-the-middle": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.2.0.tgz", + "integrity": "sha512-3TLx5TGyAY6AOqLBoXmHkNql0HIf2RGbuMgCDT2WO/uGVAPJs6h7Kl+bN6TIZGd9bWhWPwnDnTHGtW8Iu77sdw==", + "requires": { + "debug": "^4.1.1", + "module-details-from-path": "^1.0.3", + "resolve": "^1.22.1" + } + }, "require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", @@ -20857,12 +21108,11 @@ "integrity": "sha512-g/HAYvVm1nXgmUAnqL01Zl3spGkZ9jqqlvIwlNd5O5FjQilq5BU6FeH65pcYP8Sn5lCenbpJ/+wGfkmQKKfp6A==" }, "resolve": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.21.0.tgz", - "integrity": "sha512-3wCbTpk5WJlyE4mSOtDLhqQmGFi0/TD9VPwmiolnk8U0wRgMEktqCXd3vy5buTO3tljvalNvKrjHEfrd2WpEKA==", - "dev": true, + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "requires": { - "is-core-module": "^2.8.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" } @@ -21331,8 +21581,7 @@ "supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" }, "swagger-ui-dist": { "version": "4.14.0", @@ -21586,6 +21835,11 @@ "@fastify/busboy": "^2.0.0" } }, + "undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, "unescape": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/unescape/-/unescape-1.0.1.tgz", diff --git a/package.json b/package.json index 50da6a87..7c5ba1b3 100644 --- a/package.json +++ b/package.json @@ -55,7 +55,7 @@ "moment": "^2.29.1", "moment-timezone": "^0.5.34", "multer": "1.4.5-lts.1", - "newrelic": "^10.3.1", + "newrelic": "^11.5.0", "node-fetch": "^2.6.7", "node.extend": "^2.0.2", "openapi-request-coercer": "^12.0.1", From b79675b2ce9833411794c5203d8513fe19234c4e Mon Sep 17 00:00:00 2001 From: Patrick Leary Date: Tue, 12 Dec 2023 12:26:14 -0500 Subject: [PATCH 19/31] add v2 endpoint for users notification_counts --- openapi/paths/v2/users/notification_counts.js | 40 +++++++++++++++++++ .../results_users_notification_counts.js | 6 +++ schema/fixtures.js | 10 +++++ test/integration/v2/users.js | 40 +++++++++++++++++++ 4 files changed, 96 insertions(+) create mode 100644 openapi/paths/v2/users/notification_counts.js create mode 100644 openapi/schema/response/results_users_notification_counts.js diff --git a/openapi/paths/v2/users/notification_counts.js b/openapi/paths/v2/users/notification_counts.js new file mode 100644 index 00000000..91d70523 --- /dev/null +++ b/openapi/paths/v2/users/notification_counts.js @@ -0,0 +1,40 @@ +const Joi = require( "joi" ); +const transform = require( "../../../joi_to_openapi_parameter" ); +const UsersController = require( "../../../../lib/controllers/v1/users_controller" ); + +module.exports = sendWrapper => { + async function GET( req, res ) { + const results = await UsersController.notificationCounts( req ); + sendWrapper( req, res, null, results ); + } + + GET.apiDoc = { + tags: ["Users"], + summary: "Fetch counts of unread notifications for the logged-in user.", + security: [{ + userJwtRequired: [] + }], + parameters: [ + transform( Joi.string( ).label( "fields" ) ) + ], + responses: { + 200: { + description: "An object containing counts of unread notifications.", + content: { + "application/json": { + schema: { + $ref: "#/components/schemas/ResultsUsersNotificationCounts" + } + } + } + }, + default: { + $ref: "#/components/responses/Error" + } + } + }; + + return { + GET + }; +}; diff --git a/openapi/schema/response/results_users_notification_counts.js b/openapi/schema/response/results_users_notification_counts.js new file mode 100644 index 00000000..d4e5eb69 --- /dev/null +++ b/openapi/schema/response/results_users_notification_counts.js @@ -0,0 +1,6 @@ +const Joi = require( "joi" ); + +module.exports = Joi.object( ).keys( { + updates_count: Joi.number( ).integer( ).required( ), + messages_count: Joi.number( ).integer( ).required( ) +} ).unknown( false ); diff --git a/schema/fixtures.js b/schema/fixtures.js index 53cc1a14..f33dd559 100644 --- a/schema/fixtures.js +++ b/schema/fixtures.js @@ -2242,6 +2242,16 @@ "establishment_means": "endemic" } ], + "messages": [ + { + "id": 1, + "from_user_id": 1, + "to_user_id": 123, + "user_id": 123, + "created_at": "2023-12-12 00:00:00", + "updated_at": "2023-12-12 00:00:00" + } + ], "oauth_applications": [ { "id": 3, diff --git a/test/integration/v2/users.js b/test/integration/v2/users.js index 7189081c..54f19a52 100644 --- a/test/integration/v2/users.js +++ b/test/integration/v2/users.js @@ -279,4 +279,44 @@ describe( "Users", ( ) => { .expect( 200, done ); } ); } ); + + describe( "notification_counts", ( ) => { + const currentUserID = fixtures.elasticsearch.update_actions.update_action[0].subscriber_ids[0]; + const token = jwt.sign( { user_id: currentUserID }, + config.jwtSecret || "secret", + { algorithm: "HS512" } ); + + it( "should 401 without auth", function ( done ) { + request( this.app ) + .get( "/v2/users/notification_counts" ) + .expect( 401, done ); + } ); + + it( "should return JSON with notification counts", function ( done ) { + const unreadUpdatesCount = _.size( + _.filter( fixtures.elasticsearch.update_actions.update_action, updateAction => ( + _.includes( updateAction.subscriber_ids, currentUserID ) + && !_.includes( updateAction.viewed_subscriber_ids, currentUserID ) + ) ) + ); + const unreadMessagesCount = _.size( + _.filter( fixtures.postgresql.messages, message => ( + message.user_id === currentUserID + && message.to_user_id === currentUserID + && !message.read_at + ) ) + ); + request( this.app ) + .get( "/v2/users/notification_counts" ) + .set( "Authorization", token ) + .expect( "Content-Type", /json/ ) + .expect( res => { + expect( _.has( res.body, "updates_count" ) ).to.eq( true ); + expect( _.has( res.body, "messages_count" ) ).to.eq( true ); + expect( res.body.updates_count ).to.eq( unreadUpdatesCount ); + expect( res.body.messages_count ).to.eq( unreadMessagesCount ); + } ) + .expect( 200, done ); + } ); + } ); } ); From 1517ffbd78214f222eaef1a1250821a510ce6df7 Mon Sep 17 00:00:00 2001 From: Patrick Leary Date: Wed, 13 Dec 2023 11:02:24 -0500 Subject: [PATCH 20/31] add model taxon range processor task; improve model tile antimeridian handling --- lib/map_generator.js | 8 +- lib/model_taxon_range_processor.js | 218 +++++ lib/tasks/evaluate_model_taxon_ranges.js | 24 + package-lock.json | 962 ++++++++++++++++++++++- package.json | 1 + 5 files changed, 1166 insertions(+), 47 deletions(-) create mode 100644 lib/model_taxon_range_processor.js create mode 100644 lib/tasks/evaluate_model_taxon_ranges.js diff --git a/lib/map_generator.js b/lib/map_generator.js index ac3331cf..a166a566 100644 --- a/lib/map_generator.js +++ b/lib/map_generator.js @@ -248,15 +248,15 @@ MapGenerator.pythonTilesGeojson = async ( } ); } // TODO: still not working right on antimeridian. See 849b447ffffffff / 849b447ffffffff - if ( swlon < -178 ) { + if ( swlon < -175 ) { _.each( geoJSONCoords, coord => { - if ( coord[0] > 178 ) { + if ( coord[0] > 175 ) { coord[0] -= 360; } } ); - } else if ( nelon > 178 ) { + } else if ( nelon > 175 ) { _.each( geoJSONCoords, coord => { - if ( coord[0] < -178 ) { + if ( coord[0] < -175 ) { coord[0] += 360; } } ); diff --git a/lib/model_taxon_range_processor.js b/lib/model_taxon_range_processor.js new file mode 100644 index 00000000..c2bcee5d --- /dev/null +++ b/lib/model_taxon_range_processor.js @@ -0,0 +1,218 @@ +/* eslint-disable no-console */ +const _ = require( "lodash" ); +const h3 = require( "h3-js" ); +const fs = require( "fs" ); +const csv = require( "fast-csv" ); +const squel = require( "safe-squel" ); +const PromisePool = require( "es6-promise-pool" ); +const path = require( "path" ); +const shape2geohash = require( "shape2geohash" ); +const moment = require( "moment" ); +const Pool = require( "./pg_pool" ); +const esClient = require( "./es_client" ); +const ObservationsController = require( "./controllers/v1/observations_controller" ); + +const fsPromises = fs.promises; + +const ModelTaxonRangeProcessor = class ModelTaxonRangeProcessor { + constructor( options = { } ) { + console.log( options ); + this.runOptions = options; + this.taxonomyPath = options["taxonomy-path"]; + } + + async start( ) { + await this.createOutputDir( ); + const taxonIDs = await this.modelLeafTaxonIDs( ); + + this.taxaProcessed = 0; + this.startTime = Date.now( ); + this.totalTaxa = _.size( taxonIDs ); + const promiseProducer = ( ) => { + if ( _.isEmpty( taxonIDs ) ) { + return null; + } + this.outputProgress( ); + const taxonID = taxonIDs.shift( ); + return this.processTaxon( taxonID ); + }; + const pool = new PromisePool( promiseProducer, 1 ); + await pool.start( ); + } + + async createOutputDir( ) { + try { + /* eslint-disable-next-line no-bitwise */ + await fsPromises.access( this.runOptions.dir, fs.constants.R_OK | fs.constants.W_OK ); + } catch ( err ) { + throw new Error( + `output dir [${this.runOptions.dir}] does not exist or you do not have read/write permission` + ); + } + const todaysDate = moment( ).format( "YYYYMMDDHHmmss" ); + this.outputDirName = `taxon_range_eval-${todaysDate}`; + this.outputDir = path.join( this.runOptions.dir, this.outputDirName ); + if ( !fs.existsSync( this.outputDir ) ) { + fs.mkdirSync( this.outputDir ); + } + + this.taxonRangeDirName = "taxon_range_csvs"; + this.taxonRangeDir = path.join( this.outputDir, this.taxonRangeDirName ); + if ( !fs.existsSync( this.taxonRangeDir ) ) { + fs.mkdirSync( this.taxonRangeDir ); + } + + this.taxonRangeRecallsFileStream = fs.createWriteStream( + path.join( this.outputDir, "taxon_range_recalls.csv" ), { flags: "w" } + ); + this.taxonRangeRecallsFileStream.write( + "taxon_id,recall,observation_count,range_cell_count,observation_cell_count," + + "intersection_cell_count,intersection_observation_count,observation_recall\n" + ); + } + + async modelLeafTaxonIDs( ) { + return new Promise( resolve => { + const taxonIDs = []; + const readStream = fs.createReadStream( this.taxonomyPath ); + csv.parseStream( readStream, { headers: true } ) + .on( "data", row => { + if ( row.leaf_class_id ) { + taxonIDs.push( Number( row.taxon_id ) ); + } + } ).on( "end", ( ) => { + resolve( taxonIDs ); + } ); + } ); + } + + geoJSONCoordinatesToH3Cells( coordinates, resolution = 5 ) { + let h3Cells = []; + if ( _.isArray( coordinates[0][0] ) ) { + _.each( coordinates, subCoordinates => { + h3Cells = h3Cells.concat( this.geoJSONCoordinatesToH3Cells( subCoordinates, resolution ) ); + } ); + } else { + h3Cells = _.map( + h3.polygonToCells( coordinates, resolution, true ), cell => h3.cellToParent( cell, 4 ) + ); + } + return _.uniq( h3Cells ); + } + + static async evaluateTaxonRangeRecall( taxonID, geojson ) { + // turn the taxon range GeoJSON into an array of Geohashes at resolution 3 + const taxonRangeGeohashes = await shape2geohash( geojson, { + precision: 3 + } ); + + // query Elasticsearch for Geohashes where the taxon has been observed + const queryRequest = { + query: { + taxon_id: taxonID, + verifiable: "any", + captive: "false" + } + }; + const elasticQuery = await ObservationsController.reqToElasticQuery( queryRequest ); + const searchHash = esClient.searchHash( elasticQuery ); + const elasticSearchBody = { + size: 0, + query: searchHash.query, + aggregations: { + zoom1: { + geohash_grid: { + field: "location", + size: 100000, + precision: 3 + } + } + } + }; + const result = await esClient.search( "observations", { + body: { + ...elasticSearchBody, + track_total_hits: false + } + } ); + + // compare observation Geohashes to the taxon range Geohashes + const observationGeohashes = _.map( result.aggregations.zoom1.buckets, "key" ); + const observationCount = _.sum( _.map( result.aggregations.zoom1.buckets, "doc_count" ) ); + const intersectionGeohashes = _.intersection( taxonRangeGeohashes, observationGeohashes ); + const intersectionObservationCount = _.sum( _.map( _.filter( result.aggregations.zoom1.buckets, + b => _.includes( intersectionGeohashes, b.key ) ), "doc_count" ) ); + const cellRecall = _.isEmpty( observationGeohashes ) + ? 0 : _.round( _.size( intersectionGeohashes ) / _.size( observationGeohashes ), 6 ); + const observationsRecall = observationCount === 0 + ? 0 : _.round( intersectionObservationCount / observationCount, 6 ); + return { + observationCount, + observationCellCount: _.size( observationGeohashes ), + intersectionCellCount: _.size( intersectionGeohashes ), + cellRecall, + intersectionObservationCount, + observationsRecall + }; + } + + async processTaxon( taxonID ) { + // fetch the taxon range for this taxon, if available, as GeoJSON + const query = squel + .select( ) + .field( "taxon_id" ) + .field( "ST_AsGeoJSON(geom) as geojson" ) + .from( "taxon_ranges" ) + .where( "taxon_id = ?", taxonID ) + .order( "ST_MemSize(geom)", false ) + .limit( 1 ); + const { rows } = await Pool.query( query.toString( ) ); + if ( _.isEmpty( rows ) ) { + return; + } + if ( _.isEmpty( rows[0].geojson ) ) { + return; + } + + try { + console.log( `taxonID: ${taxonID}` ); + const geojson = JSON.parse( rows[0].geojson ); + // turn the GeoJSON into an array of H3 cell IDs at resolution 5 + const h3Cells = _.sortBy( this.geoJSONCoordinatesToH3Cells( geojson.coordinates, 5 ) ); + if ( _.isEmpty( h3Cells ) ) { + return; + } + // evaluate the taxon range compared to observations of the taxon + const evaluation = await ModelTaxonRangeProcessor.evaluateTaxonRangeRecall( + taxonID, geojson + ); + + if ( evaluation.cellRecall ) { + // if there is a recall to report, write it to the output, and save the taxon range H3 cells + this.taxonRangeRecallsFileStream.write( + `${taxonID},${evaluation.cellRecall},${evaluation.observationCount},${_.size( h3Cells )},` + + `${evaluation.observationCellCount},${evaluation.intersectionCellCount},` + + `${evaluation.intersectionObservationCount},${evaluation.observationsRecall}\n` + ); + const taxonRangeCellsPath = path.join( this.taxonRangeDir, `${taxonID}.csv` ); + fs.writeFileSync( taxonRangeCellsPath, h3Cells.join( "\n" ) ); + } + } catch ( e ) { + console.log( e ); + } + } + + outputProgress( ) { + this.taxaProcessed += 1; + if ( this.taxaProcessed % 10 === 0 ) { + const timeElapsed = ( Date.now( ) - this.startTime ) / 1000; + const perSecond = this.taxaProcessed / timeElapsed; + const secondsLeft = ( this.totalTaxa - this.taxaProcessed ) / perSecond; + console.log( `Processed ${this.taxaProcessed} of ${this.totalTaxa} taxa in ` + + `${_.round( timeElapsed, 2 )}s; ${_.round( perSecond, 2 )}/s; ` + + `${_.round( secondsLeft, 2 )}s left; ` ); + } + } +}; + +module.exports = ModelTaxonRangeProcessor; diff --git a/lib/tasks/evaluate_model_taxon_ranges.js b/lib/tasks/evaluate_model_taxon_ranges.js new file mode 100644 index 00000000..e1d97925 --- /dev/null +++ b/lib/tasks/evaluate_model_taxon_ranges.js @@ -0,0 +1,24 @@ +/* eslint-disable no-console */ +const yargs = require( "yargs" ); +const ModelTaxonRangeProcessor = require( "../model_taxon_range_processor" ); + +console.log( "" ); +const { argv } = yargs.usage( "Usage: $0 --dir [[output-dir]] --taxonomy-path [[taxonomy-path]]" ) + .string( ["dir", "taxonomy-path"] ) + .describe( "dir", "Path to directory where archive will be created" ) + .describe( "taxonomy-path", "Path to taxonomy.csv file containing taxa to process" ) + .demandOption( ["dir", "taxonomy-path"] ); + +setTimeout( async ( ) => { + new ModelTaxonRangeProcessor( argv ).start( ) + .catch( e => { + console.log( "Failed with error:" ); + console.log( e ); + console.log( e.stack ); + process.exit( ); + } ).finally( ( ) => { + console.log( "" ); + console.log( "we're done" ); + process.exit( ); + } ); +}, 100 ); diff --git a/package-lock.json b/package-lock.json index 652e9df9..c4965b1e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -56,6 +56,7 @@ "rison-node": "^2.1.1", "safe-squel": "^5.12.5", "scramjet": "^4.36.1", + "shape2geohash": "1.2.6", "sshpk": "^1.17.0", "swagger-ui-express": "^4.5.0", "tar": "^6.1.11", @@ -4982,6 +4983,295 @@ "node": ">=14.0.0" } }, + "node_modules/@turf/area": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/area/-/area-6.5.0.tgz", + "integrity": "sha512-xCZdiuojokLbQ+29qR6qoMD89hv+JAgWjLrwSEWL+3JV8IXKeNFl6XkEJz9HGkVpnXvQKJoRz4/liT+8ZZ5Jyg==", + "dependencies": { + "@turf/helpers": "^6.5.0", + "@turf/meta": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/bbox": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/bbox/-/bbox-6.5.0.tgz", + "integrity": "sha512-RBbLaao5hXTYyyg577iuMtDB8ehxMlUqHEJiMs8jT1GHkFhr6sYre3lmLsPeYEi/ZKj5TP5tt7fkzNdJ4GIVyw==", + "dependencies": { + "@turf/helpers": "^6.5.0", + "@turf/meta": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/bbox-polygon": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/bbox-polygon/-/bbox-polygon-6.5.0.tgz", + "integrity": "sha512-+/r0NyL1lOG3zKZmmf6L8ommU07HliP4dgYToMoTxqzsWzyLjaj/OzgQ8rBmv703WJX+aS6yCmLuIhYqyufyuw==", + "dependencies": { + "@turf/helpers": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/bearing": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/bearing/-/bearing-6.5.0.tgz", + "integrity": "sha512-dxINYhIEMzgDOztyMZc20I7ssYVNEpSv04VbMo5YPQsqa80KO3TFvbuCahMsCAW5z8Tncc8dwBlEFrmRjJG33A==", + "dependencies": { + "@turf/helpers": "^6.5.0", + "@turf/invariant": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/boolean-overlap": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/boolean-overlap/-/boolean-overlap-6.5.0.tgz", + "integrity": "sha512-8btMIdnbXVWUa1M7D4shyaSGxLRw6NjMcqKBcsTXcZdnaixl22k7ar7BvIzkaRYN3SFECk9VGXfLncNS3ckQUw==", + "dependencies": { + "@turf/helpers": "^6.5.0", + "@turf/invariant": "^6.5.0", + "@turf/line-intersect": "^6.5.0", + "@turf/line-overlap": "^6.5.0", + "@turf/meta": "^6.5.0", + "geojson-equality": "0.1.6" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/boolean-point-in-polygon": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/boolean-point-in-polygon/-/boolean-point-in-polygon-6.5.0.tgz", + "integrity": "sha512-DtSuVFB26SI+hj0SjrvXowGTUCHlgevPAIsukssW6BG5MlNSBQAo70wpICBNJL6RjukXg8d2eXaAWuD/CqL00A==", + "dependencies": { + "@turf/helpers": "^6.5.0", + "@turf/invariant": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/boolean-point-on-line": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/boolean-point-on-line/-/boolean-point-on-line-6.5.0.tgz", + "integrity": "sha512-A1BbuQ0LceLHvq7F/P7w3QvfpmZqbmViIUPHdNLvZimFNLo4e6IQunmzbe+8aSStH9QRZm3VOflyvNeXvvpZEQ==", + "dependencies": { + "@turf/helpers": "^6.5.0", + "@turf/invariant": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/boolean-within": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/boolean-within/-/boolean-within-6.5.0.tgz", + "integrity": "sha512-YQB3oU18Inx35C/LU930D36RAVe7LDXk1kWsQ8mLmuqYn9YdPsDQTMTkLJMhoQ8EbN7QTdy333xRQ4MYgToteQ==", + "dependencies": { + "@turf/bbox": "^6.5.0", + "@turf/boolean-point-in-polygon": "^6.5.0", + "@turf/boolean-point-on-line": "^6.5.0", + "@turf/helpers": "^6.5.0", + "@turf/invariant": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/destination": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/destination/-/destination-6.5.0.tgz", + "integrity": "sha512-4cnWQlNC8d1tItOz9B4pmJdWpXqS0vEvv65bI/Pj/genJnsL7evI0/Xw42RvEGROS481MPiU80xzvwxEvhQiMQ==", + "dependencies": { + "@turf/helpers": "^6.5.0", + "@turf/invariant": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/distance": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/distance/-/distance-6.5.0.tgz", + "integrity": "sha512-xzykSLfoURec5qvQJcfifw/1mJa+5UwByZZ5TZ8iaqjGYN0vomhV9aiSLeYdUGtYRESZ+DYC/OzY+4RclZYgMg==", + "dependencies": { + "@turf/helpers": "^6.5.0", + "@turf/invariant": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/envelope": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/envelope/-/envelope-6.5.0.tgz", + "integrity": "sha512-9Z+FnBWvOGOU4X+fMZxYFs1HjFlkKqsddLuMknRaqcJd6t+NIv5DWvPtDL8ATD2GEExYDiFLwMdckfr1yqJgHA==", + "dependencies": { + "@turf/bbox": "^6.5.0", + "@turf/bbox-polygon": "^6.5.0", + "@turf/helpers": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/helpers": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", + "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/intersect": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/intersect/-/intersect-6.5.0.tgz", + "integrity": "sha512-2legGJeKrfFkzntcd4GouPugoqPUjexPZnOvfez+3SfIMrHvulw8qV8u7pfVyn2Yqs53yoVCEjS5sEpvQ5YRQg==", + "dependencies": { + "@turf/helpers": "^6.5.0", + "@turf/invariant": "^6.5.0", + "polygon-clipping": "^0.15.3" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/invariant": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz", + "integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==", + "dependencies": { + "@turf/helpers": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/line-intersect": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/line-intersect/-/line-intersect-6.5.0.tgz", + "integrity": "sha512-CS6R1tZvVQD390G9Ea4pmpM6mJGPWoL82jD46y0q1KSor9s6HupMIo1kY4Ny+AEYQl9jd21V3Scz20eldpbTVA==", + "dependencies": { + "@turf/helpers": "^6.5.0", + "@turf/invariant": "^6.5.0", + "@turf/line-segment": "^6.5.0", + "@turf/meta": "^6.5.0", + "geojson-rbush": "3.x" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/line-overlap": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/line-overlap/-/line-overlap-6.5.0.tgz", + "integrity": "sha512-xHOaWLd0hkaC/1OLcStCpfq55lPHpPNadZySDXYiYjEz5HXr1oKmtMYpn0wGizsLwrOixRdEp+j7bL8dPt4ojQ==", + "dependencies": { + "@turf/boolean-point-on-line": "^6.5.0", + "@turf/helpers": "^6.5.0", + "@turf/invariant": "^6.5.0", + "@turf/line-segment": "^6.5.0", + "@turf/meta": "^6.5.0", + "@turf/nearest-point-on-line": "^6.5.0", + "deep-equal": "1.x", + "geojson-rbush": "3.x" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/line-segment": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/line-segment/-/line-segment-6.5.0.tgz", + "integrity": "sha512-jI625Ho4jSuJESNq66Mmi290ZJ5pPZiQZruPVpmHkUw257Pew0alMmb6YrqYNnLUuiVVONxAAKXUVeeUGtycfw==", + "dependencies": { + "@turf/helpers": "^6.5.0", + "@turf/invariant": "^6.5.0", + "@turf/meta": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/line-split": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/line-split/-/line-split-6.5.0.tgz", + "integrity": "sha512-/rwUMVr9OI2ccJjw7/6eTN53URtGThNSD5I0GgxyFXMtxWiloRJ9MTff8jBbtPWrRka/Sh2GkwucVRAEakx9Sw==", + "dependencies": { + "@turf/bbox": "^6.5.0", + "@turf/helpers": "^6.5.0", + "@turf/invariant": "^6.5.0", + "@turf/line-intersect": "^6.5.0", + "@turf/line-segment": "^6.5.0", + "@turf/meta": "^6.5.0", + "@turf/nearest-point-on-line": "^6.5.0", + "@turf/square": "^6.5.0", + "@turf/truncate": "^6.5.0", + "geojson-rbush": "3.x" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/meta": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/meta/-/meta-6.5.0.tgz", + "integrity": "sha512-RrArvtsV0vdsCBegoBtOalgdSOfkBrTJ07VkpiCnq/491W67hnMWmDu7e6Ztw0C3WldRYTXkg3SumfdzZxLBHA==", + "dependencies": { + "@turf/helpers": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/nearest-point-on-line": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/nearest-point-on-line/-/nearest-point-on-line-6.5.0.tgz", + "integrity": "sha512-WthrvddddvmymnC+Vf7BrkHGbDOUu6Z3/6bFYUGv1kxw8tiZ6n83/VG6kHz4poHOfS0RaNflzXSkmCi64fLBlg==", + "dependencies": { + "@turf/bearing": "^6.5.0", + "@turf/destination": "^6.5.0", + "@turf/distance": "^6.5.0", + "@turf/helpers": "^6.5.0", + "@turf/invariant": "^6.5.0", + "@turf/line-intersect": "^6.5.0", + "@turf/meta": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/square": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/square/-/square-6.5.0.tgz", + "integrity": "sha512-BM2UyWDmiuHCadVhHXKIx5CQQbNCpOxB6S/aCNOCLbhCeypKX5Q0Aosc5YcmCJgkwO5BERCC6Ee7NMbNB2vHmQ==", + "dependencies": { + "@turf/distance": "^6.5.0", + "@turf/helpers": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/truncate": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/truncate/-/truncate-6.5.0.tgz", + "integrity": "sha512-pFxg71pLk+eJj134Z9yUoRhIi8vqnnKvCYwdT4x/DQl/19RVdq1tV3yqOT3gcTQNfniteylL5qV1uTBDV5sgrg==", + "dependencies": { + "@turf/helpers": "^6.5.0", + "@turf/meta": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, "node_modules/@types/concat-stream": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", @@ -4998,6 +5288,11 @@ "@types/node": "*" } }, + "node_modules/@types/geojson": { + "version": "7946.0.8", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.8.tgz", + "integrity": "sha512-1rkryxURpr6aWP7R786/UQOkJ3PcpQiWkAXBmdWc7ryFWqN6a4xfK7BtjXvFBKO9LjQ+MWQSWxYeZX1OApnArA==" + }, "node_modules/@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", @@ -5568,7 +5863,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, "dependencies": { "function-bind": "^1.1.1", "get-intrinsic": "^1.0.2" @@ -6318,22 +6612,58 @@ "node": ">=0.12" } }, + "node_modules/deep-equal": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.2.tgz", + "integrity": "sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==", + "dependencies": { + "is-arguments": "^1.1.1", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.5.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, + "node_modules/define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dependencies": { - "object-keys": "^1.0.12" + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/delayed-stream": { @@ -7503,6 +7833,14 @@ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", "dev": true }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/generic-pool": { "version": "3.8.2", "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.8.2.tgz", @@ -7620,6 +7958,26 @@ "node": ">=8" } }, + "node_modules/geojson-equality": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/geojson-equality/-/geojson-equality-0.1.6.tgz", + "integrity": "sha512-TqG8YbqizP3EfwP5Uw4aLu6pKkg6JQK9uq/XZ1lXQntvTHD1BBKJWhNpJ2M0ax6TuWMP3oyx6Oq7FCIfznrgpQ==", + "dependencies": { + "deep-equal": "^1.0.0" + } + }, + "node_modules/geojson-rbush": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/geojson-rbush/-/geojson-rbush-3.2.0.tgz", + "integrity": "sha512-oVltQTXolxvsz1sZnutlSuLDEcQAKYC/uXt9zDzJJ6bu0W+baTI8LZBaTup5afzibEH4N3jlq2p+a152wlBJ7w==", + "dependencies": { + "@turf/bbox": "*", + "@turf/helpers": "6.x", + "@turf/meta": "6.x", + "@types/geojson": "7946.0.8", + "rbush": "^3.0.1" + } + }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -7638,14 +7996,14 @@ } }, "node_modules/get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "dev": true, + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -7732,6 +8090,17 @@ "node": ">=4" } }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/graceful-fs": { "version": "4.2.9", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", @@ -7803,11 +8172,32 @@ "node": ">=4" } }, + "node_modules/has-property-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "dependencies": { + "get-intrinsic": "^1.2.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", - "dev": true, + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "engines": { "node": ">= 0.4" }, @@ -7819,7 +8209,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, "dependencies": { "has-symbols": "^1.0.2" }, @@ -8168,6 +8557,21 @@ "node": "*" } }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-bigint": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", @@ -8240,7 +8644,6 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -8350,7 +8753,6 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -9543,6 +9945,14 @@ "node": ">=10" } }, + "node_modules/ngeohash": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/ngeohash/-/ngeohash-0.6.3.tgz", + "integrity": "sha512-kltF0cOxgx1AbmVzKxYZaoB0aj7mOxZeHaerEtQV0YaqnkXNq26WWqMmJ6lTqShYxVRWZ/mwvvTrNeOwdslWiw==", + "engines": { + "node": ">=v0.2.0" + } + }, "node_modules/nise": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.0.tgz", @@ -10080,11 +10490,25 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, "engines": { "node": ">= 0.4" } @@ -10672,6 +11096,14 @@ "node": ">=8" } }, + "node_modules/polygon-clipping": { + "version": "0.15.3", + "resolved": "https://registry.npmjs.org/polygon-clipping/-/polygon-clipping-0.15.3.tgz", + "integrity": "sha512-ho0Xx5DLkgxRx/+n4O74XyJ67DcyN3Tu9bGYKsnTukGAW6ssnuak6Mwcyb1wHy9MZc9xsUWqIoiazkZB5weECg==", + "dependencies": { + "splaytree": "^3.1.0" + } + }, "node_modules/postgres-array": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", @@ -10834,6 +11266,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/quickselect": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-2.0.0.tgz", + "integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==" + }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -10865,6 +11302,14 @@ "node": ">= 0.8" } }, + "node_modules/rbush": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/rbush/-/rbush-3.0.1.tgz", + "integrity": "sha512-XRaVO0YecOpEuIvbhbpTrZgoiI6xBlz6hnlr6EHhd+0x9ase6EmeN+hdwwUaJvLcsFFQ8iWVF1GAK1yB0BWi0w==", + "dependencies": { + "quickselect": "^2.0.0" + } + }, "node_modules/readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", @@ -10971,6 +11416,22 @@ "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", "dev": true }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", + "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "set-function-name": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/regexpp": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", @@ -11252,11 +11713,42 @@ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" }, + "node_modules/set-function-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", + "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "dependencies": { + "define-data-property": "^1.0.1", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, + "node_modules/shape2geohash": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/shape2geohash/-/shape2geohash-1.2.6.tgz", + "integrity": "sha512-lWa48NsKiPtdSboVGAeLDdGai07aHhrw1XlfYEmSCLbTWE3gBi6XQmbn2u8BDO1ksVP+ZW3a+Oa6Egvsy+R58A==", + "dependencies": { + "@turf/area": "^6.5.0", + "@turf/bbox": "^6.5.0", + "@turf/bbox-polygon": "^6.5.0", + "@turf/boolean-overlap": "^6.5.0", + "@turf/boolean-point-in-polygon": "^6.5.0", + "@turf/boolean-within": "^6.5.0", + "@turf/envelope": "^6.5.0", + "@turf/helpers": "^6.5.0", + "@turf/intersect": "^6.5.0", + "@turf/line-split": "^6.5.0", + "ngeohash": "^0.6.3" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -11378,6 +11870,11 @@ "node": ">= 8" } }, + "node_modules/splaytree": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/splaytree/-/splaytree-3.1.2.tgz", + "integrity": "sha512-4OM2BJgC5UzrhVnnJA4BkHKGtjXNzzUfpQjCO8I05xYPsfS/VuQDwjCGGMi8rYQilHEV4j8NBqTFbls/PZEE7A==" + }, "node_modules/sprintf-js": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", @@ -16479,6 +16976,229 @@ } } }, + "@turf/area": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/area/-/area-6.5.0.tgz", + "integrity": "sha512-xCZdiuojokLbQ+29qR6qoMD89hv+JAgWjLrwSEWL+3JV8IXKeNFl6XkEJz9HGkVpnXvQKJoRz4/liT+8ZZ5Jyg==", + "requires": { + "@turf/helpers": "^6.5.0", + "@turf/meta": "^6.5.0" + } + }, + "@turf/bbox": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/bbox/-/bbox-6.5.0.tgz", + "integrity": "sha512-RBbLaao5hXTYyyg577iuMtDB8ehxMlUqHEJiMs8jT1GHkFhr6sYre3lmLsPeYEi/ZKj5TP5tt7fkzNdJ4GIVyw==", + "requires": { + "@turf/helpers": "^6.5.0", + "@turf/meta": "^6.5.0" + } + }, + "@turf/bbox-polygon": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/bbox-polygon/-/bbox-polygon-6.5.0.tgz", + "integrity": "sha512-+/r0NyL1lOG3zKZmmf6L8ommU07HliP4dgYToMoTxqzsWzyLjaj/OzgQ8rBmv703WJX+aS6yCmLuIhYqyufyuw==", + "requires": { + "@turf/helpers": "^6.5.0" + } + }, + "@turf/bearing": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/bearing/-/bearing-6.5.0.tgz", + "integrity": "sha512-dxINYhIEMzgDOztyMZc20I7ssYVNEpSv04VbMo5YPQsqa80KO3TFvbuCahMsCAW5z8Tncc8dwBlEFrmRjJG33A==", + "requires": { + "@turf/helpers": "^6.5.0", + "@turf/invariant": "^6.5.0" + } + }, + "@turf/boolean-overlap": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/boolean-overlap/-/boolean-overlap-6.5.0.tgz", + "integrity": "sha512-8btMIdnbXVWUa1M7D4shyaSGxLRw6NjMcqKBcsTXcZdnaixl22k7ar7BvIzkaRYN3SFECk9VGXfLncNS3ckQUw==", + "requires": { + "@turf/helpers": "^6.5.0", + "@turf/invariant": "^6.5.0", + "@turf/line-intersect": "^6.5.0", + "@turf/line-overlap": "^6.5.0", + "@turf/meta": "^6.5.0", + "geojson-equality": "0.1.6" + } + }, + "@turf/boolean-point-in-polygon": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/boolean-point-in-polygon/-/boolean-point-in-polygon-6.5.0.tgz", + "integrity": "sha512-DtSuVFB26SI+hj0SjrvXowGTUCHlgevPAIsukssW6BG5MlNSBQAo70wpICBNJL6RjukXg8d2eXaAWuD/CqL00A==", + "requires": { + "@turf/helpers": "^6.5.0", + "@turf/invariant": "^6.5.0" + } + }, + "@turf/boolean-point-on-line": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/boolean-point-on-line/-/boolean-point-on-line-6.5.0.tgz", + "integrity": "sha512-A1BbuQ0LceLHvq7F/P7w3QvfpmZqbmViIUPHdNLvZimFNLo4e6IQunmzbe+8aSStH9QRZm3VOflyvNeXvvpZEQ==", + "requires": { + "@turf/helpers": "^6.5.0", + "@turf/invariant": "^6.5.0" + } + }, + "@turf/boolean-within": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/boolean-within/-/boolean-within-6.5.0.tgz", + "integrity": "sha512-YQB3oU18Inx35C/LU930D36RAVe7LDXk1kWsQ8mLmuqYn9YdPsDQTMTkLJMhoQ8EbN7QTdy333xRQ4MYgToteQ==", + "requires": { + "@turf/bbox": "^6.5.0", + "@turf/boolean-point-in-polygon": "^6.5.0", + "@turf/boolean-point-on-line": "^6.5.0", + "@turf/helpers": "^6.5.0", + "@turf/invariant": "^6.5.0" + } + }, + "@turf/destination": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/destination/-/destination-6.5.0.tgz", + "integrity": "sha512-4cnWQlNC8d1tItOz9B4pmJdWpXqS0vEvv65bI/Pj/genJnsL7evI0/Xw42RvEGROS481MPiU80xzvwxEvhQiMQ==", + "requires": { + "@turf/helpers": "^6.5.0", + "@turf/invariant": "^6.5.0" + } + }, + "@turf/distance": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/distance/-/distance-6.5.0.tgz", + "integrity": "sha512-xzykSLfoURec5qvQJcfifw/1mJa+5UwByZZ5TZ8iaqjGYN0vomhV9aiSLeYdUGtYRESZ+DYC/OzY+4RclZYgMg==", + "requires": { + "@turf/helpers": "^6.5.0", + "@turf/invariant": "^6.5.0" + } + }, + "@turf/envelope": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/envelope/-/envelope-6.5.0.tgz", + "integrity": "sha512-9Z+FnBWvOGOU4X+fMZxYFs1HjFlkKqsddLuMknRaqcJd6t+NIv5DWvPtDL8ATD2GEExYDiFLwMdckfr1yqJgHA==", + "requires": { + "@turf/bbox": "^6.5.0", + "@turf/bbox-polygon": "^6.5.0", + "@turf/helpers": "^6.5.0" + } + }, + "@turf/helpers": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", + "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==" + }, + "@turf/intersect": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/intersect/-/intersect-6.5.0.tgz", + "integrity": "sha512-2legGJeKrfFkzntcd4GouPugoqPUjexPZnOvfez+3SfIMrHvulw8qV8u7pfVyn2Yqs53yoVCEjS5sEpvQ5YRQg==", + "requires": { + "@turf/helpers": "^6.5.0", + "@turf/invariant": "^6.5.0", + "polygon-clipping": "^0.15.3" + } + }, + "@turf/invariant": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz", + "integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==", + "requires": { + "@turf/helpers": "^6.5.0" + } + }, + "@turf/line-intersect": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/line-intersect/-/line-intersect-6.5.0.tgz", + "integrity": "sha512-CS6R1tZvVQD390G9Ea4pmpM6mJGPWoL82jD46y0q1KSor9s6HupMIo1kY4Ny+AEYQl9jd21V3Scz20eldpbTVA==", + "requires": { + "@turf/helpers": "^6.5.0", + "@turf/invariant": "^6.5.0", + "@turf/line-segment": "^6.5.0", + "@turf/meta": "^6.5.0", + "geojson-rbush": "3.x" + } + }, + "@turf/line-overlap": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/line-overlap/-/line-overlap-6.5.0.tgz", + "integrity": "sha512-xHOaWLd0hkaC/1OLcStCpfq55lPHpPNadZySDXYiYjEz5HXr1oKmtMYpn0wGizsLwrOixRdEp+j7bL8dPt4ojQ==", + "requires": { + "@turf/boolean-point-on-line": "^6.5.0", + "@turf/helpers": "^6.5.0", + "@turf/invariant": "^6.5.0", + "@turf/line-segment": "^6.5.0", + "@turf/meta": "^6.5.0", + "@turf/nearest-point-on-line": "^6.5.0", + "deep-equal": "1.x", + "geojson-rbush": "3.x" + } + }, + "@turf/line-segment": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/line-segment/-/line-segment-6.5.0.tgz", + "integrity": "sha512-jI625Ho4jSuJESNq66Mmi290ZJ5pPZiQZruPVpmHkUw257Pew0alMmb6YrqYNnLUuiVVONxAAKXUVeeUGtycfw==", + "requires": { + "@turf/helpers": "^6.5.0", + "@turf/invariant": "^6.5.0", + "@turf/meta": "^6.5.0" + } + }, + "@turf/line-split": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/line-split/-/line-split-6.5.0.tgz", + "integrity": "sha512-/rwUMVr9OI2ccJjw7/6eTN53URtGThNSD5I0GgxyFXMtxWiloRJ9MTff8jBbtPWrRka/Sh2GkwucVRAEakx9Sw==", + "requires": { + "@turf/bbox": "^6.5.0", + "@turf/helpers": "^6.5.0", + "@turf/invariant": "^6.5.0", + "@turf/line-intersect": "^6.5.0", + "@turf/line-segment": "^6.5.0", + "@turf/meta": "^6.5.0", + "@turf/nearest-point-on-line": "^6.5.0", + "@turf/square": "^6.5.0", + "@turf/truncate": "^6.5.0", + "geojson-rbush": "3.x" + } + }, + "@turf/meta": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/meta/-/meta-6.5.0.tgz", + "integrity": "sha512-RrArvtsV0vdsCBegoBtOalgdSOfkBrTJ07VkpiCnq/491W67hnMWmDu7e6Ztw0C3WldRYTXkg3SumfdzZxLBHA==", + "requires": { + "@turf/helpers": "^6.5.0" + } + }, + "@turf/nearest-point-on-line": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/nearest-point-on-line/-/nearest-point-on-line-6.5.0.tgz", + "integrity": "sha512-WthrvddddvmymnC+Vf7BrkHGbDOUu6Z3/6bFYUGv1kxw8tiZ6n83/VG6kHz4poHOfS0RaNflzXSkmCi64fLBlg==", + "requires": { + "@turf/bearing": "^6.5.0", + "@turf/destination": "^6.5.0", + "@turf/distance": "^6.5.0", + "@turf/helpers": "^6.5.0", + "@turf/invariant": "^6.5.0", + "@turf/line-intersect": "^6.5.0", + "@turf/meta": "^6.5.0" + } + }, + "@turf/square": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/square/-/square-6.5.0.tgz", + "integrity": "sha512-BM2UyWDmiuHCadVhHXKIx5CQQbNCpOxB6S/aCNOCLbhCeypKX5Q0Aosc5YcmCJgkwO5BERCC6Ee7NMbNB2vHmQ==", + "requires": { + "@turf/distance": "^6.5.0", + "@turf/helpers": "^6.5.0" + } + }, + "@turf/truncate": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/truncate/-/truncate-6.5.0.tgz", + "integrity": "sha512-pFxg71pLk+eJj134Z9yUoRhIi8vqnnKvCYwdT4x/DQl/19RVdq1tV3yqOT3gcTQNfniteylL5qV1uTBDV5sgrg==", + "requires": { + "@turf/helpers": "^6.5.0", + "@turf/meta": "^6.5.0" + } + }, "@types/concat-stream": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", @@ -16495,6 +17215,11 @@ "@types/node": "*" } }, + "@types/geojson": { + "version": "7946.0.8", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.8.tgz", + "integrity": "sha512-1rkryxURpr6aWP7R786/UQOkJ3PcpQiWkAXBmdWc7ryFWqN6a4xfK7BtjXvFBKO9LjQ+MWQSWxYeZX1OApnArA==" + }, "@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", @@ -16939,7 +17664,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, "requires": { "function-bind": "^1.1.1", "get-intrinsic": "^1.0.2" @@ -17503,19 +18227,43 @@ "type-detect": "^4.0.0" } }, + "deep-equal": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.2.tgz", + "integrity": "sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==", + "requires": { + "is-arguments": "^1.1.1", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.5.1" + } + }, "deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, + "define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "requires": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + } + }, "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "requires": { - "object-keys": "^1.0.12" + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" } }, "delayed-stream": { @@ -18415,6 +19163,11 @@ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", "dev": true }, + "functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==" + }, "generic-pool": { "version": "3.8.2", "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.8.2.tgz", @@ -18501,6 +19254,26 @@ } } }, + "geojson-equality": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/geojson-equality/-/geojson-equality-0.1.6.tgz", + "integrity": "sha512-TqG8YbqizP3EfwP5Uw4aLu6pKkg6JQK9uq/XZ1lXQntvTHD1BBKJWhNpJ2M0ax6TuWMP3oyx6Oq7FCIfznrgpQ==", + "requires": { + "deep-equal": "^1.0.0" + } + }, + "geojson-rbush": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/geojson-rbush/-/geojson-rbush-3.2.0.tgz", + "integrity": "sha512-oVltQTXolxvsz1sZnutlSuLDEcQAKYC/uXt9zDzJJ6bu0W+baTI8LZBaTup5afzibEH4N3jlq2p+a152wlBJ7w==", + "requires": { + "@turf/bbox": "*", + "@turf/helpers": "6.x", + "@turf/meta": "6.x", + "@types/geojson": "7946.0.8", + "rbush": "^3.0.1" + } + }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -18513,14 +19286,14 @@ "dev": true }, "get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "dev": true, + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" } }, "get-package-type": { @@ -18580,6 +19353,14 @@ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true }, + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "requires": { + "get-intrinsic": "^1.1.3" + } + }, "graceful-fs": { "version": "4.2.9", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", @@ -18628,17 +19409,28 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, + "has-property-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "requires": { + "get-intrinsic": "^1.2.2" + } + }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" + }, "has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", - "dev": true + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" }, "has-tostringtag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, "requires": { "has-symbols": "^1.0.2" } @@ -18893,6 +19685,15 @@ "resolved": "https://registry.npmjs.org/is/-/is-3.3.0.tgz", "integrity": "sha512-nW24QBoPcFGGHJGUwnfpI7Yc5CdqWNdsyHQszVE/z2pKHXzh7FZ5GWhJqSyaQ9wMkQnsTx+kAI8bHlCX4tKdbg==" }, + "is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, "is-bigint": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", @@ -18944,7 +19745,6 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, "requires": { "has-tostringtag": "^1.0.0" } @@ -19015,7 +19815,6 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, "requires": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -19931,6 +20730,11 @@ } } }, + "ngeohash": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/ngeohash/-/ngeohash-0.6.3.tgz", + "integrity": "sha512-kltF0cOxgx1AbmVzKxYZaoB0aj7mOxZeHaerEtQV0YaqnkXNq26WWqMmJ6lTqShYxVRWZ/mwvvTrNeOwdslWiw==" + }, "nise": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.0.tgz", @@ -20339,11 +21143,19 @@ "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", "dev": true }, + "object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" }, "object.assign": { "version": "4.1.2", @@ -20816,6 +21628,14 @@ } } }, + "polygon-clipping": { + "version": "0.15.3", + "resolved": "https://registry.npmjs.org/polygon-clipping/-/polygon-clipping-0.15.3.tgz", + "integrity": "sha512-ho0Xx5DLkgxRx/+n4O74XyJ67DcyN3Tu9bGYKsnTukGAW6ssnuak6Mwcyb1wHy9MZc9xsUWqIoiazkZB5weECg==", + "requires": { + "splaytree": "^3.1.0" + } + }, "postgres-array": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", @@ -20932,6 +21752,11 @@ "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==" }, + "quickselect": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-2.0.0.tgz", + "integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==" + }, "randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -20957,6 +21782,14 @@ "unpipe": "1.0.0" } }, + "rbush": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/rbush/-/rbush-3.0.1.tgz", + "integrity": "sha512-XRaVO0YecOpEuIvbhbpTrZgoiI6xBlz6hnlr6EHhd+0x9ase6EmeN+hdwwUaJvLcsFFQ8iWVF1GAK1yB0BWi0w==", + "requires": { + "quickselect": "^2.0.0" + } + }, "readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", @@ -21057,6 +21890,16 @@ "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", "dev": true }, + "regexp.prototype.flags": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", + "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "set-function-name": "^2.0.0" + } + }, "regexpp": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", @@ -21261,11 +22104,39 @@ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" }, + "set-function-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", + "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "requires": { + "define-data-property": "^1.0.1", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.0" + } + }, "setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, + "shape2geohash": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/shape2geohash/-/shape2geohash-1.2.6.tgz", + "integrity": "sha512-lWa48NsKiPtdSboVGAeLDdGai07aHhrw1XlfYEmSCLbTWE3gBi6XQmbn2u8BDO1ksVP+ZW3a+Oa6Egvsy+R58A==", + "requires": { + "@turf/area": "^6.5.0", + "@turf/bbox": "^6.5.0", + "@turf/bbox-polygon": "^6.5.0", + "@turf/boolean-overlap": "^6.5.0", + "@turf/boolean-point-in-polygon": "^6.5.0", + "@turf/boolean-within": "^6.5.0", + "@turf/envelope": "^6.5.0", + "@turf/helpers": "^6.5.0", + "@turf/intersect": "^6.5.0", + "@turf/line-split": "^6.5.0", + "ngeohash": "^0.6.3" + } + }, "shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -21360,6 +22231,11 @@ } } }, + "splaytree": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/splaytree/-/splaytree-3.1.2.tgz", + "integrity": "sha512-4OM2BJgC5UzrhVnnJA4BkHKGtjXNzzUfpQjCO8I05xYPsfS/VuQDwjCGGMi8rYQilHEV4j8NBqTFbls/PZEE7A==" + }, "sprintf-js": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", diff --git a/package.json b/package.json index 7c5ba1b3..0c0cb304 100644 --- a/package.json +++ b/package.json @@ -65,6 +65,7 @@ "rison-node": "^2.1.1", "safe-squel": "^5.12.5", "scramjet": "^4.36.1", + "shape2geohash": "1.2.6", "sshpk": "^1.17.0", "swagger-ui-express": "^4.5.0", "tar": "^6.1.11", From 7ef748cd8a10efce7c5403ca947f35ec4bfbb48b Mon Sep 17 00:00:00 2001 From: Patrick Leary Date: Wed, 13 Dec 2023 12:42:19 -0500 Subject: [PATCH 21/31] taxon range eval can detect latest model taxonomy to use --- lib/model_taxon_range_processor.js | 33 +++++++++++++++++++++++- lib/tasks/evaluate_model_taxon_ranges.js | 9 ++++++- 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/lib/model_taxon_range_processor.js b/lib/model_taxon_range_processor.js index c2bcee5d..84d9d2e4 100644 --- a/lib/model_taxon_range_processor.js +++ b/lib/model_taxon_range_processor.js @@ -18,10 +18,10 @@ const ModelTaxonRangeProcessor = class ModelTaxonRangeProcessor { constructor( options = { } ) { console.log( options ); this.runOptions = options; - this.taxonomyPath = options["taxonomy-path"]; } async start( ) { + this.detectTaxonomyPath( ); await this.createOutputDir( ); const taxonIDs = await this.modelLeafTaxonIDs( ); @@ -40,6 +40,34 @@ const ModelTaxonRangeProcessor = class ModelTaxonRangeProcessor { await pool.start( ); } + detectTaxonomyPath( ) { + if ( this.runOptions["taxonomy-path"] ) { + this.taxonomyPath = this.runOptions["taxonomy-path"]; + return; + } + + const visionExportDirectories = []; + fs.readdirSync( this.runOptions["vision-exports-path"] ).forEach( file => { + const matches = file.match( /vision-export-20[0-9]{12}/ ); + if ( matches ) { + visionExportDirectories.push( matches[0] ); + } + } ); + const latestVisionExportDirectory = _.last( _.sortBy( visionExportDirectories ) ); + if ( !latestVisionExportDirectory ) { + throw new Error( + "unable to determine latest vision export directory within " + + `[${this.runOptions["vision-exports-path"]}]` + ); + } + this.taxonomyPath = path.join( + this.runOptions["vision-exports-path"], + latestVisionExportDirectory, + "taxonomy.csv" + ); + this.associatedVisionExportVersion = _.last( latestVisionExportDirectory.split( "-" ) ); + } + async createOutputDir( ) { try { /* eslint-disable-next-line no-bitwise */ @@ -51,6 +79,9 @@ const ModelTaxonRangeProcessor = class ModelTaxonRangeProcessor { } const todaysDate = moment( ).format( "YYYYMMDDHHmmss" ); this.outputDirName = `taxon_range_eval-${todaysDate}`; + if ( this.associatedVisionExportVersion ) { + this.outputDirName += `-vision-export-${this.associatedVisionExportVersion}`; + } this.outputDir = path.join( this.runOptions.dir, this.outputDirName ); if ( !fs.existsSync( this.outputDir ) ) { fs.mkdirSync( this.outputDir ); diff --git a/lib/tasks/evaluate_model_taxon_ranges.js b/lib/tasks/evaluate_model_taxon_ranges.js index e1d97925..b10d6eba 100644 --- a/lib/tasks/evaluate_model_taxon_ranges.js +++ b/lib/tasks/evaluate_model_taxon_ranges.js @@ -7,7 +7,14 @@ const { argv } = yargs.usage( "Usage: $0 --dir [[output-dir]] --taxonomy-path [[ .string( ["dir", "taxonomy-path"] ) .describe( "dir", "Path to directory where archive will be created" ) .describe( "taxonomy-path", "Path to taxonomy.csv file containing taxa to process" ) - .demandOption( ["dir", "taxonomy-path"] ); + .describe( "vision-exports-path", + "Path to vision exports directory where latest export taxonomy can be found" ) + .demandOption( ["dir"] ); + +if ( !( argv["taxonomy-path"] || argv["vision-exports-path"] ) ) { + console.log( "You must provide a value for argument `taxonomy-path` or `vision-exports-path`\n\n" ); + process.exit( ); +} setTimeout( async ( ) => { new ModelTaxonRangeProcessor( argv ).start( ) From 351f41c32e3b57b4781c6e5696c3cd737e95c65f Mon Sep 17 00:00:00 2001 From: Patrick Leary Date: Fri, 15 Dec 2023 10:59:49 -0500 Subject: [PATCH 22/31] increase size of some large taxon aggregations --- lib/controllers/v1/observations_controller.js | 4 ++-- lib/models/es_model.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/controllers/v1/observations_controller.js b/lib/controllers/v1/observations_controller.js index 62af3101..4cbb6cd9 100644 --- a/lib/controllers/v1/observations_controller.js +++ b/lib/controllers/v1/observations_controller.js @@ -406,7 +406,7 @@ ObservationsController.taxa = async req => { taxon_ids: { terms: { field: "taxon.id", - size: 500000 + size: 600000 } } } @@ -876,7 +876,7 @@ ObservationsController.taxonomy = async req => { min_species_taxon_ids: { terms: { field: "taxon.id", - size: 500000 + size: 600000 } } } diff --git a/lib/models/es_model.js b/lib/models/es_model.js index 888954d4..cf858740 100644 --- a/lib/models/es_model.js +++ b/lib/models/es_model.js @@ -183,7 +183,7 @@ const ESModel = class ESModel { per_page: 0, no_total_hits: true, aggs: { - ancestries: { terms: { field, size: 500000 } } + ancestries: { terms: { field, size: 600000 } } } } ); const countReq = _.assignIn( { }, req, { query: countQuery } ); From b0a1901472766a5fbe8c0cd1382e066711954bf0 Mon Sep 17 00:00:00 2001 From: Patrick Leary Date: Thu, 21 Dec 2023 10:30:39 -0500 Subject: [PATCH 23/31] add v2 endpoint for user password reset #378 --- lib/controllers/v2/users_controller.js | 29 +++++++++++- lib/inaturalist_api_v2.js | 18 ++++++-- openapi/doc.js | 7 +++ openapi/paths/v2/users/reset_password.js | 37 ++++++++++++++++ .../schema/request/users_reset_password.js | 7 +++ package-lock.json | 4 +- test/integration/v2/users.js | 44 +++++++++++++++++++ 7 files changed, 140 insertions(+), 6 deletions(-) create mode 100644 openapi/paths/v2/users/reset_password.js create mode 100644 openapi/schema/request/users_reset_password.js diff --git a/lib/controllers/v2/users_controller.js b/lib/controllers/v2/users_controller.js index d9c88ba7..68bcb295 100644 --- a/lib/controllers/v2/users_controller.js +++ b/lib/controllers/v2/users_controller.js @@ -1,5 +1,7 @@ const _ = require( "lodash" ); const { users } = require( "inaturalistjs" ); +const fetch = require( "node-fetch" ); +const config = require( "../../../config" ); const pgClient = require( "../../pg_client" ); const esClient = require( "../../es_client" ); const User = require( "../../models/user" ); @@ -107,6 +109,30 @@ const update = async req => { return user; }; +const resetPassword = async req => { + const requestAbortController = new AbortController( ); + const requestTimeout = setTimeout( ( ) => { + requestAbortController.abort( ); + }, 10000 ); + try { + const response = await fetch( `${config.apiURL}/users/password`, { + method: "POST", + headers: { + "Content-Type": "application/x-www-form-urlencoded;charset=UTF-8" + }, + body: `user[email]=${encodeURIComponent( req.body.user.email )}`, + signal: requestAbortController.signal + } ); + if ( !response.ok ) { + throw httpError( 500, "Password reset failed" ); + } + } catch ( error ) { + throw httpError( 500, "Password reset failed" ); + } finally { + clearTimeout( requestTimeout ); + } +}; + module.exports = { index, show, @@ -115,5 +141,6 @@ module.exports = { mute: ctrlv1.mute, unmute: ctrlv1.unmute, block: ctrlv1.block, - unblock: ctrlv1.unblock + unblock: ctrlv1.unblock, + resetPassword }; diff --git a/lib/inaturalist_api_v2.js b/lib/inaturalist_api_v2.js index 8c3d1627..7b8ff627 100644 --- a/lib/inaturalist_api_v2.js +++ b/lib/inaturalist_api_v2.js @@ -49,9 +49,11 @@ const InaturalistAPIV2 = class InaturalistAPIV2 { } } - console.log( "errorMiddleware trace:" ); - console.trace( err ); - console.log( ":end trace" ); + if ( !( process.env.NODE_ENV === "test" && err.status === 401 ) ) { + console.log( "errorMiddleware trace:" ); + console.trace( err ); + console.log( ":end trace" ); + } // Confusingly, the response object we get here has not already had its CORS // access control headers set, even though that middleware should be set in // inaturalist_api.js. Without this, clients like Chrome will simply bail @@ -783,6 +785,16 @@ const InaturalistAPIV2 = class InaturalistAPIV2 { } throw JWT_MISSING_OR_INVALID_ERROR; }, + appJwtRequired: async req => { + await InaturalistAPIV2.verifyHeaderJWTs( req ); + if ( req.applicationSession ) { + if ( req.userSession ) { + throw JWT_MISSING_OR_INVALID_ERROR; + } + return true; + } + throw JWT_MISSING_OR_INVALID_ERROR; + }, appOrUserJwtRequired: async req => { await InaturalistAPIV2.verifyHeaderJWTs( req ); if ( req.userSession || req.applicationSession ) { diff --git a/openapi/doc.js b/openapi/doc.js index cda290bf..c29aea2c 100644 --- a/openapi/doc.js +++ b/openapi/doc.js @@ -170,6 +170,13 @@ Privacy Policy: ` in: "header", description: "User-specific JSON Web Token optional, may be used to customize responses for the authenticated user, e.g. localizing common names" }, + appJwtRequired: { + type: "apiKey", + name: "Authorization", + in: "header", + description: "Application JSON Web Token required (application tokens only available to " + + "official apps), and user-specific JSON Web Tokens are not allowed" + }, appOrUserJwtRequired: { type: "apiKey", name: "Authorization", diff --git a/openapi/paths/v2/users/reset_password.js b/openapi/paths/v2/users/reset_password.js new file mode 100644 index 00000000..de50c1c9 --- /dev/null +++ b/openapi/paths/v2/users/reset_password.js @@ -0,0 +1,37 @@ +const UsersController = require( "../../../../lib/controllers/v2/users_controller" ); + +module.exports = sendWrapper => { + async function POST( req, res ) { + await UsersController.resetPassword( req ); + sendWrapper( req, res.status( 204 ) ); + } + + POST.apiDoc = { + tags: ["Users"], + summary: "Reset a user password", + security: [{ + appJwtRequired: [] + }], + requestBody: { + content: { + "application/json": { + schema: { + $ref: "#/components/schemas/UsersResetPassword" + } + } + } + }, + responses: { + 204: { + description: "No response body; success implies reset request was received" + }, + default: { + $ref: "#/components/responses/Error" + } + } + }; + + return { + POST + }; +}; diff --git a/openapi/schema/request/users_reset_password.js b/openapi/schema/request/users_reset_password.js new file mode 100644 index 00000000..76d4c86a --- /dev/null +++ b/openapi/schema/request/users_reset_password.js @@ -0,0 +1,7 @@ +const Joi = require( "joi" ); + +module.exports = Joi.object( ).keys( { + user: Joi.object( ).keys( { + email: Joi.string( ).email( ).required( ) + } ) +} ); diff --git a/package-lock.json b/package-lock.json index c4965b1e..dbf0105b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8478,7 +8478,7 @@ }, "node_modules/inaturalistjs": { "version": "2.9.0", - "resolved": "git+ssh://git@github.com/inaturalist/inaturalistjs.git#03aaab88caf36a809d502c310114198e9d8f9ae1", + "resolved": "git+ssh://git@github.com/inaturalist/inaturalistjs.git#879aaa2182cef4e5104874076f07f77fcbbdc060", "license": "MIT", "dependencies": { "cross-fetch": "^3.1.5", @@ -19621,7 +19621,7 @@ "dev": true }, "inaturalistjs": { - "version": "git+ssh://git@github.com/inaturalist/inaturalistjs.git#03aaab88caf36a809d502c310114198e9d8f9ae1", + "version": "git+ssh://git@github.com/inaturalist/inaturalistjs.git#879aaa2182cef4e5104874076f07f77fcbbdc060", "from": "inaturalistjs@github:inaturalist/inaturalistjs", "requires": { "cross-fetch": "^3.1.5", diff --git a/test/integration/v2/users.js b/test/integration/v2/users.js index 54f19a52..a5350dce 100644 --- a/test/integration/v2/users.js +++ b/test/integration/v2/users.js @@ -319,4 +319,48 @@ describe( "Users", ( ) => { .expect( 200, done ); } ); } ); + + describe( "reset_password", ( ) => { + const currentUser = fixtures.elasticsearch.users.user[0]; + const userToken = jwt.sign( { user_id: currentUser.id }, + config.jwtSecret || "secret", + { algorithm: "HS512" } ); + const applicationToken = jwt.sign( + { application: "whatever" }, + config.jwtApplicationSecret || "application_secret", + { algorithm: "HS512" } + ); + + it( "should 401 without auth", function ( done ) { + request( this.app ) + .post( "/v2/users/reset_password" ) + .expect( 401, done ); + } ); + + it( "should 401 with a user token", function ( done ) { + request( this.app ) + .post( "/v2/users/reset_password" ) + .set( "Authorization", userToken ) + .expect( 401, done ); + } ); + + it( "should hit the Rails equivalent and return 200", function ( done ) { + const nockScope = nock( "http://localhost:3000" ) + .post( "/users/password" ) + .reply( 200 ); + request( this.app ) + .post( "/v2/users/reset_password" ) + .set( "Authorization", applicationToken ) + .send( { + user: { + email: "email@domain.com" + } + } ) + .expect( ( ) => { + // Raise an exception if the nocked endpoint doesn't get called + nockScope.done( ); + } ) + .expect( 204, done ); + } ); + } ); } ); From 3a81f415de6287479f6adf6768956e3bd3e2792c Mon Sep 17 00:00:00 2001 From: Patrick Leary Date: Thu, 21 Dec 2023 11:20:57 -0500 Subject: [PATCH 24/31] fix identifications identifiers pagination, update documentation #416 --- lib/controllers/v1/identifications_controller.js | 13 +++++++------ lib/views/swagger_v1.yml.ejs | 3 ++- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/lib/controllers/v1/identifications_controller.js b/lib/controllers/v1/identifications_controller.js index dacd0c74..0ce9237f 100644 --- a/lib/controllers/v1/identifications_controller.js +++ b/lib/controllers/v1/identifications_controller.js @@ -292,21 +292,22 @@ const IdentificationsController = class IdentificationsController { static async identifiers( req ) { const countQuery = _.assignIn( { }, req.query ); const paginationOptions = { default: 500, max: 500 }; - const { aggSize } = InaturalistAPI.paginationData( req, paginationOptions ); + const { offset, aggSize } = InaturalistAPI.paginationData( req, paginationOptions ); countQuery.aggs = { }; if ( !req.query.no_total_hits ) { countQuery.aggs.total = { cardinality: { field: "user.id", precision_threshold: 5000 } }; } - if ( aggSize > 0 ) { + if ( offset < 500 && aggSize > 0 ) { countQuery.aggs.users = { - terms: { field: "user.id", size: paginationOptions.perPage } + terms: { field: "user.id", size: aggSize } }; } - return ESModel.userAggregationQuery( - req, countQuery, IdentificationsController.elasticResults, { } - ); + return ESModel.userAggregationQuery( req, + countQuery, + IdentificationsController.elasticResults, + { paginationOptions } ); } static async observers( req ) { diff --git a/lib/views/swagger_v1.yml.ejs b/lib/views/swagger_v1.yml.ejs index 6066c703..fea71d22 100644 --- a/lib/views/swagger_v1.yml.ejs +++ b/lib/views/swagger_v1.yml.ejs @@ -446,7 +446,8 @@ paths: description: | Given zero to many of following parameters, returns creators of identifications matching the search criteria and the count of - matching identifications, ordered by count descending + matching identifications, ordered by count descending. A + maximum of 500 results will be returned parameters: <%- include( "_identification_search_params_v1.yml.ejs", { type: "index" } ) %> tags: From a8a79e6e08386514e8ef3c08ac38f34fca00bfb2 Mon Sep 17 00:00:00 2001 From: Patrick Leary Date: Wed, 3 Jan 2024 10:08:25 -0500 Subject: [PATCH 25/31] add v2 endpoint for project_users update --- lib/models/observation_preload.js | 1 + lib/models/project_user.js | 8 +-- openapi/paths/v2/project_users/{id}.js | 50 +++++++++++++++++++ openapi/paths/v2/users/{id}.js | 2 +- .../schema/request/project_users_update.js | 12 +++++ openapi/schema/response/project_membership.js | 2 +- openapi/schema/response/project_user.js | 11 +++- schema/fixtures.js | 8 +-- test/integration/v2/project_users.js | 41 +++++++++++++++ 9 files changed, 125 insertions(+), 10 deletions(-) create mode 100644 openapi/paths/v2/project_users/{id}.js create mode 100644 openapi/schema/request/project_users_update.js create mode 100644 test/integration/v2/project_users.js diff --git a/lib/models/observation_preload.js b/lib/models/observation_preload.js index 0172aa2b..78303dfe 100644 --- a/lib/models/observation_preload.js +++ b/lib/models/observation_preload.js @@ -48,6 +48,7 @@ const ObservationPreload = class ObservationPreload { if ( projectIDs.length === 0 ) { return; } const query = squel .select( ) + .field( "pu.id" ) .field( "pu.project_id" ) .field( "pu.user_id" ) .field( "pu.role" ) diff --git a/lib/models/project_user.js b/lib/models/project_user.js index 1a440859..09b948ac 100644 --- a/lib/models/project_user.js +++ b/lib/models/project_user.js @@ -24,12 +24,14 @@ const ProjectUser = class ProjectUser extends Model { .where( "project_users.project_id IN ?", projectIds ) .where( "pup.name = 'curator_coordinate_access_for'" ) .where( "pup.value IN ?", obscurationSource ); - const { rows } = await pgClient.query( query.toString( ) ).catch( e => { + try { + const { rows } = await pgClient.query( query.toString( ) ); + return _.map( rows, r => r.user_id ); + } catch ( e ) { // eslint-disable-next-line no-console console.log( `[DEBUG] Error retrieving usersTrustingProjectFor with query ${query.toString( )}: `, e ); throw e; - } ); - return _.map( rows, r => r.user_id ); + } } static async projectsTrustedByUserFor( userId, obscurationSourceArg ) { diff --git a/openapi/paths/v2/project_users/{id}.js b/openapi/paths/v2/project_users/{id}.js new file mode 100644 index 00000000..3da8cc46 --- /dev/null +++ b/openapi/paths/v2/project_users/{id}.js @@ -0,0 +1,50 @@ +const Joi = require( "joi" ); +const transform = require( "../../../joi_to_openapi_parameter" ); +const ProjectUsersController = require( "../../../../lib/controllers/v1/project_users_controller" ); + +module.exports = sendWrapper => { + async function PUT( req, res ) { + const results = await ProjectUsersController.update( req ); + sendWrapper( req, res, null, results ); + } + + PUT.apiDoc = { + tags: ["ProjectUsers"], + summary: "Update project users.", + security: [{ + userJwtRequired: [] + }], + parameters: [ + transform( Joi.string( ).label( "id" ).meta( { in: "path" } ) + .required( ) ) + ], + requestBody: { + content: { + "application/json": { + schema: { + $ref: "#/components/schemas/ProjectUsersUpdate" + } + } + } + }, + responses: { + 200: { + description: "A project user.", + content: { + "application/json": { + schema: { + $ref: "#/components/schemas/ProjectUser" + } + } + } + }, + default: { + $ref: "#/components/responses/Error" + } + } + }; + + return { + PUT + }; +}; diff --git a/openapi/paths/v2/users/{id}.js b/openapi/paths/v2/users/{id}.js index 2e8fe56e..6d461a09 100644 --- a/openapi/paths/v2/users/{id}.js +++ b/openapi/paths/v2/users/{id}.js @@ -68,7 +68,7 @@ module.exports = sendWrapper => { }, responses: { 200: { - description: "A list of users.", + description: "A user.", content: { "application/json": { schema: { diff --git a/openapi/schema/request/project_users_update.js b/openapi/schema/request/project_users_update.js new file mode 100644 index 00000000..c8ec6e20 --- /dev/null +++ b/openapi/schema/request/project_users_update.js @@ -0,0 +1,12 @@ +const Joi = require( "joi" ); + +module.exports = Joi.object( ).keys( { + project_user: Joi.object( ).keys( { + prefers_curator_coordinate_access_for: Joi.string( ).valid( + "none", + "any", + "taxon" + ), + prefers_updates: Joi.boolean( ) + } ) +} ); diff --git a/openapi/schema/response/project_membership.js b/openapi/schema/response/project_membership.js index 9a808e15..508894ee 100644 --- a/openapi/schema/response/project_membership.js +++ b/openapi/schema/response/project_membership.js @@ -8,5 +8,5 @@ module.exports = Joi.object( ).keys( { created_at: Joi.date( ), updated_at: Joi.date( ), prefers_curator_coordinate_access_for: Joi.string( ).valid( null ), - prefers_updates: Joi.string( ).valid( null ) + prefers_updates: Joi.boolean( ).valid( null ) } ).unknown( false ).meta( { className: "ProjectMembership" } ); diff --git a/openapi/schema/response/project_user.js b/openapi/schema/response/project_user.js index 9c9fc19c..5d54a6df 100644 --- a/openapi/schema/response/project_user.js +++ b/openapi/schema/response/project_user.js @@ -1,8 +1,17 @@ const Joi = require( "joi" ); module.exports = Joi.object( ).keys( { + id: Joi.number( ).integer( ) + .description( "Unique auto-increment integer identifier." ) + .required( ), + observations_count: Joi.number( ).integer( ), prefers_curator_coordinate_access_for: Joi.string( ), project_id: Joi.number( ).integer( ), role: Joi.string( ).valid( null ), - user_id: Joi.number( ).integer( ) + taxa_count: Joi.number( ).integer( ), + user_id: Joi.number( ).integer( ), + created_at: Joi.string( ).isoDate( ), + created_at_utc: Joi.date( ), + updated_at: Joi.string( ).isoDate( ), + updated_at_utc: Joi.date( ) } ).unknown( false ); diff --git a/schema/fixtures.js b/schema/fixtures.js index f33dd559..0deed068 100644 --- a/schema/fixtures.js +++ b/schema/fixtures.js @@ -2581,17 +2581,17 @@ { "id": 111, "name": "United States", - "ancestry": "111" + "ancestry": "" }, { "id": 222, "name": "California", - "ancestry": "111/222" + "ancestry": "111" }, { "id": 333, "name": "Nevada", - "ancestry": "111/333" + "ancestry": "111" }, { "id": 432, @@ -2602,7 +2602,7 @@ "id": 433, "name": "a-place-in-a-place", "display_name": "A Place In A Place", - "ancestry": "432/433" + "ancestry": "432" }, { "id": 511, diff --git a/test/integration/v2/project_users.js b/test/integration/v2/project_users.js new file mode 100644 index 00000000..6cfcc4b2 --- /dev/null +++ b/test/integration/v2/project_users.js @@ -0,0 +1,41 @@ +const fs = require( "fs" ); +const jwt = require( "jsonwebtoken" ); +const nock = require( "nock" ); +const request = require( "supertest" ); +const config = require( "../../../config" ); + +const fixtures = JSON.parse( fs.readFileSync( "schema/fixtures.js" ) ); + +describe( "Projects", ( ) => { + const projectUser = fixtures.postgresql.project_users[0]; + const token = jwt.sign( + { user_id: projectUser.user_id }, + config.jwtSecret || "secret", + { algorithm: "HS512" } + ); + + describe( "update", ( ) => { + it( "requires authentication", function ( done ) { + request( this.app ).put( `/v2/project_users/${projectUser.id}` ) + .expect( 401, done ); + } ); + + it( "should succeed", function ( done ) { + nock( "http://localhost:3000" ) + .put( `/project_users/${projectUser.id}` ) + .reply( 200, { + id: projectUser.id + } ); + request( this.app ).put( `/v2/project_users/${projectUser.id}` ).set( "Authorization", token ) + .set( "Authorization", token ) + .set( "Content-Type", "application/json" ) + .send( { + project_user: { + prefers_curator_coordinate_access_for: "any", + prefers_updates: false + } + } ) + .expect( 200, done ); + } ); + } ); +} ); From b352a39527d0fe70486c00fa476beb038d875382 Mon Sep 17 00:00:00 2001 From: Corey Farwell Date: Sat, 6 Jan 2024 14:14:08 -0500 Subject: [PATCH 26/31] Mention the `order` option for `species_count` --- lib/views/swagger_v1.yml.ejs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/lib/views/swagger_v1.yml.ejs b/lib/views/swagger_v1.yml.ejs index fea71d22..cdde0f9c 100644 --- a/lib/views/swagger_v1.yml.ejs +++ b/lib/views/swagger_v1.yml.ejs @@ -428,6 +428,15 @@ paths: - identification - observation default: identification + - order: + name: order + type: string + in: query + description: Sort order + default: desc + enum: + - desc + - asc tags: - Identifications responses: From 4028b9ff2e4947eb27910d419cbbd411fafa9624 Mon Sep 17 00:00:00 2001 From: Patrick Leary Date: Wed, 10 Jan 2024 10:06:46 -0500 Subject: [PATCH 27/31] fix taxonomy endpoint for taxa without iconic taxa inaturalist/inaturalist#3961; allow order param for v2 species_counts --- lib/models/taxon.js | 2 +- openapi/paths/v2/observations/species_counts.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/models/taxon.js b/lib/models/taxon.js index dd19642d..7f2a4ea1 100644 --- a/lib/models/taxon.js +++ b/lib/models/taxon.js @@ -542,7 +542,7 @@ const Taxon = class Taxon extends Model { const query = squel.select( ) .field( "taxa.id, taxa.name, taxa.rank, taxa.rank_level, taxa.ancestry, taxa.is_active, iconic_taxa.name AS iconic_taxon_name" ) .from( "taxa" ) - .join( "taxa iconic_taxa", null, "taxa.iconic_taxon_id = iconic_taxa.id" ) + .left_join( "taxa iconic_taxa", null, "taxa.iconic_taxon_id = iconic_taxa.id" ) .where( "taxa.id IN ?", util.paramArray( taxonIDs ) ); const result = await pgClient.query( query.toString( ) ); const taxonDetails = { }; diff --git a/openapi/paths/v2/observations/species_counts.js b/openapi/paths/v2/observations/species_counts.js index c3ad78cf..ae3a1d0d 100644 --- a/openapi/paths/v2/observations/species_counts.js +++ b/openapi/paths/v2/observations/species_counts.js @@ -13,7 +13,7 @@ module.exports = sendWrapper => { const parameters = _.filter( _.map( observationsSearchSchema.$_terms.keys, child => transform( child.schema.label( child.key ) ) - ), p => !_.includes( ["order", "order_by", "only_id"], p.name ) ); + ), p => !_.includes( ["order_by", "only_id"], p.name ) ); parameters.push( transform( Joi.string( ).label( "X-HTTP-Method-Override" ).meta( { in: "header" } ) ) ); From b6b24c1d4decb4adf7841ec28d0b256c873c87ab Mon Sep 17 00:00:00 2001 From: Patrick Leary Date: Tue, 23 Jan 2024 10:08:06 -0500 Subject: [PATCH 28/31] include observation_sounds join object in v2 response #422 --- openapi/schema/response/common_ancestor.js | 2 +- openapi/schema/response/message.js | 2 +- openapi/schema/response/observation.js | 2 ++ openapi/schema/response/observation_photo.js | 2 +- openapi/schema/response/observation_sound.js | 2 +- openapi/schema/response/project_observation.js | 2 +- openapi/schema/response/project_user.js | 2 +- openapi/schema/response/relationship.js | 2 +- openapi/schema/response/subscription.js | 2 +- openapi/schema/response/taxon_count.js | 2 +- openapi/schema/response/update.js | 2 +- 11 files changed, 12 insertions(+), 10 deletions(-) diff --git a/openapi/schema/response/common_ancestor.js b/openapi/schema/response/common_ancestor.js index 7eddab3b..77257d97 100644 --- a/openapi/schema/response/common_ancestor.js +++ b/openapi/schema/response/common_ancestor.js @@ -8,4 +8,4 @@ module.exports = Joi.object( ).keys( { Common ancestor taxon of some of the top results weighted by combined score. If present, it generally has a much higher chance of being accurate (if not precise), often by as much as 30-40 percentage points. -`.replace( /\s+/m, " " ) ); +`.replace( /\s+/m, " " ) ).meta( { className: "CommonAncestor" } ); diff --git a/openapi/schema/response/message.js b/openapi/schema/response/message.js index 9c2b4087..9b1ad10a 100644 --- a/openapi/schema/response/message.js +++ b/openapi/schema/response/message.js @@ -15,4 +15,4 @@ module.exports = Joi.object( ).keys( { comments_count: Joi.number( ).integer( ), from_user: user.valid( null ), to_user: user.valid( null ) -} ).unknown( false ); +} ).unknown( false ).meta( { className: "Message" } ); diff --git a/openapi/schema/response/observation.js b/openapi/schema/response/observation.js index e1996bc2..776a29b0 100644 --- a/openapi/schema/response/observation.js +++ b/openapi/schema/response/observation.js @@ -8,6 +8,7 @@ const identification = require( "./identification" ); const observationFieldValue = require( "./observation_field_value" ); const photo = require( "./photo" ); const observationPhoto = require( "./observation_photo" ); +const observationSound = require( "./observation_sound" ); const project = require( "./project" ); const projectObservation = require( "./project_observation" ); const qualityMetric = require( "./quality_metric" ); @@ -70,6 +71,7 @@ module.exports = Joi.object( ).keys( { oauth_application_id: Joi.number( ).integer( ).valid( null ), obscured: Joi.boolean( ), observation_photos: Joi.array( ).items( observationPhoto ), + observation_sounds: Joi.array( ).items( observationSound ), observed_on: Joi.string( ).valid( null ), observed_on_details: dateDetails, observed_on_string: Joi.string( ).valid( null ), diff --git a/openapi/schema/response/observation_photo.js b/openapi/schema/response/observation_photo.js index 444c53f0..b11dd111 100644 --- a/openapi/schema/response/observation_photo.js +++ b/openapi/schema/response/observation_photo.js @@ -6,4 +6,4 @@ module.exports = Joi.object( ).keys( { photo, position: Joi.number( ).integer( ).valid( null ), uuid: Joi.string( ).guid( { version: "uuidv4" } ) -} ).unknown( false ); +} ).unknown( false ).meta( { className: "ObservationPhoto" } ); diff --git a/openapi/schema/response/observation_sound.js b/openapi/schema/response/observation_sound.js index 8647be24..28eb01a1 100644 --- a/openapi/schema/response/observation_sound.js +++ b/openapi/schema/response/observation_sound.js @@ -6,4 +6,4 @@ module.exports = Joi.object( ).keys( { sound, position: Joi.number( ).integer( ), uuid: Joi.string( ).guid( { version: "uuidv4" } ) -} ).unknown( false ); +} ).unknown( false ).meta( { className: "ObservationSound" } ); diff --git a/openapi/schema/response/project_observation.js b/openapi/schema/response/project_observation.js index 5925f51e..3c901f50 100644 --- a/openapi/schema/response/project_observation.js +++ b/openapi/schema/response/project_observation.js @@ -16,4 +16,4 @@ module.exports = Joi.object( ).keys( { user, user_id: Joi.number( ).integer( ).valid( null ), uuid: Joi.string( ).guid( { version: "uuidv4" } ).required( ) -} ).unknown( false ); +} ).unknown( false ).meta( { className: "ProjectObservation" } ); diff --git a/openapi/schema/response/project_user.js b/openapi/schema/response/project_user.js index 5d54a6df..9cf0ea8e 100644 --- a/openapi/schema/response/project_user.js +++ b/openapi/schema/response/project_user.js @@ -14,4 +14,4 @@ module.exports = Joi.object( ).keys( { created_at_utc: Joi.date( ), updated_at: Joi.string( ).isoDate( ), updated_at_utc: Joi.date( ) -} ).unknown( false ); +} ).unknown( false ).meta( { className: "ProjectUser" } ); diff --git a/openapi/schema/response/relationship.js b/openapi/schema/response/relationship.js index 3116c0ec..903b5dbe 100644 --- a/openapi/schema/response/relationship.js +++ b/openapi/schema/response/relationship.js @@ -12,4 +12,4 @@ module.exports = Joi.object( ).keys( { following: Joi.boolean( ).description( "Whether the user notifications about new content made by the friend" ), trust: Joi.boolean( ).description( "Whether the user trusts the friend with hidden coordinates" ), reciprocal_trust: Joi.boolean( ).description( "Whether the friend trusts the user with hidden coordinates" ) -} ); +} ).meta( { className: "Relationship" } ); diff --git a/openapi/schema/response/subscription.js b/openapi/schema/response/subscription.js index ce9ccedd..9141467e 100644 --- a/openapi/schema/response/subscription.js +++ b/openapi/schema/response/subscription.js @@ -10,4 +10,4 @@ module.exports = Joi.object( ).keys( { created_at: Joi.string( ), updated_at: Joi.string( ), taxon_id: Joi.number( ).integer( ) -} ); +} ).meta( { className: "Subscription" } ); diff --git a/openapi/schema/response/taxon_count.js b/openapi/schema/response/taxon_count.js index 20b69fc7..4884c3d2 100644 --- a/openapi/schema/response/taxon_count.js +++ b/openapi/schema/response/taxon_count.js @@ -4,4 +4,4 @@ const taxon = require( "./taxon" ); module.exports = Joi.object( ).keys( { taxon: taxon.required( ), count: Joi.number( ).integer( ).required( ) -} ).unknown( false ); +} ).unknown( false ).meta( { className: "TaxonCount" } ); diff --git a/openapi/schema/response/update.js b/openapi/schema/response/update.js index 92352476..93624888 100644 --- a/openapi/schema/response/update.js +++ b/openapi/schema/response/update.js @@ -19,4 +19,4 @@ module.exports = Joi.object( ).keys( { resource_id: Joi.number( ).integer( ), resource_uuid: Joi.string( ).guid( { version: "uuidv4" } ), viewed: Joi.boolean( ) -} ).unknown( false ); +} ).unknown( false ).meta( { className: "Update" } ); From 3e1f2e87268f387d68bceddb4eefc6a33e310102 Mon Sep 17 00:00:00 2001 From: Patrick Leary Date: Fri, 26 Jan 2024 12:23:03 -0500 Subject: [PATCH 29/31] update inaturalistjs, other dependencies --- package-lock.json | 79 ++++++++++++++++++++++++++++++----------------- 1 file changed, 51 insertions(+), 28 deletions(-) diff --git a/package-lock.json b/package-lock.json index dbf0105b..c1ad1e6a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -81,6 +81,43 @@ "uuid": "^8.3.2" } }, + "../../inaturalistjs": { + "version": "2.9.0", + "extraneous": true, + "license": "MIT", + "dependencies": { + "cross-fetch": "^3.1.5", + "form-data": "^4.0.0", + "rison-node": "^2.1.1" + }, + "devDependencies": { + "@babel/core": "^7.16.7", + "@babel/eslint-parser": "^7.16.5", + "@babel/preset-env": "^7.16.8", + "@babel/preset-flow": "^7.16.7", + "babel-loader": "^8.2.3", + "babel-preset-flow": "^6.23.0", + "chai": "^4.3.4", + "debug": "^4.3.3", + "eslint": "^8.6.0", + "eslint-config-airbnb": "^19.0.4", + "eslint-plugin-import": "^2.25.4", + "eslint-plugin-jsx-a11y": "^6.5.1", + "eslint-plugin-react": "^7.28.0", + "extend": "^3.0.2", + "flow-bin": "^0.169.0", + "hoek": "^6.1.3", + "lodash": "^4.17.21", + "mocha": "^10.0.0", + "nock": "^13.2.2", + "nyc": "^15.1.0", + "querystring-es3": "^0.2.1", + "sinon": "^12.0.1", + "supertest": "^6.2.0", + "webpack": "^5.76.0", + "webpack-cli": "^4.10.0" + } + }, "node_modules/@ampproject/remapping": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", @@ -7658,9 +7695,9 @@ "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==" }, "node_modules/follow-redirects": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", - "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", + "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==", "funding": [ { "type": "individual", @@ -8478,7 +8515,7 @@ }, "node_modules/inaturalistjs": { "version": "2.9.0", - "resolved": "git+ssh://git@github.com/inaturalist/inaturalistjs.git#879aaa2182cef4e5104874076f07f77fcbbdc060", + "resolved": "git+ssh://git@github.com/inaturalist/inaturalistjs.git#9cbfcb1a004c90b26e812b7bf70da7fc8044a578", "license": "MIT", "dependencies": { "cross-fetch": "^3.1.5", @@ -9261,12 +9298,6 @@ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" }, - "node_modules/lodash.set": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz", - "integrity": "sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM=", - "dev": true - }, "node_modules/lodash.uniq": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", @@ -9991,14 +10022,13 @@ } }, "node_modules/nock": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/nock/-/nock-13.2.2.tgz", - "integrity": "sha512-PcBHuvl9i6zfaJ50A7LS55oU+nFLv8htXIhffJO+FxyfibdZ4jEvd9kTuvkrJireBFIGMZ+oUIRpMK5gU9h//g==", + "version": "13.5.0", + "resolved": "https://registry.npmjs.org/nock/-/nock-13.5.0.tgz", + "integrity": "sha512-9hc1eCS2HtOz+sE9W7JQw/tXJktg0zoPSu48s/pYe73e25JW9ywiowbqnUSd7iZPeVawLcVpPZeZS312fwSY+g==", "dev": true, "dependencies": { "debug": "^4.1.0", "json-stringify-safe": "^5.0.1", - "lodash.set": "^4.3.2", "propagate": "^2.0.0" }, "engines": { @@ -19053,9 +19083,9 @@ "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==" }, "follow-redirects": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", - "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==" + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", + "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==" }, "foreground-child": { "version": "2.0.0", @@ -19621,7 +19651,7 @@ "dev": true }, "inaturalistjs": { - "version": "git+ssh://git@github.com/inaturalist/inaturalistjs.git#879aaa2182cef4e5104874076f07f77fcbbdc060", + "version": "git+ssh://git@github.com/inaturalist/inaturalistjs.git#9cbfcb1a004c90b26e812b7bf70da7fc8044a578", "from": "inaturalistjs@github:inaturalist/inaturalistjs", "requires": { "cross-fetch": "^3.1.5", @@ -20219,12 +20249,6 @@ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" }, - "lodash.set": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz", - "integrity": "sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM=", - "dev": true - }, "lodash.uniq": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", @@ -20775,14 +20799,13 @@ } }, "nock": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/nock/-/nock-13.2.2.tgz", - "integrity": "sha512-PcBHuvl9i6zfaJ50A7LS55oU+nFLv8htXIhffJO+FxyfibdZ4jEvd9kTuvkrJireBFIGMZ+oUIRpMK5gU9h//g==", + "version": "13.5.0", + "resolved": "https://registry.npmjs.org/nock/-/nock-13.5.0.tgz", + "integrity": "sha512-9hc1eCS2HtOz+sE9W7JQw/tXJktg0zoPSu48s/pYe73e25JW9ywiowbqnUSd7iZPeVawLcVpPZeZS312fwSY+g==", "dev": true, "requires": { "debug": "^4.1.0", "json-stringify-safe": "^5.0.1", - "lodash.set": "^4.3.2", "propagate": "^2.0.0" } }, From f58e3f41040a4c8170a29309994a239c570dc227 Mon Sep 17 00:00:00 2001 From: Ken-ichi Ueda Date: Fri, 2 Feb 2024 12:07:27 -0800 Subject: [PATCH 30/31] Updated docs for v2/observations/updates --- .../schema/request/observations_updates.js | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/openapi/schema/request/observations_updates.js b/openapi/schema/request/observations_updates.js index 725c62fe..b0e47cf9 100644 --- a/openapi/schema/request/observations_updates.js +++ b/openapi/schema/request/observations_updates.js @@ -1,12 +1,20 @@ const Joi = require( "joi" ); module.exports = Joi.object( ).keys( { - created_after: Joi.string( ), - viewed: Joi.boolean( ), - observations_by: Joi.string( ).valid( - "owner", - "following" - ), + created_after: Joi.string( ) + .description( "ISO8601 datetime after which the update was created" ), + viewed: Joi.boolean( ) + .description( + "When false this only returns updates that have not been viewed " + + "by the authenticated user. When true it returns all updates." + ) + .default( true ), + observations_by: Joi.string( ) + .valid( "owner", "following" ) + .description( + "Restrict to updates on observations by the authenticated user (owner) " + + "or on observations the authenticated user is following" + ), page: Joi.number( ).integer( ), per_page: Joi.number( ).integer( ), fields: Joi.any( ) From a0da003d4e8f90cbae5411435d57ecd346ddc673 Mon Sep 17 00:00:00 2001 From: Patrick Leary Date: Tue, 6 Feb 2024 10:21:04 -0500 Subject: [PATCH 31/31] add users recent_observation_fields endpoint --- lib/controllers/v1/users_controller.js | 32 ++++++++++++++ lib/inaturalist_api.js | 1 + .../v2/users/recent_observation_fields.js | 40 +++++++++++++++++ .../response/results_observation_fields.js | 9 ++++ package-lock.json | 43 ++----------------- schema/fixtures.js | 22 ++++++++++ test/integration/v1/users.js | 32 ++++++++++++++ test/integration/v2/users.js | 31 +++++++++++++ 8 files changed, 170 insertions(+), 40 deletions(-) create mode 100644 openapi/paths/v2/users/recent_observation_fields.js create mode 100644 openapi/schema/response/results_observation_fields.js diff --git a/lib/controllers/v1/users_controller.js b/lib/controllers/v1/users_controller.js index bd6380cd..e7a2052d 100644 --- a/lib/controllers/v1/users_controller.js +++ b/lib/controllers/v1/users_controller.js @@ -384,6 +384,38 @@ const UsersController = class UsersController { static async resendConfirmation( req ) { return InaturalistAPI.iNatJSWrap( users.resendConfirmation, req ); } + + static async recentObservationFields( req ) { + if ( !req.userSession ) { throw new Error( 401 ); } + const query = squel.select( { autoQuoteAliasNames: false } ) + .field( "id" ) + .field( "name" ) + .field( "description" ) + .field( "datatype" ) + .field( "allowed_values" ) + .field( "values_count" ) + .field( "ofvs.ofv_max_id" ) + .from( "observation_fields" ) + .join( + squel.select( ) + .field( "observation_field_id" ) + .field( "max(observation_field_values.id) as ofv_max_id" ) + .from( "observation_field_values" ) + .where( "user_id = ?", req.userSession.user_id ) + .group( "observation_field_id" ), "ofvs", "observation_fields.id = ofvs.observation_field_id" + ) + .order( "ofvs.ofv_max_id", false ) + .limit( 10 ); + const { rows } = await pgClient.query( query.toString( ) ); + return { + total_results: rows.length, + page: 1, + per_page: rows.length, + results: _.map( rows, r => _.pick( r, [ + "id", "name", "description", "datatype", "allowed_values", "values_count" + ] ) ) + }; + } }; module.exports = UsersController; diff --git a/lib/inaturalist_api.js b/lib/inaturalist_api.js index a24ea93c..5bf01af7 100644 --- a/lib/inaturalist_api.js +++ b/lib/inaturalist_api.js @@ -498,6 +498,7 @@ InaturalistAPI.server = async ( ) => { } ); dfault( "get", "/v1/users/me", UsersController.me ); dfault( "get", "/v1/users/notification_counts", UsersController.notificationCounts ); + dfault( "get", "/v1/users/recent_observation_fields", UsersController.recentObservationFields ); dfault( "get", "/v1/users/:id", UsersController.show ); dfault( "get", "/v1/users/:id/projects", UsersController.projects ); dfault( "get", "/v1/users/:id/followees", UsersController.followees ); diff --git a/openapi/paths/v2/users/recent_observation_fields.js b/openapi/paths/v2/users/recent_observation_fields.js new file mode 100644 index 00000000..42bcd7e9 --- /dev/null +++ b/openapi/paths/v2/users/recent_observation_fields.js @@ -0,0 +1,40 @@ +const Joi = require( "joi" ); +const transform = require( "../../../joi_to_openapi_parameter" ); +const UsersController = require( "../../../../lib/controllers/v1/users_controller" ); + +module.exports = sendWrapper => { + async function GET( req, res ) { + const results = await UsersController.recentObservationFields( req ); + sendWrapper( req, res, null, results ); + } + + GET.apiDoc = { + tags: ["Users"], + summary: "Fetch observation fields recently used by the logged-in user.", + security: [{ + userJwtRequired: [] + }], + parameters: [ + transform( Joi.string( ).label( "fields" ) ) + ], + responses: { + 200: { + description: "An array of observation fields.", + content: { + "application/json": { + schema: { + $ref: "#/components/schemas/ResultsObservationFields" + } + } + } + }, + default: { + $ref: "#/components/responses/Error" + } + } + }; + + return { + GET + }; +}; diff --git a/openapi/schema/response/results_observation_fields.js b/openapi/schema/response/results_observation_fields.js new file mode 100644 index 00000000..2982685e --- /dev/null +++ b/openapi/schema/response/results_observation_fields.js @@ -0,0 +1,9 @@ +const Joi = require( "joi" ); +const observationField = require( "./observation_field" ); + +module.exports = Joi.object( ).keys( { + total_results: Joi.number( ).integer( ).required( ), + page: Joi.number( ).integer( ).required( ), + per_page: Joi.number( ).integer( ).required( ), + results: Joi.array( ).items( observationField ).required( ) +} ).unknown( false ); diff --git a/package-lock.json b/package-lock.json index c1ad1e6a..34e84bce 100644 --- a/package-lock.json +++ b/package-lock.json @@ -81,43 +81,6 @@ "uuid": "^8.3.2" } }, - "../../inaturalistjs": { - "version": "2.9.0", - "extraneous": true, - "license": "MIT", - "dependencies": { - "cross-fetch": "^3.1.5", - "form-data": "^4.0.0", - "rison-node": "^2.1.1" - }, - "devDependencies": { - "@babel/core": "^7.16.7", - "@babel/eslint-parser": "^7.16.5", - "@babel/preset-env": "^7.16.8", - "@babel/preset-flow": "^7.16.7", - "babel-loader": "^8.2.3", - "babel-preset-flow": "^6.23.0", - "chai": "^4.3.4", - "debug": "^4.3.3", - "eslint": "^8.6.0", - "eslint-config-airbnb": "^19.0.4", - "eslint-plugin-import": "^2.25.4", - "eslint-plugin-jsx-a11y": "^6.5.1", - "eslint-plugin-react": "^7.28.0", - "extend": "^3.0.2", - "flow-bin": "^0.169.0", - "hoek": "^6.1.3", - "lodash": "^4.17.21", - "mocha": "^10.0.0", - "nock": "^13.2.2", - "nyc": "^15.1.0", - "querystring-es3": "^0.2.1", - "sinon": "^12.0.1", - "supertest": "^6.2.0", - "webpack": "^5.76.0", - "webpack-cli": "^4.10.0" - } - }, "node_modules/@ampproject/remapping": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", @@ -8514,8 +8477,8 @@ } }, "node_modules/inaturalistjs": { - "version": "2.9.0", - "resolved": "git+ssh://git@github.com/inaturalist/inaturalistjs.git#9cbfcb1a004c90b26e812b7bf70da7fc8044a578", + "version": "2.10.0", + "resolved": "git+ssh://git@github.com/inaturalist/inaturalistjs.git#9951a0507da318ba9d7f9464e465d9868d4101da", "license": "MIT", "dependencies": { "cross-fetch": "^3.1.5", @@ -19651,7 +19614,7 @@ "dev": true }, "inaturalistjs": { - "version": "git+ssh://git@github.com/inaturalist/inaturalistjs.git#9cbfcb1a004c90b26e812b7bf70da7fc8044a578", + "version": "git+ssh://git@github.com/inaturalist/inaturalistjs.git#9951a0507da318ba9d7f9464e465d9868d4101da", "from": "inaturalistjs@github:inaturalist/inaturalistjs", "requires": { "cross-fetch": "^3.1.5", diff --git a/schema/fixtures.js b/schema/fixtures.js index 0deed068..cc9cd1e6 100644 --- a/schema/fixtures.js +++ b/schema/fixtures.js @@ -2306,6 +2306,28 @@ "scopes": "write login" } ], + "observation_fields": [ + { + "id": 1, + "name": "fieldname", + "description": "fieldname description", + "datatype": "text", + "allowed_values": "one|two|three", + "values_count": 1 + } + ], + "observation_field_values": [ + { + "id": 1, + "observation_id": 1, + "observation_field_id": 1, + "value": "one", + "created_at": "2024-02-01T00:00:00", + "updated_at": "2024-02-01T00:00:00", + "user_id": 1, + "uuid": "b027f2ff-c913-470e-a1da-a3e2f3ec2359" + } + ], "observations": [ { "id": 1, diff --git a/test/integration/v1/users.js b/test/integration/v1/users.js index 78e145c3..6bc74982 100644 --- a/test/integration/v1/users.js +++ b/test/integration/v1/users.js @@ -362,4 +362,36 @@ describe( "Users", ( ) => { } ); } ); } ); + + describe( "recentObservationFields", ( ) => { + it( "fails for unauthenticated requests", function ( done ) { + request( this.app ).get( "/v1/users/recent_observation_fields" ).expect( res => { + expect( res.error.text ).to.eq( "{\"error\":\"Unauthorized\",\"status\":401}" ); + } ).expect( "Content-Type", /json/ ) + .expect( 401, done ); + } ); + + it( "returns observation fields", function ( done ) { + const token = jwt.sign( { user_id: 1 }, + config.jwtSecret || "secret", + { algorithm: "HS512" } ); + const fixtureObservationField = fixtures.postgresql.observation_fields[0]; + request( this.app ).get( "/v1/users/recent_observation_fields" ) + .set( "Authorization", token ) + .expect( res => { + expect( res.body.page ).to.eq( 1 ); + expect( res.body.per_page ).to.eq( 1 ); + expect( res.body.total_results ).to.eq( 1 ); + expect( res.body.results.length ).to.eq( 1 ); + expect( res.body.results[0].id ).to.eq( fixtureObservationField.id ); + expect( res.body.results[0].name ).to.eq( fixtureObservationField.name ); + expect( res.body.results[0].description ).to.eq( fixtureObservationField.description ); + expect( res.body.results[0].datatype ).to.eq( fixtureObservationField.datatype ); + expect( res.body.results[0].allowed_values ).to + .eq( fixtureObservationField.allowed_values ); + } ) + .expect( "Content-Type", /json/ ) + .expect( 200, done ); + } ); + } ); } ); diff --git a/test/integration/v2/users.js b/test/integration/v2/users.js index a5350dce..e6b30142 100644 --- a/test/integration/v2/users.js +++ b/test/integration/v2/users.js @@ -363,4 +363,35 @@ describe( "Users", ( ) => { .expect( 204, done ); } ); } ); + + describe( "recentObservationFields", ( ) => { + it( "fails for unauthenticated requests", function ( done ) { + request( this.app ) + .get( "/v2/users/recent_observation_fields" ) + .expect( 401, done ); + } ); + + it( "returns observation fields", function ( done ) { + const token = jwt.sign( { user_id: 1 }, + config.jwtSecret || "secret", + { algorithm: "HS512" } ); + const fixtureObservationField = fixtures.postgresql.observation_fields[0]; + request( this.app ).get( "/v2/users/recent_observation_fields?fields=all" ) + .set( "Authorization", token ) + .expect( res => { + expect( res.body.page ).to.eq( 1 ); + expect( res.body.per_page ).to.eq( 1 ); + expect( res.body.total_results ).to.eq( 1 ); + expect( res.body.results.length ).to.eq( 1 ); + expect( res.body.results[0].id ).to.eq( fixtureObservationField.id ); + expect( res.body.results[0].name ).to.eq( fixtureObservationField.name ); + expect( res.body.results[0].description ).to.eq( fixtureObservationField.description ); + expect( res.body.results[0].datatype ).to.eq( fixtureObservationField.datatype ); + expect( res.body.results[0].allowed_values ).to + .eq( fixtureObservationField.allowed_values ); + } ) + .expect( "Content-Type", /json/ ) + .expect( 200, done ); + } ); + } ); } );