diff --git a/.gitignore b/.gitignore index 7c6f19d..d2a0cb3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1 @@ -sdks/**/** - .npmrc diff --git a/openapi.yaml b/openapi.yaml index a11fa84..8a70c36 100644 --- a/openapi.yaml +++ b/openapi.yaml @@ -5,342 +5,312 @@ info: API for finding and booking train trips across Europe. ## Run in Postman - + Experiment with this API in Postman, using our Postman Collection. [Run In Postman](https://app.getpostman.com/run-collection/9265903-7a75a0d0-b108-4436-ba54-c6139698dc08?action=collection%2Ffork&source=rip_markdown&collection-url=entityId%3D9265903-7a75a0d0-b108-4436-ba54-c6139698dc08%26entityType%3Dcollection%26workspaceId%3Df507f69d-9564-419c-89a2-cb8e4c8c7b8f) - - ## Run in Insomnia - - Experiment with this API in Insomnia, using our Insomnia Collection. - - [![Run in Insomnia}](https://insomnia.rest/images/run.svg)](https://insomnia.rest/run/?label=Train%20Travel%20API&uri=https%3A%2F%2Fraw.githubusercontent.com%2Fbump-sh-examples%2Ftrain-travel-api%2Fmain%2Finsomnia%2FInsomnia_2024-05-27.json) version: 1.0.0 contact: name: Train Support url: https://example.com/support email: support@example.com - license: + license: name: Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International identifier: CC-BY-NC-SA-4.0 + x-feedbackLink: + label: Submit Feedback + url: https://github.com/bump-sh-examples/train-travel-api/issues/new + servers: - url: https://wm-train-travel.wiremockapi.cloud - description: Train Travel mock - - url: https://apimatic-demo.wiremockapi.cloud - description: APIMatic Train Travel playground + description: Train Travel API mock + security: -- OAuth2: - - read + - OAuth2: + - read tags: -- name: Stations - description: | - Find and filter train stations across Europe, including their location - and local timezone. -- name: Trips - description: | - Timetables and routes for train trips between stations, including pricing - and availability. -- name: Bookings - description: | - Create and manage bookings for train trips, including passenger details - and optional extras. -- name: Payments - description: "Pay for bookings using a card or bank account, and view payment\n\ - status and history.\n\n> warn\n> Bookings usually expire within 1 hour so you'll\ - \ need to make your payment\n> before the expiry date \n" + - name: Stations + description: | + Find and filter train stations across Europe, including their location + and local timezone. + - name: Trips + description: | + Timetables and routes for train trips between stations, including pricing + and availability. + - name: Bookings + description: | + Create and manage bookings for train trips, including passenger details + and optional extras. + - name: Payments + description: | + Pay for bookings using a card or bank account, and view payment + status and history. + + > warn + > Bookings usually expire within 1 hour so you'll need to make your payment + > before the expiry date + paths: /stations: get: summary: Get a list of train stations - description: Returns a list of all train stations in the system. + description: Returns a paginated and searchable list of all train stations. operationId: get-stations tags: - - Stations + - Stations + parameters: + - name: page + in: query + description: The page number to return + required: false + schema: + type: integer + minimum: 1 + default: 1 + example: 1 + - name: coordinates + in: query + description: > + The latitude and longitude of the user's location, to narrow down + the search results to sites within a proximity of this location. + required: false + schema: + type: string + example: 52.5200,13.4050 + - name: search + in: query + description: > + A search term to filter the list of stations by name or address. + required: false + schema: + type: string + examples: + - Milano Centrale + - Paris responses: - "200": - description: A list of train stations + '200': + description: OK headers: RateLimit: - $ref: "#/components/headers/RateLimit" + $ref: '#/components/headers/RateLimit' content: application/json: schema: - allOf: - - $ref: "#/components/schemas/Wrapper-Collection" - - properties: - data: - type: array - items: - $ref: "#/components/schemas/Station" - - properties: - links: - allOf: - - $ref: "#/components/schemas/Links-Self" - - $ref: "#/components/schemas/Links-Pagination" + properties: + data: + type: array + items: + $ref: '#/components/schemas/Station' example: data: - - id: efdbb9d1-02c2-4bc3-afb7-6788d8782b1e - name: Berlin Hauptbahnhof - address: "Invalidenstraße 10557 Berlin, Germany" - country_code: DE - timezone: Europe/Berlin - - id: b2e783e1-c824-4d63-b37a-d8d698862f1d - name: Paris Gare du Nord - address: "18 Rue de Dunkerque 75010 Paris, France" - country_code: FR - timezone: Europe/Paris + - id: efdbb9d1-02c2-4bc3-afb7-6788d8782b1e + name: Berlin Hauptbahnhof + address: Invalidenstraße 10557 Berlin, Germany + country_code: DE + timezone: Europe/Berlin + - id: b2e783e1-c824-4d63-b37a-d8d698862f1d + name: Paris Gare du Nord + address: 18 Rue de Dunkerque 75010 Paris, France + country_code: FR + timezone: Europe/Paris links: self: https://api.example.com/stations&page=2 next: https://api.example.com/stations?page=3 prev: https://api.example.com/stations?page=1 - application/xml: - schema: - allOf: - - $ref: "#/components/schemas/Wrapper-Collection" - - properties: - data: - type: array - xml: - name: stations - wrapped: true - items: - $ref: "#/components/schemas/Station" - - properties: - links: - allOf: - - $ref: "#/components/schemas/Links-Self" - - $ref: "#/components/schemas/Links-Pagination" - "400": - $ref: "#/components/responses/BadRequest" - "401": - $ref: "#/components/responses/Unauthorized" - "403": - $ref: "#/components/responses/Forbidden" - "429": - $ref: "#/components/responses/TooManyRequests" - "500": - $ref: "#/components/responses/InternalServerError" + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '429': + $ref: '#/components/responses/TooManyRequests' + '500': + $ref: '#/components/responses/InternalServerError' /trips: get: summary: Get available train trips - description: "Returns a list of available train trips between the specified\ - \ origin and destination stations on the given date, and allows for filtering\ - \ by bicycle and dog allowances." + description: > + Returns a list of available train trips between the specified origin and + destination stations on the given date, and allows for filtering by + bicycle and dog allowances. operationId: get-trips tags: - - Trips + - Trips parameters: - - name: origin - in: query - description: The ID of the origin station - required: true - schema: - type: string - format: uuid - example: efdbb9d1-02c2-4bc3-afb7-6788d8782b1e - - name: destination - in: query - description: The ID of the destination station - required: true - schema: - type: string - format: uuid - example: b2e783e1-c824-4d63-b37a-d8d698862f1d - - name: date - in: query - description: The date and time of the trip in ISO 8601 format in origin station's - timezone. - required: true - schema: - type: string - format: date-time - example: 2024-02-01T09:00:00Z - - name: bicycles - in: query - description: Only return trips where bicycles are known to be allowed - required: false - schema: - type: boolean - default: false - - name: dogs - in: query - description: Only return trips where dogs are known to be allowed - required: false - schema: - type: boolean - default: false + - name: origin + in: query + description: The ID of the origin station + required: true + schema: + type: string + format: uuid + example: efdbb9d1-02c2-4bc3-afb7-6788d8782b1e + - name: destination + in: query + description: The ID of the destination station + required: true + schema: + type: string + format: uuid + example: b2e783e1-c824-4d63-b37a-d8d698862f1d + - name: date + in: query + description: The date and time of the trip in ISO 8601 format in origin station's timezone. + required: true + schema: + type: string + format: date-time + example: '2024-02-01T09:00:00Z' + - name: bicycles + in: query + description: Only return trips where bicycles are known to be allowed + required: false + schema: + type: boolean + default: false + - name: dogs + in: query + description: Only return trips where dogs are known to be allowed + required: false + schema: + type: boolean + default: false responses: - "200": + '200': description: A list of available train trips headers: RateLimit: - $ref: "#/components/headers/RateLimit" + $ref: '#/components/headers/RateLimit' content: application/json: schema: allOf: - - $ref: "#/components/schemas/Wrapper-Collection" - - properties: - data: - type: array - items: - $ref: "#/components/schemas/Trip" - - properties: - links: - allOf: - - $ref: "#/components/schemas/Links-Self" - - $ref: "#/components/schemas/Links-Pagination" + - $ref: '#/components/schemas/Wrapper-Collection' + - properties: + data: + type: array + items: + $ref: '#/components/schemas/Trip' + - properties: + links: + allOf: + - $ref: '#/components/schemas/Links-Self' + - $ref: '#/components/schemas/Links-Pagination' example: data: - - id: ea399ba1-6d95-433f-92d1-83f67b775594 - origin: efdbb9d1-02c2-4bc3-afb7-6788d8782b1e - destination: b2e783e1-c824-4d63-b37a-d8d698862f1d - departure_time: 2024-02-01T10:00:00Z - arrival_time: 2024-02-01T16:00:00Z - price: 50 - operator: Deutsche Bahn - bicycles_allowed: true - dogs_allowed: true - - id: 4d67459c-af07-40bb-bb12-178dbb88e09f - origin: b2e783e1-c824-4d63-b37a-d8d698862f1d - destination: efdbb9d1-02c2-4bc3-afb7-6788d8782b1e - departure_time: 2024-02-01T12:00:00Z - arrival_time: 2024-02-01T18:00:00Z - price: 50 - operator: SNCF - bicycles_allowed: true - dogs_allowed: true + - id: ea399ba1-6d95-433f-92d1-83f67b775594 + origin: efdbb9d1-02c2-4bc3-afb7-6788d8782b1e + destination: b2e783e1-c824-4d63-b37a-d8d698862f1d + departure_time: '2024-02-01T10:00:00Z' + arrival_time: '2024-02-01T16:00:00Z' + price: 50 + operator: Deutsche Bahn + bicycles_allowed: true + dogs_allowed: true + - id: 4d67459c-af07-40bb-bb12-178dbb88e09f + origin: b2e783e1-c824-4d63-b37a-d8d698862f1d + destination: efdbb9d1-02c2-4bc3-afb7-6788d8782b1e + departure_time: '2024-02-01T12:00:00Z' + arrival_time: '2024-02-01T18:00:00Z' + price: 50 + operator: SNCF + bicycles_allowed: true + dogs_allowed: true links: self: https://api.example.com/trips?origin=efdbb9d1-02c2-4bc3-afb7-6788d8782b1e&destination=b2e783e1-c824-4d63-b37a-d8d698862f1d&date=2024-02-01 next: https://api.example.com/trips?origin=efdbb9d1-02c2-4bc3-afb7-6788d8782b1e&destination=b2e783e1-c824-4d63-b37a-d8d698862f1d&date=2024-02-01&page=2 - application/xml: - schema: - allOf: - - $ref: "#/components/schemas/Wrapper-Collection" - - properties: - data: - type: array - xml: - name: trips - wrapped: true - items: - $ref: "#/components/schemas/Trip" - - properties: - links: - allOf: - - $ref: "#/components/schemas/Links-Self" - - $ref: "#/components/schemas/Links-Pagination" - "400": - $ref: "#/components/responses/BadRequest" - "401": - $ref: "#/components/responses/Unauthorized" - "403": - $ref: "#/components/responses/Forbidden" - "429": - $ref: "#/components/responses/TooManyRequests" - "500": - $ref: "#/components/responses/InternalServerError" + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '429': + $ref: '#/components/responses/TooManyRequests' + '500': + $ref: '#/components/responses/InternalServerError' /bookings: get: operationId: get-bookings summary: List existing bookings description: Returns a list of all trip bookings by the authenticated user. tags: - - Bookings + - Bookings responses: - "200": + '200': description: A list of bookings headers: RateLimit: - $ref: "#/components/headers/RateLimit" + $ref: '#/components/headers/RateLimit' content: application/json: schema: allOf: - - $ref: "#/components/schemas/Wrapper-Collection" - - properties: - data: - type: array - items: - $ref: "#/components/schemas/Booking" - - properties: - links: - allOf: - - $ref: "#/components/schemas/Links-Self" - - $ref: "#/components/schemas/Links-Pagination" + - $ref: '#/components/schemas/Wrapper-Collection' + - properties: + data: + type: array + items: + $ref: '#/components/schemas/Booking' + - properties: + links: + allOf: + - $ref: '#/components/schemas/Links-Self' + - $ref: '#/components/schemas/Links-Pagination' example: data: - - id: efdbb9d1-02c2-4bc3-afb7-6788d8782b1e - trip_id: efdbb9d1-02c2-4bc3-afb7-6788d8782b1e - passenger_name: John Doe - has_bicycle: true - has_dog: true - - id: b2e783e1-c824-4d63-b37a-d8d698862f1d - trip_id: b2e783e1-c824-4d63-b37a-d8d698862f1d - passenger_name: Jane Smith - has_bicycle: false - has_dog: false + - id: efdbb9d1-02c2-4bc3-afb7-6788d8782b1e + trip_id: efdbb9d1-02c2-4bc3-afb7-6788d8782b1e + passenger_name: John Doe + has_bicycle: true + has_dog: true + - id: b2e783e1-c824-4d63-b37a-d8d698862f1d + trip_id: b2e783e1-c824-4d63-b37a-d8d698862f1d + passenger_name: Jane Smith + has_bicycle: false + has_dog: false links: self: https://api.example.com/bookings next: https://api.example.com/bookings?page=2 - application/xml: - schema: - allOf: - - $ref: "#/components/schemas/Wrapper-Collection" - - properties: - data: - type: array - xml: - name: bookings - wrapped: true - items: - $ref: "#/components/schemas/Booking" - - properties: - links: - allOf: - - $ref: "#/components/schemas/Links-Self" - - $ref: "#/components/schemas/Links-Pagination" - "400": - $ref: "#/components/responses/BadRequest" - "401": - $ref: "#/components/responses/Unauthorized" - "403": - $ref: "#/components/responses/Forbidden" - "429": - $ref: "#/components/responses/TooManyRequests" - "500": - $ref: "#/components/responses/InternalServerError" + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '429': + $ref: '#/components/responses/TooManyRequests' + '500': + $ref: '#/components/responses/InternalServerError' post: operationId: create-booking summary: Create a booking - description: A booking is a temporary hold on a trip. It is not confirmed until - the payment is processed. + description: A booking is a temporary hold on a trip. It is not confirmed until the payment is processed. tags: - - Bookings + - Bookings security: - - OAuth2: - - write + - OAuth2: + - write requestBody: required: true content: application/json: schema: - $ref: "#/components/schemas/Booking" - application/xml: - schema: - $ref: "#/components/schemas/Booking" + $ref: '#/components/schemas/Booking' responses: - "201": + '201': description: Booking successful content: application/json: schema: allOf: - - $ref: "#/components/schemas/Booking" - - properties: - links: - $ref: "#/components/schemas/Links-Self" + - $ref: '#/components/schemas/Booking' + - properties: + links: + $ref: '#/components/schemas/Links-Self' + example: id: efdbb9d1-02c2-4bc3-afb7-6788d8782b1e trip_id: efdbb9d1-02c2-4bc3-afb7-6788d8782b1e @@ -349,55 +319,49 @@ paths: has_dog: true links: self: https://api.example.com/bookings/efdbb9d1-02c2-4bc3-afb7-6788d8782b1e - application/xml: - schema: - allOf: - - $ref: "#/components/schemas/Booking" - - properties: - links: - $ref: "#/components/schemas/Links-Self" - "400": - $ref: "#/components/responses/BadRequest" - "401": - $ref: "#/components/responses/Unauthorized" - "404": - $ref: "#/components/responses/NotFound" - "409": - $ref: "#/components/responses/Conflict" - "429": - $ref: "#/components/responses/TooManyRequests" - "500": - $ref: "#/components/responses/InternalServerError" + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + '404': + $ref: '#/components/responses/NotFound' + '409': + $ref: '#/components/responses/Conflict' + '429': + $ref: '#/components/responses/TooManyRequests' + '500': + $ref: '#/components/responses/InternalServerError' + /bookings/{bookingId}: parameters: - - name: bookingId - in: path - required: true - description: The ID of the booking to retrieve. - schema: - type: string - format: uuid - example: 1725ff48-ab45-4bb5-9d02-88745177dedb + - name: bookingId + in: path + required: true + description: The ID of the booking to retrieve. + schema: + type: string + format: uuid + example: 1725ff48-ab45-4bb5-9d02-88745177dedb get: summary: Get a booking description: Returns the details of a specific booking. operationId: get-booking tags: - - Bookings + - Bookings responses: - "200": + '200': description: The booking details headers: RateLimit: - $ref: "#/components/headers/RateLimit" + $ref: '#/components/headers/RateLimit' content: application/json: schema: allOf: - - $ref: "#/components/schemas/Booking" - - properties: - links: - $ref: "#/components/schemas/Links-Self" + - $ref: '#/components/schemas/Booking' + - properties: + links: + $ref: '#/components/schemas/Links-Self' example: id: efdbb9d1-02c2-4bc3-afb7-6788d8782b1e trip_id: efdbb9d1-02c2-4bc3-afb7-6788d8782b1e @@ -406,72 +370,65 @@ paths: has_dog: true links: self: https://api.example.com/bookings/1725ff48-ab45-4bb5-9d02-88745177dedb - application/xml: - schema: - allOf: - - $ref: "#/components/schemas/Booking" - - properties: - links: - $ref: "#/components/schemas/Links-Self" - "400": - $ref: "#/components/responses/BadRequest" - "401": - $ref: "#/components/responses/Unauthorized" - "403": - $ref: "#/components/responses/Forbidden" - "404": - $ref: "#/components/responses/NotFound" - "429": - $ref: "#/components/responses/TooManyRequests" - "500": - $ref: "#/components/responses/InternalServerError" + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' + '429': + $ref: '#/components/responses/TooManyRequests' + '500': + $ref: '#/components/responses/InternalServerError' delete: summary: Delete a booking - description: "Deletes a booking, cancelling the hold on the trip." + description: Deletes a booking, cancelling the hold on the trip. operationId: delete-booking security: - - OAuth2: - - write + - OAuth2: + - write tags: - - Bookings + - Bookings responses: - "204": + '204': description: Booking deleted - "400": - $ref: "#/components/responses/BadRequest" - "401": - $ref: "#/components/responses/Unauthorized" - "403": - $ref: "#/components/responses/Forbidden" - "404": - $ref: "#/components/responses/NotFound" - "429": - $ref: "#/components/responses/TooManyRequests" - "500": - $ref: "#/components/responses/InternalServerError" + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' + '429': + $ref: '#/components/responses/TooManyRequests' + '500': + $ref: '#/components/responses/InternalServerError' + /bookings/{bookingId}/payment: parameters: - - name: bookingId - in: path - required: true - description: The ID of the booking to pay for. - schema: - type: string - format: uuid - example: 1725ff48-ab45-4bb5-9d02-88745177dedb + - name: bookingId + in: path + required: true + description: The ID of the booking to pay for. + schema: + type: string + format: uuid + example: 1725ff48-ab45-4bb5-9d02-88745177dedb post: summary: Pay for a Booking - description: "A payment is an attempt to pay for the booking, which will confirm\ - \ the booking for the user and enable them to get their tickets." + description: A payment is an attempt to pay for the booking, which will confirm the booking for the user and enable them to get their tickets. operationId: create-booking-payment tags: - - Payments + - Payments requestBody: required: true content: application/json: schema: - $ref: "#/components/schemas/BookingPayment" + $ref: '#/components/schemas/BookingPayment' examples: Card: summary: Card Payment @@ -481,7 +438,7 @@ paths: source: object: card name: J. Doe - number: 4242424242424242 + number: '4242424242424242' cvc: 123 exp_month: 12 exp_year: 2025 @@ -504,19 +461,19 @@ paths: bank_name: Starling Bank country: gb responses: - "200": + '200': description: Payment successful headers: RateLimit: - $ref: "#/components/headers/RateLimit" + $ref: '#/components/headers/RateLimit' content: application/json: schema: allOf: - - $ref: "#/components/schemas/BookingPayment" - - properties: - links: - $ref: "#/components/schemas/Links-Booking" + - $ref: '#/components/schemas/BookingPayment' + - properties: + links: + $ref: '#/components/schemas/Links-Booking' examples: Card: summary: Card Payment @@ -553,16 +510,16 @@ paths: status: succeeded links: booking: https://api.example.com/bookings/1725ff48-ab45-4bb5-9d02-88745177dedb - "400": - $ref: "#/components/responses/BadRequest" - "401": - $ref: "#/components/responses/Unauthorized" - "403": - $ref: "#/components/responses/Forbidden" - "429": - $ref: "#/components/responses/TooManyRequests" - "500": - $ref: "#/components/responses/InternalServerError" + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '429': + $ref: '#/components/responses/TooManyRequests' + '500': + $ref: '#/components/responses/InternalServerError' webhooks: newBooking: post: @@ -571,18 +528,18 @@ webhooks: description: | Subscribe to new bookings being created, to update integrations for your users. Related data is available via the links provided in the request. tags: - - Bookings + - Bookings requestBody: content: application/json: schema: - allOf: - - $ref: "#/components/schemas/Booking" - - properties: - links: - allOf: - - $ref: "#/components/schemas/Links-Self" - - $ref: "#/components/schemas/Links-Pagination" + allOf: + - $ref: '#/components/schemas/Booking' + - properties: + links: + allOf: + - $ref: '#/components/schemas/Links-Self' + - $ref: '#/components/schemas/Links-Pagination' example: id: efdbb9d1-02c2-4bc3-afb7-6788d8782b1e trip_id: efdbb9d1-02c2-4bc3-afb7-6788d8782b1e @@ -592,9 +549,9 @@ webhooks: links: self: https://api.example.com/bookings/1725ff48-ab45-4bb5-9d02-88745177dedb responses: - "200": - description: Return a 200 status to indicate that the data was received - successfully. + '200': + description: Return a 200 status to indicate that the data was received successfully. + components: securitySchemes: OAuth2: @@ -602,8 +559,8 @@ components: description: OAuth 2.0 authorization code following RFC8725 best practices. flows: authorizationCode: - authorizationUrl: https://google-sign-in.wiremockapi.cloud/o/oauth2/v2/auth - tokenUrl: https://google-sign-in.wiremockapi.cloud/token + authorizationUrl: https://example.com/oauth/authorize + tokenUrl: https://example.com/oauth/token scopes: read: Read access write: Write access @@ -613,44 +570,43 @@ components: xml: name: station required: - - id - - name - - address - - country_code + - id + - name + - address + - country_code properties: id: type: string format: uuid description: Unique identifier for the station. examples: - - efdbb9d1-02c2-4bc3-afb7-6788d8782b1e - - b2e783e1-c824-4d63-b37a-d8d698862f1d + - efdbb9d1-02c2-4bc3-afb7-6788d8782b1e + - b2e783e1-c824-4d63-b37a-d8d698862f1d name: type: string description: The name of the station examples: - - Berlin Hauptbahnhof - - Paris Gare du Nord + - Berlin Hauptbahnhof + - Paris Gare du Nord address: type: string description: The address of the station. examples: - - "Invalidenstraße 10557 Berlin, Germany" - - "18 Rue de Dunkerque 75010 Paris, France" + - Invalidenstraße 10557 Berlin, Germany + - 18 Rue de Dunkerque 75010 Paris, France country_code: type: string description: The country code of the station. format: iso-country-code examples: - - DE - - FR + - DE + - FR timezone: type: string - description: "The timezone of the station in the [IANA Time Zone Database\ - \ format](https://www.iana.org/time-zones)." + description: The timezone of the station in the [IANA Time Zone Database format](https://www.iana.org/time-zones). examples: - - Europe/Berlin - - Europe/Paris + - Europe/Berlin + - Europe/Paris Links-Self: type: object properties: @@ -677,17 +633,15 @@ components: example: https://example.com/probs/out-of-credit title: type: string - description: "A short, human-readable summary of the problem type" + description: A short, human-readable summary of the problem type example: You do not have enough credit. detail: type: string - description: A human-readable explanation specific to this occurrence of - the problem - example: "Your current balance is 30, but that costs 50." + description: A human-readable explanation specific to this occurrence of the problem + example: Your current balance is 30, but that costs 50. instance: type: string - description: A URI reference that identifies the specific occurrence of - the problem + description: A URI reference that identifies the specific occurrence of the problem example: /account/12345/msgs/abc status: type: integer @@ -703,42 +657,42 @@ components: format: uuid description: Unique identifier for the trip examples: - - 4f4e4e1-c824-4d63-b37a-d8d698862f1d + - 4f4e4e1-c824-4d63-b37a-d8d698862f1d origin: type: string description: The starting station of the trip examples: - - Berlin Hauptbahnhof - - Paris Gare du Nord + - Berlin Hauptbahnhof + - Paris Gare du Nord destination: type: string description: The destination station of the trip examples: - - Paris Gare du Nord - - Berlin Hauptbahnhof + - Paris Gare du Nord + - Berlin Hauptbahnhof departure_time: type: string format: date-time description: The date and time when the trip departs examples: - - 2024-02-01T10:00:00Z + - '2024-02-01T10:00:00Z' arrival_time: type: string format: date-time description: The date and time when the trip arrives examples: - - 2024-02-01T16:00:00Z + - '2024-02-01T16:00:00Z' operator: type: string description: The name of the operator of the trip examples: - - Deutsche Bahn - - SNCF + - Deutsche Bahn + - SNCF price: type: number description: The cost of the trip examples: - - 50 + - 50 bicycles_allowed: type: boolean description: Indicates whether bicycles are allowed on the trip @@ -756,18 +710,18 @@ components: description: Unique identifier for the booking readOnly: true examples: - - 3f3e3e1-c824-4d63-b37a-d8d698862f1d + - 3f3e3e1-c824-4d63-b37a-d8d698862f1d trip_id: type: string format: uuid description: Identifier of the booked trip examples: - - 4f4e4e1-c824-4d63-b37a-d8d698862f1d + - 4f4e4e1-c824-4d63-b37a-d8d698862f1d passenger_name: type: string description: Name of the passenger examples: - - John Doe + - John Doe has_bicycle: type: boolean description: Indicates whether the passenger has a bicycle. @@ -775,8 +729,7 @@ components: type: boolean description: Indicates whether the passenger has a dog. Wrapper-Collection: - description: This is a generic request/response wrapper which contains both - data and links which serve as hypermedia controls (HATEOAS). + description: This is a generic request/response wrapper which contains both data and links which serve as hypermedia controls (HATEOAS). type: object properties: data: @@ -794,141 +747,129 @@ components: type: object properties: id: - description: "Unique identifier for the payment. This will be a unique identifier\ - \ for the payment, and is used to reference the payment in other objects." + description: Unique identifier for the payment. This will be a unique identifier for the payment, and is used to reference the payment in other objects. type: string format: uuid readOnly: true amount: - description: Amount intended to be collected by this payment. A positive - decimal figure describing the amount to be collected. + description: Amount intended to be collected by this payment. A positive decimal figure describing the amount to be collected. type: number exclusiveMinimum: 0 examples: - - 49.99 + - 49.99 currency: - description: "Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html),\ - \ in lowercase." + description: Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. type: string enum: - - bam - - bgn - - chf - - eur - - gbp - - nok - - sek - - try + - bam + - bgn + - chf + - eur + - gbp + - nok + - sek + - try source: unevaluatedProperties: false - description: The payment source to take the payment from. This can be a - card or a bank account. Some of these properties will be hidden on read - to protect PII leaking. + description: The payment source to take the payment from. This can be a card or a bank account. Some of these properties will be hidden on read to protect PII leaking. anyOf: - - title: Card - description: A card (debit or credit) to take payment from. - properties: - object: - type: string - const: card - name: - type: string - description: Cardholder's full name as it appears on the card. - examples: - - Francis Bourgeois - number: - type: string - description: "The card number, as a string without any separators.\ - \ On read all but the last four digits will be masked for security." - examples: - - 4242424242424242 - cvc: - type: integer - description: "Card security code, 3 or 4 digits usually found on the\ - \ back of the card." - minLength: 3 - maxLength: 4 - writeOnly: true - example: 123 - exp_month: - type: integer - format: int64 - description: Two-digit number representing the card's expiration month. - examples: - - 12 - exp_year: - type: integer - format: int64 - description: Four-digit number representing the card's expiration - year. - examples: - - 2025 - address_line1: - type: string - writeOnly: true - address_line2: - type: string - writeOnly: true - address_city: - type: string - address_country: - type: string - address_post_code: - type: string - required: - - name - - number - - cvc - - exp_month - - exp_year - - address_country - - title: Bank Account - description: A bank account to take payment from. Must be able to make - payments in the currency specified in the payment. - type: object - properties: - object: - const: bank_account - type: string - name: - type: string - number: - type: string - description: "The account number for the bank account, in string form.\ - \ Must be a current account." - sort_code: - type: string - description: "The sort code for the bank account, in string form.\ - \ Must be a six-digit number." - account_type: - enum: - - individual - - company - type: string - description: The type of entity that holds the account. This can be - either `individual` or `company`. - bank_name: - type: string - description: The name of the bank associated with the routing number. - examples: - - Starling Bank - country: - type: string - description: Two-letter country code (ISO 3166-1 alpha-2). - required: - - name - - number - - account_type - - bank_name - - country + - title: Card + description: A card (debit or credit) to take payment from. + properties: + object: + type: string + const: card + name: + type: string + description: Cardholder's full name as it appears on the card. + examples: + - Francis Bourgeois + number: + type: string + description: The card number, as a string without any separators. On read all but the last four digits will be masked for security. + examples: + - '4242424242424242' + cvc: + type: integer + description: Card security code, 3 or 4 digits usually found on the back of the card. + minLength: 3 + maxLength: 4 + writeOnly: true + + example: 123 + exp_month: + type: integer + format: int64 + description: Two-digit number representing the card's expiration month. + examples: + - 12 + exp_year: + type: integer + format: int64 + description: Four-digit number representing the card's expiration year. + examples: + - 2025 + address_line1: + type: string + writeOnly: true + address_line2: + type: string + writeOnly: true + address_city: + type: string + address_country: + type: string + address_post_code: + type: string + required: + - name + - number + - cvc + - exp_month + - exp_year + - address_country + - title: Bank Account + description: A bank account to take payment from. Must be able to make payments in the currency specified in the payment. + type: object + properties: + object: + const: bank_account + type: string + name: + type: string + number: + type: string + description: The account number for the bank account, in string form. Must be a current account. + sort_code: + type: string + description: The sort code for the bank account, in string form. Must be a six-digit number. + account_type: + enum: + - individual + - company + type: string + description: The type of entity that holds the account. This can be either `individual` or `company`. + bank_name: + type: string + description: The name of the bank associated with the routing number. + examples: + - Starling Bank + country: + type: string + description: Two-letter country code (ISO 3166-1 alpha-2). + required: + - name + - number + - account_type + - bank_name + - country status: - description: "The status of the payment, one of `pending`, `succeeded`,\ - \ or `failed`." + description: The status of the payment, one of `pending`, `succeeded`, or `failed`. type: string enum: - - pending - - succeeded - - failed + - pending + - succeeded + - failed readOnly: true Links-Booking: type: object @@ -937,7 +878,7 @@ components: type: string format: uri examples: - - https://api.example.com/bookings/1725ff48-ab45-4bb5-9d02-88745177dedb + - https://api.example.com/bookings/1725ff48-ab45-4bb5-9d02-88745177dedb headers: RateLimit: description: | @@ -947,176 +888,128 @@ components: schema: type: string examples: - - "limit=10, remaining=0, reset=10" + - limit=10, remaining=0, reset=10 + Retry-After: - description: "The Retry-After header indicates how long the user agent should\ - \ wait before making a follow-up request. \nThe value is in seconds and can\ - \ be an integer or a date in the future. \nIf the value is an integer, it\ - \ indicates the number of seconds to wait. \nIf the value is a date, it indicates\ - \ the time at which the user agent should make a follow-up request. \n" + description: | + The Retry-After header indicates how long the user agent should wait before making a follow-up request. + The value is in seconds and can be an integer or a date in the future. + If the value is an integer, it indicates the number of seconds to wait. + If the value is a date, it indicates the time at which the user agent should make a follow-up request. schema: type: string examples: integer: - value: 120 + value: '120' summary: Retry after 120 seconds date: - value: "Fri, 31 Dec 2021 23:59:59 GMT" + value: 'Fri, 31 Dec 2021 23:59:59 GMT' summary: Retry after the specified date + responses: BadRequest: description: Bad Request headers: RateLimit: - $ref: "#/components/headers/RateLimit" + $ref: '#/components/headers/RateLimit' content: application/problem+json: schema: - $ref: "#/components/schemas/Problem" - example: - type: https://example.com/errors/bad-request - title: Bad Request - status: 400 - detail: The request is invalid or missing required parameters. - application/problem+xml: - schema: - $ref: "#/components/schemas/Problem" + $ref: '#/components/schemas/Problem' example: type: https://example.com/errors/bad-request title: Bad Request status: 400 detail: The request is invalid or missing required parameters. + Conflict: description: Conflict headers: RateLimit: - $ref: "#/components/headers/RateLimit" + $ref: '#/components/headers/RateLimit' content: application/problem+json: schema: - $ref: "#/components/schemas/Problem" - example: - type: https://example.com/errors/conflict - title: Conflict - status: 409 - detail: There is a conflict with an existing resource. - application/problem+xml: - schema: - $ref: "#/components/schemas/Problem" + $ref: '#/components/schemas/Problem' example: type: https://example.com/errors/conflict title: Conflict status: 409 detail: There is a conflict with an existing resource. + Forbidden: description: Forbidden headers: RateLimit: - $ref: "#/components/headers/RateLimit" + $ref: '#/components/headers/RateLimit' content: application/problem+json: schema: - $ref: "#/components/schemas/Problem" - example: - type: https://example.com/errors/forbidden - title: Forbidden - status: 403 - detail: Access is forbidden with the provided credentials. - application/problem+xml: - schema: - $ref: "#/components/schemas/Problem" + $ref: '#/components/schemas/Problem' example: type: https://example.com/errors/forbidden title: Forbidden status: 403 detail: Access is forbidden with the provided credentials. + InternalServerError: description: Internal Server Error headers: RateLimit: - $ref: "#/components/headers/RateLimit" + $ref: '#/components/headers/RateLimit' content: application/problem+json: schema: - $ref: "#/components/schemas/Problem" - example: - type: https://example.com/errors/internal-server-error - title: Internal Server Error - status: 500 - detail: An unexpected error occurred. - application/problem+xml: - schema: - $ref: "#/components/schemas/Problem" + $ref: '#/components/schemas/Problem' example: type: https://example.com/errors/internal-server-error title: Internal Server Error status: 500 detail: An unexpected error occurred. + NotFound: description: Not Found headers: RateLimit: - $ref: "#/components/headers/RateLimit" + $ref: '#/components/headers/RateLimit' content: application/problem+json: schema: - $ref: "#/components/schemas/Problem" - example: - type: https://example.com/errors/not-found - title: Not Found - status: 404 - detail: The requested resource was not found. - application/problem+xml: - schema: - $ref: "#/components/schemas/Problem" + $ref: '#/components/schemas/Problem' example: type: https://example.com/errors/not-found title: Not Found status: 404 detail: The requested resource was not found. + TooManyRequests: description: Too Many Requests headers: RateLimit: - $ref: "#/components/headers/RateLimit" + $ref: '#/components/headers/RateLimit' Retry-After: - $ref: "#/components/headers/Retry-After" + $ref: '#/components/headers/Retry-After' content: application/problem+json: schema: - $ref: "#/components/schemas/Problem" - example: - type: https://example.com/errors/too-many-requests - title: Too Many Requests - status: 429 - detail: You have exceeded the rate limit. - application/problem+xml: - schema: - $ref: "#/components/schemas/Problem" + $ref: '#/components/schemas/Problem' example: type: https://example.com/errors/too-many-requests title: Too Many Requests status: 429 detail: You have exceeded the rate limit. + Unauthorized: description: Unauthorized headers: RateLimit: - $ref: "#/components/headers/RateLimit" + $ref: '#/components/headers/RateLimit' content: application/problem+json: schema: - $ref: "#/components/schemas/Problem" - example: - type: https://example.com/errors/unauthorized - title: Unauthorized - status: 401 - detail: You do not have the necessary permissions. - application/problem+xml: - schema: - $ref: "#/components/schemas/Problem" + $ref: '#/components/schemas/Problem' example: type: https://example.com/errors/unauthorized title: Unauthorized status: 401 - detail: You do not have the necessary permissions. + detail: You do not have the necessary permissions. \ No newline at end of file diff --git a/sdks/ts/openapi_sdk_typescript/.editorconfig b/sdks/ts/openapi_sdk_typescript/.editorconfig new file mode 100644 index 0000000..63187fe --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/.editorconfig @@ -0,0 +1,15 @@ +# http://editorconfig.org +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_size = 2 +indent_style = space +insert_final_newline = true +max_line_length = 80 +trim_trailing_whitespace = true + +[*.md] +max_line_length = 0 +trim_trailing_whitespace = false diff --git a/sdks/ts/openapi_sdk_typescript/.eslintignore b/sdks/ts/openapi_sdk_typescript/.eslintignore new file mode 100644 index 0000000..9f9eafe --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/.eslintignore @@ -0,0 +1,5 @@ +*.log +.DS_Store +node_modules +dist +coverage \ No newline at end of file diff --git a/sdks/ts/openapi_sdk_typescript/.eslintrc.json b/sdks/ts/openapi_sdk_typescript/.eslintrc.json new file mode 100644 index 0000000..9864e10 --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/.eslintrc.json @@ -0,0 +1,27 @@ +{ + "env": { + "browser": true, + "es2021": true + }, + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/recommended" + ], + "overrides": [ + ], + "parser": "@typescript-eslint/parser", + "parserOptions": { + "ecmaVersion": "latest", + "sourceType": "module" + }, + "plugins": [ + "@typescript-eslint" + ], + + "rules": { + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/no-namespace": "off", + "@typescript-eslint/ban-types": "off", + "no-irregular-whitespace": "off" + } +} diff --git a/sdks/ts/openapi_sdk_typescript/.gitignore b/sdks/ts/openapi_sdk_typescript/.gitignore new file mode 100644 index 0000000..9f9eafe --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/.gitignore @@ -0,0 +1,5 @@ +*.log +.DS_Store +node_modules +dist +coverage \ No newline at end of file diff --git a/sdks/ts/openapi_sdk_typescript/LICENSE b/sdks/ts/openapi_sdk_typescript/LICENSE new file mode 100644 index 0000000..b9181f7 --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/LICENSE @@ -0,0 +1,28 @@ +License: +======== +The MIT License (MIT) +http://opensource.org/licenses/MIT + +Copyright (c) 2014 - 2024 APIMATIC Limited + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +Trade Mark: +========== +APIMATIC is a trade mark for APIMATIC Limited \ No newline at end of file diff --git a/sdks/ts/openapi_sdk_typescript/README.md b/sdks/ts/openapi_sdk_typescript/README.md new file mode 100644 index 0000000..4062b7f --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/README.md @@ -0,0 +1,164 @@ + +# Getting Started with Train Travel API + +## Introduction + +API for finding and booking train trips across Europe. + +### Run in Postman + +Experiment with this API in Postman, using our Postman Collection. + +[Run In Postman](https://app.getpostman.com/run-collection/9265903-7a75a0d0-b108-4436-ba54-c6139698dc08?action=collection%2Ffork&source=rip_markdown&collection-url=entityId%3D9265903-7a75a0d0-b108-4436-ba54-c6139698dc08%26entityType%3Dcollection%26workspaceId%3Df507f69d-9564-419c-89a2-cb8e4c8c7b8f) + +## Building + +### Requirements + +The SDK relies on **Node.js** and **npm** (to resolve dependencies). It also requires **Typescript version 3.9+**. You can download and install Node.js and [npm](https://www.npmjs.com/) from [the official Node.js website](https://nodejs.org/en/download/). + +> **NOTE:** npm is installed by default when Node.js is installed. + +### Verify Successful Installation + +Run the following commands in the command prompt or shell of your choice to check if Node.js and npm are successfully installed: + +* Node.js: `node --version` + +* npm: `npm --version` + +![Version Check](https://apidocs.io/illustration/typescript?workspaceFolder=TrainTravelAPI&step=versionCheck) + +### Install Dependencies + +- To resolve all dependencies, go to the **SDK root directory** and run the following command with npm: + +```bash +npm install +``` + +- This will install all dependencies in the **node_modules** folder. + +![Resolve Dependencies](https://apidocs.io/illustration/typescript?workspaceFolder=TrainTravelAPI&workspaceName=train-travel-apilib&step=resolveDependency) + +## Installation + +The following section explains how to use the generated library in a new project. + +### 1. Initialize the Node Project + +- Open an IDE/text editor for JavaScript like Visual Studio Code. The basic workflow presented here is also applicable if you prefer using a different editor or IDE. + +- Click on **File** and select **Open Folder**. Select an empty folder of your project, the folder will become visible in the sidebar on the left. + +![Open Folder](https://apidocs.io/illustration/typescript?step=openProject) + +- To initialize the Node project, click on **Terminal** and select **New Terminal**. Execute the following command in the terminal: + +```bash +npm init --y +``` + +![Initialize the Node Project](https://apidocs.io/illustration/typescript?step=initializeProject) + +### 2. Add Dependencies to the Client Library + +- The created project manages its dependencies using its `package.json` file. In order to add a dependency on the *Train Travel APILib* client library, double click on the `package.json` file in the bar on the left and add the dependency to the package in it. + +![Add TrainTravelApilib Dependency](https://apidocs.io/illustration/typescript?workspaceFolder=TrainTravelAPI&workspaceName=train-travel-apilib&step=importDependency) + +- To install the package in the project, run the following command in the terminal: + +```bash +npm install +``` + +![Install TrainTravelApilib Dependency](https://apidocs.io/illustration/typescript?step=installDependency) + +## Test the SDK + +To validate the functionality of this SDK, you can execute all tests located in the `test` directory. This SDK utilizes `Jest` as both the testing framework and test runner. + +To run the tests, navigate to the root directory of the SDK and execute the following command: + +```bash +npm run test +``` + +Or you can also run tests with coverage report: + +```bash +npm run test:coverage +``` + +## Initialize the API Client + +**_Note:_** Documentation for the client can be found [here.](doc/client.md) + +The following parameters are configurable for the API Client: + +| Parameter | Type | Description | +| --- | --- | --- | +| `environment` | `Environment` | The API environment.
**Default: `Environment.Production`** | +| `timeout` | `number` | Timeout for API calls.
*Default*: `0` | +| `httpClientOptions` | `Partial` | Stable configurable http client options. | +| `unstableHttpClientOptions` | `any` | Unstable configurable http client options. | +| `authorizationCodeAuthCredentials` | [`AuthorizationCodeAuthCredentials`](doc/auth/oauth-2-authorization-code-grant.md) | The credential object for authorizationCodeAuth | + +### HttpClientOptions + +| Parameter | Type | Description | +| --- | --- | --- | +| `timeout` | `number` | Timeout in milliseconds. | +| `httpAgent` | `any` | Custom http agent to be used when performing http requests. | +| `httpsAgent` | `any` | Custom https agent to be used when performing http requests. | +| `retryConfig` | `Partial` | Configurations to retry requests. | + +### RetryConfiguration + +| Parameter | Type | Description | +| --- | --- | --- | +| `maxNumberOfRetries` | `number` | Maximum number of retries.
*Default*: `0` | +| `retryOnTimeout` | `boolean` | Whether to retry on request timeout.
*Default*: `true` | +| `retryInterval` | `number` | Interval before next retry. Used in calculation of wait time for next request in case of failure.
*Default*: `1` | +| `maximumRetryWaitTime` | `number` | Overall wait time for the requests getting retried.
*Default*: `0` | +| `backoffFactor` | `number` | Used in calculation of wait time for next request in case of failure.
*Default*: `2` | +| `httpStatusCodesToRetry` | `number[]` | Http status codes to retry against.
*Default*: `[408, 413, 429, 500, 502, 503, 504, 521, 522, 524]` | +| `httpMethodsToRetry` | `HttpMethod[]` | Http methods to retry against.
*Default*: `['GET', 'PUT']` | + +The API client can be initialized as follows: + +```ts +const client = new Client({ + authorizationCodeAuthCredentials: { + oAuthClientId: 'OAuthClientId', + oAuthClientSecret: 'OAuthClientSecret', + oAuthRedirectUri: 'OAuthRedirectUri', + oAuthScopes: [ + OAuthScopeEnum.Read, + OAuthScopeEnum.Write + ] + }, + timeout: 0, + environment: Environment.Production, +}); +``` + +## Authorization + +This API uses the following authentication schemes. + +* [`OAuth2 (OAuth 2 Authorization Code Grant)`](doc/auth/oauth-2-authorization-code-grant.md) + +## List of APIs + +* [Stations](doc/controllers/stations.md) +* [Trips](doc/controllers/trips.md) +* [Bookings](doc/controllers/bookings.md) +* [Payments](doc/controllers/payments.md) + +## Classes Documentation + +* [ApiResponse](doc/api-response.md) +* [ApiError](doc/api-error.md) + diff --git a/sdks/ts/openapi_sdk_typescript/doc/api-error.md b/sdks/ts/openapi_sdk_typescript/doc/api-error.md new file mode 100644 index 0000000..9d09241 --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/doc/api-error.md @@ -0,0 +1,17 @@ + +# ApiError + +Thrown when the HTTP status code is not okay. + +The ApiError extends the ApiResponse interface, so all ApiResponse properties are available. + +## Properties + +| Name | Type | Description | +| --- | --- | --- | +| request | HttpRequest | Original request that resulted in this response. | +| statusCode | number | Response status code. | +| headers | Record | Response headers. | +| result | T | Response data. | +| body | string \| Blob \| NodeJS.ReadableStream | Original body from the response. | + diff --git a/sdks/ts/openapi_sdk_typescript/doc/api-response.md b/sdks/ts/openapi_sdk_typescript/doc/api-response.md new file mode 100644 index 0000000..1e886c9 --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/doc/api-response.md @@ -0,0 +1,15 @@ + +# ApiResponse + +An interface for the result of an API call. + +## Properties + +| Name | Type | Description | +| --- | --- | --- | +| request | HttpRequest | Original request that resulted in this response. | +| statusCode | number | Response status codee. | +| headers | Record | Response headers. | +| result | T | Response data. | +| body | string \| Blob \| NodeJS.ReadableStream | Original body from the response. | + diff --git a/sdks/ts/openapi_sdk_typescript/doc/auth/oauth-2-authorization-code-grant.md b/sdks/ts/openapi_sdk_typescript/doc/auth/oauth-2-authorization-code-grant.md new file mode 100644 index 0000000..46d7d1a --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/doc/auth/oauth-2-authorization-code-grant.md @@ -0,0 +1,184 @@ + +# OAuth 2 Authorization Code Grant + + + +Documentation for accessing and setting credentials for OAuth2. + +## Auth Credentials + +| Name | Type | Description | Setter | +| --- | --- | --- | --- | +| OAuthClientId | `string` | OAuth 2 Client ID | `oAuthClientId` | +| OAuthClientSecret | `string` | OAuth 2 Client Secret | `oAuthClientSecret` | +| OAuthRedirectUri | `string` | OAuth 2 Redirection endpoint or Callback Uri | `oAuthRedirectUri` | +| OAuthToken | `OAuthToken` | Object for storing information about the OAuth token | `oAuthToken` | +| OAuthScopes | `OAuthScopeEnum[]` | List of scopes that apply to the OAuth token | `oAuthScopes` | +| OAuthClockSkew | `number` | Clock skew time in seconds applied while checking the OAuth Token expiry. | `clockSkew` | +| OAuthTokenProvider | `(lastOAuthToken: OAuthToken \| undefined, authManager: AuthorizationCodeAuthManager) => Promise` | Registers a callback for oAuth Token Provider used for automatic token fetching/refreshing. | `oAuthTokenProvider` | +| OAuthOnTokenUpdate | `(token: OAuthToken) => void` | Registers a callback for token update event. | `oAuthOnTokenUpdate` | + + + +**Note:** Auth credentials can be set using `authorizationCodeAuthCredentials` object in the client. + +## Usage Example + +### 1\. Client Initialization + +You must initialize the client with *OAuth 2.0 Authorization Code Grant* credentials as shown in the following code snippet. + +```ts +const client = new Client({ + authorizationCodeAuthCredentials: { + oAuthClientId: 'OAuthClientId', + oAuthClientSecret: 'OAuthClientSecret', + oAuthRedirectUri: 'OAuthRedirectUri', + oAuthScopes: [ + OAuthScopeEnum.Read, + OAuthScopeEnum.Write + ] + }, +}); +``` + + + +Your application must obtain user authorization before it can execute an endpoint call in case this SDK chooses to use *OAuth 2.0 Authorization Code Grant*. This authorization includes the following steps + +### 2\. Obtain user consent + +To obtain user's consent, you must redirect the user to the authorization page.The `buildAuthorizationUrl()` method creates the URL to the authorization page. You must have initialized the client with scopes for which you need permission to access. + +```ts +const authUrl = client.authorizationCodeAuthManager?.buildAuthorizationUrl(); +``` + +### 3\. Handle the OAuth server response + +Once the user responds to the consent request, the OAuth 2.0 server responds to your application's access request by redirecting the user to the redirect URI specified set in `Configuration`. + +If the user approves the request, the authorization code will be sent as the `code` query string: + +``` +https://example.com/oauth/callback?code=XXXXXXXXXXXXXXXXXXXXXXXXX +``` + +If the user does not approve the request, the response contains an `error` query string: + +``` +https://example.com/oauth/callback?error=access_denied +``` + +### 4\. Authorize the client using the code + +After the server receives the code, it can exchange this for an *access token*. The access token is an object containing information for authorizing client requests and refreshing the token itself. + +```ts +try { + const token = await client.authorizationCodeAuthManager?.fetchToken(authorizationCode); + if (token) { + client.withConfiguration({ + authorizationCodeAuthCredentials: { + ...config.authorizationCodeAuthCredentials, + oAuthToken: token + } + }); + } +} catch(error) { + // handle ApiError or OAuthProviderError if needed +} +``` + +### Scopes + +Scopes enable your application to only request access to the resources it needs while enabling users to control the amount of access they grant to your application. Available scopes are defined in the [`OAuthScopeEnum`](../../doc/models/o-auth-scope-enum.md) enumeration. + +| Scope Name | Description | +| --- | --- | +| `Read` | Read access | +| `Write` | Write access | + +### Refreshing the token + +An access token may expire after sometime. To extend its lifetime, you must refresh the token. + +```ts +try { + const token = await client.authorizationCodeAuthManager?.refreshToken(); +} catch(error) { + // handle error +} +``` + +If a token expires, an exception will be thrown before the next endpoint call requiring authentication. + +### Storing an access token for reuse + +It is recommended that you store the access token for reuse. + +```ts +Store the token in session storage or local storage. +``` + +### Creating a client from a stored token + +To authorize a client using a stored access token, just set the access token in Configuration along with the other configuration parameters before creating the client: + +```ts +const newClient = client.withConfiguration({ + authorizationCodeAuthCredentials: { + ...config.authorizationCodeAuthCredentials, + oAuthToken: token + } +}); +``` + +### Complete example + + + +```ts +// function for storing token to database +async function saveTokenToDatabase(token: OAuthToken) { + // Code to save the token to the database +} + +// function for loading token from database +async function loadTokenFromDatabase(): Promise { + // Load token from the database and return it (return undefined if no token exists) + return undefined; +} + +// create a new client from configuration +const client = new Client({ + authorizationCodeAuthCredentials: { + oAuthClientId: 'OAuthClientId', + oAuthClientSecret: 'OAuthClientSecret', + oAuthRedirectUri: 'OAuthRedirectUri', + oAuthScopes: [ + OAuthScopeEnum.Read, + OAuthScopeEnum.Write + ] + }, + timeout: 0, + environment: Environment.Production, +}); + +// obtain access token, needed for client to be authorized +const previousToken = await loadTokenFromDatabase(); +if (previousToken) { + // restore previous access token and update the cloned configuration with the token + client.withConfiguration({ + authorizationCodeAuthCredentials: { + ...config.authorizationCodeAuthCredentials, + oAuthToken: previousToken + } + }); +} +else { + // redirect user to a page that handles authorization +} +``` + + diff --git a/sdks/ts/openapi_sdk_typescript/doc/client.md b/sdks/ts/openapi_sdk_typescript/doc/client.md new file mode 100644 index 0000000..c1c0456 --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/doc/client.md @@ -0,0 +1,66 @@ + +# Client Class Documentation + +The following parameters are configurable for the API Client: + +| Parameter | Type | Description | +| --- | --- | --- | +| `environment` | `Environment` | The API environment.
**Default: `Environment.Production`** | +| `timeout` | `number` | Timeout for API calls.
*Default*: `0` | +| `httpClientOptions` | `Partial` | Stable configurable http client options. | +| `unstableHttpClientOptions` | `any` | Unstable configurable http client options. | +| `authorizationCodeAuthCredentials` | [`AuthorizationCodeAuthCredentials`](auth/oauth-2-authorization-code-grant.md) | The credential object for authorizationCodeAuth | + +## HttpClientOptions + +| Parameter | Type | Description | +| --- | --- | --- | +| `timeout` | `number` | Timeout in milliseconds. | +| `httpAgent` | `any` | Custom http agent to be used when performing http requests. | +| `httpsAgent` | `any` | Custom https agent to be used when performing http requests. | +| `retryConfig` | `Partial` | Configurations to retry requests. | + +## RetryConfiguration + +| Parameter | Type | Description | +| --- | --- | --- | +| `maxNumberOfRetries` | `number` | Maximum number of retries.
*Default*: `0` | +| `retryOnTimeout` | `boolean` | Whether to retry on request timeout.
*Default*: `true` | +| `retryInterval` | `number` | Interval before next retry. Used in calculation of wait time for next request in case of failure.
*Default*: `1` | +| `maximumRetryWaitTime` | `number` | Overall wait time for the requests getting retried.
*Default*: `0` | +| `backoffFactor` | `number` | Used in calculation of wait time for next request in case of failure.
*Default*: `2` | +| `httpStatusCodesToRetry` | `number[]` | Http status codes to retry against.
*Default*: `[408, 413, 429, 500, 502, 503, 504, 521, 522, 524]` | +| `httpMethodsToRetry` | `HttpMethod[]` | Http methods to retry against.
*Default*: `['GET', 'PUT']` | + +The API client can be initialized as follows: + +```ts +const client = new Client({ + authorizationCodeAuthCredentials: { + oAuthClientId: 'OAuthClientId', + oAuthClientSecret: 'OAuthClientSecret', + oAuthRedirectUri: 'OAuthRedirectUri', + oAuthScopes: [ + OAuthScopeEnum.Read, + OAuthScopeEnum.Write + ] + }, + timeout: 0, + environment: Environment.Production, +}); +``` + +## Train Travel API Client + +The gateway for the SDK. This class acts as a factory for the Controllers and also holds the configuration of the SDK. + +## Controllers + +| Name | Description | +| --- | --- | +| stations | Gets StationsController | +| trips | Gets TripsController | +| bookings | Gets BookingsController | +| payments | Gets PaymentsController | +| oAuthAuthorization | Gets OAuthAuthorizationController | + diff --git a/sdks/ts/openapi_sdk_typescript/doc/controllers/bookings.md b/sdks/ts/openapi_sdk_typescript/doc/controllers/bookings.md new file mode 100644 index 0000000..80eb500 --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/doc/controllers/bookings.md @@ -0,0 +1,292 @@ +# Bookings + +Create and manage bookings for train trips, including passenger details +and optional extras. + +```ts +const bookingsController = new BookingsController(client); +``` + +## Class Name + +`BookingsController` + +## Methods + +* [Get-Bookings](../../doc/controllers/bookings.md#get-bookings) +* [Create-Booking](../../doc/controllers/bookings.md#create-booking) +* [Get-Booking](../../doc/controllers/bookings.md#get-booking) +* [Delete-Booking](../../doc/controllers/bookings.md#delete-booking) + + +# Get-Bookings + +Returns a list of all trip bookings by the authenticated user. + +```ts +async getBookings(requestOptions?: RequestOptions): Promise> +``` + +## Parameters + +| Parameter | Type | Tags | Description | +| --- | --- | --- | --- | +| `requestOptions` | `RequestOptions \| undefined` | Optional | Pass additional request options. | + +## Requires scope + +### OAuth2 + +`read` + +## Response Type + +[`BookingsResponse`](../../doc/models/bookings-response.md) + +## Example Usage + +```ts +try { + const { result, ...httpResponse } = await bookingsController.getBookings(); + // Get more response info... + // const { statusCode, headers } = httpResponse; +} catch (error) { + if (error instanceof ApiError) { + const errors = error.result; + // const { statusCode, headers } = error; + } +} +``` + +## Example Response *(as JSON)* + +```json +{ + "data": [ + { + "id": "efdbb9d1-02c2-4bc3-afb7-6788d8782b1e", + "trip_id": "efdbb9d1-02c2-4bc3-afb7-6788d8782b1e", + "passenger_name": "John Doe", + "has_bicycle": true, + "has_dog": true + }, + { + "id": "b2e783e1-c824-4d63-b37a-d8d698862f1d", + "trip_id": "b2e783e1-c824-4d63-b37a-d8d698862f1d", + "passenger_name": "Jane Smith", + "has_bicycle": false, + "has_dog": false + } + ], + "links": { + "self": "https://api.example.com/bookings", + "next": "https://api.example.com/bookings?page=2" + } +} +``` + +## Errors + +| HTTP Status Code | Error Description | Exception Class | +| --- | --- | --- | +| 400 | Bad Request | [`ProblemError`](../../doc/models/problem-error.md) | +| 401 | Unauthorized | [`ProblemError`](../../doc/models/problem-error.md) | +| 403 | Forbidden | [`ProblemError`](../../doc/models/problem-error.md) | +| 429 | Too Many Requests | [`ProblemError`](../../doc/models/problem-error.md) | +| 500 | Internal Server Error | [`ProblemError`](../../doc/models/problem-error.md) | + + +# Create-Booking + +A booking is a temporary hold on a trip. It is not confirmed until the payment is processed. + +```ts +async createBooking( body: Booking, +requestOptions?: RequestOptions): Promise> +``` + +## Parameters + +| Parameter | Type | Tags | Description | +| --- | --- | --- | --- | +| `body` | [`Booking`](../../doc/models/booking.md) | Body, Required | - | +| `requestOptions` | `RequestOptions \| undefined` | Optional | Pass additional request options. | + +## Requires scope + +### OAuth2 + +`write` + +## Response Type + +[`BookingsResponse1`](../../doc/models/bookings-response-1.md) + +## Example Usage + +```ts +const body: Booking = {}; + +try { + const { result, ...httpResponse } = await bookingsController.createBooking(body); + // Get more response info... + // const { statusCode, headers } = httpResponse; +} catch (error) { + if (error instanceof ApiError) { + const errors = error.result; + // const { statusCode, headers } = error; + } +} +``` + +## Example Response *(as JSON)* + +```json +{ + "id": "efdbb9d1-02c2-4bc3-afb7-6788d8782b1e", + "trip_id": "efdbb9d1-02c2-4bc3-afb7-6788d8782b1e", + "passenger_name": "John Doe", + "has_bicycle": true, + "has_dog": true, + "links": { + "self": "https://api.example.com/bookings/efdbb9d1-02c2-4bc3-afb7-6788d8782b1e" + } +} +``` + +## Errors + +| HTTP Status Code | Error Description | Exception Class | +| --- | --- | --- | +| 400 | Bad Request | [`ProblemError`](../../doc/models/problem-error.md) | +| 401 | Unauthorized | [`ProblemError`](../../doc/models/problem-error.md) | +| 404 | Not Found | [`ProblemError`](../../doc/models/problem-error.md) | +| 409 | Conflict | [`ProblemError`](../../doc/models/problem-error.md) | +| 429 | Too Many Requests | [`ProblemError`](../../doc/models/problem-error.md) | +| 500 | Internal Server Error | [`ProblemError`](../../doc/models/problem-error.md) | + + +# Get-Booking + +Returns the details of a specific booking. + +```ts +async getBooking( bookingId: string, +requestOptions?: RequestOptions): Promise> +``` + +## Parameters + +| Parameter | Type | Tags | Description | +| --- | --- | --- | --- | +| `bookingId` | `string` | Template, Required | The ID of the booking to retrieve. | +| `requestOptions` | `RequestOptions \| undefined` | Optional | Pass additional request options. | + +## Requires scope + +### OAuth2 + +`read` + +## Response Type + +[`BookingsResponse1`](../../doc/models/bookings-response-1.md) + +## Example Usage + +```ts +const bookingId = '1725ff48-ab45-4bb5-9d02-88745177dedb'; + +try { + const { result, ...httpResponse } = await bookingsController.getBooking(bookingId); + // Get more response info... + // const { statusCode, headers } = httpResponse; +} catch (error) { + if (error instanceof ApiError) { + const errors = error.result; + // const { statusCode, headers } = error; + } +} +``` + +## Example Response *(as JSON)* + +```json +{ + "id": "efdbb9d1-02c2-4bc3-afb7-6788d8782b1e", + "trip_id": "efdbb9d1-02c2-4bc3-afb7-6788d8782b1e", + "passenger_name": "John Doe", + "has_bicycle": true, + "has_dog": true, + "links": { + "self": "https://api.example.com/bookings/1725ff48-ab45-4bb5-9d02-88745177dedb" + } +} +``` + +## Errors + +| HTTP Status Code | Error Description | Exception Class | +| --- | --- | --- | +| 400 | Bad Request | [`ProblemError`](../../doc/models/problem-error.md) | +| 401 | Unauthorized | [`ProblemError`](../../doc/models/problem-error.md) | +| 403 | Forbidden | [`ProblemError`](../../doc/models/problem-error.md) | +| 404 | Not Found | [`ProblemError`](../../doc/models/problem-error.md) | +| 429 | Too Many Requests | [`ProblemError`](../../doc/models/problem-error.md) | +| 500 | Internal Server Error | [`ProblemError`](../../doc/models/problem-error.md) | + + +# Delete-Booking + +Deletes a booking, cancelling the hold on the trip. + +```ts +async deleteBooking( bookingId: string, +requestOptions?: RequestOptions): Promise> +``` + +## Parameters + +| Parameter | Type | Tags | Description | +| --- | --- | --- | --- | +| `bookingId` | `string` | Template, Required | The ID of the booking to retrieve. | +| `requestOptions` | `RequestOptions \| undefined` | Optional | Pass additional request options. | + +## Requires scope + +### OAuth2 + +`write` + +## Response Type + +`void` + +## Example Usage + +```ts +const bookingId = '1725ff48-ab45-4bb5-9d02-88745177dedb'; + +try { + const { result, ...httpResponse } = await bookingsController.deleteBooking(bookingId); + // Get more response info... + // const { statusCode, headers } = httpResponse; +} catch (error) { + if (error instanceof ApiError) { + const errors = error.result; + // const { statusCode, headers } = error; + } +} +``` + +## Errors + +| HTTP Status Code | Error Description | Exception Class | +| --- | --- | --- | +| 400 | Bad Request | [`ProblemError`](../../doc/models/problem-error.md) | +| 401 | Unauthorized | [`ProblemError`](../../doc/models/problem-error.md) | +| 403 | Forbidden | [`ProblemError`](../../doc/models/problem-error.md) | +| 404 | Not Found | [`ProblemError`](../../doc/models/problem-error.md) | +| 429 | Too Many Requests | [`ProblemError`](../../doc/models/problem-error.md) | +| 500 | Internal Server Error | [`ProblemError`](../../doc/models/problem-error.md) | + diff --git a/sdks/ts/openapi_sdk_typescript/doc/controllers/payments.md b/sdks/ts/openapi_sdk_typescript/doc/controllers/payments.md new file mode 100644 index 0000000..e94ec02 --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/doc/controllers/payments.md @@ -0,0 +1,118 @@ +# Payments + +Pay for bookings using a card or bank account, and view payment +status and history. + +> warn +> Bookings usually expire within 1 hour so you'll need to make your payment +> before the expiry date + +```ts +const paymentsController = new PaymentsController(client); +``` + +## Class Name + +`PaymentsController` + + +# Create-Booking-Payment + +A payment is an attempt to pay for the booking, which will confirm the booking for the user and enable them to get their tickets. + +```ts +async createBookingPayment( bookingId: string, + body: BookingPayment, +requestOptions?: RequestOptions): Promise> +``` + +## Parameters + +| Parameter | Type | Tags | Description | +| --- | --- | --- | --- | +| `bookingId` | `string` | Template, Required | The ID of the booking to pay for. | +| `body` | [`BookingPayment`](../../doc/models/booking-payment.md) | Body, Required | - | +| `requestOptions` | `RequestOptions \| undefined` | Optional | Pass additional request options. | + +## Requires scope + +### OAuth2 + +`read` + +## Response Type + +[`BookingsPaymentResponse`](../../doc/models/bookings-payment-response.md) + +## Example Usage + +```ts +const bookingId = '1725ff48-ab45-4bb5-9d02-88745177dedb'; + +const body: BookingPayment = { + amount: 49.99, + currency: CurrencyEnum.Gbp, + source: { + name: 'J. Doe', + number: '4242424242424242', + cvc: 123, + expMonth: BigInt(12), + expYear: BigInt(2025), + addressCountry: 'gb', + object: 'card', + addressLine1: '123 Fake Street', + addressLine2: '4th Floor', + addressCity: 'London', + addressPostCode: 'N12 9XX', + }, +}; + +try { + const { result, ...httpResponse } = await paymentsController.createBookingPayment( + bookingId, + body +); + // Get more response info... + // const { statusCode, headers } = httpResponse; +} catch (error) { + if (error instanceof ApiError) { + const errors = error.result; + // const { statusCode, headers } = error; + } +} +``` + +## Example Response *(as JSON)* + +```json +{ + "id": "2e3b4f5a-6b7c-8d9e-0f1a-2b3c4d5e6f7a", + "amount": 49.99, + "currency": "gbp", + "source": { + "object": "card", + "name": "J. Doe", + "number": "************4242", + "cvc": 123, + "exp_month": 12, + "exp_year": 2025, + "address_country": "gb", + "address_post_code": "N12 9XX" + }, + "status": "succeeded", + "links": { + "booking": "https://api.example.com/bookings/1725ff48-ab45-4bb5-9d02-88745177dedb/payment" + } +} +``` + +## Errors + +| HTTP Status Code | Error Description | Exception Class | +| --- | --- | --- | +| 400 | Bad Request | [`ProblemError`](../../doc/models/problem-error.md) | +| 401 | Unauthorized | [`ProblemError`](../../doc/models/problem-error.md) | +| 403 | Forbidden | [`ProblemError`](../../doc/models/problem-error.md) | +| 429 | Too Many Requests | [`ProblemError`](../../doc/models/problem-error.md) | +| 500 | Internal Server Error | [`ProblemError`](../../doc/models/problem-error.md) | + diff --git a/sdks/ts/openapi_sdk_typescript/doc/controllers/stations.md b/sdks/ts/openapi_sdk_typescript/doc/controllers/stations.md new file mode 100644 index 0000000..d393dae --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/doc/controllers/stations.md @@ -0,0 +1,103 @@ +# Stations + +Find and filter train stations across Europe, including their location +and local timezone. + +```ts +const stationsController = new StationsController(client); +``` + +## Class Name + +`StationsController` + + +# Get-Stations + +Returns a paginated and searchable list of all train stations. + +```ts +async getStations( page?: number, + coordinates?: string, + search?: string, +requestOptions?: RequestOptions): Promise> +``` + +## Parameters + +| Parameter | Type | Tags | Description | +| --- | --- | --- | --- | +| `page` | `number \| undefined` | Query, Optional | The page number to return
**Default**: `1`
**Constraints**: `>= 1` | +| `coordinates` | `string \| undefined` | Query, Optional | The latitude and longitude of the user's location, to narrow down the search results to sites within a proximity of this location. | +| `search` | `string \| undefined` | Query, Optional | A search term to filter the list of stations by name or address. | +| `requestOptions` | `RequestOptions \| undefined` | Optional | Pass additional request options. | + +## Requires scope + +### OAuth2 + +`read` + +## Response Type + +[`StationsResponse`](../../doc/models/stations-response.md) + +## Example Usage + +```ts +const search = 'Milano Centrale'; + +try { + const { result, ...httpResponse } = await stationsController.getStations( + undefined, + undefined, + search +); + // Get more response info... + // const { statusCode, headers } = httpResponse; +} catch (error) { + if (error instanceof ApiError) { + const errors = error.result; + // const { statusCode, headers } = error; + } +} +``` + +## Example Response *(as JSON)* + +```json +{ + "data": [ + { + "id": "efdbb9d1-02c2-4bc3-afb7-6788d8782b1e", + "name": "Berlin Hauptbahnhof", + "address": "Invalidenstraße 10557 Berlin, Germany", + "country_code": "DE", + "timezone": "Europe/Berlin" + }, + { + "id": "b2e783e1-c824-4d63-b37a-d8d698862f1d", + "name": "Paris Gare du Nord", + "address": "18 Rue de Dunkerque 75010 Paris, France", + "country_code": "FR", + "timezone": "Europe/Paris" + } + ], + "links": { + "self": "https://api.example.com/stations&page=2", + "next": "https://api.example.com/stations?page=3", + "prev": "https://api.example.com/stations?page=1" + } +} +``` + +## Errors + +| HTTP Status Code | Error Description | Exception Class | +| --- | --- | --- | +| 400 | Bad Request | [`ProblemError`](../../doc/models/problem-error.md) | +| 401 | Unauthorized | [`ProblemError`](../../doc/models/problem-error.md) | +| 403 | Forbidden | [`ProblemError`](../../doc/models/problem-error.md) | +| 429 | Too Many Requests | [`ProblemError`](../../doc/models/problem-error.md) | +| 500 | Internal Server Error | [`ProblemError`](../../doc/models/problem-error.md) | + diff --git a/sdks/ts/openapi_sdk_typescript/doc/controllers/trips.md b/sdks/ts/openapi_sdk_typescript/doc/controllers/trips.md new file mode 100644 index 0000000..c17aed0 --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/doc/controllers/trips.md @@ -0,0 +1,124 @@ +# Trips + +Timetables and routes for train trips between stations, including pricing +and availability. + +```ts +const tripsController = new TripsController(client); +``` + +## Class Name + +`TripsController` + + +# Get-Trips + +Returns a list of available train trips between the specified origin and destination stations on the given date, and allows for filtering by bicycle and dog allowances. + +```ts +async getTrips( origin: string, + destination: string, + date: string, + bicycles?: boolean, + dogs?: boolean, +requestOptions?: RequestOptions): Promise> +``` + +## Parameters + +| Parameter | Type | Tags | Description | +| --- | --- | --- | --- | +| `origin` | `string` | Query, Required | The ID of the origin station | +| `destination` | `string` | Query, Required | The ID of the destination station | +| `date` | `string` | Query, Required | The date and time of the trip in ISO 8601 format in origin station's timezone. | +| `bicycles` | `boolean \| undefined` | Query, Optional | Only return trips where bicycles are known to be allowed
**Default**: `false` | +| `dogs` | `boolean \| undefined` | Query, Optional | Only return trips where dogs are known to be allowed
**Default**: `false` | +| `requestOptions` | `RequestOptions \| undefined` | Optional | Pass additional request options. | + +## Requires scope + +### OAuth2 + +`read` + +## Response Type + +[`TripsResponse`](../../doc/models/trips-response.md) + +## Example Usage + +```ts +const origin = 'efdbb9d1-02c2-4bc3-afb7-6788d8782b1e'; + +const destination = 'b2e783e1-c824-4d63-b37a-d8d698862f1d'; + +const date = '02/01/2024 09:00:00'; + +const bicycles = false; + +const dogs = false; + +try { + const { result, ...httpResponse } = await tripsController.getTrips( + origin, + destination, + date, + bicycles, + dogs +); + // Get more response info... + // const { statusCode, headers } = httpResponse; +} catch (error) { + if (error instanceof ApiError) { + const errors = error.result; + // const { statusCode, headers } = error; + } +} +``` + +## Example Response *(as JSON)* + +```json +{ + "data": [ + { + "id": "ea399ba1-6d95-433f-92d1-83f67b775594", + "origin": "efdbb9d1-02c2-4bc3-afb7-6788d8782b1e", + "destination": "b2e783e1-c824-4d63-b37a-d8d698862f1d", + "departure_time": "2024-02-01T10:00:00Z", + "arrival_time": "2024-02-01T16:00:00Z", + "price": 50, + "operator": "Deutsche Bahn", + "bicycles_allowed": true, + "dogs_allowed": true + }, + { + "id": "4d67459c-af07-40bb-bb12-178dbb88e09f", + "origin": "b2e783e1-c824-4d63-b37a-d8d698862f1d", + "destination": "efdbb9d1-02c2-4bc3-afb7-6788d8782b1e", + "departure_time": "2024-02-01T12:00:00Z", + "arrival_time": "2024-02-01T18:00:00Z", + "price": 50, + "operator": "SNCF", + "bicycles_allowed": true, + "dogs_allowed": true + } + ], + "links": { + "self": "https://api.example.com/trips?origin=efdbb9d1-02c2-4bc3-afb7-6788d8782b1e&destination=b2e783e1-c824-4d63-b37a-d8d698862f1d&date=2024-02-01", + "next": "https://api.example.com/trips?origin=efdbb9d1-02c2-4bc3-afb7-6788d8782b1e&destination=b2e783e1-c824-4d63-b37a-d8d698862f1d&date=2024-02-01&page=2" + } +} +``` + +## Errors + +| HTTP Status Code | Error Description | Exception Class | +| --- | --- | --- | +| 400 | Bad Request | [`ProblemError`](../../doc/models/problem-error.md) | +| 401 | Unauthorized | [`ProblemError`](../../doc/models/problem-error.md) | +| 403 | Forbidden | [`ProblemError`](../../doc/models/problem-error.md) | +| 429 | Too Many Requests | [`ProblemError`](../../doc/models/problem-error.md) | +| 500 | Internal Server Error | [`ProblemError`](../../doc/models/problem-error.md) | + diff --git a/sdks/ts/openapi_sdk_typescript/doc/models/account-type-enum.md b/sdks/ts/openapi_sdk_typescript/doc/models/account-type-enum.md new file mode 100644 index 0000000..98fb1e9 --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/doc/models/account-type-enum.md @@ -0,0 +1,16 @@ + +# Account Type Enum + +The type of entity that holds the account. This can be either `individual` or `company`. + +## Enumeration + +`AccountTypeEnum` + +## Fields + +| Name | +| --- | +| `Individual` | +| `Company` | + diff --git a/sdks/ts/openapi_sdk_typescript/doc/models/bank-account.md b/sdks/ts/openapi_sdk_typescript/doc/models/bank-account.md new file mode 100644 index 0000000..e1b75c4 --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/doc/models/bank-account.md @@ -0,0 +1,35 @@ + +# Bank Account + +A bank account to take payment from. Must be able to make payments in the currency specified in the payment. + +## Structure + +`BankAccount` + +## Fields + +| Name | Type | Tags | Description | +| --- | --- | --- | --- | +| `object` | [`Object1Enum \| undefined`](../../doc/models/object-1-enum.md) | Optional | - | +| `name` | `string` | Required | - | +| `number` | `string` | Required | The account number for the bank account, in string form. Must be a current account. | +| `sortCode` | `string \| undefined` | Optional | The sort code for the bank account, in string form. Must be a six-digit number. | +| `accountType` | [`AccountTypeEnum`](../../doc/models/account-type-enum.md) | Required | The type of entity that holds the account. This can be either `individual` or `company`. | +| `bankName` | `string` | Required | The name of the bank associated with the routing number. | +| `country` | `string` | Required | Two-letter country code (ISO 3166-1 alpha-2). | + +## Example (as JSON) + +```json +{ + "name": "name2", + "number": "number0", + "account_type": "individual", + "bank_name": "Starling Bank", + "country": "country6", + "object": "bank_account", + "sort_code": "sort_code2" +} +``` + diff --git a/sdks/ts/openapi_sdk_typescript/doc/models/booking-payment.md b/sdks/ts/openapi_sdk_typescript/doc/models/booking-payment.md new file mode 100644 index 0000000..fc19b17 --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/doc/models/booking-payment.md @@ -0,0 +1,41 @@ + +# Booking Payment + +## Structure + +`BookingPayment` + +## Fields + +| Name | Type | Tags | Description | +| --- | --- | --- | --- | +| `id` | `string \| undefined` | Optional | Unique identifier for the payment. This will be a unique identifier for the payment, and is used to reference the payment in other objects. | +| `amount` | `number \| undefined` | Optional | Amount intended to be collected by this payment. A positive decimal figure describing the amount to be collected.
**Constraints**: `> 0` | +| `currency` | [`CurrencyEnum \| undefined`](../../doc/models/currency-enum.md) | Optional | Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. | +| `source` | [`BookingPaymentSource \| undefined`](../../doc/models/containers/booking-payment-source.md) | Optional | This is a container for any-of cases. | +| `status` | [`StatusEnum \| undefined`](../../doc/models/status-enum.md) | Optional | The status of the payment, one of `pending`, `succeeded`, or `failed`. | + +## Example (as JSON) + +```json +{ + "amount": 49.99, + "id": "00000f08-0000-0000-0000-000000000000", + "currency": "gbp", + "source": { + "object": "card", + "name": "name0", + "number": "number8", + "cvc": 94, + "exp_month": 240, + "exp_year": 56, + "address_line1": "address_line14", + "address_line2": "address_line22", + "address_city": "address_city0", + "address_country": "address_country2", + "address_post_code": "address_post_code6" + }, + "status": "pending" +} +``` + diff --git a/sdks/ts/openapi_sdk_typescript/doc/models/booking.md b/sdks/ts/openapi_sdk_typescript/doc/models/booking.md new file mode 100644 index 0000000..36d7eb7 --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/doc/models/booking.md @@ -0,0 +1,29 @@ + +# Booking + +## Structure + +`Booking` + +## Fields + +| Name | Type | Tags | Description | +| --- | --- | --- | --- | +| `id` | `string \| undefined` | Optional | Unique identifier for the booking | +| `tripId` | `string \| undefined` | Optional | Identifier of the booked trip | +| `passengerName` | `string \| undefined` | Optional | Name of the passenger | +| `hasBicycle` | `boolean \| undefined` | Optional | Indicates whether the passenger has a bicycle. | +| `hasDog` | `boolean \| undefined` | Optional | Indicates whether the passenger has a dog. | + +## Example (as JSON) + +```json +{ + "id": "00000b58-0000-0000-0000-000000000000", + "trip_id": "00001334-0000-0000-0000-000000000000", + "passenger_name": "passenger_name4", + "has_bicycle": false, + "has_dog": false +} +``` + diff --git a/sdks/ts/openapi_sdk_typescript/doc/models/bookings-payment-response.md b/sdks/ts/openapi_sdk_typescript/doc/models/bookings-payment-response.md new file mode 100644 index 0000000..762a9d2 --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/doc/models/bookings-payment-response.md @@ -0,0 +1,42 @@ + +# Bookings Payment Response + +## Structure + +`BookingsPaymentResponse` + +## Fields + +| Name | Type | Tags | Description | +| --- | --- | --- | --- | +| `id` | `string \| undefined` | Optional | Unique identifier for the payment. This will be a unique identifier for the payment, and is used to reference the payment in other objects. | +| `amount` | `number \| undefined` | Optional | Amount intended to be collected by this payment. A positive decimal figure describing the amount to be collected.
**Constraints**: `> 0` | +| `currency` | [`CurrencyEnum \| undefined`](../../doc/models/currency-enum.md) | Optional | Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. | +| `source` | [`BookingsPaymentResponseSource \| undefined`](../../doc/models/containers/bookings-payment-response-source.md) | Optional | This is a container for any-of cases. | +| `status` | [`StatusEnum \| undefined`](../../doc/models/status-enum.md) | Optional | The status of the payment, one of `pending`, `succeeded`, or `failed`. | +| `links` | [`LinksBooking \| undefined`](../../doc/models/links-booking.md) | Optional | - | + +## Example (as JSON) + +```json +{ + "amount": 49.99, + "id": "00001bb0-0000-0000-0000-000000000000", + "currency": "gbp", + "source": { + "object": "card", + "name": "name0", + "number": "number8", + "cvc": 94, + "exp_month": 240, + "exp_year": 56, + "address_line1": "address_line14", + "address_line2": "address_line22", + "address_city": "address_city0", + "address_country": "address_country2", + "address_post_code": "address_post_code6" + }, + "status": "failed" +} +``` + diff --git a/sdks/ts/openapi_sdk_typescript/doc/models/bookings-response-1.md b/sdks/ts/openapi_sdk_typescript/doc/models/bookings-response-1.md new file mode 100644 index 0000000..663594c --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/doc/models/bookings-response-1.md @@ -0,0 +1,30 @@ + +# Bookings Response 1 + +## Structure + +`BookingsResponse1` + +## Fields + +| Name | Type | Tags | Description | +| --- | --- | --- | --- | +| `id` | `string \| undefined` | Optional | Unique identifier for the booking | +| `tripId` | `string \| undefined` | Optional | Identifier of the booked trip | +| `passengerName` | `string \| undefined` | Optional | Name of the passenger | +| `hasBicycle` | `boolean \| undefined` | Optional | Indicates whether the passenger has a bicycle. | +| `hasDog` | `boolean \| undefined` | Optional | Indicates whether the passenger has a dog. | +| `links` | [`LinksSelf \| undefined`](../../doc/models/links-self.md) | Optional | - | + +## Example (as JSON) + +```json +{ + "passenger_name": "John Doe", + "id": "00000124-0000-0000-0000-000000000000", + "trip_id": "00000900-0000-0000-0000-000000000000", + "has_bicycle": false, + "has_dog": false +} +``` + diff --git a/sdks/ts/openapi_sdk_typescript/doc/models/bookings-response.md b/sdks/ts/openapi_sdk_typescript/doc/models/bookings-response.md new file mode 100644 index 0000000..3682f33 --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/doc/models/bookings-response.md @@ -0,0 +1,35 @@ + +# Bookings Response + +## Structure + +`BookingsResponse` + +## Fields + +| Name | Type | Tags | Description | +| --- | --- | --- | --- | +| `data` | [`Booking[] \| undefined`](../../doc/models/booking.md) | Optional | The wrapper for a collection is an array of objects. | +| `links` | [`Links \| undefined`](../../doc/models/links.md) | Optional | A set of hypermedia links which serve as controls for the client. | + +## Example (as JSON) + +```json +{ + "data": [ + { + "id": "00001c2a-0000-0000-0000-000000000000", + "trip_id": "00002406-0000-0000-0000-000000000000", + "passenger_name": "passenger_name0", + "has_bicycle": false, + "has_dog": false + } + ], + "links": { + "self": "self2", + "next": "next2", + "prev": "prev8" + } +} +``` + diff --git a/sdks/ts/openapi_sdk_typescript/doc/models/card.md b/sdks/ts/openapi_sdk_typescript/doc/models/card.md new file mode 100644 index 0000000..c7c765b --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/doc/models/card.md @@ -0,0 +1,43 @@ + +# Card + +A card (debit or credit) to take payment from. + +## Structure + +`Card` + +## Fields + +| Name | Type | Tags | Description | +| --- | --- | --- | --- | +| `object` | [`ObjectEnum \| undefined`](../../doc/models/object-enum.md) | Optional | - | +| `name` | `string` | Required | Cardholder's full name as it appears on the card. | +| `number` | `string` | Required | The card number, as a string without any separators. On read all but the last four digits will be masked for security. | +| `cvc` | `number` | Required | Card security code, 3 or 4 digits usually found on the back of the card. | +| `expMonth` | `bigint` | Required | Two-digit number representing the card's expiration month. | +| `expYear` | `bigint` | Required | Four-digit number representing the card's expiration year. | +| `addressLine1` | `string \| undefined` | Optional | - | +| `addressLine2` | `string \| undefined` | Optional | - | +| `addressCity` | `string \| undefined` | Optional | - | +| `addressCountry` | `string` | Required | - | +| `addressPostCode` | `string \| undefined` | Optional | - | + +## Example (as JSON) + +```json +{ + "name": "Francis Bourgeois", + "number": "4242424242424242", + "cvc": 123, + "exp_month": 12, + "exp_year": 2025, + "address_country": "address_country2", + "object": "card", + "address_line1": "address_line14", + "address_line2": "address_line22", + "address_city": "address_city0", + "address_post_code": "address_post_code6" +} +``` + diff --git a/sdks/ts/openapi_sdk_typescript/doc/models/currency-enum.md b/sdks/ts/openapi_sdk_typescript/doc/models/currency-enum.md new file mode 100644 index 0000000..2d91cce --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/doc/models/currency-enum.md @@ -0,0 +1,22 @@ + +# Currency Enum + +Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. + +## Enumeration + +`CurrencyEnum` + +## Fields + +| Name | +| --- | +| `Bam` | +| `Bgn` | +| `Chf` | +| `Eur` | +| `Gbp` | +| `Nok` | +| `Sek` | +| `Try` | + diff --git a/sdks/ts/openapi_sdk_typescript/doc/models/links-booking.md b/sdks/ts/openapi_sdk_typescript/doc/models/links-booking.md new file mode 100644 index 0000000..c9bd41a --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/doc/models/links-booking.md @@ -0,0 +1,21 @@ + +# Links Booking + +## Structure + +`LinksBooking` + +## Fields + +| Name | Type | Tags | Description | +| --- | --- | --- | --- | +| `booking` | `string \| undefined` | Optional | - | + +## Example (as JSON) + +```json +{ + "booking": "https://api.example.com/bookings/1725ff48-ab45-4bb5-9d02-88745177dedb" +} +``` + diff --git a/sdks/ts/openapi_sdk_typescript/doc/models/links-pagination.md b/sdks/ts/openapi_sdk_typescript/doc/models/links-pagination.md new file mode 100644 index 0000000..0e3e820 --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/doc/models/links-pagination.md @@ -0,0 +1,23 @@ + +# Links Pagination + +## Structure + +`LinksPagination` + +## Fields + +| Name | Type | Tags | Description | +| --- | --- | --- | --- | +| `next` | `string \| undefined` | Optional | - | +| `prev` | `string \| undefined` | Optional | - | + +## Example (as JSON) + +```json +{ + "next": "next8", + "prev": "prev2" +} +``` + diff --git a/sdks/ts/openapi_sdk_typescript/doc/models/links-self.md b/sdks/ts/openapi_sdk_typescript/doc/models/links-self.md new file mode 100644 index 0000000..06f805d --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/doc/models/links-self.md @@ -0,0 +1,21 @@ + +# Links Self + +## Structure + +`LinksSelf` + +## Fields + +| Name | Type | Tags | Description | +| --- | --- | --- | --- | +| `self` | `string \| undefined` | Optional | - | + +## Example (as JSON) + +```json +{ + "self": "self6" +} +``` + diff --git a/sdks/ts/openapi_sdk_typescript/doc/models/links.md b/sdks/ts/openapi_sdk_typescript/doc/models/links.md new file mode 100644 index 0000000..bd4cfb5 --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/doc/models/links.md @@ -0,0 +1,27 @@ + +# Links + +A set of hypermedia links which serve as controls for the client. + +## Structure + +`Links` + +## Fields + +| Name | Type | Tags | Description | +| --- | --- | --- | --- | +| `self` | `string \| undefined` | Optional | - | +| `next` | `string \| undefined` | Optional | - | +| `prev` | `string \| undefined` | Optional | - | + +## Example (as JSON) + +```json +{ + "self": "self4", + "next": "next4", + "prev": "prev0" +} +``` + diff --git a/sdks/ts/openapi_sdk_typescript/doc/models/o-auth-provider-error-enum.md b/sdks/ts/openapi_sdk_typescript/doc/models/o-auth-provider-error-enum.md new file mode 100644 index 0000000..c735700 --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/doc/models/o-auth-provider-error-enum.md @@ -0,0 +1,20 @@ + +# O Auth Provider Error Enum + +OAuth 2 Authorization error codes + +## Enumeration + +`OAuthProviderErrorEnum` + +## Fields + +| Name | Description | +| --- | --- | +| `InvalidRequest` | The request is missing a required parameter, includes an unsupported parameter value (other than grant type), repeats a parameter, includes multiple credentials, utilizes more than one mechanism for authenticating the client, or is otherwise malformed. | +| `InvalidClient` | Client authentication failed (e.g., unknown client, no client authentication included, or unsupported authentication method). | +| `InvalidGrant` | The provided authorization grant (e.g., authorization code, resource owner credentials) or refresh token is invalid, expired, revoked, does not match the redirection URI used in the authorization request, or was issued to another client. | +| `UnauthorizedClient` | The authenticated client is not authorized to use this authorization grant type. | +| `UnsupportedGrantType` | The authorization grant type is not supported by the authorization server. | +| `InvalidScope` | The requested scope is invalid, unknown, malformed, or exceeds the scope granted by the resource owner. | + diff --git a/sdks/ts/openapi_sdk_typescript/doc/models/o-auth-provider-error.md b/sdks/ts/openapi_sdk_typescript/doc/models/o-auth-provider-error.md new file mode 100644 index 0000000..abb647f --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/doc/models/o-auth-provider-error.md @@ -0,0 +1,27 @@ + +# O Auth Provider Error + +OAuth 2 Authorization endpoint exception. + +## Structure + +`OAuthProviderError` + +## Fields + +| Name | Type | Tags | Description | +| --- | --- | --- | --- | +| `error` | [`OAuthProviderErrorEnum`](../../doc/models/o-auth-provider-error-enum.md) | Required | Gets or sets error code. | +| `errorDescription` | `string \| undefined` | Optional | Gets or sets human-readable text providing additional information on error.
Used to assist the client developer in understanding the error that occurred. | +| `errorUri` | `string \| undefined` | Optional | Gets or sets a URI identifying a human-readable web page with information about the error, used to provide the client developer with additional information about the error. | + +## Example (as JSON) + +```json +{ + "error": "unsupported_grant_type", + "error_description": "error_description8", + "error_uri": "error_uri8" +} +``` + diff --git a/sdks/ts/openapi_sdk_typescript/doc/models/o-auth-scope-enum.md b/sdks/ts/openapi_sdk_typescript/doc/models/o-auth-scope-enum.md new file mode 100644 index 0000000..4273db7 --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/doc/models/o-auth-scope-enum.md @@ -0,0 +1,16 @@ + +# O Auth Scope Enum + +OAuth 2 scopes supported by the API + +## Enumeration + +`OAuthScopeEnum` + +## Fields + +| Name | Description | +| --- | --- | +| `Read` | Read access | +| `Write` | Write access | + diff --git a/sdks/ts/openapi_sdk_typescript/doc/models/o-auth-token.md b/sdks/ts/openapi_sdk_typescript/doc/models/o-auth-token.md new file mode 100644 index 0000000..e0b0b33 --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/doc/models/o-auth-token.md @@ -0,0 +1,33 @@ + +# O Auth Token + +OAuth 2 Authorization endpoint response + +## Structure + +`OAuthToken` + +## Fields + +| Name | Type | Tags | Description | +| --- | --- | --- | --- | +| `accessToken` | `string` | Required | Access token | +| `tokenType` | `string` | Required | Type of access token | +| `expiresIn` | `bigint \| undefined` | Optional | Time in seconds before the access token expires | +| `scope` | `string \| undefined` | Optional | List of scopes granted
This is a space-delimited list of strings. | +| `expiry` | `bigint \| undefined` | Optional | Time of token expiry as unix timestamp (UTC) | +| `refreshToken` | `string \| undefined` | Optional | Refresh token
Used to get a new access token when it expires. | + +## Example (as JSON) + +```json +{ + "access_token": "access_token4", + "token_type": "token_type6", + "expires_in": 74, + "scope": "scope6", + "expiry": 88, + "refresh_token": "refresh_token6" +} +``` + diff --git a/sdks/ts/openapi_sdk_typescript/doc/models/object-1-enum.md b/sdks/ts/openapi_sdk_typescript/doc/models/object-1-enum.md new file mode 100644 index 0000000..58196ed --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/doc/models/object-1-enum.md @@ -0,0 +1,13 @@ + +# Object 1 Enum + +## Enumeration + +`Object1Enum` + +## Fields + +| Name | +| --- | +| `BankAccount` | + diff --git a/sdks/ts/openapi_sdk_typescript/doc/models/object-enum.md b/sdks/ts/openapi_sdk_typescript/doc/models/object-enum.md new file mode 100644 index 0000000..1d94ec5 --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/doc/models/object-enum.md @@ -0,0 +1,13 @@ + +# Object Enum + +## Enumeration + +`ObjectEnum` + +## Fields + +| Name | +| --- | +| `Card` | + diff --git a/sdks/ts/openapi_sdk_typescript/doc/models/problem-error.md b/sdks/ts/openapi_sdk_typescript/doc/models/problem-error.md new file mode 100644 index 0000000..ddc74d2 --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/doc/models/problem-error.md @@ -0,0 +1,29 @@ + +# Problem Error + +## Structure + +`ProblemError` + +## Fields + +| Name | Type | Tags | Description | +| --- | --- | --- | --- | +| `type` | `string \| undefined` | Optional | A URI reference that identifies the problem type | +| `title` | `string \| undefined` | Optional | A short, human-readable summary of the problem type | +| `detail` | `string \| undefined` | Optional | A human-readable explanation specific to this occurrence of the problem | +| `instance` | `string \| undefined` | Optional | A URI reference that identifies the specific occurrence of the problem | +| `status` | `number \| undefined` | Optional | The HTTP status code | + +## Example (as JSON) + +```json +{ + "type": "type4", + "title": "title8", + "detail": "detail2", + "instance": "instance2", + "status": 14 +} +``` + diff --git a/sdks/ts/openapi_sdk_typescript/doc/models/source.md b/sdks/ts/openapi_sdk_typescript/doc/models/source.md new file mode 100644 index 0000000..a0810ef --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/doc/models/source.md @@ -0,0 +1,43 @@ + +# Source + +The payment source to take the payment from. This can be a card or a bank account. Some of these properties will be hidden on read to protect PII leaking. + +## Structure + +`Source` + +## Fields + +| Name | Type | Tags | Description | +| --- | --- | --- | --- | +| `object` | [`ObjectEnum \| undefined`](../../doc/models/object-enum.md) | Optional | - | +| `name` | `string \| undefined` | Optional | Cardholder's full name as it appears on the card. | +| `number` | `string \| undefined` | Optional | The card number, as a string without any separators. On read all but the last four digits will be masked for security. | +| `cvc` | `number \| undefined` | Optional | Card security code, 3 or 4 digits usually found on the back of the card. | +| `expMonth` | `bigint \| undefined` | Optional | Two-digit number representing the card's expiration month. | +| `expYear` | `bigint \| undefined` | Optional | Four-digit number representing the card's expiration year. | +| `addressLine1` | `string \| undefined` | Optional | - | +| `addressLine2` | `string \| undefined` | Optional | - | +| `addressCity` | `string \| undefined` | Optional | - | +| `addressCountry` | `string \| undefined` | Optional | - | +| `addressPostCode` | `string \| undefined` | Optional | - | +| `sortCode` | `string \| undefined` | Optional | The sort code for the bank account, in string form. Must be a six-digit number. | +| `accountType` | [`AccountTypeEnum \| undefined`](../../doc/models/account-type-enum.md) | Optional | The type of entity that holds the account. This can be either `individual` or `company`. | +| `bankName` | `string \| undefined` | Optional | The name of the bank associated with the routing number. | +| `country` | `string \| undefined` | Optional | Two-letter country code (ISO 3166-1 alpha-2). | + +## Example (as JSON) + +```json +{ + "name": "Francis Bourgeois", + "number": "4242424242424242", + "cvc": 123, + "exp_month": 12, + "exp_year": 2025, + "bank_name": "Starling Bank", + "object": "card" +} +``` + diff --git a/sdks/ts/openapi_sdk_typescript/doc/models/station.md b/sdks/ts/openapi_sdk_typescript/doc/models/station.md new file mode 100644 index 0000000..74e1a83 --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/doc/models/station.md @@ -0,0 +1,29 @@ + +# Station + +## Structure + +`Station` + +## Fields + +| Name | Type | Tags | Description | +| --- | --- | --- | --- | +| `id` | `string` | Required | Unique identifier for the station. | +| `name` | `string` | Required | The name of the station | +| `address` | `string` | Required | The address of the station. | +| `countryCode` | `string` | Required | The country code of the station. | +| `timezone` | `string \| undefined` | Optional | The timezone of the station in the [IANA Time Zone Database format](https://www.iana.org/time-zones). | + +## Example (as JSON) + +```json +{ + "id": "efdbb9d1-02c2-4bc3-afb7-6788d8782b1e", + "name": "Berlin Hauptbahnhof", + "address": "Invalidenstraße 10557 Berlin, Germany", + "country_code": "DE", + "timezone": "Europe/Berlin" +} +``` + diff --git a/sdks/ts/openapi_sdk_typescript/doc/models/stations-response.md b/sdks/ts/openapi_sdk_typescript/doc/models/stations-response.md new file mode 100644 index 0000000..bf2c80e --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/doc/models/stations-response.md @@ -0,0 +1,43 @@ + +# Stations Response + +## Structure + +`StationsResponse` + +## Fields + +| Name | Type | Tags | Description | +| --- | --- | --- | --- | +| `data` | [`Station[] \| undefined`](../../doc/models/station.md) | Optional | - | + +## Example (as JSON) + +```json +{ + "data": [ + { + "id": "00001c2a-0000-0000-0000-000000000000", + "name": "name0", + "address": "address6", + "country_code": "country_code0", + "timezone": "timezone0" + }, + { + "id": "00001c2a-0000-0000-0000-000000000000", + "name": "name0", + "address": "address6", + "country_code": "country_code0", + "timezone": "timezone0" + }, + { + "id": "00001c2a-0000-0000-0000-000000000000", + "name": "name0", + "address": "address6", + "country_code": "country_code0", + "timezone": "timezone0" + } + ] +} +``` + diff --git a/sdks/ts/openapi_sdk_typescript/doc/models/status-enum.md b/sdks/ts/openapi_sdk_typescript/doc/models/status-enum.md new file mode 100644 index 0000000..8cb4c7d --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/doc/models/status-enum.md @@ -0,0 +1,17 @@ + +# Status Enum + +The status of the payment, one of `pending`, `succeeded`, or `failed`. + +## Enumeration + +`StatusEnum` + +## Fields + +| Name | +| --- | +| `Pending` | +| `Succeeded` | +| `Failed` | + diff --git a/sdks/ts/openapi_sdk_typescript/doc/models/trip.md b/sdks/ts/openapi_sdk_typescript/doc/models/trip.md new file mode 100644 index 0000000..45da409 --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/doc/models/trip.md @@ -0,0 +1,34 @@ + +# Trip + +## Structure + +`Trip` + +## Fields + +| Name | Type | Tags | Description | +| --- | --- | --- | --- | +| `id` | `string \| undefined` | Optional | Unique identifier for the trip | +| `origin` | `string \| undefined` | Optional | The starting station of the trip | +| `destination` | `string \| undefined` | Optional | The destination station of the trip | +| `departureTime` | `string \| undefined` | Optional | The date and time when the trip departs | +| `arrivalTime` | `string \| undefined` | Optional | The date and time when the trip arrives | +| `operator` | `string \| undefined` | Optional | The name of the operator of the trip | +| `price` | `number \| undefined` | Optional | The cost of the trip | +| `bicyclesAllowed` | `boolean \| undefined` | Optional | Indicates whether bicycles are allowed on the trip | +| `dogsAllowed` | `boolean \| undefined` | Optional | Indicates whether dogs are allowed on the trip | + +## Example (as JSON) + +```json +{ + "origin": "Berlin Hauptbahnhof", + "destination": "Paris Gare du Nord", + "operator": "Deutsche Bahn", + "id": "00001cba-0000-0000-0000-000000000000", + "departure_time": "2016-03-13T12:52:32.123Z", + "arrival_time": "2016-03-13T12:52:32.123Z" +} +``` + diff --git a/sdks/ts/openapi_sdk_typescript/doc/models/trips-response.md b/sdks/ts/openapi_sdk_typescript/doc/models/trips-response.md new file mode 100644 index 0000000..9915e2d --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/doc/models/trips-response.md @@ -0,0 +1,49 @@ + +# Trips Response + +## Structure + +`TripsResponse` + +## Fields + +| Name | Type | Tags | Description | +| --- | --- | --- | --- | +| `data` | [`Trip[] \| undefined`](../../doc/models/trip.md) | Optional | The wrapper for a collection is an array of objects. | +| `links` | [`Links \| undefined`](../../doc/models/links.md) | Optional | A set of hypermedia links which serve as controls for the client. | + +## Example (as JSON) + +```json +{ + "data": [ + { + "id": "00001c2a-0000-0000-0000-000000000000", + "origin": "origin4", + "destination": "destination6", + "departure_time": "2016-03-13T12:52:32.123Z", + "arrival_time": "2016-03-13T12:52:32.123Z" + }, + { + "id": "00001c2a-0000-0000-0000-000000000000", + "origin": "origin4", + "destination": "destination6", + "departure_time": "2016-03-13T12:52:32.123Z", + "arrival_time": "2016-03-13T12:52:32.123Z" + }, + { + "id": "00001c2a-0000-0000-0000-000000000000", + "origin": "origin4", + "destination": "destination6", + "departure_time": "2016-03-13T12:52:32.123Z", + "arrival_time": "2016-03-13T12:52:32.123Z" + } + ], + "links": { + "self": "self2", + "next": "next2", + "prev": "prev8" + } +} +``` + diff --git a/sdks/ts/openapi_sdk_typescript/doc/models/wrapper-collection.md b/sdks/ts/openapi_sdk_typescript/doc/models/wrapper-collection.md new file mode 100644 index 0000000..d6569cb --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/doc/models/wrapper-collection.md @@ -0,0 +1,33 @@ + +# Wrapper Collection + +This is a generic request/response wrapper which contains both data and links which serve as hypermedia controls (HATEOAS). + +## Structure + +`WrapperCollection` + +## Fields + +| Name | Type | Tags | Description | +| --- | --- | --- | --- | +| `data` | [`unknown[] \| undefined`](../../doc/models/object-enum.md) | Optional | The wrapper for a collection is an array of objects. | +| `links` | [`unknown \| undefined`](../../doc/models/object-enum.md) | Optional | A set of hypermedia links which serve as controls for the client. | + +## Example (as JSON) + +```json +{ + "data": [ + { + "key1": "val1", + "key2": "val2" + } + ], + "links": { + "key1": "val1", + "key2": "val2" + } +} +``` + diff --git a/sdks/ts/openapi_sdk_typescript/jest.config.js b/sdks/ts/openapi_sdk_typescript/jest.config.js new file mode 100644 index 0000000..091b875 --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/jest.config.js @@ -0,0 +1,7 @@ +module.exports = { + testEnvironment: 'node', + preset: 'ts-jest', + transform: { + '^.+\\.tsx?$': ['ts-jest', { tsconfig: 'tsconfig.base.json' }], + }, +}; diff --git a/sdks/ts/openapi_sdk_typescript/package-lock.json b/sdks/ts/openapi_sdk_typescript/package-lock.json new file mode 100644 index 0000000..3c53645 --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/package-lock.json @@ -0,0 +1,5568 @@ +{ + "name": "train-travel-apilib", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "train-travel-apilib", + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "@apimatic/authentication-adapters": "^0.5.4", + "@apimatic/axios-client-adapter": "^0.3.4", + "@apimatic/core": "^0.10.13", + "@apimatic/oauth-adapters": "^0.4.6", + "@apimatic/schema": "^0.7.12" + }, + "devDependencies": { + "@apimatic/test-utilities": "^0.0.1", + "@types/jest": "^29.4.0", + "@typescript-eslint/eslint-plugin": "^5.52.0", + "@typescript-eslint/parser": "^5.52.0", + "eslint": "^8.34.0", + "jest": "^29.4.3", + "ts-jest": "^29.0.5", + "tslib": "^2.5.0", + "typescript": "^4.9.5" + }, + "engines": { + "node": ">=14.17.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@apimatic/authentication-adapters": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@apimatic/authentication-adapters/-/authentication-adapters-0.5.4.tgz", + "integrity": "sha512-UP4+LfvLQJjgtKaGr+hgQogM3JJGb9llEX8v9OVUp0xmiIVI8zt0m69nz/vk4GaNe4U6AvS3D4x0YiE5JtLVkg==", + "license": "MIT", + "dependencies": { + "@apimatic/core-interfaces": "^0.2.6", + "@apimatic/http-headers": "^0.3.2", + "@apimatic/http-query": "^0.3.2", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=14.15.0 || >=16.0.0" + } + }, + "node_modules/@apimatic/axios-client-adapter": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@apimatic/axios-client-adapter/-/axios-client-adapter-0.3.4.tgz", + "integrity": "sha512-vRluB6E7AHnGRZp/ntPcvdj01RrxUj2ylzDR6ejsT/xbXf0SOw2awSDOEq1ZsglzakNvzbuGaWIBY+e2yq8e/Q==", + "license": "MIT", + "dependencies": { + "@apimatic/convert-to-stream": "^0.1.2", + "@apimatic/core-interfaces": "^0.2.6", + "@apimatic/file-wrapper": "^0.3.2", + "@apimatic/http-headers": "^0.3.2", + "@apimatic/http-query": "^0.3.2", + "@apimatic/json-bigint": "^1.2.0", + "@apimatic/schema": "^0.7.12", + "axios": "^1.6.0", + "detect-browser": "^5.3.0", + "detect-node": "^2.0.4", + "form-data": "^3.0.0", + "lodash.flatmap": "^4.5.0", + "tiny-warning": "^1.0.3", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=14.15.0 || >=16.0.0" + } + }, + "node_modules/@apimatic/convert-to-stream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@apimatic/convert-to-stream/-/convert-to-stream-0.1.2.tgz", + "integrity": "sha512-4UzlEIbecy1Qubbx8KXVerpt1w/KD4iEtHRfE28p0eMEU6RoLksnHVONp5i4uycvfNJsA0z0kiTBRtXkmNsWag==", + "license": "ISC", + "engines": { + "node": ">=14.15.0 || >=16.0.0" + } + }, + "node_modules/@apimatic/core": { + "version": "0.10.13", + "resolved": "https://registry.npmjs.org/@apimatic/core/-/core-0.10.13.tgz", + "integrity": "sha512-vqzaHTY+wq4agQZXmQYlkh6VmWdFm6SMlHtiQ84dbj9AWalq/N++ddgRlwUdd7H98/sJj7sJd3+5xsNhnZlKTg==", + "license": "MIT", + "dependencies": { + "@apimatic/convert-to-stream": "^0.0.2", + "@apimatic/core-interfaces": "^0.2.6", + "@apimatic/file-wrapper": "^0.3.2", + "@apimatic/http-headers": "^0.3.2", + "@apimatic/http-query": "^0.3.2", + "@apimatic/json-bigint": "^1.2.0", + "@apimatic/schema": "^0.7.12", + "detect-browser": "^5.3.0", + "detect-node": "^2.0.4", + "form-data": "^3.0.0", + "json-ptr": "^3.1.0", + "lodash.defaultsdeep": "^4.6.1", + "lodash.flatmap": "^4.5.0", + "tiny-warning": "^1.0.3", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=14.15.0 || >=16.0.0" + } + }, + "node_modules/@apimatic/core-interfaces": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/@apimatic/core-interfaces/-/core-interfaces-0.2.6.tgz", + "integrity": "sha512-XbqyftDB4GO3rVOablFt7RnF03gLdctUgLT0flDP5JI3E4r+Cn2O66nFufWfSFhI/Vr0vJbVjjDG2xzZ2bHBjQ==", + "license": "MIT", + "dependencies": { + "@apimatic/file-wrapper": "^0.3.2", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=14.15.0 || >=16.0.0" + } + }, + "node_modules/@apimatic/core/node_modules/@apimatic/convert-to-stream": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/@apimatic/convert-to-stream/-/convert-to-stream-0.0.2.tgz", + "integrity": "sha512-1DRg17ItExfMYsXwjt6WIjJSCgV5RGg3fHPLgYD44/YmiU+7suWj7YfPKKUqmNcnJ/AvMh4lG1+tHrfOT01zXw==", + "license": "ISC", + "engines": { + "node": ">=10.4.0" + } + }, + "node_modules/@apimatic/file-wrapper": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@apimatic/file-wrapper/-/file-wrapper-0.3.2.tgz", + "integrity": "sha512-pU2n9eEw5lIb4qWbqfgNmjrWAw8oI6I9jduE97Qpoe71+GSFZ2DWY0VBo+LXTYVm+fQBKpfcXAdheF6Ec3ilOA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=14.15.0 || >=16.0.0" + } + }, + "node_modules/@apimatic/http-headers": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@apimatic/http-headers/-/http-headers-0.3.2.tgz", + "integrity": "sha512-n6f+hSKercj29wvlqGg0gjNGZbXbpcDKelHya0SekBH0072eCqo8ndXdQ2PVsTUjWR+yErF2ZqagwX7aPhJICQ==", + "license": "MIT", + "dependencies": { + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=14.15.0 || >=16.0.0" + } + }, + "node_modules/@apimatic/http-query": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@apimatic/http-query/-/http-query-0.3.2.tgz", + "integrity": "sha512-rT7HaoaLGraIeZE90FWo7ebwrYzW1FoaOu8NyUQKBiSo9rA6hmHcUPakUPCWIxh53tTqEnJVTSopMudpGVLZXQ==", + "license": "MIT", + "dependencies": { + "@apimatic/file-wrapper": "^0.3.2", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=14.15.0 || >=16.0.0" + } + }, + "node_modules/@apimatic/json-bigint": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@apimatic/json-bigint/-/json-bigint-1.2.0.tgz", + "integrity": "sha512-+bmVzYMdZu0Ya5L+my4FXFUih54OvQA/qlZsFOYdOoostyUuB27UDrVWQs/WVCmS0ADdo5vTU0eeTrrBkHoySw==", + "license": "MIT" + }, + "node_modules/@apimatic/oauth-adapters": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/@apimatic/oauth-adapters/-/oauth-adapters-0.4.6.tgz", + "integrity": "sha512-s+BmjLUCsRY8XGeyCtOf95XXow4Ko2NRf5xRWzR3wx7OmrbgSCQ2ulxv8S6n2ViN/uI4EcaFRzoCMsoVJ+UcDA==", + "license": "MIT", + "dependencies": { + "@apimatic/core-interfaces": "^0.2.6", + "@apimatic/file-wrapper": "^0.3.2", + "@apimatic/http-headers": "^0.3.2", + "@apimatic/schema": "^0.7.12", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=14.15.0 || >=16.0.0" + } + }, + "node_modules/@apimatic/schema": { + "version": "0.7.12", + "resolved": "https://registry.npmjs.org/@apimatic/schema/-/schema-0.7.12.tgz", + "integrity": "sha512-JiIabKJuEKAF5QGFPwx2kG9vfTbQW7OLKxhRXbcIv8VvaH1DX/AdAfsDq3/+qCTmu6LpeNJmLWs8fwh8YRcsaQ==", + "license": "MIT", + "dependencies": { + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=14.15.0 || >=16.0.0" + } + }, + "node_modules/@apimatic/test-utilities": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@apimatic/test-utilities/-/test-utilities-0.0.1.tgz", + "integrity": "sha512-AHu+yw8chntpk5hkT4iIn+f0u/cvP7Lb68p1FxKpCeow0p9CRGR6MoV91TlyIZ+Ff6xhD1elieeltgVsrj9ptA==", + "dev": true, + "license": "ISC", + "dependencies": { + "@apimatic/core-interfaces": "^0.2.6", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=14.15.0 || >=16.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", + "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.24.7", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.4.tgz", + "integrity": "sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", + "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.25.0", + "@babel/helper-compilation-targets": "^7.25.2", + "@babel/helper-module-transforms": "^7.25.2", + "@babel/helpers": "^7.25.0", + "@babel/parser": "^7.25.0", + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.2", + "@babel/types": "^7.25.2", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.6.tgz", + "integrity": "sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.25.6", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz", + "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.25.2", + "@babel/helper-validator-option": "^7.24.8", + "browserslist": "^4.23.1", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", + "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz", + "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-simple-access": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7", + "@babel/traverse": "^7.25.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", + "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", + "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", + "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", + "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.6.tgz", + "integrity": "sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.24.7", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.6.tgz", + "integrity": "sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.25.6" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.25.6.tgz", + "integrity": "sha512-sXaDXaJN9SNLymBdlWFA+bjzBhFD617ZaFiY13dGt7TVslVvVgA6fkZOP7Ki3IGElC45lwHdOTrCtKZGVAWeLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz", + "integrity": "sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.4.tgz", + "integrity": "sha512-uMOCoHVU52BsSWxPOMVv5qKRdeSlPuImUCB2dlPuBSU+W2/ROE7/Zg8F2Kepbk+8yBa68LlRKxO+xgEVWorsDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", + "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.25.0", + "@babel/types": "^7.25.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.6.tgz", + "integrity": "sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.25.6", + "@babel/parser": "^7.25.6", + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.6", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/types": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.6.tgz", + "integrity": "sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", + "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", + "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "29.5.12", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.12.tgz", + "integrity": "sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.5.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.5.4.tgz", + "integrity": "sha512-FDuKUJQm/ju9fT/SeX/6+gBzoPzlVCzfzmGkwKvRHQVxi4BntVbyIwf6a4Xn62mrvndLiml6z/UBXIdEVjQLXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.19.2" + } + }, + "node_modules/@types/semver": { + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/yargs": { + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", + "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/type-utils": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", + "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", + "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/acorn": { + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "dev": true, + "license": "MIT" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", + "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/axios/node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/babel-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz", + "integrity": "sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", + "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001646", + "electron-to-chromium": "^1.5.4", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001660", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001660.tgz", + "integrity": "sha512-GacvNTTuATm26qC74pt+ad1fW15mlQ/zuTzzY1ZoIzECTP8HURDfF43kNxPgf7H1jmelCBQTTbBNxdSXOA7Bqg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz", + "integrity": "sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/dedent": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", + "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "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, + "license": "MIT" + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/detect-browser": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/detect-browser/-/detect-browser-5.3.0.tgz", + "integrity": "sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w==", + "license": "MIT" + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "license": "MIT" + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.18", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.18.tgz", + "integrity": "sha512-1OfuVACu+zKlmjsNdcJuVQuVE61sZOLbNM4JAQ1Rvh6EOj0/EUKhMJjRH73InPlXSh8HIJk1cVZ8pyOV/FMdUQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true, + "license": "ISC" + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "license": "MIT" + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-local": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-core-module": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jake": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", + "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-cli": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watcher": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-ptr": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/json-ptr/-/json-ptr-3.1.1.tgz", + "integrity": "sha512-SiSJQ805W1sDUCD1+/t1/1BIrveq2Fe9HJqENxZmMCILmrPI7WhS/pePpIOx85v6/H2z1Vy7AI08GV2TzfXocg==", + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.defaultsdeep": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.1.tgz", + "integrity": "sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA==", + "license": "MIT" + }, + "node_modules/lodash.flatmap": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.flatmap/-/lodash.flatmap-4.5.0.tgz", + "integrity": "sha512-/OcpcAGWlrZyoHGeHh3cAoa6nGdX6QYtmzNP84Jqol6UEQQ2gIaU3H+0eICcjcKGl0/XF8LWOujNn9lffsnaOg==", + "license": "MIT" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true, + "license": "ISC" + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", + "dev": true, + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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, + "license": "MIT" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pure-rand": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tiny-warning": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==", + "license": "MIT" + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-jest": { + "version": "29.2.5", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.2.5.tgz", + "integrity": "sha512-KD8zB2aAZrcKIdGk4OwpJggeLcH1FgrICqDSROWqlnJXGCXK4Mn6FcdK2B6670Xr73lHMG1kHw8R87A0ecZ+vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bs-logger": "^0.2.6", + "ejs": "^3.1.10", + "fast-json-stable-stringify": "^2.1.0", + "jest-util": "^29.0.0", + "json5": "^2.2.3", + "lodash.memoize": "^4.1.2", + "make-error": "^1.3.6", + "semver": "^7.6.3", + "yargs-parser": "^21.1.1" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/transform": "^29.0.0", + "@jest/types": "^29.0.0", + "babel-jest": "^29.0.0", + "jest": "^29.0.0", + "typescript": ">=4.3 <6" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/transform": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + } + } + }, + "node_modules/tslib": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", + "license": "0BSD" + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "license": "0BSD" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "dev": true, + "license": "MIT" + }, + "node_modules/update-browserslist-db": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.1.2", + "picocolors": "^1.0.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/v8-to-istanbul": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", + "dev": true, + "license": "ISC", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/sdks/ts/openapi_sdk_typescript/package.json b/sdks/ts/openapi_sdk_typescript/package.json new file mode 100644 index 0000000..5bd7b01 --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/package.json @@ -0,0 +1,61 @@ +{ + "version": "1.0.0", + "license": "MIT", + "sideEffects": false, + "main": "dist/cjs/index.js", + "typings": "dist/types/index.d.ts", + "module": "dist/esm/index.js", + "files": [ + "dist", + "src", + "test" + ], + "engines": { + "node": ">=14.17.0" + }, + "scripts": { + "build": "rm -rf dist & tsc -p tsconfig.esm.json & tsc -p tsconfig.cjs.json", + "prepare": "rm -rf dist & tsc -p tsconfig.esm.json & tsc -p tsconfig.cjs.json", + "test": "jest --passWithNoTests", + "test:coverage": "jest --coverage --passWithNoTests", + "lint": "eslint **/*.ts --ignore-path .eslintignore", + "lint:fix": "eslint **/*.ts --ignore-path .eslintignore --fix" + }, + "peerDependencies": {}, + "prettier": { + "printWidth": 80, + "semi": true, + "singleQuote": true, + "trailingComma": "es5", + "quoteProps": "preserve" + }, + "name": "train-travel-apilib", + "description": "API for finding and booking train trips across Europe. ## Run in Postman Experiment with this API in Postman, using our Postman Collection. [\"Run](https://app.getpostman.com/run-collection/9265903-7a75a0d0-b108-4436-ba54-c6139698dc08?action=collection%2Ffork&source=rip_markdown&collection-url=entityId%3D9265903-7a75a0d0-b108-4436-ba54-c6139698dc08%26entityType%3Dcollection%26workspaceId%3Df507f69d-9564-419c-89a2-cb8e4c8c7b8f)", + "author": { + "name": "Train Support", + "email": "support@example.com", + "url": "https://example.com/support" + }, + "devDependencies": { + "@apimatic/test-utilities": "^0.0.1", + "@types/jest": "^29.4.0", + "@typescript-eslint/eslint-plugin": "^5.52.0", + "@typescript-eslint/parser": "^5.52.0", + "eslint": "^8.34.0", + "jest": "^29.4.3", + "ts-jest": "^29.0.5", + "tslib": "^2.5.0", + "typescript": "^4.9.5" + }, + "dependencies": { + "@apimatic/authentication-adapters": "^0.5.4", + "@apimatic/axios-client-adapter": "^0.3.4", + "@apimatic/core": "^0.10.13", + "@apimatic/oauth-adapters": "^0.4.6", + "@apimatic/schema": "^0.7.12" + }, + "bugs": { + "url": "https://example.com/support", + "email": "support@example.com" + } +} \ No newline at end of file diff --git a/sdks/ts/openapi_sdk_typescript/src/authProvider.ts b/sdks/ts/openapi_sdk_typescript/src/authProvider.ts new file mode 100644 index 0000000..2c8dcde --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/src/authProvider.ts @@ -0,0 +1,58 @@ +/** + * Train Travel APILib + * + * This file was automatically generated by APIMATIC v3.0 ( https://www.apimatic.io ). + */ + +import { + compositeAuthenticationProvider, + OAuthConfiguration, + requestAuthenticationProvider, +} from './authentication'; +import { AuthorizationCodeAuthManager } from './authorizationCodeAuthManager'; +import { Configuration } from './configuration'; +import { OAuthToken } from './models/oAuthToken'; + +export function createAuthProviderFromConfig( + config: Partial, + oAuth2: () => AuthorizationCodeAuthManager +) { + const authConfig = { + oAuth2: + config.authorizationCodeAuthCredentials && + requestAuthenticationProvider( + config.authorizationCodeAuthCredentials.oAuthToken, + oAuth2TokenProvider( + oAuth2, + config.authorizationCodeAuthCredentials.oAuthTokenProvider + ), + config.authorizationCodeAuthCredentials.oAuthOnTokenUpdate, + { + clockSkew: config.authorizationCodeAuthCredentials.oAuthClockSkew, + } as OAuthConfiguration + ), + }; + + return compositeAuthenticationProvider< + keyof typeof authConfig, + typeof authConfig + >(authConfig); +} + +function oAuth2TokenProvider( + oAuth2: () => AuthorizationCodeAuthManager, + defaultProvider: + | (( + lastOAuthToken: OAuthToken | undefined, + authManager: AuthorizationCodeAuthManager + ) => Promise) + | undefined +): ((token: OAuthToken | undefined) => Promise) | undefined { + return (token: OAuthToken | undefined) => { + const manager = oAuth2(); + if (defaultProvider === undefined) { + return manager.updateToken(token); + } + return defaultProvider(token, manager); + }; +} diff --git a/sdks/ts/openapi_sdk_typescript/src/authentication.ts b/sdks/ts/openapi_sdk_typescript/src/authentication.ts new file mode 100644 index 0000000..576c293 --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/src/authentication.ts @@ -0,0 +1,8 @@ +/** + * Train Travel APILib + * + * This file was automatically generated by APIMATIC v3.0 ( https://www.apimatic.io ). + */ + +export * from '@apimatic/oauth-adapters'; +export * from '@apimatic/authentication-adapters'; diff --git a/sdks/ts/openapi_sdk_typescript/src/authorizationCodeAuthManager.ts b/sdks/ts/openapi_sdk_typescript/src/authorizationCodeAuthManager.ts new file mode 100644 index 0000000..5adb385 --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/src/authorizationCodeAuthManager.ts @@ -0,0 +1,145 @@ +/** + * Train Travel APILib + * + * This file was automatically generated by APIMATIC v3.0 ( https://www.apimatic.io ). + */ + +import { isExpired, isValid } from './authentication'; +import { OAuthToken } from './models/oAuthToken'; +import { ClientInterface } from './clientInterface'; +import { OAuthAuthorizationController } from './controllers/oAuthAuthorizationController'; +import { OAuthScopeEnum } from './models/oAuthScopeEnum'; + +export class AuthorizationCodeAuthManager { + private _oAuthClientId: string; + private _oAuthClientSecret: string; + private _oAuthRedirectUri: string; + private _oAuthToken?: OAuthToken; + private _oAuthScopes?: OAuthScopeEnum[]; + private _oAuthClockSkew?: number; + private _oAuthController: OAuthAuthorizationController; + private _baseUri: string; + + constructor( + { + oAuthClientId, + oAuthClientSecret, + oAuthRedirectUri, + oAuthToken, + oAuthScopes, + oAuthClockSkew, + }: { + oAuthClientId: string; + oAuthClientSecret: string; + oAuthRedirectUri: string; + oAuthToken?: OAuthToken; + oAuthScopes?: OAuthScopeEnum[]; + oAuthClockSkew?: number; + }, + baseUri: string, + client: ClientInterface + ) { + this._oAuthClientId = oAuthClientId; + this._oAuthClientSecret = oAuthClientSecret; + this._oAuthRedirectUri = oAuthRedirectUri; + this._oAuthToken = oAuthToken; + this._oAuthScopes = oAuthScopes; + this._oAuthClockSkew = oAuthClockSkew; + this._oAuthController = new OAuthAuthorizationController(client); + this._baseUri = baseUri; + } + + public buildAuthorizationUrl( + state?: string, + additionalParams?: Record + ): string { + let query = this._baseUri + '/authorize'; + const queryParams: Record = { + response_type: 'code', + client_id: this._oAuthClientId, + redirect_uri: this._oAuthRedirectUri, + scope: this._oAuthScopes?.join(' '), + state: state, + ...additionalParams, + }; + const queryString: string[] = []; + for (const key of Object.keys(queryParams)) { + const value = queryParams[key]; + if (value !== undefined && value !== null) { + queryString.push( + `${encodeURIComponent(key)}=${encodeURIComponent(value)}` + ); + } + } + return (query += + (query.indexOf('?') === -1 ? '?' : '&') + queryString.join('&')); + } + + public async updateToken(oAuthToken?: OAuthToken): Promise { + if (!this.isValid(oAuthToken)) { + oAuthToken = await this.fetchToken(''); + } else if (this.isExpired(oAuthToken)) { + oAuthToken = await this.refreshToken(); + } + return oAuthToken; + } + + public isValid(oAuthToken: OAuthToken | undefined): oAuthToken is OAuthToken { + return isValid(oAuthToken); + } + + public isExpired(oAuthToken: OAuthToken) { + return isExpired(oAuthToken, this._oAuthClockSkew); + } + + public async fetchToken( + authorizationCode: string, + additionalParams?: Record + ): Promise { + const authorization = this.getClientBasicAuth( + this._oAuthClientId, + this._oAuthClientSecret + ); + const { result } = await this._oAuthController.requestToken( + authorization, + authorizationCode, + this._oAuthRedirectUri, + additionalParams + ); + return this.setExpiry(result); + } + + public async refreshToken( + additionalParams?: Record + ): Promise { + if (typeof this._oAuthToken?.refreshToken === 'undefined') { + throw new Error(); + } + const authorization = this.getClientBasicAuth( + this._oAuthClientId, + this._oAuthClientSecret + ); + const { result } = await this._oAuthController.refreshToken( + authorization, + this._oAuthToken?.refreshToken, + this._oAuthScopes?.join(' '), + additionalParams + ); + return this.setExpiry(result); + } + + private getClientBasicAuth(clientId: string, clientSecret: string): string { + return `Basic ${Buffer.from(clientId + ':' + clientSecret).toString( + 'base64' + )}`; + } + + private async setExpiry(token: OAuthToken) { + const newToken = token; + if (newToken.expiresIn) { + newToken.expiry = + BigInt(Math.round(Date.now() / 1000)) + newToken.expiresIn; + } + return newToken; + } +} diff --git a/sdks/ts/openapi_sdk_typescript/src/client.ts b/sdks/ts/openapi_sdk_typescript/src/client.ts new file mode 100644 index 0000000..3621108 --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/src/client.ts @@ -0,0 +1,156 @@ +/** + * Train Travel APILib + * + * This file was automatically generated by APIMATIC v3.0 ( https://www.apimatic.io ). + */ + +import { AuthorizationCodeAuthManager } from './authorizationCodeAuthManager'; +import { createAuthProviderFromConfig } from './authProvider'; +import { + AuthParams, + ClientInterface, + SdkRequestBuilder, + SdkRequestBuilderFactory, + Server, +} from './clientInterface'; +import { Configuration, Environment } from './configuration'; +import { + DEFAULT_CONFIGURATION, + DEFAULT_RETRY_CONFIG, +} from './defaultConfiguration'; +import { ApiError } from './core'; +import { + AbortError, + AuthenticatorInterface, + createRequestBuilderFactory, + HttpClientInterface, + RetryConfiguration, +} from './core'; +import { HttpClient } from './clientAdapter'; + +const USER_AGENT = 'APIMATIC 3.0'; + +export class Client implements ClientInterface { + private _config: Readonly; + private _timeout: number; + private _retryConfig: RetryConfiguration; + private _requestBuilderFactory: SdkRequestBuilderFactory; + public authorizationCodeAuthManager: AuthorizationCodeAuthManager; + + constructor(config?: Partial) { + this._config = { + ...DEFAULT_CONFIGURATION, + ...config, + }; + this._retryConfig = { + ...DEFAULT_RETRY_CONFIG, + ...this._config.httpClientOptions?.retryConfig, + }; + this._timeout = + typeof this._config.httpClientOptions?.timeout != 'undefined' + ? this._config.httpClientOptions.timeout + : this._config.timeout; + const clonedConfig = { + ...this._config, + authorizationCodeAuthCredentials: this._config + .authorizationCodeAuthCredentials || { + oAuthClientId: this._config.oAuthClientId || '', + oAuthClientSecret: this._config.oAuthClientSecret || '', + oAuthRedirectUri: this._config.oAuthRedirectUri || '', + oAuthToken: this._config.oAuthToken, + oAuthScopes: this._config.oAuthScopes, + }, + }; + + this._requestBuilderFactory = createRequestHandlerFactory( + (server) => getBaseUri(server, this._config), + createAuthProviderFromConfig( + clonedConfig, + () => this.authorizationCodeAuthManager + ), + new HttpClient(AbortError, { + timeout: this._timeout, + clientConfigOverrides: this._config.unstable_httpClientOptions, + httpAgent: this._config.httpClientOptions?.httpAgent, + httpsAgent: this._config.httpClientOptions?.httpsAgent, + }), + [withErrorHandlers, withUserAgent, withAuthenticationByDefault], + this._retryConfig + ); + this.authorizationCodeAuthManager = new AuthorizationCodeAuthManager( + clonedConfig.authorizationCodeAuthCredentials, + getBaseUri('auth server', this._config), + this + ); + } + + public getRequestBuilderFactory(): SdkRequestBuilderFactory { + return this._requestBuilderFactory; + } + + /** + * Clone this client and override given configuration options + */ + public withConfiguration(config: Partial) { + return new Client({ ...this._config, ...config }); + } +} + +function createHttpClientAdapter(client: HttpClient): HttpClientInterface { + return async (request, requestOptions) => { + return await client.executeRequest(request, requestOptions); + }; +} + +function getBaseUri(server: Server = 'default', config: Configuration): string { + if (config.environment === Environment.Production) { + if (server === 'default') { + return 'https://wm-train-travel.wiremockapi.cloud'; + } + if (server === 'auth server') { + return 'https://example.com/oauth'; + } + } + throw new Error('Could not get Base URL. Invalid environment or server.'); +} + +function createRequestHandlerFactory( + baseUrlProvider: (server?: Server) => string, + authProvider: AuthenticatorInterface, + httpClient: HttpClient, + addons: ((rb: SdkRequestBuilder) => void)[], + retryConfig: RetryConfiguration +): SdkRequestBuilderFactory { + const requestBuilderFactory = createRequestBuilderFactory( + createHttpClientAdapter(httpClient), + baseUrlProvider, + ApiError, + authProvider, + retryConfig + ); + + return tap(requestBuilderFactory, ...addons); +} + +function tap( + requestBuilderFactory: SdkRequestBuilderFactory, + ...callback: ((requestBuilder: SdkRequestBuilder) => void)[] +): SdkRequestBuilderFactory { + return (...args) => { + const requestBuilder = requestBuilderFactory(...args); + callback.forEach((c) => c(requestBuilder)); + return requestBuilder; + }; +} + +function withErrorHandlers(rb: SdkRequestBuilder) { + rb.defaultToError(ApiError); +} + +function withUserAgent(rb: SdkRequestBuilder) { + rb.header('user-agent', USER_AGENT); +} + +function withAuthenticationByDefault(rb: SdkRequestBuilder) { + rb.authenticate([{ oAuth2: true }]); +} diff --git a/sdks/ts/openapi_sdk_typescript/src/clientAdapter.ts b/sdks/ts/openapi_sdk_typescript/src/clientAdapter.ts new file mode 100644 index 0000000..f6b2790 --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/src/clientAdapter.ts @@ -0,0 +1,7 @@ +/** + * Train Travel APILib + * + * This file was automatically generated by APIMATIC v3.0 ( https://www.apimatic.io ). + */ + +export * from '@apimatic/axios-client-adapter'; diff --git a/sdks/ts/openapi_sdk_typescript/src/clientInterface.ts b/sdks/ts/openapi_sdk_typescript/src/clientInterface.ts new file mode 100644 index 0000000..426e816 --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/src/clientInterface.ts @@ -0,0 +1,27 @@ +/** + * Train Travel APILib + * + * This file was automatically generated by APIMATIC v3.0 ( https://www.apimatic.io ). + */ + +import { createAuthProviderFromConfig } from './authProvider'; +import { AuthenticatorInterface, RequestBuilderFactory } from './core'; + +export interface ClientInterface { + getRequestBuilderFactory(): SdkRequestBuilderFactory; +} + +export type SdkRequestBuilderFactory = RequestBuilderFactory< + Server, + AuthParams +>; + +export type SdkRequestBuilder = ReturnType; + +export type Server = 'default' | 'auth server'; + +export type AuthParams = ReturnType< + typeof createAuthProviderFromConfig +> extends AuthenticatorInterface + ? X + : never; diff --git a/sdks/ts/openapi_sdk_typescript/src/configuration.ts b/sdks/ts/openapi_sdk_typescript/src/configuration.ts new file mode 100644 index 0000000..02e1294 --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/src/configuration.ts @@ -0,0 +1,46 @@ +/** + * Train Travel APILib + * + * This file was automatically generated by APIMATIC v3.0 ( https://www.apimatic.io ). + */ + +import { AuthorizationCodeAuthManager } from './authorizationCodeAuthManager'; +import { HttpClientOptions } from './clientAdapter'; +import { OAuthScopeEnum } from './models/oAuthScopeEnum'; +import { OAuthToken } from './models/oAuthToken'; + +/** An interface for all configuration parameters required by the SDK. */ +export interface Configuration { + timeout: number; + environment: Environment; + /** @deprecated use authorizationCodeAuthCredentials field instead */ + oAuthClientId?: string; + /** @deprecated use authorizationCodeAuthCredentials field instead */ + oAuthClientSecret?: string; + /** @deprecated use authorizationCodeAuthCredentials field instead */ + oAuthRedirectUri?: string; + /** @deprecated use authorizationCodeAuthCredentials field instead */ + oAuthToken?: OAuthToken; + /** @deprecated use authorizationCodeAuthCredentials field instead */ + oAuthScopes?: OAuthScopeEnum[]; + authorizationCodeAuthCredentials?: { + oAuthClientId: string; + oAuthClientSecret: string; + oAuthRedirectUri: string; + oAuthToken?: OAuthToken; + oAuthScopes?: OAuthScopeEnum[]; + oAuthTokenProvider?: ( + lastOAuthToken: OAuthToken | undefined, + authManager: AuthorizationCodeAuthManager + ) => Promise; + oAuthOnTokenUpdate?: (token: OAuthToken) => void; + oAuthClockSkew?: number; + }; + httpClientOptions?: Partial; + unstable_httpClientOptions?: any; +} + +/** Environments available for API */ +export enum Environment { + Production = 'production', +} diff --git a/sdks/ts/openapi_sdk_typescript/src/controllers/baseController.ts b/sdks/ts/openapi_sdk_typescript/src/controllers/baseController.ts new file mode 100644 index 0000000..e6b7d20 --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/src/controllers/baseController.ts @@ -0,0 +1,17 @@ +/** + * Train Travel APILib + * + * This file was automatically generated by APIMATIC v3.0 ( https://www.apimatic.io ). + */ + +import { ClientInterface, SdkRequestBuilderFactory } from '../clientInterface'; + +/** Base class for all controllers */ +export class BaseController { + /** Create a request builder */ + protected createRequest: SdkRequestBuilderFactory; + + constructor(client: ClientInterface) { + this.createRequest = client.getRequestBuilderFactory(); + } +} diff --git a/sdks/ts/openapi_sdk_typescript/src/controllers/bookingsController.ts b/sdks/ts/openapi_sdk_typescript/src/controllers/bookingsController.ts new file mode 100644 index 0000000..178f461 --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/src/controllers/bookingsController.ts @@ -0,0 +1,109 @@ +/** + * Train Travel APILib + * + * This file was automatically generated by APIMATIC v3.0 ( https://www.apimatic.io ). + */ + +import { ApiResponse, RequestOptions } from '../core'; +import { Booking, bookingSchema } from '../models/booking'; +import { + BookingsResponse, + bookingsResponseSchema, +} from '../models/bookingsResponse'; +import { + BookingsResponse1, + bookingsResponse1Schema, +} from '../models/bookingsResponse1'; +import { string } from '../schema'; +import { BaseController } from './baseController'; +import { ProblemError } from '../errors/problemError'; + +export class BookingsController extends BaseController { + /** + * Returns a list of all trip bookings by the authenticated user. + * + * @return Response from the API call + */ + async getBookings( + requestOptions?: RequestOptions + ): Promise> { + const req = this.createRequest('GET', '/bookings'); + req.throwOn(400, ProblemError, 'Bad Request'); + req.throwOn(401, ProblemError, 'Unauthorized'); + req.throwOn(403, ProblemError, 'Forbidden'); + req.throwOn(429, ProblemError, 'Too Many Requests'); + req.throwOn(500, ProblemError, 'Internal Server Error'); + req.authenticate([{ oAuth2: true }]); + return req.callAsJson(bookingsResponseSchema, requestOptions); + } + + /** + * A booking is a temporary hold on a trip. It is not confirmed until the payment is processed. + * + * @param body + * @return Response from the API call + */ + async createBooking( + body: Booking, + requestOptions?: RequestOptions + ): Promise> { + const req = this.createRequest('POST', '/bookings'); + const mapped = req.prepareArgs({ body: [body, bookingSchema] }); + req.header('Content-Type', 'application/json'); + req.json(mapped.body); + req.throwOn(400, ProblemError, 'Bad Request'); + req.throwOn(401, ProblemError, 'Unauthorized'); + req.throwOn(404, ProblemError, 'Not Found'); + req.throwOn(409, ProblemError, 'Conflict'); + req.throwOn(429, ProblemError, 'Too Many Requests'); + req.throwOn(500, ProblemError, 'Internal Server Error'); + req.authenticate([{ oAuth2: true }]); + return req.callAsJson(bookingsResponse1Schema, requestOptions); + } + + /** + * Returns the details of a specific booking. + * + * @param bookingId The ID of the booking to retrieve. + * @return Response from the API call + */ + async getBooking( + bookingId: string, + requestOptions?: RequestOptions + ): Promise> { + const req = this.createRequest('GET'); + const mapped = req.prepareArgs({ bookingId: [bookingId, string()] }); + req.appendTemplatePath`/bookings/${mapped.bookingId}`; + req.throwOn(400, ProblemError, 'Bad Request'); + req.throwOn(401, ProblemError, 'Unauthorized'); + req.throwOn(403, ProblemError, 'Forbidden'); + req.throwOn(404, ProblemError, 'Not Found'); + req.throwOn(429, ProblemError, 'Too Many Requests'); + req.throwOn(500, ProblemError, 'Internal Server Error'); + req.authenticate([{ oAuth2: true }]); + return req.callAsJson(bookingsResponse1Schema, requestOptions); + } + + /** + * Deletes a booking, cancelling the hold on the trip. + * + * @param bookingId The ID of the booking to retrieve. + * @return Response from the API call + */ + async deleteBooking( + bookingId: string, + requestOptions?: RequestOptions + ): Promise> { + const req = this.createRequest('DELETE'); + const mapped = req.prepareArgs({ bookingId: [bookingId, string()] }); + req.appendTemplatePath`/bookings/${mapped.bookingId}`; + req.throwOn(400, ProblemError, 'Bad Request'); + req.throwOn(401, ProblemError, 'Unauthorized'); + req.throwOn(403, ProblemError, 'Forbidden'); + req.throwOn(404, ProblemError, 'Not Found'); + req.throwOn(429, ProblemError, 'Too Many Requests'); + req.throwOn(500, ProblemError, 'Internal Server Error'); + req.authenticate([{ oAuth2: true }]); + return req.call(requestOptions); + } +} diff --git a/sdks/ts/openapi_sdk_typescript/src/controllers/oAuthAuthorizationController.ts b/sdks/ts/openapi_sdk_typescript/src/controllers/oAuthAuthorizationController.ts new file mode 100644 index 0000000..b901ed3 --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/src/controllers/oAuthAuthorizationController.ts @@ -0,0 +1,91 @@ +/** + * Train Travel APILib + * + * This file was automatically generated by APIMATIC v3.0 ( https://www.apimatic.io ). + */ + +import { ApiResponse, RequestOptions } from '../core'; +import { OAuthToken, oAuthTokenSchema } from '../models/oAuthToken'; +import { optional, string } from '../schema'; +import { BaseController } from './baseController'; +import { OAuthProviderError } from '../errors/oAuthProviderError'; + +export class OAuthAuthorizationController extends BaseController { + /** + * Create a new OAuth 2 token. + * + * @param authorization Authorization header in Basic auth format + * @param code Authorization Code + * @param redirectUri Redirect Uri + * @return Response from the API call + */ + async requestToken( + authorization: string, + code: string, + redirectUri: string, + fieldParameters?: Record, + requestOptions?: RequestOptions + ): Promise> { + const req = this.createRequest('POST', '/token'); + req.baseUrl('auth server'); + const mapped = req.prepareArgs({ + authorization: [authorization, string()], + code: [code, string()], + redirectUri: [redirectUri, string()], + }); + req.header('Authorization', mapped.authorization); + req.form({ + grant_type: 'authorization_code', + code: mapped.code, + redirect_uri: mapped.redirectUri, + ...fieldParameters, + }); + req.throwOn(400, OAuthProviderError, 'OAuth 2 provider returned an error.'); + req.throwOn( + 401, + OAuthProviderError, + 'OAuth 2 provider says client authentication failed.' + ); + req.authenticate(false); + return req.callAsJson(oAuthTokenSchema, requestOptions); + } + + /** + * Obtain a new access token using a refresh token + * + * @param authorization Authorization header in Basic auth format + * @param refreshToken Refresh token + * @param scope Requested scopes as a space-delimited list. + * @return Response from the API call + */ + async refreshToken( + authorization: string, + refreshToken: string, + scope?: string, + fieldParameters?: Record, + requestOptions?: RequestOptions + ): Promise> { + const req = this.createRequest('POST', '/token'); + req.baseUrl('auth server'); + const mapped = req.prepareArgs({ + authorization: [authorization, string()], + refreshToken: [refreshToken, string()], + scope: [scope, optional(string())], + }); + req.header('Authorization', mapped.authorization); + req.form({ + grant_type: 'refresh_token', + refresh_token: mapped.refreshToken, + scope: mapped.scope, + ...fieldParameters, + }); + req.throwOn(400, OAuthProviderError, 'OAuth 2 provider returned an error.'); + req.throwOn( + 401, + OAuthProviderError, + 'OAuth 2 provider says client authentication failed.' + ); + req.authenticate(false); + return req.callAsJson(oAuthTokenSchema, requestOptions); + } +} diff --git a/sdks/ts/openapi_sdk_typescript/src/controllers/paymentsController.ts b/sdks/ts/openapi_sdk_typescript/src/controllers/paymentsController.ts new file mode 100644 index 0000000..0ed6a6f --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/src/controllers/paymentsController.ts @@ -0,0 +1,47 @@ +/** + * Train Travel APILib + * + * This file was automatically generated by APIMATIC v3.0 ( https://www.apimatic.io ). + */ + +import { ApiResponse, RequestOptions } from '../core'; +import { BookingPayment, bookingPaymentSchema } from '../models/bookingPayment'; +import { + BookingsPaymentResponse, + bookingsPaymentResponseSchema, +} from '../models/bookingsPaymentResponse'; +import { string } from '../schema'; +import { BaseController } from './baseController'; +import { ProblemError } from '../errors/problemError'; + +export class PaymentsController extends BaseController { + /** + * A payment is an attempt to pay for the booking, which will confirm the booking for the user and + * enable them to get their tickets. + * + * @param bookingId The ID of the booking to pay for. + * @param body + * @return Response from the API call + */ + async createBookingPayment( + bookingId: string, + body: BookingPayment, + requestOptions?: RequestOptions + ): Promise> { + const req = this.createRequest('POST'); + const mapped = req.prepareArgs({ + bookingId: [bookingId, string()], + body: [body, bookingPaymentSchema], + }); + req.header('Content-Type', 'application/json'); + req.json(mapped.body); + req.appendTemplatePath`/bookings/${mapped.bookingId}/payment`; + req.throwOn(400, ProblemError, 'Bad Request'); + req.throwOn(401, ProblemError, 'Unauthorized'); + req.throwOn(403, ProblemError, 'Forbidden'); + req.throwOn(429, ProblemError, 'Too Many Requests'); + req.throwOn(500, ProblemError, 'Internal Server Error'); + req.authenticate([{ oAuth2: true }]); + return req.callAsJson(bookingsPaymentResponseSchema, requestOptions); + } +} diff --git a/sdks/ts/openapi_sdk_typescript/src/controllers/stationsController.ts b/sdks/ts/openapi_sdk_typescript/src/controllers/stationsController.ts new file mode 100644 index 0000000..b3195c0 --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/src/controllers/stationsController.ts @@ -0,0 +1,49 @@ +/** + * Train Travel APILib + * + * This file was automatically generated by APIMATIC v3.0 ( https://www.apimatic.io ). + */ + +import { ApiResponse, RequestOptions } from '../core'; +import { + StationsResponse, + stationsResponseSchema, +} from '../models/stationsResponse'; +import { number, optional, string } from '../schema'; +import { BaseController } from './baseController'; +import { ProblemError } from '../errors/problemError'; + +export class StationsController extends BaseController { + /** + * Returns a paginated and searchable list of all train stations. + * + * @param page The page number to return + * @param coordinates The latitude and longitude of the user's location, to narrow down the search results + * to sites within a proximity of this location. + * @param search A search term to filter the list of stations by name or address. + * @return Response from the API call + */ + async getStations( + page?: number, + coordinates?: string, + search?: string, + requestOptions?: RequestOptions + ): Promise> { + const req = this.createRequest('GET', '/stations'); + const mapped = req.prepareArgs({ + page: [page, optional(number())], + coordinates: [coordinates, optional(string())], + search: [search, optional(string())], + }); + req.query('page', mapped.page); + req.query('coordinates', mapped.coordinates); + req.query('search', mapped.search); + req.throwOn(400, ProblemError, 'Bad Request'); + req.throwOn(401, ProblemError, 'Unauthorized'); + req.throwOn(403, ProblemError, 'Forbidden'); + req.throwOn(429, ProblemError, 'Too Many Requests'); + req.throwOn(500, ProblemError, 'Internal Server Error'); + req.authenticate([{ oAuth2: true }]); + return req.callAsJson(stationsResponseSchema, requestOptions); + } +} diff --git a/sdks/ts/openapi_sdk_typescript/src/controllers/tripsController.ts b/sdks/ts/openapi_sdk_typescript/src/controllers/tripsController.ts new file mode 100644 index 0000000..40c429e --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/src/controllers/tripsController.ts @@ -0,0 +1,55 @@ +/** + * Train Travel APILib + * + * This file was automatically generated by APIMATIC v3.0 ( https://www.apimatic.io ). + */ + +import { ApiResponse, RequestOptions } from '../core'; +import { TripsResponse, tripsResponseSchema } from '../models/tripsResponse'; +import { boolean, optional, string } from '../schema'; +import { BaseController } from './baseController'; +import { ProblemError } from '../errors/problemError'; + +export class TripsController extends BaseController { + /** + * Returns a list of available train trips between the specified origin and destination stations on the + * given date, and allows for filtering by bicycle and dog allowances. + * + * + * @param origin The ID of the origin station + * @param destination The ID of the destination station + * @param date The date and time of the trip in ISO 8601 format in origin station's timezone. + * @param bicycles Only return trips where bicycles are known to be allowed + * @param dogs Only return trips where dogs are known to be allowed + * @return Response from the API call + */ + async getTrips( + origin: string, + destination: string, + date: string, + bicycles?: boolean, + dogs?: boolean, + requestOptions?: RequestOptions + ): Promise> { + const req = this.createRequest('GET', '/trips'); + const mapped = req.prepareArgs({ + origin: [origin, string()], + destination: [destination, string()], + date: [date, string()], + bicycles: [bicycles, optional(boolean())], + dogs: [dogs, optional(boolean())], + }); + req.query('origin', mapped.origin); + req.query('destination', mapped.destination); + req.query('date', mapped.date); + req.query('bicycles', mapped.bicycles); + req.query('dogs', mapped.dogs); + req.throwOn(400, ProblemError, 'Bad Request'); + req.throwOn(401, ProblemError, 'Unauthorized'); + req.throwOn(403, ProblemError, 'Forbidden'); + req.throwOn(429, ProblemError, 'Too Many Requests'); + req.throwOn(500, ProblemError, 'Internal Server Error'); + req.authenticate([{ oAuth2: true }]); + return req.callAsJson(tripsResponseSchema, requestOptions); + } +} diff --git a/sdks/ts/openapi_sdk_typescript/src/core.ts b/sdks/ts/openapi_sdk_typescript/src/core.ts new file mode 100644 index 0000000..51303ef --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/src/core.ts @@ -0,0 +1,7 @@ +/** + * Train Travel APILib + * + * This file was automatically generated by APIMATIC v3.0 ( https://www.apimatic.io ). + */ + +export * from '@apimatic/core'; diff --git a/sdks/ts/openapi_sdk_typescript/src/defaultConfiguration.ts b/sdks/ts/openapi_sdk_typescript/src/defaultConfiguration.ts new file mode 100644 index 0000000..34457f8 --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/src/defaultConfiguration.ts @@ -0,0 +1,25 @@ +/** + * Train Travel APILib + * + * This file was automatically generated by APIMATIC v3.0 ( https://www.apimatic.io ). + */ + +import { Configuration, Environment } from './configuration'; +import { RetryConfiguration } from './core'; + +/** Default values for the configuration parameters of the client. */ +export const DEFAULT_CONFIGURATION: Configuration = { + timeout: 0, + environment: Environment.Production, +}; + +/** Default values for retry configuration parameters. */ +export const DEFAULT_RETRY_CONFIG: RetryConfiguration = { + maxNumberOfRetries: 0, + retryOnTimeout: true, + retryInterval: 1, + maximumRetryWaitTime: 0, + backoffFactor: 2, + httpStatusCodesToRetry: [408, 413, 429, 500, 502, 503, 504, 521, 522, 524], + httpMethodsToRetry: ['GET', 'PUT'], +}; diff --git a/sdks/ts/openapi_sdk_typescript/src/errors/oAuthProviderError.ts b/sdks/ts/openapi_sdk_typescript/src/errors/oAuthProviderError.ts new file mode 100644 index 0000000..042e622 --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/src/errors/oAuthProviderError.ts @@ -0,0 +1,25 @@ +/** + * Train Travel APILib + * + * This file was automatically generated by APIMATIC v3.0 ( https://www.apimatic.io ). + */ + +import { ApiError } from '../core'; +import { OAuthProviderErrorEnum } from '../models/oAuthProviderErrorEnum'; + +/** + * Creates an instance of OAuthProvider + */ +interface OAuthProvider { + /** Gets or sets error code. */ + error: OAuthProviderErrorEnum; + /** + * Gets or sets human-readable text providing additional information on error. + * Used to assist the client developer in understanding the error that occurred. + */ + error_description?: string; + /** Gets or sets a URI identifying a human-readable web page with information about the error, used to provide the client developer with additional information about the error. */ + error_uri?: string; +} + +export class OAuthProviderError extends ApiError {} diff --git a/sdks/ts/openapi_sdk_typescript/src/errors/problemError.ts b/sdks/ts/openapi_sdk_typescript/src/errors/problemError.ts new file mode 100644 index 0000000..98f423d --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/src/errors/problemError.ts @@ -0,0 +1,25 @@ +/** + * Train Travel APILib + * + * This file was automatically generated by APIMATIC v3.0 ( https://www.apimatic.io ). + */ + +import { ApiError } from '../core'; + +/** + * Creates an instance of Problem + */ +interface Problem { + /** A URI reference that identifies the problem type */ + type?: string; + /** A short, human-readable summary of the problem type */ + title?: string; + /** A human-readable explanation specific to this occurrence of the problem */ + detail?: string; + /** A URI reference that identifies the specific occurrence of the problem */ + instance?: string; + /** The HTTP status code */ + status?: number; +} + +export class ProblemError extends ApiError {} diff --git a/sdks/ts/openapi_sdk_typescript/src/index.ts b/sdks/ts/openapi_sdk_typescript/src/index.ts new file mode 100644 index 0000000..904bcc1 --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/src/index.ts @@ -0,0 +1,54 @@ +/** + * Train Travel APILib + * + * This file was automatically generated by APIMATIC v3.0 ( https://www.apimatic.io ). + */ + +export * from './client'; +export * from './configuration'; +export type { ApiResponse } from './core'; +export { + AbortError, + ArgumentsValidationError, + cloneFileWrapper, + FileWrapper, + isFileWrapper, + ResponseValidationError, +} from './core'; +export * from './defaultConfiguration'; +export * from './authorizationCodeAuthManager'; +export * from './controllers/bookingsController'; +export * from './controllers/oAuthAuthorizationController'; +export * from './controllers/paymentsController'; +export * from './controllers/stationsController'; +export * from './controllers/tripsController'; +export { ApiError } from './core'; +export * from './errors/oAuthProviderError'; +export * from './errors/problemError'; +export { AccountTypeEnum } from './models/accountTypeEnum'; +export type { BankAccount } from './models/bankAccount'; +export type { Booking } from './models/booking'; +export type { BookingPayment } from './models/bookingPayment'; +export type { BookingsPaymentResponse } from './models/bookingsPaymentResponse'; +export type { BookingsResponse } from './models/bookingsResponse'; +export type { BookingsResponse1 } from './models/bookingsResponse1'; +export type { Card } from './models/card'; +export { CurrencyEnum } from './models/currencyEnum'; +export type { Links } from './models/links'; +export type { LinksBooking } from './models/linksBooking'; +export type { LinksPagination } from './models/linksPagination'; +export type { LinksSelf } from './models/linksSelf'; +export { OAuthProviderErrorEnum } from './models/oAuthProviderErrorEnum'; +export { OAuthScopeEnum } from './models/oAuthScopeEnum'; +export type { OAuthToken } from './models/oAuthToken'; +export { Object1Enum } from './models/object1Enum'; +export { ObjectEnum } from './models/objectEnum'; +export type { Source } from './models/source'; +export type { Station } from './models/station'; +export type { StationsResponse } from './models/stationsResponse'; +export { StatusEnum } from './models/statusEnum'; +export type { Trip } from './models/trip'; +export type { TripsResponse } from './models/tripsResponse'; +export type { WrapperCollection } from './models/wrapperCollection'; +export * from './models/containers/bookingPaymentSource'; +export * from './models/containers/bookingsPaymentResponseSource'; diff --git a/sdks/ts/openapi_sdk_typescript/src/models/accountTypeEnum.ts b/sdks/ts/openapi_sdk_typescript/src/models/accountTypeEnum.ts new file mode 100644 index 0000000..2eabb29 --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/src/models/accountTypeEnum.ts @@ -0,0 +1,22 @@ +/** + * Train Travel APILib + * + * This file was automatically generated by APIMATIC v3.0 ( https://www.apimatic.io ). + */ + +import { Schema, stringEnum } from '../schema'; + +/** + * Enum for AccountTypeEnum + */ +export enum AccountTypeEnum { + Individual = 'individual', + Company = 'company', +} + +/** + * Schema for AccountTypeEnum + */ +export const accountTypeEnumSchema: Schema = stringEnum( + AccountTypeEnum +); diff --git a/sdks/ts/openapi_sdk_typescript/src/models/bankAccount.ts b/sdks/ts/openapi_sdk_typescript/src/models/bankAccount.ts new file mode 100644 index 0000000..00c0f0a --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/src/models/bankAccount.ts @@ -0,0 +1,35 @@ +/** + * Train Travel APILib + * + * This file was automatically generated by APIMATIC v3.0 ( https://www.apimatic.io ). + */ + +import { object, optional, Schema, string } from '../schema'; +import { AccountTypeEnum, accountTypeEnumSchema } from './accountTypeEnum'; +import { Object1Enum, object1EnumSchema } from './object1Enum'; + +/** A bank account to take payment from. Must be able to make payments in the currency specified in the payment. */ +export interface BankAccount { + object?: Object1Enum; + name: string; + /** The account number for the bank account, in string form. Must be a current account. */ + number: string; + /** The sort code for the bank account, in string form. Must be a six-digit number. */ + sortCode?: string; + /** The type of entity that holds the account. This can be either `individual` or `company`. */ + accountType: AccountTypeEnum; + /** The name of the bank associated with the routing number. */ + bankName: string; + /** Two-letter country code (ISO 3166-1 alpha-2). */ + country: string; +} + +export const bankAccountSchema: Schema = object({ + object: ['object', optional(object1EnumSchema)], + name: ['name', string()], + number: ['number', string()], + sortCode: ['sort_code', optional(string())], + accountType: ['account_type', accountTypeEnumSchema], + bankName: ['bank_name', string()], + country: ['country', string()], +}); diff --git a/sdks/ts/openapi_sdk_typescript/src/models/booking.ts b/sdks/ts/openapi_sdk_typescript/src/models/booking.ts new file mode 100644 index 0000000..4ebc827 --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/src/models/booking.ts @@ -0,0 +1,28 @@ +/** + * Train Travel APILib + * + * This file was automatically generated by APIMATIC v3.0 ( https://www.apimatic.io ). + */ + +import { boolean, object, optional, Schema, string } from '../schema'; + +export interface Booking { + /** Unique identifier for the booking */ + id?: string; + /** Identifier of the booked trip */ + tripId?: string; + /** Name of the passenger */ + passengerName?: string; + /** Indicates whether the passenger has a bicycle. */ + hasBicycle?: boolean; + /** Indicates whether the passenger has a dog. */ + hasDog?: boolean; +} + +export const bookingSchema: Schema = object({ + id: ['id', optional(string())], + tripId: ['trip_id', optional(string())], + passengerName: ['passenger_name', optional(string())], + hasBicycle: ['has_bicycle', optional(boolean())], + hasDog: ['has_dog', optional(boolean())], +}); diff --git a/sdks/ts/openapi_sdk_typescript/src/models/bookingPayment.ts b/sdks/ts/openapi_sdk_typescript/src/models/bookingPayment.ts new file mode 100644 index 0000000..8659ddc --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/src/models/bookingPayment.ts @@ -0,0 +1,34 @@ +/** + * Train Travel APILib + * + * This file was automatically generated by APIMATIC v3.0 ( https://www.apimatic.io ). + */ + +import { number, object, optional, Schema, string } from '../schema'; +import { + BookingPaymentSource, + bookingPaymentSourceSchema, +} from './containers/bookingPaymentSource'; +import { CurrencyEnum, currencyEnumSchema } from './currencyEnum'; +import { StatusEnum, statusEnumSchema } from './statusEnum'; + +export interface BookingPayment { + /** Unique identifier for the payment. This will be a unique identifier for the payment, and is used to reference the payment in other objects. */ + id?: string; + /** Amount intended to be collected by this payment. A positive decimal figure describing the amount to be collected. */ + amount?: number; + /** Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. */ + currency?: CurrencyEnum; + /** The payment source to take the payment from. This can be a card or a bank account. Some of these properties will be hidden on read to protect PII leaking. */ + source?: BookingPaymentSource; + /** The status of the payment, one of `pending`, `succeeded`, or `failed`. */ + status?: StatusEnum; +} + +export const bookingPaymentSchema: Schema = object({ + id: ['id', optional(string())], + amount: ['amount', optional(number())], + currency: ['currency', optional(currencyEnumSchema)], + source: ['source', optional(bookingPaymentSourceSchema)], + status: ['status', optional(statusEnumSchema)], +}); diff --git a/sdks/ts/openapi_sdk_typescript/src/models/bookingsPaymentResponse.ts b/sdks/ts/openapi_sdk_typescript/src/models/bookingsPaymentResponse.ts new file mode 100644 index 0000000..73804eb --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/src/models/bookingsPaymentResponse.ts @@ -0,0 +1,39 @@ +/** + * Train Travel APILib + * + * This file was automatically generated by APIMATIC v3.0 ( https://www.apimatic.io ). + */ + +import { lazy, number, object, optional, Schema, string } from '../schema'; +import { + BookingsPaymentResponseSource, + bookingsPaymentResponseSourceSchema, +} from './containers/bookingsPaymentResponseSource'; +import { CurrencyEnum, currencyEnumSchema } from './currencyEnum'; +import { LinksBooking, linksBookingSchema } from './linksBooking'; +import { StatusEnum, statusEnumSchema } from './statusEnum'; + +export interface BookingsPaymentResponse { + /** Unique identifier for the payment. This will be a unique identifier for the payment, and is used to reference the payment in other objects. */ + id?: string; + /** Amount intended to be collected by this payment. A positive decimal figure describing the amount to be collected. */ + amount?: number; + /** Three-letter [ISO currency code](https://www.iso.org/iso-4217-currency-codes.html), in lowercase. */ + currency?: CurrencyEnum; + /** The payment source to take the payment from. This can be a card or a bank account. Some of these properties will be hidden on read to protect PII leaking. */ + source?: BookingsPaymentResponseSource; + /** The status of the payment, one of `pending`, `succeeded`, or `failed`. */ + status?: StatusEnum; + links?: LinksBooking; +} + +export const bookingsPaymentResponseSchema: Schema = object( + { + id: ['id', optional(string())], + amount: ['amount', optional(number())], + currency: ['currency', optional(currencyEnumSchema)], + source: ['source', optional(bookingsPaymentResponseSourceSchema)], + status: ['status', optional(statusEnumSchema)], + links: ['links', optional(lazy(() => linksBookingSchema))], + } +); diff --git a/sdks/ts/openapi_sdk_typescript/src/models/bookingsResponse.ts b/sdks/ts/openapi_sdk_typescript/src/models/bookingsResponse.ts new file mode 100644 index 0000000..67680fe --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/src/models/bookingsResponse.ts @@ -0,0 +1,21 @@ +/** + * Train Travel APILib + * + * This file was automatically generated by APIMATIC v3.0 ( https://www.apimatic.io ). + */ + +import { array, lazy, object, optional, Schema } from '../schema'; +import { Booking, bookingSchema } from './booking'; +import { Links, linksSchema } from './links'; + +export interface BookingsResponse { + /** The wrapper for a collection is an array of objects. */ + data?: Booking[]; + /** A set of hypermedia links which serve as controls for the client. */ + links?: Links; +} + +export const bookingsResponseSchema: Schema = object({ + data: ['data', optional(array(lazy(() => bookingSchema)))], + links: ['links', optional(lazy(() => linksSchema))], +}); diff --git a/sdks/ts/openapi_sdk_typescript/src/models/bookingsResponse1.ts b/sdks/ts/openapi_sdk_typescript/src/models/bookingsResponse1.ts new file mode 100644 index 0000000..ee8215c --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/src/models/bookingsResponse1.ts @@ -0,0 +1,31 @@ +/** + * Train Travel APILib + * + * This file was automatically generated by APIMATIC v3.0 ( https://www.apimatic.io ). + */ + +import { boolean, lazy, object, optional, Schema, string } from '../schema'; +import { LinksSelf, linksSelfSchema } from './linksSelf'; + +export interface BookingsResponse1 { + /** Unique identifier for the booking */ + id?: string; + /** Identifier of the booked trip */ + tripId?: string; + /** Name of the passenger */ + passengerName?: string; + /** Indicates whether the passenger has a bicycle. */ + hasBicycle?: boolean; + /** Indicates whether the passenger has a dog. */ + hasDog?: boolean; + links?: LinksSelf; +} + +export const bookingsResponse1Schema: Schema = object({ + id: ['id', optional(string())], + tripId: ['trip_id', optional(string())], + passengerName: ['passenger_name', optional(string())], + hasBicycle: ['has_bicycle', optional(boolean())], + hasDog: ['has_dog', optional(boolean())], + links: ['links', optional(lazy(() => linksSelfSchema))], +}); diff --git a/sdks/ts/openapi_sdk_typescript/src/models/card.ts b/sdks/ts/openapi_sdk_typescript/src/models/card.ts new file mode 100644 index 0000000..d6092ed --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/src/models/card.ts @@ -0,0 +1,42 @@ +/** + * Train Travel APILib + * + * This file was automatically generated by APIMATIC v3.0 ( https://www.apimatic.io ). + */ + +import { bigint, number, object, optional, Schema, string } from '../schema'; +import { ObjectEnum, objectEnumSchema } from './objectEnum'; + +/** A card (debit or credit) to take payment from. */ +export interface Card { + object?: ObjectEnum; + /** Cardholder's full name as it appears on the card. */ + name: string; + /** The card number, as a string without any separators. On read all but the last four digits will be masked for security. */ + number: string; + /** Card security code, 3 or 4 digits usually found on the back of the card. */ + cvc: number; + /** Two-digit number representing the card's expiration month. */ + expMonth: bigint; + /** Four-digit number representing the card's expiration year. */ + expYear: bigint; + addressLine1?: string; + addressLine2?: string; + addressCity?: string; + addressCountry: string; + addressPostCode?: string; +} + +export const cardSchema: Schema = object({ + object: ['object', optional(objectEnumSchema)], + name: ['name', string()], + number: ['number', string()], + cvc: ['cvc', number()], + expMonth: ['exp_month', bigint()], + expYear: ['exp_year', bigint()], + addressLine1: ['address_line1', optional(string())], + addressLine2: ['address_line2', optional(string())], + addressCity: ['address_city', optional(string())], + addressCountry: ['address_country', string()], + addressPostCode: ['address_post_code', optional(string())], +}); diff --git a/sdks/ts/openapi_sdk_typescript/src/models/containers/bookingPaymentSource.ts b/sdks/ts/openapi_sdk_typescript/src/models/containers/bookingPaymentSource.ts new file mode 100644 index 0000000..dacda99 --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/src/models/containers/bookingPaymentSource.ts @@ -0,0 +1,39 @@ +/** + * Train Travel APILib + * + * This file was automatically generated by APIMATIC v3.0 ( https://www.apimatic.io ). + */ + +import { anyOf, Schema, validateAndMap } from '../../schema'; +import { BankAccount, bankAccountSchema } from '../bankAccount'; +import { Card, cardSchema } from '../card'; + +/** This is a container type for any-of types. */ +export type BookingPaymentSource = Card | BankAccount; + +export const bookingPaymentSourceSchema: Schema = anyOf([ + cardSchema, + bankAccountSchema, +]); + +export namespace BookingPaymentSource { + /** + * Validation method to narrow down union type to Card type case. + * + * This is Card case. + */ + export function isCard(value: unknown): value is Card { + const validationResult = validateAndMap(value, cardSchema); + return validationResult.errors === false; + } + + /** + * Validation method to narrow down union type to BankAccount type case. + * + * This is Bank Account case. + */ + export function isBankAccount(value: unknown): value is BankAccount { + const validationResult = validateAndMap(value, bankAccountSchema); + return validationResult.errors === false; + } +} diff --git a/sdks/ts/openapi_sdk_typescript/src/models/containers/bookingsPaymentResponseSource.ts b/sdks/ts/openapi_sdk_typescript/src/models/containers/bookingsPaymentResponseSource.ts new file mode 100644 index 0000000..e567bde --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/src/models/containers/bookingsPaymentResponseSource.ts @@ -0,0 +1,38 @@ +/** + * Train Travel APILib + * + * This file was automatically generated by APIMATIC v3.0 ( https://www.apimatic.io ). + */ + +import { anyOf, Schema, validateAndMap } from '../../schema'; +import { BankAccount, bankAccountSchema } from '../bankAccount'; +import { Card, cardSchema } from '../card'; + +/** This is a container type for any-of types. */ +export type BookingsPaymentResponseSource = Card | BankAccount; + +export const bookingsPaymentResponseSourceSchema: Schema = anyOf( + [cardSchema, bankAccountSchema] +); + +export namespace BookingsPaymentResponseSource { + /** + * Validation method to narrow down union type to Card type case. + * + * This is Card case. + */ + export function isCard(value: unknown): value is Card { + const validationResult = validateAndMap(value, cardSchema); + return validationResult.errors === false; + } + + /** + * Validation method to narrow down union type to BankAccount type case. + * + * This is Bank Account case. + */ + export function isBankAccount(value: unknown): value is BankAccount { + const validationResult = validateAndMap(value, bankAccountSchema); + return validationResult.errors === false; + } +} diff --git a/sdks/ts/openapi_sdk_typescript/src/models/currencyEnum.ts b/sdks/ts/openapi_sdk_typescript/src/models/currencyEnum.ts new file mode 100644 index 0000000..76b00ae --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/src/models/currencyEnum.ts @@ -0,0 +1,28 @@ +/** + * Train Travel APILib + * + * This file was automatically generated by APIMATIC v3.0 ( https://www.apimatic.io ). + */ + +import { Schema, stringEnum } from '../schema'; + +/** + * Enum for CurrencyEnum + */ +export enum CurrencyEnum { + Bam = 'bam', + Bgn = 'bgn', + Chf = 'chf', + Eur = 'eur', + Gbp = 'gbp', + Nok = 'nok', + Sek = 'sek', + Try = 'try', +} + +/** + * Schema for CurrencyEnum + */ +export const currencyEnumSchema: Schema = stringEnum( + CurrencyEnum +); diff --git a/sdks/ts/openapi_sdk_typescript/src/models/links.ts b/sdks/ts/openapi_sdk_typescript/src/models/links.ts new file mode 100644 index 0000000..6538257 --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/src/models/links.ts @@ -0,0 +1,20 @@ +/** + * Train Travel APILib + * + * This file was automatically generated by APIMATIC v3.0 ( https://www.apimatic.io ). + */ + +import { object, optional, Schema, string } from '../schema'; + +/** A set of hypermedia links which serve as controls for the client. */ +export interface Links { + self?: string; + next?: string; + prev?: string; +} + +export const linksSchema: Schema = object({ + self: ['self', optional(string())], + next: ['next', optional(string())], + prev: ['prev', optional(string())], +}); diff --git a/sdks/ts/openapi_sdk_typescript/src/models/linksBooking.ts b/sdks/ts/openapi_sdk_typescript/src/models/linksBooking.ts new file mode 100644 index 0000000..6660fda --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/src/models/linksBooking.ts @@ -0,0 +1,15 @@ +/** + * Train Travel APILib + * + * This file was automatically generated by APIMATIC v3.0 ( https://www.apimatic.io ). + */ + +import { object, optional, Schema, string } from '../schema'; + +export interface LinksBooking { + booking?: string; +} + +export const linksBookingSchema: Schema = object({ + booking: ['booking', optional(string())], +}); diff --git a/sdks/ts/openapi_sdk_typescript/src/models/linksPagination.ts b/sdks/ts/openapi_sdk_typescript/src/models/linksPagination.ts new file mode 100644 index 0000000..d94c169 --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/src/models/linksPagination.ts @@ -0,0 +1,17 @@ +/** + * Train Travel APILib + * + * This file was automatically generated by APIMATIC v3.0 ( https://www.apimatic.io ). + */ + +import { object, optional, Schema, string } from '../schema'; + +export interface LinksPagination { + next?: string; + prev?: string; +} + +export const linksPaginationSchema: Schema = object({ + next: ['next', optional(string())], + prev: ['prev', optional(string())], +}); diff --git a/sdks/ts/openapi_sdk_typescript/src/models/linksSelf.ts b/sdks/ts/openapi_sdk_typescript/src/models/linksSelf.ts new file mode 100644 index 0000000..3409f36 --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/src/models/linksSelf.ts @@ -0,0 +1,15 @@ +/** + * Train Travel APILib + * + * This file was automatically generated by APIMATIC v3.0 ( https://www.apimatic.io ). + */ + +import { object, optional, Schema, string } from '../schema'; + +export interface LinksSelf { + self?: string; +} + +export const linksSelfSchema: Schema = object({ + self: ['self', optional(string())], +}); diff --git a/sdks/ts/openapi_sdk_typescript/src/models/oAuthProviderErrorEnum.ts b/sdks/ts/openapi_sdk_typescript/src/models/oAuthProviderErrorEnum.ts new file mode 100644 index 0000000..5b10160 --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/src/models/oAuthProviderErrorEnum.ts @@ -0,0 +1,26 @@ +/** + * Train Travel APILib + * + * This file was automatically generated by APIMATIC v3.0 ( https://www.apimatic.io ). + */ + +import { Schema, stringEnum } from '../schema'; + +/** + * Enum for OAuthProviderErrorEnum + */ +export enum OAuthProviderErrorEnum { + InvalidRequest = 'invalid_request', + InvalidClient = 'invalid_client', + InvalidGrant = 'invalid_grant', + UnauthorizedClient = 'unauthorized_client', + UnsupportedGrantType = 'unsupported_grant_type', + InvalidScope = 'invalid_scope', +} + +/** + * Schema for OAuthProviderErrorEnum + */ +export const oAuthProviderErrorEnumSchema: Schema = stringEnum( + OAuthProviderErrorEnum +); diff --git a/sdks/ts/openapi_sdk_typescript/src/models/oAuthScopeEnum.ts b/sdks/ts/openapi_sdk_typescript/src/models/oAuthScopeEnum.ts new file mode 100644 index 0000000..a56c2ff --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/src/models/oAuthScopeEnum.ts @@ -0,0 +1,22 @@ +/** + * Train Travel APILib + * + * This file was automatically generated by APIMATIC v3.0 ( https://www.apimatic.io ). + */ + +import { Schema, stringEnum } from '../schema'; + +/** + * Enum for OAuthScopeEnum + */ +export enum OAuthScopeEnum { + Read = 'read', + Write = 'write', +} + +/** + * Schema for OAuthScopeEnum + */ +export const oAuthScopeEnumSchema: Schema = stringEnum( + OAuthScopeEnum +); diff --git a/sdks/ts/openapi_sdk_typescript/src/models/oAuthToken.ts b/sdks/ts/openapi_sdk_typescript/src/models/oAuthToken.ts new file mode 100644 index 0000000..3ea6cfc --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/src/models/oAuthToken.ts @@ -0,0 +1,38 @@ +/** + * Train Travel APILib + * + * This file was automatically generated by APIMATIC v3.0 ( https://www.apimatic.io ). + */ + +import { bigint, object, optional, Schema, string } from '../schema'; + +/** OAuth 2 Authorization endpoint response */ +export interface OAuthToken { + /** Access token */ + accessToken: string; + /** Type of access token */ + tokenType: string; + /** Time in seconds before the access token expires */ + expiresIn?: bigint; + /** + * List of scopes granted + * This is a space-delimited list of strings. + */ + scope?: string; + /** Time of token expiry as unix timestamp (UTC) */ + expiry?: bigint; + /** + * Refresh token + * Used to get a new access token when it expires. + */ + refreshToken?: string; +} + +export const oAuthTokenSchema: Schema = object({ + accessToken: ['access_token', string()], + tokenType: ['token_type', string()], + expiresIn: ['expires_in', optional(bigint())], + scope: ['scope', optional(string())], + expiry: ['expiry', optional(bigint())], + refreshToken: ['refresh_token', optional(string())], +}); diff --git a/sdks/ts/openapi_sdk_typescript/src/models/object1Enum.ts b/sdks/ts/openapi_sdk_typescript/src/models/object1Enum.ts new file mode 100644 index 0000000..68b19fc --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/src/models/object1Enum.ts @@ -0,0 +1,19 @@ +/** + * Train Travel APILib + * + * This file was automatically generated by APIMATIC v3.0 ( https://www.apimatic.io ). + */ + +import { Schema, stringEnum } from '../schema'; + +/** + * Enum for Object1Enum + */ +export enum Object1Enum { + BankAccount = 'bank_account', +} + +/** + * Schema for Object1Enum + */ +export const object1EnumSchema: Schema = stringEnum(Object1Enum); diff --git a/sdks/ts/openapi_sdk_typescript/src/models/objectEnum.ts b/sdks/ts/openapi_sdk_typescript/src/models/objectEnum.ts new file mode 100644 index 0000000..a766063 --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/src/models/objectEnum.ts @@ -0,0 +1,19 @@ +/** + * Train Travel APILib + * + * This file was automatically generated by APIMATIC v3.0 ( https://www.apimatic.io ). + */ + +import { Schema, stringEnum } from '../schema'; + +/** + * Enum for ObjectEnum + */ +export enum ObjectEnum { + Card = 'card', +} + +/** + * Schema for ObjectEnum + */ +export const objectEnumSchema: Schema = stringEnum(ObjectEnum); diff --git a/sdks/ts/openapi_sdk_typescript/src/models/source.ts b/sdks/ts/openapi_sdk_typescript/src/models/source.ts new file mode 100644 index 0000000..a1da3b9 --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/src/models/source.ts @@ -0,0 +1,55 @@ +/** + * Train Travel APILib + * + * This file was automatically generated by APIMATIC v3.0 ( https://www.apimatic.io ). + */ + +import { bigint, number, object, optional, Schema, string } from '../schema'; +import { AccountTypeEnum, accountTypeEnumSchema } from './accountTypeEnum'; +import { ObjectEnum, objectEnumSchema } from './objectEnum'; + +/** The payment source to take the payment from. This can be a card or a bank account. Some of these properties will be hidden on read to protect PII leaking. */ +export interface Source { + object?: ObjectEnum; + /** Cardholder's full name as it appears on the card. */ + name?: string; + /** The card number, as a string without any separators. On read all but the last four digits will be masked for security. */ + number?: string; + /** Card security code, 3 or 4 digits usually found on the back of the card. */ + cvc?: number; + /** Two-digit number representing the card's expiration month. */ + expMonth?: bigint; + /** Four-digit number representing the card's expiration year. */ + expYear?: bigint; + addressLine1?: string; + addressLine2?: string; + addressCity?: string; + addressCountry?: string; + addressPostCode?: string; + /** The sort code for the bank account, in string form. Must be a six-digit number. */ + sortCode?: string; + /** The type of entity that holds the account. This can be either `individual` or `company`. */ + accountType?: AccountTypeEnum; + /** The name of the bank associated with the routing number. */ + bankName?: string; + /** Two-letter country code (ISO 3166-1 alpha-2). */ + country?: string; +} + +export const sourceSchema: Schema = object({ + object: ['object', optional(objectEnumSchema)], + name: ['name', optional(string())], + number: ['number', optional(string())], + cvc: ['cvc', optional(number())], + expMonth: ['exp_month', optional(bigint())], + expYear: ['exp_year', optional(bigint())], + addressLine1: ['address_line1', optional(string())], + addressLine2: ['address_line2', optional(string())], + addressCity: ['address_city', optional(string())], + addressCountry: ['address_country', optional(string())], + addressPostCode: ['address_post_code', optional(string())], + sortCode: ['sort_code', optional(string())], + accountType: ['account_type', optional(accountTypeEnumSchema)], + bankName: ['bank_name', optional(string())], + country: ['country', optional(string())], +}); diff --git a/sdks/ts/openapi_sdk_typescript/src/models/station.ts b/sdks/ts/openapi_sdk_typescript/src/models/station.ts new file mode 100644 index 0000000..f3b90ea --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/src/models/station.ts @@ -0,0 +1,28 @@ +/** + * Train Travel APILib + * + * This file was automatically generated by APIMATIC v3.0 ( https://www.apimatic.io ). + */ + +import { object, optional, Schema, string } from '../schema'; + +export interface Station { + /** Unique identifier for the station. */ + id: string; + /** The name of the station */ + name: string; + /** The address of the station. */ + address: string; + /** The country code of the station. */ + countryCode: string; + /** The timezone of the station in the [IANA Time Zone Database format](https://www.iana.org/time-zones). */ + timezone?: string; +} + +export const stationSchema: Schema = object({ + id: ['id', string()], + name: ['name', string()], + address: ['address', string()], + countryCode: ['country_code', string()], + timezone: ['timezone', optional(string())], +}); diff --git a/sdks/ts/openapi_sdk_typescript/src/models/stationsResponse.ts b/sdks/ts/openapi_sdk_typescript/src/models/stationsResponse.ts new file mode 100644 index 0000000..db66a90 --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/src/models/stationsResponse.ts @@ -0,0 +1,16 @@ +/** + * Train Travel APILib + * + * This file was automatically generated by APIMATIC v3.0 ( https://www.apimatic.io ). + */ + +import { array, lazy, object, optional, Schema } from '../schema'; +import { Station, stationSchema } from './station'; + +export interface StationsResponse { + data?: Station[]; +} + +export const stationsResponseSchema: Schema = object({ + data: ['data', optional(array(lazy(() => stationSchema)))], +}); diff --git a/sdks/ts/openapi_sdk_typescript/src/models/statusEnum.ts b/sdks/ts/openapi_sdk_typescript/src/models/statusEnum.ts new file mode 100644 index 0000000..6ee605a --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/src/models/statusEnum.ts @@ -0,0 +1,21 @@ +/** + * Train Travel APILib + * + * This file was automatically generated by APIMATIC v3.0 ( https://www.apimatic.io ). + */ + +import { Schema, stringEnum } from '../schema'; + +/** + * Enum for StatusEnum + */ +export enum StatusEnum { + Pending = 'pending', + Succeeded = 'succeeded', + Failed = 'failed', +} + +/** + * Schema for StatusEnum + */ +export const statusEnumSchema: Schema = stringEnum(StatusEnum); diff --git a/sdks/ts/openapi_sdk_typescript/src/models/trip.ts b/sdks/ts/openapi_sdk_typescript/src/models/trip.ts new file mode 100644 index 0000000..f5f075c --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/src/models/trip.ts @@ -0,0 +1,40 @@ +/** + * Train Travel APILib + * + * This file was automatically generated by APIMATIC v3.0 ( https://www.apimatic.io ). + */ + +import { boolean, number, object, optional, Schema, string } from '../schema'; + +export interface Trip { + /** Unique identifier for the trip */ + id?: string; + /** The starting station of the trip */ + origin?: string; + /** The destination station of the trip */ + destination?: string; + /** The date and time when the trip departs */ + departureTime?: string; + /** The date and time when the trip arrives */ + arrivalTime?: string; + /** The name of the operator of the trip */ + operator?: string; + /** The cost of the trip */ + price?: number; + /** Indicates whether bicycles are allowed on the trip */ + bicyclesAllowed?: boolean; + /** Indicates whether dogs are allowed on the trip */ + dogsAllowed?: boolean; +} + +export const tripSchema: Schema = object({ + id: ['id', optional(string())], + origin: ['origin', optional(string())], + destination: ['destination', optional(string())], + departureTime: ['departure_time', optional(string())], + arrivalTime: ['arrival_time', optional(string())], + operator: ['operator', optional(string())], + price: ['price', optional(number())], + bicyclesAllowed: ['bicycles_allowed', optional(boolean())], + dogsAllowed: ['dogs_allowed', optional(boolean())], +}); diff --git a/sdks/ts/openapi_sdk_typescript/src/models/tripsResponse.ts b/sdks/ts/openapi_sdk_typescript/src/models/tripsResponse.ts new file mode 100644 index 0000000..300cd2e --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/src/models/tripsResponse.ts @@ -0,0 +1,21 @@ +/** + * Train Travel APILib + * + * This file was automatically generated by APIMATIC v3.0 ( https://www.apimatic.io ). + */ + +import { array, lazy, object, optional, Schema } from '../schema'; +import { Links, linksSchema } from './links'; +import { Trip, tripSchema } from './trip'; + +export interface TripsResponse { + /** The wrapper for a collection is an array of objects. */ + data?: Trip[]; + /** A set of hypermedia links which serve as controls for the client. */ + links?: Links; +} + +export const tripsResponseSchema: Schema = object({ + data: ['data', optional(array(lazy(() => tripSchema)))], + links: ['links', optional(lazy(() => linksSchema))], +}); diff --git a/sdks/ts/openapi_sdk_typescript/src/models/wrapperCollection.ts b/sdks/ts/openapi_sdk_typescript/src/models/wrapperCollection.ts new file mode 100644 index 0000000..5977ab9 --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/src/models/wrapperCollection.ts @@ -0,0 +1,20 @@ +/** + * Train Travel APILib + * + * This file was automatically generated by APIMATIC v3.0 ( https://www.apimatic.io ). + */ + +import { array, object, optional, Schema, unknown } from '../schema'; + +/** This is a generic request/response wrapper which contains both data and links which serve as hypermedia controls (HATEOAS). */ +export interface WrapperCollection { + /** The wrapper for a collection is an array of objects. */ + data?: unknown[]; + /** A set of hypermedia links which serve as controls for the client. */ + links?: unknown; +} + +export const wrapperCollectionSchema: Schema = object({ + data: ['data', optional(array(unknown()))], + links: ['links', optional(unknown())], +}); diff --git a/sdks/ts/openapi_sdk_typescript/src/schema.ts b/sdks/ts/openapi_sdk_typescript/src/schema.ts new file mode 100644 index 0000000..2e4a7ee --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/src/schema.ts @@ -0,0 +1,7 @@ +/** + * Train Travel APILib + * + * This file was automatically generated by APIMATIC v3.0 ( https://www.apimatic.io ). + */ + +export * from '@apimatic/schema'; diff --git a/sdks/ts/openapi_sdk_typescript/test/bookingsController.test.ts b/sdks/ts/openapi_sdk_typescript/test/bookingsController.test.ts new file mode 100644 index 0000000..6dd48f9 --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/test/bookingsController.test.ts @@ -0,0 +1,111 @@ +/** + * Train Travel APILib + * + * This file was automatically generated by APIMATIC v3.0 ( https://www.apimatic.io ). + */ + +import { BookingsController, BookingsResponse, BookingsResponse1 } from '../src'; +import { testClient } from './testClient'; +import { + expectHeadersToMatch, + expectMatchingWithOptions, + makeApiCall, +} from './testHelper'; + +describe('BookingsController', () => { + let controller : BookingsController; + + beforeAll(() => { + controller = new BookingsController(testClient); + }); + + it('should Test get-bookings', async () => { + const response = await makeApiCall( + () => controller.getBookings() + ); + + expect(response.statusCode).toBe(200); + + const expectedHeaders = { + RateLimit: ['', false], + 'Content-Type': ['application/json', true], + }; + + expectHeadersToMatch(response.headers, expectedHeaders); + + const expected: BookingsResponse = { + data: [ + { + id: 'efdbb9d1-02c2-4bc3-afb7-6788d8782b1e', + tripId: 'efdbb9d1-02c2-4bc3-afb7-6788d8782b1e', + passengerName: 'John Doe', + hasBicycle: true, + hasDog: true, + }, + { + id: 'b2e783e1-c824-4d63-b37a-d8d698862f1d', + tripId: 'b2e783e1-c824-4d63-b37a-d8d698862f1d', + passengerName: 'Jane Smith', + hasBicycle: false, + hasDog: false, + } + ], + links: { + self: 'https://api.example.com/bookings', + next: 'https://api.example.com/bookings?page=2', + }, + }; + + expect(response.result).not.toBeNull(); + expectMatchingWithOptions( + expected, + response.result, + { allowExtra: true, isOrdered: false, checkValues: false } + ); + }); + + it('should Test get-booking', async () => { + const bookingId = '1725ff48-ab45-4bb5-9d02-88745177dedb'; + + const response = await makeApiCall( + () => controller.getBooking(bookingId) + ); + + expect(response.statusCode).toBe(200); + + const expectedHeaders = { + RateLimit: ['', false], + 'Content-Type': ['application/json', true], + }; + + expectHeadersToMatch(response.headers, expectedHeaders); + + const expected: BookingsResponse1 = { + id: 'efdbb9d1-02c2-4bc3-afb7-6788d8782b1e', + tripId: 'efdbb9d1-02c2-4bc3-afb7-6788d8782b1e', + passengerName: 'John Doe', + hasBicycle: true, + hasDog: true, + links: { + self: 'https://api.example.com/bookings/1725ff48-ab45-4bb5-9d02-88745177dedb', + }, + }; + + expect(response.result).not.toBeNull(); + expectMatchingWithOptions( + expected, + response.result, + { allowExtra: true, isOrdered: false, checkValues: false } + ); + }); + + it('should Test delete-booking', async () => { + const bookingId = '1725ff48-ab45-4bb5-9d02-88745177dedb'; + + const response = await makeApiCall( + () => controller.deleteBooking(bookingId) + ); + + expect(response.statusCode).toBe(204); + }); +}); diff --git a/sdks/ts/openapi_sdk_typescript/test/paymentsController.test.ts b/sdks/ts/openapi_sdk_typescript/test/paymentsController.test.ts new file mode 100644 index 0000000..561664f --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/test/paymentsController.test.ts @@ -0,0 +1,90 @@ +/** + * Train Travel APILib + * + * This file was automatically generated by APIMATIC v3.0 ( https://www.apimatic.io ). + */ + +import { + BookingPayment, + BookingsPaymentResponse, + CurrencyEnum, + ObjectEnum, + PaymentsController, + StatusEnum, +} from '../src'; +import { testClient } from './testClient'; +import { + expectHeadersToMatch, + expectMatchingWithOptions, + makeApiCall, +} from './testHelper'; + +describe('PaymentsController', () => { + let controller : PaymentsController; + + beforeAll(() => { + controller = new PaymentsController(testClient); + }); + + it('should Test create-booking-payment', async () => { + const bookingId = '1725ff48-ab45-4bb5-9d02-88745177dedb'; + + const body: BookingPayment = { + amount: 49.99, + currency: CurrencyEnum.Gbp, + source: { + name: 'J. Doe', + number: '4242424242424242', + cvc: 123, + expMonth: BigInt(12), + expYear: BigInt(2025), + addressCountry: 'gb', + object: 'card', + addressLine1: '123 Fake Street', + addressLine2: '4th Floor', + addressCity: 'London', + addressPostCode: 'N12 9XX', + }, + }; + + const response = await makeApiCall( + () => controller.createBookingPayment(bookingId, body) + ); + + expect(response.statusCode).toBe(200); + + const expectedHeaders = { + RateLimit: ['', false], + 'Content-Type': ['application/json', true], + }; + + expectHeadersToMatch(response.headers, expectedHeaders); + + const expected: BookingsPaymentResponse = { + id: '2e3b4f5a-6b7c-8d9e-0f1a-2b3c4d5e6f7a', + amount: 49.99, + currency: CurrencyEnum.Gbp, + source: { + name: 'J. Doe', + number: '************4242', + cvc: 123, + expMonth: BigInt(12), + expYear: BigInt(2025), + addressCountry: 'gb', + object: 'card', + addressPostCode: 'N12 9XX', + }, + status: StatusEnum.Succeeded, + links: { + booking: 'https://api.example.com/bookings/1725ff48-ab45-4bb5-9d02-88745177dedb/payment', + }, + }; + + expect(response.result).not.toBeNull(); + expectMatchingWithOptions( + expected, + response.result, + { allowExtra: true, isOrdered: false, checkValues: false } + ); + }); +}); diff --git a/sdks/ts/openapi_sdk_typescript/test/stationsController.test.ts b/sdks/ts/openapi_sdk_typescript/test/stationsController.test.ts new file mode 100644 index 0000000..7a35f70 --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/test/stationsController.test.ts @@ -0,0 +1,66 @@ +/** + * Train Travel APILib + * + * This file was automatically generated by APIMATIC v3.0 ( https://www.apimatic.io ). + */ + +import { StationsController, StationsResponse } from '../src'; +import { testClient } from './testClient'; +import { + expectHeadersToMatch, + expectMatchingWithOptions, + makeApiCall, +} from './testHelper'; + +describe('StationsController', () => { + let controller : StationsController; + + beforeAll(() => { + controller = new StationsController(testClient); + }); + + it('should Test get-stations', async () => { + const page = 1; + + const coordinates = '52.5200,13.4050'; + + const response = await makeApiCall( + () => controller.getStations(page, coordinates, undefined) + ); + + expect(response.statusCode).toBe(200); + + const expectedHeaders = { + RateLimit: ['', false], + 'Content-Type': ['application/json', true], + }; + + expectHeadersToMatch(response.headers, expectedHeaders); + + const expected: StationsResponse = { + data: [ + { + id: 'efdbb9d1-02c2-4bc3-afb7-6788d8782b1e', + name: 'Berlin Hauptbahnhof', + address: 'Invalidenstraße 10557 Berlin, Germany', + countryCode: 'DE', + timezone: 'Europe/Berlin', + }, + { + id: 'b2e783e1-c824-4d63-b37a-d8d698862f1d', + name: 'Paris Gare du Nord', + address: '18 Rue de Dunkerque 75010 Paris, France', + countryCode: 'FR', + timezone: 'Europe/Paris', + } + ], + }; + + expect(response.result).not.toBeNull(); + expectMatchingWithOptions( + expected, + response.result, + { allowExtra: true, isOrdered: false, checkValues: false } + ); + }); +}); diff --git a/sdks/ts/openapi_sdk_typescript/test/testClient.ts b/sdks/ts/openapi_sdk_typescript/test/testClient.ts new file mode 100644 index 0000000..2e2db99 --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/test/testClient.ts @@ -0,0 +1,41 @@ +/** + * Train Travel APILib + * + * This file was automatically generated by APIMATIC v3.0 ( https://www.apimatic.io ). + */ + +import { Client, Configuration, Environment } from '../src'; + +export const testClient = new Client(createConfigurationFromEnvironment()); + +function createConfigurationFromEnvironment(): Partial { + const config: Partial = {}; + + const environment = process.env.TRAIN_TRAVEL_API_LIB_ENVIRONMENT; + const timeout = process.env.TRAIN_TRAVEL_API_LIB_TIMEOUT; + const oAuthClientId = process.env.TRAIN_TRAVEL_API_LIB_O_AUTH_CLIENT_ID; + const oAuthClientSecret = process.env.TRAIN_TRAVEL_API_LIB_O_AUTH_CLIENT_SECRET; + const oAuthRedirectUri = process.env.TRAIN_TRAVEL_API_LIB_O_AUTH_REDIRECT_URI; + + if (environment !== undefined) { + config.environment = environment as Environment; + } + + if (timeout !== undefined && timeout !== '') { + config.timeout = parseInt(timeout); + } + + if ( + oAuthClientId !== undefined + && oAuthClientSecret !== undefined + && oAuthRedirectUri !== undefined + ) { + config.authorizationCodeAuthCredentials = { + oAuthClientId: oAuthClientId, + oAuthClientSecret: oAuthClientSecret, + oAuthRedirectUri: oAuthRedirectUri, + }; + } + + return config; +} diff --git a/sdks/ts/openapi_sdk_typescript/test/testHelper.ts b/sdks/ts/openapi_sdk_typescript/test/testHelper.ts new file mode 100644 index 0000000..403b4fd --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/test/testHelper.ts @@ -0,0 +1,36 @@ +/** + * Train Travel APILib + * + * This file was automatically generated by APIMATIC v3.0 ( https://www.apimatic.io ). + */ + +export * from '@apimatic/test-utilities'; + +import { HttpClient } from '../src/clientAdapter'; +import { HttpClientInterface } from '../src/core'; +import { ApiError, ApiResponse, AbortError } from '../src'; + +export function httpClientInterface(): HttpClientInterface { + return async (request, requestOptions) => { + return await new HttpClient(AbortError).executeRequest(request, requestOptions); + }; +} + +export async function makeApiCall( + caller: () => Promise> +): Promise> { + try { + return await caller(); + } catch (error) { + if (error instanceof ApiError) { + return { + request: error.request, + statusCode: error.statusCode, + headers: error.headers, + result: error.result, + body: error.body + }; + } + throw error; + } +} diff --git a/sdks/ts/openapi_sdk_typescript/test/tripsController.test.ts b/sdks/ts/openapi_sdk_typescript/test/tripsController.test.ts new file mode 100644 index 0000000..4e93dfb --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/test/tripsController.test.ts @@ -0,0 +1,84 @@ +/** + * Train Travel APILib + * + * This file was automatically generated by APIMATIC v3.0 ( https://www.apimatic.io ). + */ + +import { TripsController, TripsResponse } from '../src'; +import { testClient } from './testClient'; +import { + expectHeadersToMatch, + expectMatchingWithOptions, + makeApiCall, +} from './testHelper'; + +describe('TripsController', () => { + let controller : TripsController; + + beforeAll(() => { + controller = new TripsController(testClient); + }); + + it('should Test get-trips', async () => { + const origin = 'efdbb9d1-02c2-4bc3-afb7-6788d8782b1e'; + + const destination = 'b2e783e1-c824-4d63-b37a-d8d698862f1d'; + + const date = '2024-02-01T09:00:00Z'; + + const bicycles = false; + + const dogs = false; + + const response = await makeApiCall( + () => controller.getTrips(origin, destination, date, bicycles, dogs) + ); + + expect(response.statusCode).toBe(200); + + const expectedHeaders = { + RateLimit: ['', false], + 'Content-Type': ['application/json', true], + }; + + expectHeadersToMatch(response.headers, expectedHeaders); + + const expected: TripsResponse = { + data: [ + { + id: 'ea399ba1-6d95-433f-92d1-83f67b775594', + origin: 'efdbb9d1-02c2-4bc3-afb7-6788d8782b1e', + destination: 'b2e783e1-c824-4d63-b37a-d8d698862f1d', + departureTime: '2024-02-01T10:00:00Z', + arrivalTime: '2024-02-01T16:00:00Z', + operator: 'Deutsche Bahn', + price: 50, + bicyclesAllowed: true, + dogsAllowed: true, + }, + { + id: '4d67459c-af07-40bb-bb12-178dbb88e09f', + origin: 'b2e783e1-c824-4d63-b37a-d8d698862f1d', + destination: 'efdbb9d1-02c2-4bc3-afb7-6788d8782b1e', + departureTime: '2024-02-01T12:00:00Z', + arrivalTime: '2024-02-01T18:00:00Z', + operator: 'SNCF', + price: 50, + bicyclesAllowed: true, + dogsAllowed: true, + } + ], + links: { + self: 'https://api.example.com/trips?origin=efdbb9d1-02c2-4bc3-afb7-6788d8782b1e&destination=b2e783e1-c824-4d63-b37a-d8d698862f1d&date=2024-02-01', + next: 'https://api.example.com/trips?origin=efdbb9d1-02c2-4bc3-afb7-6788d8782b1e&destination=b2e783e1-c824-4d63-b37a-d8d698862f1d&date=2024-02-01&page=2', + }, + }; + + expect(response.result).not.toBeNull(); + expectMatchingWithOptions( + expected, + response.result, + { allowExtra: true, isOrdered: false, checkValues: false } + ); + }); +}); diff --git a/sdks/ts/openapi_sdk_typescript/tsconfig.base.json b/sdks/ts/openapi_sdk_typescript/tsconfig.base.json new file mode 100644 index 0000000..ed7c212 --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/tsconfig.base.json @@ -0,0 +1,18 @@ +{ + "include": ["src", "types"], + "compilerOptions": { + "importHelpers": true, + "declaration": true, + "sourceMap": true, + "rootDir": "./src", + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "moduleResolution": "node", + "jsx": "react", + "esModuleInterop": true, + "useUnknownInCatchVariables": false + } +} diff --git a/sdks/ts/openapi_sdk_typescript/tsconfig.cjs.json b/sdks/ts/openapi_sdk_typescript/tsconfig.cjs.json new file mode 100644 index 0000000..3459ff4 --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/tsconfig.cjs.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.base.json", + "compilerOptions": { + "module": "CommonJS", + "outDir": "dist/cjs", + "declarationDir": "dist/types" + } +} diff --git a/sdks/ts/openapi_sdk_typescript/tsconfig.esm.json b/sdks/ts/openapi_sdk_typescript/tsconfig.esm.json new file mode 100644 index 0000000..2da6959 --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/tsconfig.esm.json @@ -0,0 +1,11 @@ +{ + "extends": "./tsconfig.base.json", + "compilerOptions": { + "module": "esnext", + "lib": ["esnext"], + "outDir": "dist/esm", + "declarationDir": "dist/types", + "target": "ES2017" + } +} + diff --git a/sdks/ts/openapi_sdk_typescript/tsconfig.json b/sdks/ts/openapi_sdk_typescript/tsconfig.json new file mode 100644 index 0000000..57d362c --- /dev/null +++ b/sdks/ts/openapi_sdk_typescript/tsconfig.json @@ -0,0 +1,20 @@ +{ + "include": ["src", "types"], + "compilerOptions": { + "module": "esnext", + "lib": ["esnext"], + "importHelpers": true, + "declaration": true, + "sourceMap": true, + "rootDir": "./src", + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "moduleResolution": "node", + "target": "ES2017", + "jsx": "react", + "esModuleInterop": true + } +}