diff --git a/.gitignore b/.gitignore index fbef97dd..3864a782 100644 --- a/.gitignore +++ b/.gitignore @@ -75,5 +75,8 @@ engine/tests/data/auth.json /ui/src/locale/_build/ /ui/src/locale/**/*.*js +# generated static files +/ui/public/api/ + # linting /ui/hadolint diff --git a/backend/Makefile b/backend/Makefile index 13f47d03..2d8c3e47 100644 --- a/backend/Makefile +++ b/backend/Makefile @@ -64,8 +64,6 @@ ifndef ANALYZER_DJANGO_SECRET_KEY export ANALYZER_DB_PORT=5433 endif -SWAGGER_CODEGEN := swagger-codegen - # Lambdas REPO_LAMBDA := ${PREFIX}-repo-handler USERS_LAMBDA := ${PREFIX}-users-handler @@ -336,17 +334,6 @@ artemis_scan: $(CURDIR)/ci-tools/shell/artemis-scan.sh ${ARTEMIS_SCAN_ARGS} github ${REPO_NAME} ${BRANCH_NAME} ${SEVERITY_LEVELS} .PHONY: artemis_scan -############################################################################### -# Documentation -############################################################################### - -dist/api/index.html: lambdas/api/spec.yaml - @echo "${INFO}Building $@" - mkdir -p ${DIST_DIR}/api - mkdir -p ${BUILD_DIR}/api - ${SWAGGER_CODEGEN} generate -i lambdas/api/spec.yaml -o ${DIST_DIR}/api -l html - @echo "${OK}" - ############################################################################### # Lambdas ############################################################################### @@ -635,8 +622,7 @@ docker: dist/docker/engine \ build: ## Build all build: lambdas \ docker \ - dist/engine_scripts.zip \ - dist/api/index.html + dist/engine_scripts.zip .PHONY: build ############################################################################### diff --git a/backend/lambdas/api/spec.yaml b/backend/lambdas/api/spec.yaml deleted file mode 100644 index eaca3c33..00000000 --- a/backend/lambdas/api/spec.yaml +++ /dev/null @@ -1,3788 +0,0 @@ -openapi: 3.1.0 -info: - title: Artemis REST API - version: 1.1.0 - license: - name: MIT License - identifier: MIT - contact: - email: "cso_appsec@warnermedia.com" -tags: - - name: groups - description: Group actions - - name: repo - description: Repository actions - - name: report - description: Report actions - - name: sbom - description: SBOM actions - - name: search - description: Search actions - - name: system - description: System actions - - name: users - description: User actions - - name: whitelist - description: Whitelist actions -servers: - - url: https://{host}/api/v1 - variables: - host: - default: localhost - description: API host -paths: - "/{service}": - parameters: - - name: service - in: path - description: The VCS the organization is in - required: true - schema: - type: string - post: - summary: Submit a repository for analysis - tags: - - repo - operationId: repo_post - requestBody: - content: - "application/json": - schema: - type: array - minimum: 1 - items: - $ref: "#/components/schemas/ScanRequestWithRepoOrg" - responses: - "200": - description: Repository was queued for analysis - content: - "application/json": - schema: - $ref: "#/components/schemas/ScanResponse" - "400": - description: Request validation failed - "/{service}/{org}/{repo}": - parameters: - - name: service - in: path - description: The VCS the organization is in - required: true - schema: - type: string - - name: org - in: path - description: The organization the repository is in - required: true - schema: - type: string - - name: repo - in: path - description: The name of the repository - required: true - schema: - type: string - get: - summary: Retrieve a report of a repository - tags: - - repo - operationId: repo_get - parameters: - - name: results - in: query - description: The type of results to filter - schema: - type: string - enum: - - vulnerabilities - - secrets - - static_analysis - - inventory - - configuration - - name: severity - in: query - description: The vulnerability severity to filter - schema: - type: string - enum: - - critical - - high - - medium - - low - - negligible - - name: secret - in: query - description: The secret type to filter - schema: - type: string - enum: - - aws - - ssh - - name: format - in: query - description: The report format to return - schema: - type: string - enum: - - full - - summary - responses: - "200": - description: Analysis report - content: - "application/json": - schema: - $ref: "#/components/schemas/AnalysisReport" - "404": - description: Repository not found - post: - summary: Submit the repository for analysis - tags: - - repo - operationId: repo_url_post - requestBody: - content: - "application/json": - schema: - $ref: "#/components/schemas/ScanRequest" - responses: - "200": - description: Repository was queued for analysis - content: - "application/json": - schema: - $ref: "#/components/schemas/ScanResponse" - "400": - description: Request validation failed - "/{service}/{org}/{repo}/{id}": - parameters: - - name: service - in: path - description: The VCS the organization is in - required: true - schema: - type: string - - name: org - in: path - description: The organization the repository is in - required: true - schema: - type: string - - name: repo - in: path - description: The name of the repository - required: true - schema: - type: string - - name: id - in: path - description: The scan ID - required: true - schema: - type: string - get: - summary: Retrieve a report of a repository - tags: - - repo - operationId: repo_get_by_id - parameters: - - name: results - in: query - description: The type of results to filter - schema: - type: string - enum: - - vulnerabilities - - secrets - - static_analysis - - inventory - - configuration - - name: severity - in: query - description: The vulnerability severity to filter - schema: - type: string - enum: - - critical - - high - - medium - - low - - negligible - - name: secret - in: query - description: The secret type to filter - schema: - type: string - enum: - - aws - - ssh - - name: format - in: query - description: The report format to return - schema: - type: string - enum: - - full - - summary - - name: filter_diff - in: query - description: Whether to filter out items not included in diff. Has no effect if diff_base was not included in scan. - required: false - schema: - type: boolean - default: true - allowEmptyValue: true - responses: - "200": - description: Analysis report - content: - "application/json": - schema: - $ref: "#/components/schemas/AnalysisReport" - "404": - description: Repository not found - "/{service}/{org}/{repo}/history": - parameters: - - name: service - in: path - description: The VCS the organization is in - required: true - schema: - type: string - - name: org - in: path - description: The organization the repository is in - required: true - schema: - type: string - - name: repo - in: path - description: The name of the repository - required: true - schema: - type: string - - name: limit - in: query - description: Limit the number of records returned to this number. - required: false - schema: - type: integer - - name: offset - in: query - description: The offset number to get the history from. - required: false - schema: - type: integer - - name: inititated_by - in: query - description: Filter history to scans initiated by just this user. - required: false - schema: - type: string - - name: include_batch - in: query - description: Whether to include batch priority scans in the history - required: false - schema: - type: boolean - default: false - allowEmptyValue: true - - name: include_diff - in: query - description: Whether to include diff scans in the history - required: false - schema: - type: boolean - default: false - allowEmptyValue: true - get: - summary: Retrieve the scan history for a repository - tags: - - repo - operationId: repo_get_history - responses: - "200": - description: Scan history - content: - "application/json": - schema: - $ref: "#/components/schemas/PagedScanHistory" - "404": - description: Repository not found - "/{service}/{org}/{repo}/whitelist": - parameters: - - name: service - in: path - description: The VCS the organization is in - required: true - schema: - type: string - - name: org - in: path - description: The organization the repository is in - required: true - schema: - type: string - - name: repo - in: path - description: The name of the repository - required: true - schema: - type: string - get: - summary: Retrieve the whitelist for a repository - tags: - - whitelist - operationId: whitelist_get_all - parameters: - - name: type - in: query - description: The type of whitelist item to filter openapi - schema: - type: string - enum: - - vulnerability - - secret - - secret_raw - - static_analysis - - configuration - responses: - "200": - description: Whitelist - content: - "application/json": - schema: - type: array - minimum: 1 - items: - $ref: "#/components/schemas/WhitelistItem" - "404": - description: Repository not found - post: - summary: Create a new whitelist item - tags: - - whitelist - operationId: whitelist_post - parameters: - - name: org - in: path - description: The organization the repository is in - required: true - schema: - type: string - format: uuid - - name: repo - in: path - description: The name of the repository - required: true - schema: - type: string - requestBody: - content: - "application/json": - schema: - $ref: "#/components/schemas/WhitelistItem" - responses: - "204": - description: Update successful - "404": - description: Item not found - "/{service}/{org}/{repo}/whitelist/{id}": - parameters: - - name: service - in: path - description: The VCS the organization is in - required: true - schema: - type: string - - name: org - in: path - description: The organization the repository is in - required: true - schema: - type: string - format: uuid - - name: repo - in: path - description: The name of the repository - required: true - schema: - type: string - - name: id - in: path - description: The ID of the whitelist item - required: true - schema: - type: string - get: - summary: Retrieve a specific whitelist item for a repository - tags: - - whitelist - operationId: whitelist_get - responses: - "200": - description: Whitelist - content: - "application/json": - schema: - $ref: "#/components/schemas/WhitelistItemWithId" - "404": - description: Item not found - put: - summary: Update a specific whitelist item - tags: - - whitelist - operationId: whitelist_put - requestBody: - content: - "application/json": - schema: - $ref: "#/components/schemas/WhitelistItem" - responses: - "204": - description: Update successful - "404": - description: Item not found - delete: - summary: Delete a specific whitelist item - tags: - - whitelist - operationId: whitelist_delete - responses: - "204": - description: Delete successful - "404": - description: Item not found - "/{service}/{org}/{repo}/{id}/report": - parameters: - - name: service - in: path - description: The VCS the organization is in - required: true - schema: - type: string - - name: org - in: path - description: The organization the repository is in - required: true - schema: - type: string - - name: repo - in: path - description: The name of the repository - required: true - schema: - type: string - - name: id - in: path - description: The scan ID - required: true - schema: - type: string - get: - summary: Retrieve the most recent report generated for the scan - tags: - - report - operationId: report_get_latest - responses: - "200": - description: Report metadata - content: - "application/json": - schema: - $ref: "#/components/schemas/ReportResponse" - "404": - description: Repository, scan, or report not found - post: - summary: Request a new report be generated - tags: - - report - operationId: report_post - requestBody: - content: - "application/json": - schema: - $ref: "#/components/schemas/ReportRequest" - responses: - "200": - description: Report request was queued for generation - content: - "application/json": - schema: - $ref: "#/components/schemas/ScanResponse" - "207": - description: Some report requests were queued for generation and some failed to be queued - content: - "application/json": - schema: - $ref: "#/components/schemas/ScanResponse" - "404": - description: Scan not found - "/{service}/{org}/{repo}/{id}/report/{report_id}": - parameters: - - name: service - in: path - description: The VCS the organization is in - required: true - schema: - type: string - - name: org - in: path - description: The organization the repository is in - required: true - schema: - type: string - format: uuid - - name: repo - in: path - description: The name of the repository - required: true - schema: - type: string - - name: id - in: path - description: The ID of the scan - required: true - schema: - type: string - - name: report_id - in: path - description: The ID of the report - required: true - schema: - type: string - get: - summary: Retrieve the report generated for the scan with the provided ID - tags: - - report - operationId: report_get_by_id - responses: - "200": - description: Report metadata - content: - "application/json": - schema: - $ref: "#/components/schemas/ReportResponse" - "404": - description: Repository, scan, or report not found - /users: - parameters: - - name: limit - in: query - description: Limit the number of records returned to this number. - required: false - schema: - type: integer - - name: offset - in: query - description: The offset number to get the history from. - required: false - schema: - type: integer - - name: admin - in: query - description: Filter on the admin flag - required: false - schema: - type: boolean - - name: email - in: query - description: Filter on the email (exact match) - required: false - schema: - type: string - - name: email__contains - in: query - description: Filter on the email (case-sensitive substring match) - required: false - schema: - type: string - - name: email__icontains - in: query - description: Filter on the email (case-insensitive substring match) - required: false - schema: - type: string - - name: scope - in: query - description: Filter on the scope (exact match) - required: false - schema: - type: string - - name: scope__contains - in: query - description: Filter on the scope (case-sensitive substring match) - required: false - schema: - type: string - - name: scope__icontains - in: query - description: Filter on the scope (case-insensitive substring match) - required: false - schema: - type: string - - name: features - in: query - description: Filter on the features (exact match) use -feature to exclude feature - required: false - schema: - type: string - - name: last_login - in: query - description: Filter on the last_login (exact match) - required: false - schema: - type: string - format: date-time - - name: last_login__lt - in: query - description: Filter on the last_login (match before time) - required: false - schema: - type: string - format: date-time - - name: last_login__gt - in: query - description: Filter on the last_login (match after time) - required: false - schema: - type: string - format: date-time - - name: order_by - in: query - description: Order the list by the fields listed - required: false - schema: - type: string - enum: - - admin - - -admin - - email - - -email - - scope - - -scope - - last_login - - -last_login - get: - summary: Return a list of users - tags: - - users - operationId: users - responses: - "200": - description: List of users - content: - "application/json": - schema: - $ref: "#/components/schemas/PagedUserItem" - "/users/{id}": - parameters: - - name: id - in: path - description: user ID (email address or "self") - required: true - schema: - type: string - get: - summary: Return information about the user - tags: - - users - operationId: users_id - responses: - "200": - description: Information specific to the logged in user. - content: - "application/json": - schema: - $ref: "#/components/schemas/UserItem" - post: - summary: Create a user - tags: - - users - operationId: users_id_post - requestBody: - content: - "application/json": - schema: - $ref: "#/components/schemas/UserRequest" - responses: - "200": - description: API key created - content: - "application/json": - schema: - $ref: "#/components/schemas/UserItem" - "400": - description: Request validation failed - "409": - description: User exists - put: - summary: Update a user - tags: - - users - operationId: users_id_put - requestBody: - content: - "application/json": - schema: - $ref: "#/components/schemas/UserRequest" - responses: - "200": - description: API key created - content: - "application/json": - schema: - $ref: "#/components/schemas/UserItem" - "400": - description: Request validation failed - delete: - summary: Delete a user - tags: - - users - operationId: users_id_delete - responses: - "204": - description: Delete successful - "404": - description: User not found - "/users/{id}/keys": - parameters: - - name: id - in: path - description: user ID (email address or "self") - required: true - schema: - type: string - - name: limit - in: query - description: Limit the number of records returned to this number. - required: false - schema: - type: integer - - name: offset - in: query - description: The offset number to get the history from. - required: false - schema: - type: integer - get: - summary: Return API key information - tags: - - users - operationId: users_id_keys - responses: - "200": - description: API keys - content: - "application/json": - schema: - type: array - minimum: 1 - items: - $ref: "#/components/schemas/PagedAPIKeyItem" - post: - summary: Create an API key - tags: - - users - operationId: users_id_keys_post - requestBody: - content: - "application/json": - schema: - $ref: "#/components/schemas/APIKeyRequest" - responses: - "200": - description: API key created - content: - "application/json": - schema: - $ref: "#/components/schemas/APIKeyResponse" - "400": - description: Request validation failed - "/users/{id}/keys/{kid}": - parameters: - - name: id - in: path - description: user ID (email address or "self") - required: true - schema: - type: string - - name: kid - in: path - description: API key ID - required: true - schema: - type: string - format: uuid - get: - summary: Return API key information - tags: - - users - operationId: users_id_keys_item - responses: - "200": - description: API key - content: - "application/json": - schema: - $ref: "#/components/schemas/APIKeyItem" - delete: - summary: Delete an API key - tags: - - users - operationId: users_self_keys_delete - responses: - "204": - description: Delete successful - "404": - description: Item not found - "/users/{id}/services": - parameters: - - name: id - in: path - description: user ID (email address or "self") - required: true - schema: - type: string - get: - summary: Return list of linked user services - tags: - - users - operationId: users_id_services_get - responses: - "200": - description: Get successful - content: - "application/json": - schema: - $ref: "#/components/schemas/UsersServicesResponse" - post: - summary: Link a new user service - tags: - - users - operationId: users_id_services_post - requestBody: - content: - "application/json": - schema: - $ref: "#/components/schemas/UsersServicesRequest" - responses: - "200": - description: Post successful - content: - "application/json": - schema: - $ref: "#/components/schemas/UsersServicesResponse" - "400": - description: | - Name is required, \ - params is required, \ - Service ID invalid, \ - Either auth_code or username param is required, \ - Invalid auth_code param - "409": - description: User exists - - "/users/{id}/services/{sid}": - parameters: - - name: id - in: path - description: user ID (email address or "self") - required: true - schema: - type: string - - name: sid - in: path - description: service ID - required: true - schema: - type: string - get: - summary: Return info for linked service - tags: - - users - operationId: users_id_services_sid_get - responses: - "200": - description: Get successful - content: - "application/json": - schema: - $ref: "#/components/schemas/UsersServicesServiceResponse" - "404": - description: Service not found for user - delete: - summary: Unlink user service - tags: - - users - operationId: users_id_services_sid_delete - responses: - "204": - description: Delete successful - - # SBOM paths - /sbom/components: - parameters: - - name: limit - in: query - description: Limit the number of records returned to this number. - required: false - schema: - type: integer - - name: offset - in: query - description: The offset number to get the paging from. - required: false - schema: - type: integer - - name: name - in: query - description: Filter on the component name (exact match) - required: false - schema: - type: string - - name: name__contains - in: query - description: Filter on the component name (case-sensitive substring match) - required: false - schema: - type: string - - name: name__icontains - in: query - description: Filter on the component name (case-insensitive substring match) - required: false - schema: - type: string - - name: version - in: query - description: Filter on the component version (exact match) - required: false - schema: - type: string - - name: version__contains - in: query - description: Filter on the component version (case-sensitive substring match) - required: false - schema: - type: string - - name: version__icontains - in: query - description: Filter on the component version (case-insensitive substring match) - required: false - schema: - type: string - - name: license - in: query - description: Filter on the component license (exact match) - required: false - schema: - type: string - - name: license__contains - in: query - description: Filter on the component license (case-sensitive substring match) - required: false - schema: - type: string - - name: license__icontains - in: query - description: Filter on the component license (case-insensitive substring match) - required: false - schema: - type: string - - name: service - in: query - description: Filter on the component repository service name (exact match) - required: false - schema: - type: string - - name: service__contains - in: query - description: Filter on the component repository service name (case-sensitive substring match) - required: false - schema: - type: string - - name: service__icontains - in: query - description: Filter on the component repository service name (case-insensitive substring match) - required: false - schema: - type: string - - name: repo - in: query - description: Filter on the component repository name (exact match) - required: false - schema: - type: string - - name: repo__contains - in: query - description: Filter on the component repository name (case-sensitive substring match) - required: false - schema: - type: string - - name: repo__icontains - in: query - description: Filter on the component repository name (case-insensitive substring match) - required: false - schema: - type: string - - name: last_scan - in: query - description: Filter on the component last scan time (exact match) - required: false - schema: - type: string - format: date-time - - name: last_scan__gt - in: query - description: Filter on the component last scan time (since timestamp) - required: false - schema: - type: string - format: date-time - - name: last_scan__lt - in: query - description: Filter on the component last scan time (prior to timestamp) - required: false - schema: - type: string - format: date-time - - name: order_by - in: query - description: Order the list by the fields listed - required: false - schema: - type: string - enum: - - name - - -name - - version - - -version - get: - summary: Return a list of components - tags: - - sbom - operationId: sbom_components - responses: - "200": - description: List of components - content: - "application/json": - schema: - $ref: "#/components/schemas/PagedSBOMComponents" - "/sbom/components/{name}": - parameters: - - name: name - in: path - description: Component name (URL-component-encoded) - required: true - schema: - type: string - - name: limit - in: query - description: Limit the number of records returned to this number. - required: false - schema: - type: integer - - name: offset - in: query - description: The offset number to get the paging from. - required: false - schema: - type: integer - - name: version - in: query - description: Filter on the component version (exact match) - required: false - schema: - type: string - - name: version__contains - in: query - description: Filter on the component version (case-sensitive substring match) - required: false - schema: - type: string - - name: version__icontains - in: query - description: Filter on the component version (case-insensitive substring match) - required: false - schema: - type: string - - name: license - in: query - description: Filter on the component license (exact match) - required: false - schema: - type: string - - name: license__contains - in: query - description: Filter on the component license (case-sensitive substring match) - required: false - schema: - type: string - - name: license__icontains - in: query - description: Filter on the component license (case-insensitive substring match) - required: false - schema: - type: string - - name: service - in: query - description: Filter on the component repository service name (exact match) - required: false - schema: - type: string - - name: service__contains - in: query - description: Filter on the component repository service name (case-sensitive substring match) - required: false - schema: - type: string - - name: service__icontains - in: query - description: Filter on the component repository service name (case-insensitive substring match) - required: false - schema: - type: string - - name: repo - in: query - description: Filter on the component repository name (exact match) - required: false - schema: - type: string - - name: repo__contains - in: query - description: Filter on the component repository name (case-sensitive substring match) - required: false - schema: - type: string - - name: repo__icontains - in: query - description: Filter on the component repository name (case-insensitive substring match) - required: false - schema: - type: string - - name: last_scan - in: query - description: Filter on the component last scan time (exact match) - required: false - schema: - type: string - format: date-time - - name: last_scan__gt - in: query - description: Filter on the component last scan time (since timestamp) - required: false - schema: - type: string - format: date-time - - name: last_scan__lt - in: query - description: Filter on the component last scan time (prior to timestamp) - required: false - schema: - type: string - format: date-time - - name: order_by - in: query - description: Order the list by the fields listed - required: false - schema: - type: string - enum: - - name - - -name - - version - - -version - get: - summary: Return a list of component versions - tags: - - sbom - operationId: sbom_components_name - responses: - "200": - description: List of component versions for the component name - content: - "application/json": - schema: - $ref: "#/components/schemas/PagedSBOMComponents" - "404": - description: Component not found - "/sbom/components/{name}/{version}": - parameters: - - name: name - in: path - description: Component name (URL-component-encoded) - required: true - schema: - type: string - - name: version - in: path - description: Component version (URL-component-encoded) - required: true - schema: - type: string - get: - summary: Return information about the specific version of the component - tags: - - sbom - operationId: sbom_components_name_version - responses: - "200": - description: Information about the component version - content: - "application/json": - schema: - $ref: "#/components/schemas/SBOMComponent" - "404": - description: Component version not found - "/sbom/components/{name}/{version}/repos": - parameters: - - name: name - in: path - description: Component name (URL-component-encoded) - required: true - schema: - type: string - - name: version - in: path - description: Component version (URL-component-encoded) - required: true - schema: - type: string - - name: limit - in: query - description: Limit the number of records returned to this number. - required: false - schema: - type: integer - - name: offset - in: query - description: The offset number to get the paging from. - required: false - schema: - type: integer - - name: license - in: query - description: Filter on the component license (exact match) - required: false - schema: - type: string - - name: service - in: query - description: Filter on the component repository service name (exact match) - required: false - schema: - type: string - - name: service__contains - in: query - description: Filter on the component repository service name (case-sensitive substring match) - required: false - schema: - type: string - - name: service__icontains - in: query - description: Filter on the component repository service name (case-insensitive substring match) - required: false - schema: - type: string - - name: repo - in: query - description: Filter on the component repository name (exact match) - required: false - schema: - type: string - - name: repo__contains - in: query - description: Filter on the component repository name (case-sensitive substring match) - required: false - schema: - type: string - - name: repo__icontains - in: query - description: Filter on the component repository name (case-insensitive substring match) - required: false - schema: - type: string - - name: last_scan - in: query - description: Filter on the component last scan time (exact match) - required: false - schema: - type: string - format: date-time - - name: last_scan__gt - in: query - description: Filter on the component last scan time (since timestamp) - required: false - schema: - type: string - format: date-time - - name: last_scan__lt - in: query - description: Filter on the component last scan time (prior to timestamp) - required: false - schema: - type: string - format: date-time - - name: order_by - in: query - description: Order the list by the fields listed - required: false - schema: - type: string - enum: - - service - - -service - - repo - - -repo - get: - summary: Return a list of repositories containing the component - tags: - - sbom - operationId: sbom_components_name_version_repos - responses: - "200": - description: List of repositories containing the component - content: - "application/json": - schema: - $ref: "#/components/schemas/PagedSBOMRepositories" - "404": - description: Component version not found - /sbom/licenses: - parameters: - - name: limit - in: query - description: Limit the number of records returned to this number. - required: false - schema: - type: integer - - name: offset - in: query - description: The offset number to get the paging from. - required: false - schema: - type: integer - - name: name - in: query - description: Filter on the component name (exact match) - required: false - schema: - type: string - - name: name__contains - in: query - description: Filter on the component name (case-sensitive substring match) - required: false - schema: - type: string - - name: name__icontains - in: query - description: Filter on the component name (case-insensitive substring match) - required: false - schema: - type: string - - name: order_by - in: query - description: Order the list by the fields listed - required: false - schema: - type: string - enum: - - name - - -name - get: - summary: Return a list of licenses - tags: - - sbom - operationId: sbom_licenses - responses: - "200": - description: List of licenses - content: - "application/json": - schema: - $ref: "#/components/schemas/PagedSBOMLicenses" - "/sbom/licenses/{id}": - parameters: - - name: id - in: path - description: License ID - required: true - schema: - type: string - get: - summary: Return information about the specific license - tags: - - sbom - operationId: sbom_licenses_id - responses: - "200": - description: Information about the license - content: - "application/json": - schema: - $ref: "#/components/schemas/SBOMLicense" - "404": - description: License not found - - # Search paths - /search/repositories: - parameters: - - name: limit - in: query - description: Limit the number of records returned to this number. - required: false - schema: - type: integer - - name: offset - in: query - description: The offset number to get the paging from. - required: false - schema: - type: integer - - name: service - in: query - description: Filter on the repository service name (exact match) - required: false - schema: - type: string - - name: service__contains - in: query - description: Filter on the repository service name (case-sensitive substring match) - required: false - schema: - type: string - - name: service__icontains - in: query - description: Filter on the repository service name (case-insensitive substring match) - required: false - schema: - type: string - - name: repo - in: query - description: Filter on the repository name (exact match) - required: false - schema: - type: string - - name: repo__contains - in: query - description: Filter on the repository name (case-sensitive substring match) - required: false - schema: - type: string - - name: repo__icontains - in: query - description: Filter on the repository name (case-insensitive substring match) - required: false - schema: - type: string - - name: last_qualified_scan - in: query - description: Filter on the last qualified scan time (exact match) - required: false - schema: - type: string - format: date-time - - name: last_qualified_scan__gt - in: query - description: Filter on the last qualified scan time (since timestamp) - required: false - schema: - type: string - format: date-time - - name: last_qualified_scan__lt - in: query - description: Filter on the last qualified scan time (prior to timestamp) - required: false - schema: - type: string - format: date-time - - name: last_qualified_scan__isnull - in: query - description: Filter on the presence of any qualified scan - required: false - schema: - type: boolean - - name: risk - in: query - description: Filter on the risk level of the repository - required: false - schema: - type: string - enum: - - priority - - critical - - high - - moderate - - low - - name: app_id - in: query - description: Filter on the repository application ID (exact match) - required: false - schema: - type: string - - name: app_id__isnull - in: query - description: Filter on the presense of any repository application ID (exact match) - required: false - schema: - type: boolean - - name: repo_contact - in: query - description: Filter on the repository contact (exact match) - required: false - schema: - type: string - - name: repo_contact__contains - in: query - description: Filter on the repository contact (case-sensitive substring match) - required: false - schema: - type: string - - name: repo_contact__icontains - in: query - description: Filter on the repository contact (case-insensitive substring match) - required: false - schema: - type: string - - name: repo_contact__isnull - in: query - description: Filter on the presense of a repository contact - required: false - schema: - type: boolean - - name: order_by - in: query - description: Order the list by the fields listed - required: false - schema: - type: string - enum: - - service - - -service - - repo - - -repo - - risk - - -risk - get: - summary: Return a list of repositories - tags: - - search - operationId: search_repositories - responses: - "200": - description: List of repositories - content: - "application/json": - schema: - $ref: "#/components/schemas/PagedSearchRepositories" - /search/scans: - parameters: - - $ref: "#/components/parameters/limit" - - $ref: "#/components/parameters/offset" - - $ref: "#/components/parameters/batch_id" - - $ref: "#/components/parameters/created" - - $ref: "#/components/parameters/created__lt" - - $ref: "#/components/parameters/created__gt" - - $ref: "#/components/parameters/service" - - $ref: "#/components/parameters/service__contains" - - $ref: "#/components/parameters/service__icontains" - - $ref: "#/components/parameters/repo" - - $ref: "#/components/parameters/repo__contains" - - $ref: "#/components/parameters/repo__icontains" - - $ref: "#/components/parameters/branch" - - $ref: "#/components/parameters/branch__contains" - - $ref: "#/components/parameters/branch__icontains" - - $ref: "#/components/parameters/branch__isnull" - - $ref: "#/components/parameters/sbom" - - $ref: "#/components/parameters/plugin_contains" - - $ref: "#/components/parameters/plugin_icontains" - - name: order_by - in: query - description: Order the list by the fields listed - required: false - schema: - type: string - enum: - - created - - -created - get: - summary: Return a list of scans - tags: - - search - operationId: search_scans - responses: - "200": - description: List of scans - content: - "application/json": - schema: - $ref: "#/components/schemas/PagedScanHistory" - - # System paths - /system/status: - get: - summary: Return the system status - tags: - - system - operationId: system_status - responses: - "200": - description: System status when not in maintenance - content: - "application/json": - schema: - $ref: "#/components/schemas/SystemStatus" - "503": - description: System status when in maintenance - content: - "application/json": - schema: - $ref: "#/components/schemas/SystemStatus" - /system/allowlist: - get: - summary: Retrieve the system-wide allowlist - tags: - - system_allowlist - operationId: system_allowlist_get_all - responses: - "200": - description: System allowlist - content: - "application/json": - schema: - type: array - minimum: 1 - items: - $ref: "#/components/schemas/PagedSystemAllowlistItem" - post: - summary: Create a new allowlist item - tags: - - system_allowlist - operationId: system_allowlist_post - requestBody: - content: - "application/json": - schema: - $ref: "#/components/schemas/SystemAllowlistItem" - responses: - "200": - description: Creation successful - content: - "application/json": - schema: - $ref: "#/components/schemas/SystemAllowlistItemWithId" - "/system/allowlist/{id}": - parameters: - - $ref: "#/components/parameters/id" - get: - summary: Retrieve a specific system-wide allowlist item - tags: - - system_allowlist - operationId: system_allowlist_get - responses: - "200": - description: Allowlist item - content: - "application/json": - schema: - $ref: "#/components/schemas/SystemAllowlistItemWithId" - "404": - description: Item not found - put: - summary: Update a specific system-wide allowlist item - tags: - - system_allowlist - operationId: system_allowlist_put - requestBody: - content: - "application/json": - schema: - $ref: "#/components/schemas/SystemAllowlistItem" - responses: - "204": - description: Update successful - "404": - description: Item not found - delete: - summary: Delete a specific system-wide allowlist item - tags: - - system_allowlist - operationId: system_allowlist_delete - responses: - "204": - description: Delete successful - "404": - description: Item not found - - /system/services: - get: - summary: Return a list of connected VCS services - tags: - - system - operationId: system_services_get_all - responses: - "200": - description: List of system services - content: - "application/json": - schema: - $ref: "#/components/schemas/PagedSystemServices" - - "/system/services/{id}": - parameters: - - $ref: "#/components/parameters/id" - get: - summary: Retrieve a specific system VCS service and its connectivity status - tags: - - system - operationId: system_services_get - responses: - "200": - description: System service item - content: - "application/json": - schema: - $ref: "#/components/schemas/SystemService" - "404": - description: Item not found - - "/system/services/{id}/stats": - parameters: - - $ref: "#/components/parameters/id" - get: - summary: Retrieve a specific system VCS service and its scanning stats - tags: - - system - operationId: system_services_stats_get - responses: - "200": - description: System service stats item - content: - "application/json": - schema: - $ref: "#/components/schemas/SystemServiceStats" - "404": - description: Item not found - - # Group paths - /groups: - parameters: - - $ref: "#/components/parameters/limit" - - $ref: "#/components/parameters/offset" - - $ref: "#/components/parameters/name" - - $ref: "#/components/parameters/name__contains" - - $ref: "#/components/parameters/name__icontains" - - $ref: "#/components/parameters/parent" - - $ref: "#/components/parameters/parent__contains" - - $ref: "#/components/parameters/parent__icontains" - - $ref: "#/components/parameters/description" - - $ref: "#/components/parameters/description__contains" - - $ref: "#/components/parameters/description__icontains" - - name: order_by - in: query - description: Order the list by the fields listed - required: false - schema: - type: string - enum: - - name - - -name - - parent - - -parent - - created - - -created - - allowlist - - -allowlist - get: - summary: Return a list of groups - tags: - - groups - operationId: groups - responses: - "200": - description: List of groups - content: - "application/json": - schema: - $ref: "#/components/schemas/PagedGroupItem" - post: - summary: Create a group - tags: - - groups - operationId: groups_post - requestBody: - content: - "application/json": - schema: - $ref: "#/components/schemas/GroupRequest" - responses: - "200": - description: Group created - content: - "application/json": - schema: - $ref: "#/components/schemas/GroupItem" - "400": - description: Request validation failed - "409": - description: Group exists - "/groups/{id}": - parameters: - - $ref: "#/components/parameters/id" - get: - summary: Return information about the group - tags: - - groups - operationId: groups_id - responses: - "200": - description: Information specific to the group. - content: - "application/json": - schema: - $ref: "#/components/schemas/GroupItem" - "404": - description: Group not found - put: - summary: Update a group - tags: - - groups - operationId: groups_id_put - requestBody: - content: - "application/json": - schema: - $ref: "#/components/schemas/GroupRequest" - responses: - "200": - description: Group updated - content: - "application/json": - schema: - $ref: "#/components/schemas/GroupItem" - "400": - description: Request validation failed - delete: - summary: Delete a group - tags: - - groups - operationId: group_id_delete - responses: - "204": - description: Delete successful - "404": - description: Group not found - "/groups/{id}/keys": - parameters: - - $ref: "#/components/parameters/id" - - $ref: "#/components/parameters/limit" - - $ref: "#/components/parameters/offset" - - $ref: "#/components/parameters/name" - - $ref: "#/components/parameters/name__contains" - - $ref: "#/components/parameters/name__icontains" - - $ref: "#/components/parameters/created" - - $ref: "#/components/parameters/created__lt" - - $ref: "#/components/parameters/created__gt" - - $ref: "#/components/parameters/expires" - - $ref: "#/components/parameters/expires__lt" - - $ref: "#/components/parameters/expires__gt" - - name: order_by - in: query - description: Order the list by the fields listed - required: false - schema: - type: string - enum: - - name - - -name - - created - - -created - - expires - - -expires - get: - summary: Return API key information - tags: - - groups - operationId: groups_id_keys - responses: - "200": - description: API keys - content: - "application/json": - schema: - type: array - minimum: 1 - items: - $ref: "#/components/schemas/PagedAPIKeyItem" - "404": - description: Group not found - post: - summary: Create an API key - tags: - - groups - operationId: groups_id_keys_post - requestBody: - content: - "application/json": - schema: - $ref: "#/components/schemas/APIKeyRequest" - responses: - "200": - description: API key created - content: - "application/json": - schema: - $ref: "#/components/schemas/APIKeyResponse" - "400": - description: Request validation failed - "404": - description: Group not found - "/groups/{id}/keys/{kid}": - parameters: - - $ref: "#/components/parameters/id" - - $ref: "#/components/parameters/kid" - get: - summary: Return API key information - tags: - - groups - operationId: groups_id_keys_item - responses: - "200": - description: API key - content: - "application/json": - schema: - $ref: "#/components/schemas/APIKeyItem" - "404": - description: Group or key not found - delete: - summary: Delete an API key - tags: - - groups - operationId: groups_id_keys_delete - responses: - "204": - description: Delete successful - "404": - description: Group or key not found - "/groups/{id}/members": - parameters: - - $ref: "#/components/parameters/id" - get: - summary: Return list of group members - tags: - - groups - operationId: groups_id_members_get - responses: - "200": - description: Get successful - content: - "application/json": - schema: - $ref: "#/components/schemas/PagedGroupMemberItem" - "404": - description: Group not found - "/groups/{id}/members/{uid}": - parameters: - - $ref: "#/components/parameters/id" - - $ref: "#/components/parameters/uid" - get: - summary: Return group members - tags: - - groups - operationId: groups_id_members_uid_get - responses: - "200": - description: Get successful - content: - "application/json": - schema: - $ref: "#/components/schemas/GroupMemberItem" - "404": - description: Group or member not found - post: - summary: Add a user to a group - tags: - - groups - operationId: groups_id_members_uid_post - requestBody: - content: - "application/json": - schema: - $ref: "#/components/schemas/GroupMemberRequest" - responses: - "200": - description: Post successful - content: - "application/json": - schema: - $ref: "#/components/schemas/GroupMemberItem" - "400": - description: Invalid request - "404": - description: Group or user not found - "409": - description: User is already a member - put: - summary: Update a user in a group - tags: - - groups - operationId: groups_id_members_uid_put - requestBody: - content: - "application/json": - schema: - $ref: "#/components/schemas/GroupMemberRequest" - responses: - "200": - description: Update successful - content: - "application/json": - schema: - $ref: "#/components/schemas/GroupMemberItem" - "400": - description: Invalid request - "404": - description: Group or user not found - delete: - summary: Remove a user from a group - tags: - - groups - operationId: groups_id_members_uid_delete - responses: - "204": - description: Removal successful - "404": - description: Group or user not found - -security: - - x-api-key: [] - -components: - # Reusable object schemas - schemas: - ScanRequest: - type: object - properties: - branch: - description: Repository branch - type: string - plugins: - description: List of plugins to run during analysis - type: array - items: - type: string - enum: - - checkov - - swiftlint - - detekt - - aqua_cli_scanner - - findsecbugs_java7 - - findsecbugs_java8 - - findsecbugs_java13 - - gitsecrets - - github_repo_health - - gitlab_repo_health - - node_dependencies - - owasp_dependency_check - - php_sensio_security_checker - - python_code_checker - - technology_discovery - - cicd_tools - - trufflehog - - brakeman - - bundler_audit - - bandit - - eslint - - nodejsscan - categories: - description: List of plugin categories to run during analysis - type: array - items: - type: string - enum: - - vulnerability - - secret - - static_analysis - - inventory - - configuration - depth: - description: Max number of commits to analyze - type: integer - format: int32 - default: 500 - include_dev: - description: Whether to include dev dependencies in analysis - type: boolean - default: false - callback: - description: Scan complete callback - type: object - properties: - url: - description: Callback URL to POST to - type: string - client_id: - description: Client-specified ID to echo back in POST - type: string - batch_priority: - description: Whether to give the scan batch (lower) batch_priority - type: boolean - default: false - diff_base: - description: Commit hash or branch name to use for diff-based reporting - type: - - string - - "null" - minLength: 1 - maxLength: 256 - batch_id: - description: Scan Batch ID - type: string - include_paths: - description: List of paths within the repo to include in the scan. Stacks with exclude_paths. Optional, by default the entire repo is scanned. If include_paths is used and exclude_paths is missing or empty exclude_paths defaults to ["*"]. - type: array - items: - type: string - exclude_paths: - description: List of paths within the repo to exclude from the scan. If include_paths is used and exclude_paths is missing or empty exclude_paths defaults to ["*"]. - type: array - items: - type: string - ScanRequestWithRepoOrg: - allOf: - - $ref: "#/components/schemas/ScanRequest" - - type: object - required: - - repo - properties: - repo: - description: Name of the repository - type: string - org: - description: Organization the repository belongs to - type: string - ScanResponse: - type: object - properties: - queued: - description: Repositories successfully queued with scan IDs - type: array - items: - type: string - failed: - description: Repositories that failed - type: array - items: - properties: - repo: - description: Repository name - type: string - error: - description: Error message - type: string - ScanHistoryItem: - type: object - required: - - repo - - branch - - timestamp - - initiated_by - properties: - repo: - description: Repo name with scan ID - type: string - branch: - description: Scan branch name - type: string - timestamps: - description: Start and end times of scan - type: object - properties: - queued: - description: Time the scan was queued - type: string - format: date-time - start: - description: Time scan started - type: string - format: date-time - end: - description: Time scan finished - type: string - format: date-time - initiated_by: - description: User ID of the user that initiated the scan - type: string - status: - description: Status of the most recent analysis job - type: string - enum: - - queued - - processing - - completed - - failed - status_detail: - description: Detailed scan status - type: object - properties: - plugin_name: - description: Currently running plugin - type: string - plugin_start_time: - description: Start time of current plugin - type: string - format: date-time - current_plugin: - description: Count of plugins run - type: integer - format: int32 - total_plugins: - description: Total number of plugins - type: integer - format: int32 - scan_options: - description: Options used at scan creation - $ref: "#/components/schemas/ScanRequest" - PagedScanHistory: - type: object - required: - - history - properties: - history: - description: One page of scan history results. - type: array - items: - $ref: "#/components/schemas/ScanHistoryItem" - last_scan_id: - description: identifies the last scan in the page of results, used to get the next page of results in a subsequent request - type: string - AnalysisReport: - type: object - properties: - repo: - description: Repository name - type: string - scan_id: - description: Scan ID - type: string - branch: - description: Branch name - type: string - engine_id: - description: ID of the engine that ran the scan, for troubleshooting purposes - type: string - initiated_by: - description: User ID of the user that initiated the scan - type: string - scan_options: - description: Options used at scan creation - $ref: "#/components/schemas/ScanRequest" - status: - description: Status of the most recent analysis job - type: string - enum: - - queued - - processing - - completed - - failed - status_detail: - description: Detailed scan status - type: object - properties: - plugin_name: - description: Currently running plugin - type: string - plugin_start_time: - description: Start time of current plugin - type: string - format: date-time - current_plugin: - description: Count of plugins run - type: integer - format: int32 - total_plugins: - description: Total number of plugins - type: integer - format: int32 - success: - description: Whether the scan found no issues taking current filters into account - type: boolean - truncated: - description: Whether the raw results exceeded storage limits and were truncated - type: boolean - timestamps: - description: Start and end times of scan - type: object - properties: - queued: - description: Time the scan was queued - type: string - format: date-time - start: - description: Time scan started - type: string - format: date-time - end: - description: Time scan finished - type: string - format: date-time - errors: - description: Error messages - type: object - additionalProperties: - type: array - items: - description: Error messages - type: string - alerts: - description: Messages alerting the user to addressable things that are not scan failures - type: object - additionalProperties: - type: array - items: - description: Alert messages - type: string - debug: - description: Debug messages - type: object - additionalProperties: - type: array - items: - description: Debug messages - type: string - results_summary: - description: Summary scan results - type: object - properties: - vulnerabilities: - type: object - description: The summary of vulnerablities - properties: - critical: - description: The number of critical severity vulnerabilities - type: integer - format: int32 - high: - description: The number of high severity vulnerabilities - type: integer - format: int32 - medium: - description: The number of medium severity vulnerabilities - type: integer - format: int32 - low: - description: The number of low severity vulnerabilities - type: integer - format: int32 - negligible: - description: The number of negligible vulnerabilities - type: integer - format: int32 - secrets: - type: integer - description: The number of secrets - format: int32 - static_analysis: - type: object - description: The summary of static analysis findings - properties: - critical: - description: The number of critical severity findings - type: integer - format: int32 - high: - description: The number of high severity findings - type: integer - format: int32 - medium: - description: The number of medium severity findings - type: integer - format: int32 - low: - description: The number of low severity findings - type: integer - format: int32 - negligible: - description: The number of negligible findings - type: integer - format: int32 - inventory: - type: object - description: The summary of inventory findings - properties: - technology_discovery: - description: The number of technologies discovered - type: integer - format: int32 - base_images: - description: The number of base images - type: integer - format: int32 - configuration: - type: object - description: The summary of configuration findings - properties: - critical: - description: The number of critical severity findings - type: integer - format: int32 - high: - description: The number of high severity findings - type: integer - format: int32 - medium: - description: The number of medium severity findings - type: integer - format: int32 - low: - description: The number of low severity findings - type: integer - format: int32 - negligible: - description: The number of negligible findings - type: integer - format: int32 - results: - description: Scan results - type: object - properties: - vulnerabilities: - type: object - description: The vulnerable component - additionalProperties: - type: object - description: The ID of the vulnerability - properties: - source: - description: The dependency source of the component - type: array - items: - type: string - severity: - description: The severity of the vulnerability - type: string - enum: - - critical - - high - - medium - - low - - negligible - description: - description: Short description of the vulnerability - type: string - remediation: - description: Remediation steps for the vulnerability - type: string - secrets: - type: object - description: The name of the file with the secret - additionalProperties: - type: array - items: - type: object - properties: - type: - description: Type of secret - type: string - enum: - - aws - - ssh - - mongo - - postgres - - redis - - urlauth - - google - - slack - - other - line: - description: Location within the file - type: integer - commit: - description: Hash of commit that added the secret - type: string - static_analysis: - type: object - description: File that is noted to have vulnerabilities or insecure code - additionalProperties: - type: array - items: - type: object - properties: - line: - description: Location within the file - type: integer - message: - description: message provided by analysis regarding issue - type: string - severity: - description: The severity of the insecurity or issue - type: string - enum: - - critical - - high - - medium - - low - - negligible - type: - description: Type of issue or insecurity - type: string - inventory: - type: object - description: Name of plugin providing information about the project - additionalProperties: - type: object - description: output of the plugin - configuration: - type: object - description: Configuration check that does not meet the requirements - additionalProperties: - type: object - description: The ID of the vulnerability - properties: - name: - description: Human-readable name for the check - type: string - description: - description: Short description of the check - type: string - severity: - description: The severity of the failing check - type: string - enum: - - critical - - high - - medium - - low - - negligible - WhitelistItem: - type: object - required: - - type - - value - - reason - - created_by - - created - - updated - properties: - type: - description: Whitelist item type - type: string - enum: - - vulnerability - - vulnerability_raw - - secret - - secret_raw - - static_analysis - - configuration - value: - description: The whitelisted value - oneOf: - - $ref: "#/components/schemas/WhitelistVulnItem" - - $ref: "#/components/schemas/WhitelistVulnRawItem" - - $ref: "#/components/schemas/WhitelistSecretItem" - - $ref: "#/components/schemas/WhitelistSecretRawItem" - - $ref: "#/components/schemas/WhitelistStaticAnalysisItem" - expires: - description: Expiration timestamp - type: string - format: date-time - reason: - description: Reason for creation - type: string - created_by: - description: Autoset User that created the item, ignored if passed in post/put requests. - type: string - updated_by: - description: Autoset User that last updated the item, ignored if passed in post/put requests - type: string - created: - description: Autoset date-time the item was created, ignored if passed in post/put requests - type: string - format: date-time - updated: - description: Autoset date-time the item was last updated, ignored if passed in post/put requests - type: string - format: date-time - WhitelistItemWithId: - allOf: - - $ref: "#/components/schemas/WhitelistItem" - - type: object - required: - - id - - reason - - created_by - - created - - updated - properties: - id: - description: ID of the whitelist item - type: string - format: uuid - created_by: - description: Autoset User that created the item, ignored if passed in post/put requests. - type: string - updated_by: - description: Autoset User that last updated the item, ignored if passed in post/put requests - type: string - created: - description: Autoset date-time the item was created, ignored if passed in post/put requests - type: string - format: date-time - updated: - description: Autoset date-time the item was last updated, ignored if passed in post/put requests - type: string - format: date-time - WhitelistVulnItem: - type: object - properties: - component: - description: Vulnerable component - type: string - id: - description: Vulnerability ID - type: string - source: - description: Vulnerable component dependency source - type: string - WhitelistSecretItem: - type: object - properties: - filename: - description: Secret-containing filename - type: string - line: - description: Secret location in file - type: integer - commit: - description: Secret-containing commit - type: string - WhitelistStaticAnalysisItem: - type: object - properties: - filename: - description: Finding-containing filename - type: string - line: - description: Finding location in file - type: integer - type: - description: Finding type - type: string - WhitelistSecretRawItem: - type: object - properties: - value: - description: Secret value to whitelist repo-wide - type: string - WhitelistVulnRawItem: - type: object - properties: - id: - description: Secret value to whitelist repo-wide - type: string - UserItem: - type: object - properties: - email: - description: User email address - type: string - admin: - description: User admin privileges - type: boolean - last_login: - description: User's last login time - type: string - format: date-time - scope: - description: User scan scope - type: array - items: - type: string - features: - description: User feature flags - type: object - scan_orgs: - description: Scan orgs that are accessible to this user - type: array - items: - type: string - PagedUserItem: - type: object - required: - - results - - count - - next - - previous - properties: - results: - description: One page of users. - type: array - items: - $ref: "#/components/schemas/UserItem" - count: - description: Number of items returned - type: integer - format: int32 - next: - description: Link to next page of results - type: string - previous: - description: Link to the previous page of results - type: string - UserRequest: - type: object - properties: - scope: - description: User scope - type: array - items: - type: string - admin: - description: User admin privileges - type: boolean - features: - description: User feature flags - type: object - - APIKeyItem: - type: object - required: - - id - - name - - scope - - expires - - created - - last_used - properties: - id: - description: API key ID - type: string - format: uuid - name: - description: API key name - type: string - scope: - description: API key scope - type: array - items: - type: string - expires: - description: API key expiration time - type: string - format: date-time - created: - description: API key created time - type: string - format: date-time - last_used: - description: API key last_used time - type: string - format: date-time - PagedAPIKeyItem: - type: object - required: - - results - - count - - next - - previous - properties: - results: - description: One page of API keys - type: array - items: - $ref: "#/components/schemas/APIKeyItem" - count: - description: Number of items returned - type: integer - format: int32 - next: - description: Link to next page of results - type: string - previous: - description: Link to the previous page of results - type: string - APIKeyRequest: - type: object - required: - - name - - scope - properties: - name: - description: API key name - type: string - scope: - description: API key scope - type: array - items: - type: string - expires: - description: API key expiration time - type: string - format: date-time - APIKeyResponse: - type: object - required: - - key - properties: - key: - description: API key - type: string - ReportRequest: - type: object - required: - - type - properties: - type: - description: Report format type - type: string - enum: - - pdf - filters: - description: Filters applied to the scan results during report generation - $ref: "#/components/schemas/ReportFilters" - ReportResponse: - type: object - required: - - report_id - - report_type - - status - - created_by - - timestamps - - scan_id - - filters - - download - properties: - report_id: - description: Report ID - type: string - format: uuid - report_type: - description: Report format type - type: string - enum: - - pdf - status: - description: Report generation status - type: string - enum: - - queued - - processing - - completed - - failed - - error - - terminated - created_by: - description: User that initiated the report generation - type: string - timestamps: - description: Report generation timestamps - type: object - properties: - requested: - description: Time the report generation was requested - type: string - format: date-time - completed: - description: Time report generation request completed - type: string - format: date-time - scan_id: - description: ID of the scan this report is for - type: string - format: uuid - filters: - description: Filters applied to the scan results during report generation - $ref: "#/components/schemas/ReportFilters" - download: - description: Report download location - type: object - properties: - url: - description: Report download URL - type: string - expires: - description: Report downloads URL expiration time - type: string - format: date-time - ReportFilters: - type: object - properties: - format: - description: Report filtering format - type: string - enum: - - full - - summary - filter_diff: - description: Whether to filter out items not included in diff. Has no effect if diff_base was not included in scan. - type: boolean - default: true - results: - description: The type of results to filter - type: array - items: - type: string - enum: - - vulnerabilities - - secrets - - static_analysis - - inventory - - configuration - severity: - description: The vulnerability severity to filter - type: array - items: - type: string - enum: - - critical - - high - - medium - - low - - negligible - secret: - description: The secret type to filter - type: array - items: - type: string - enum: - - aws - - ssh - UsersServicesRequest: - type: object - properties: - services: - description: List of linked services - type: array - items: - type: string - enum: - - github - UsersServicesResponse: - type: object - properties: - name: - description: Name of service - type: string - enum: - - github - params: - description: Parameters - type: object - properties: - auth_code: - description: GitHub oauth auth code - type: string - UsersServicesServiceResponse: - type: object - properties: - name: - description: Name of service - type: string - enum: - - github - username: - description: Service username - type: string - linked: - description: Timestamp of when linked - type: string - - # SBOM Schemas - SBOMLicense: - type: object - required: - - id - - name - properties: - id: - description: License ID (short name) - type: string - name: - description: License name (long name) - type: string - SBOMComponent: - type: object - required: - - name - - version - - licenses - properties: - name: - description: Component name - type: string - version: - description: Component version - type: string - licenses: - description: Component licenses - type: array - items: - $ref: "#/components/schemas/SBOMLicense" - SBOMRepository: - type: object - required: - - service - - repo - - sources - properties: - service: - description: Service name - type: string - repo: - description: Repository name - type: string - sources: - description: Source file paths - type: array - items: - type: string - - # Paged SBOM Schemas - PagedSBOMLicenses: - type: object - required: - - results - - count - - next - - previous - properties: - results: - description: One page of SBOM licenses - type: array - items: - $ref: "#/components/schemas/SBOMLicense" - count: - description: Number of items returned - type: integer - format: int32 - next: - description: Link to next page of results - type: string - previous: - description: Link to the previous page of results - type: string - PagedSBOMComponents: - type: object - required: - - results - - count - - next - - previous - properties: - results: - description: One page of SBOM components - type: array - items: - $ref: "#/components/schemas/SBOMComponent" - count: - description: Number of items returned - type: integer - format: int32 - next: - description: Link to next page of results - type: string - previous: - description: Link to the previous page of results - type: string - PagedSBOMRepositories: - type: object - required: - - results - - count - - next - - previous - properties: - results: - description: One page of SBOM licenses - type: array - items: - $ref: "#/components/schemas/SBOMRepository" - count: - description: Number of items returned - type: integer - format: int32 - next: - description: Link to next page of results - type: string - previous: - description: Link to the previous page of results - type: string - - # Search Schemas - SearchRepository: - type: object - required: - - service - - repo - - risk - - qualified_scan - - application_metadata - properties: - service: - description: Service name - type: string - repo: - description: Repo name (org/repo) - type: string - risk: - description: Risk level - type: string - enum: - - priority - - critical - - high - - moderate - - low - qualified_scan: - description: Identifying details of last qualified scan - type: object - properties: - created: - description: Timestamp of when the scan was created - type: string - format: date-time - scan_id: - description: ID of the scan - type: string - format: uuid - application_metadata: - description: Metadata for identifying the repo owner and associated application - type: object - - # Paged Search Schemas - PagedSearchRepositories: - type: object - required: - - results - - count - - next - - previous - properties: - results: - description: One page of repositories - type: array - items: - $ref: "#/components/schemas/SearchRepository" - count: - description: Number of items returned - type: integer - format: int32 - next: - description: Link to next page of results - type: string - previous: - description: Link to the previous page of results - type: string - - # System Status - SystemStatus: - type: object - required: - - maintenance - - engines - properties: - maintenance: - description: Maintenance information - type: object - properties: - enabled: - description: Whether the system is in maintenance mode - type: boolean - message: - description: Informational message accompanying maintenance mode - type: string - engines: - description: Engine status summary - type: object - properties: - status: - description: Metadata conforming to the WarnerMedia baseline requirements - type: string - enum: - - OK - - DEGRADED - - FAILED - - OFFLINE - count: - description: Number of online engines - type: integer - format: int32 - - #System Service - SystemService: - type: object - required: - - service - - service_type - - reachable - - auth_successful - - auth_type - - error - properties: - service: - description: Service name - type: string - service_type: - description: Type of VCS service - type: string - reachable: - description: Whether the service is reachable - type: boolean - auth_successful: - description: Whether Artemis can successfully authenticate to the service - type: boolean - auth_type: - description: Type of authentication Artemis uses to connect to the service - type: string - error: - description: Error encountered when testing connection from Artemis to service - type: - - string - - "null" - - SystemServiceStats: - type: object - required: - - service - - repo_count - - total_scans - - successful_scans - - failed_scans - - timestamps - properties: - service: - description: Service name - type: string - repo_count: - description: Count of repos scanned in the service - type: integer - format: int32 - total_scans: - description: Count of all scans run on repos in this service - type: integer - format: int32 - successful_scans: - description: Count of successful scans run on repos in this service - type: integer - format: int32 - failed_scans: - description: Count of failed scans run on repos in this service - type: integer - format: int32 - timestamps: - description: Oldest and latest retained scans run on this service - type: object - properties: - oldest_scan: - description: Timestamp of oldest retained scan run on a repo in this service - type: string - format: date-time - latest_scan: - description: Timestamp of most recent scan run on a repo in this service - type: string - format: date-time - - PagedSystemServices: - type: object - required: - - results - - count - - next - - previous - properties: - results: - description: One page of system services - type: array - items: - $ref: "#/components/schemas/SystemService" - count: - description: Number of items returned - type: integer - format: int32 - next: - description: Link to next page of results - type: string - previous: - description: Link to the previous page of results - type: string - - # Groups - GroupItem: - type: object - properties: - id: - description: Group UUID - type: string - format: uuid - parent: - description: Parent group UUID - type: string - format: uuid - name: - description: Group name - type: string - description: - description: Group description - type: string - created: - description: Group creation timestamp - type: string - format: date-time - created_by: - description: User that created the group - type: string - updated: - description: Group update timestamp - type: string - format: date-time - permissions: - description: Group permissions - type: object - properties: - scope: - description: Authorization scope for this group - type: array - items: - type: string - features: - description: Group feature flags - type: object - admin: - description: Group admin privileges - type: boolean - allowlist: - description: Whether the group members can do allowlist operations within the scope - type: boolean - PagedGroupItem: - type: object - required: - - results - - count - - next - - previous - properties: - results: - description: One page of groups. - type: array - items: - $ref: "#/components/schemas/GroupItem" - count: - description: Number of items returned - type: integer - format: int32 - next: - description: Link to next page of results - type: string - previous: - description: Link to the previous page of results - type: string - GroupRequest: - type: object - properties: - parent: - description: Parent group UUID - type: string - format: uuid - name: - description: Group name - type: string - description: - description: Group description - type: string - permissions: - description: Group permissions - type: object - properties: - scope: - description: Authorization scope for this group - type: array - items: - type: string - features: - description: Group feature flags - type: object - admin: - description: Group admin privileges - type: boolean - allowlist: - description: Whether the group members can do allowlist operations within the scope - type: boolean - - # Group members - GroupMemberItem: - type: object - properties: - email: - description: User email - type: string - group_admin: - description: Whether the user is an admin of the group - type: boolean - added: - description: When the user was added to the group - type: string - format: date-time - PagedGroupMemberItem: - type: object - required: - - results - - count - - next - - previous - properties: - results: - description: One page of group members - type: array - items: - $ref: "#/components/schemas/GroupMemberItem" - count: - description: Number of items returned - type: integer - format: int32 - next: - description: Link to next page of results - type: string - previous: - description: Link to the previous page of results - type: string - GroupMemberRequest: - type: object - properties: - group_admin: - description: Whether the user is an admin of the group - type: boolean - - # System Allowlist - SystemAllowlistItem: - type: object - required: - - type - - value - - reason - properties: - type: - description: System-wide allowlist item type - type: string - enum: - - secret - value: - description: The allowlisted value - oneOf: - - $ref: "#/components/schemas/SystemAllowlistSecretItem" - reason: - description: Reason for creation - type: string - created_by: - description: Autoset principal that created the item, ignored if passed in post/put requests. - type: string - updated_by: - description: Autoset principal that last updated the item, ignored if passed in post/put requests - type: string - created: - description: Autoset date-time the item was created, ignored if passed in post/put requests - type: string - format: date-time - updated: - description: Autoset date-time the item was last updated, ignored if passed in post/put requests - type: string - format: date-time - SystemAllowlistItemWithId: - allOf: - - $ref: "#/components/schemas/SystemAllowlistItem" - - type: object - required: - - id - properties: - id: - description: ID of the allowlist item - type: string - format: uuid - PagedSystemAllowlistItem: - type: object - required: - - results - - count - - next - - previous - properties: - results: - description: One page of system-wide allowlist items - type: array - items: - $ref: "#/components/schemas/SystemAllowlistItemWithId" - count: - description: Number of items returned - type: integer - format: int32 - next: - description: Link to next page of results - type: string - previous: - description: Link to the previous page of results - type: string - SystemAllowlistSecretItem: - type: object - properties: - filename: - description: Secret-containing filename (wildcard supported) - type: string - value: - description: Secret value to ignore (wildcard supported) - type: string - - # Reusable parameter definitions - parameters: - limit: - name: limit - in: query - description: Limit the number of records returned to this number. - required: false - schema: - type: integer - offset: - name: offset - in: query - description: The offset number to get the history from. - required: false - schema: - type: integer - name: - name: name - in: query - description: Filter on the name (exact match) - required: false - schema: - type: string - name__contains: - name: name__contains - in: query - description: Filter on the name (case-sensitive substring match) - required: false - schema: - type: string - name__icontains: - name: name__icontains - in: query - description: Filter on the name (case-insensitive substring match) - required: false - schema: - type: string - parent: - name: parent - in: query - description: Filter on the parent (exact match) - required: false - schema: - type: string - parent__contains: - name: parent__contains - in: query - description: Filter on the parent (case-sensitive substring match) - required: false - schema: - type: string - parent__icontains: - name: parent__icontains - in: query - description: Filter on the parent (case-insensitive substring match) - required: false - schema: - type: string - description: - name: description - in: query - description: Filter on the description (exact match) - required: false - schema: - type: string - description__contains: - name: description__contains - in: query - description: Filter on the description (case-sensitive substring match) - required: false - schema: - type: string - description__icontains: - name: description__icontains - in: query - description: Filter on the description (case-insensitive substring match) - required: false - schema: - type: string - created: - name: created - in: query - description: Filter on the created time (exact match) - required: false - schema: - type: string - format: date-time - created__gt: - name: created__gt - in: query - description: Filter on the created time (since timestamp) - required: false - schema: - type: string - format: date-time - created__lt: - name: created__lt - in: query - description: Filter on the created time (prior to timestamp) - required: false - schema: - type: string - format: date-time - expires: - name: expires - in: query - description: Filter on the expires time (exact match) - required: false - schema: - type: string - format: date-time - expires__gt: - name: expires__gt - in: query - description: Filter on the expires time (since timestamp) - required: false - schema: - type: string - format: date-time - expires__lt: - name: expires__lt - in: query - description: Filter on the expires time (prior to timestamp) - required: false - schema: - type: string - format: date-time - id: - name: id - in: path - description: ID - required: true - schema: - type: string - kid: - name: kid - in: path - description: API key ID - required: true - schema: - type: string - format: uuid - uid: - name: uid - in: path - description: User email address - required: true - schema: - type: string - batch_id: - name: batch_id - in: query - description: Filter on the batch ID (exact match) - required: false - schema: - type: string - format: uuid - service: - name: service - in: query - description: Filter on the service (exact match) - required: false - schema: - type: string - service__contains: - name: service__contains - in: query - description: Filter on the service (case-sensitive substring match) - required: false - schema: - type: string - service__icontains: - name: service__icontains - in: query - description: Filter on the service (case-insensitive substring match) - required: false - schema: - type: string - repo: - name: repo - in: query - description: Filter on the repo (exact match) - required: false - schema: - type: string - repo__contains: - name: repo__contains - in: query - description: Filter on the repo (case-sensitive substring match) - required: false - schema: - type: string - repo__icontains: - name: repo__icontains - in: query - description: Filter on the repo (case-insensitive substring match) - required: false - schema: - type: string - branch: - name: branch - in: query - description: Filter on the branch (exact match) - required: false - schema: - type: string - branch__contains: - name: branch__contains - in: query - description: Filter on the branch (case-sensitive substring match) - required: false - schema: - type: string - branch__icontains: - name: branch__icontains - in: query - description: Filter on the branch (case-insensitive substring match) - required: false - schema: - type: string - branch__isnull: - name: branch__isnull - in: query - description: Filter on the branch being null - required: false - schema: - type: boolean - sbom: - name: sbom - in: query - description: Filter on the scan being an SBOM scan - required: false - schema: - type: boolean - plugin_contains: - name: plugin__contains - in: query - description: Filter on a plugin (case-sensitive substring match) - required: false - schema: - type: string - plugin_icontains: - name: plugin__icontains - in: query - description: Filter on a plugin (case-insensitive substring match) - required: false - schema: - type: string - - securitySchemes: - x-api-key: - type: apiKey - description: API key - name: x-api-key - in: header diff --git a/backend/lambdas/api/spec.yaml b/backend/lambdas/api/spec.yaml new file mode 120000 index 00000000..dd9abacc --- /dev/null +++ b/backend/lambdas/api/spec.yaml @@ -0,0 +1 @@ +../../../ui/api/spec.yaml \ No newline at end of file diff --git a/ui/Makefile b/ui/Makefile index 216ecd82..88b232de 100644 --- a/ui/Makefile +++ b/ui/Makefile @@ -83,6 +83,7 @@ help: ## Print this help text clean: ## Remove production build files @echo "${INFO}Removing production build files" rm -rf $(DISTDIR) + rm -rf public/api/index.html @echo "${OK}" .PHONY: distclean @@ -171,6 +172,12 @@ mdlint: README.md ## Lint Markdown files $(NPM) run mdlint @echo "${OK}" +.PHONY: redocly-lint +redocly-lint: api/spec.yaml ## Lint API specification + @echo "${INFO}Linting API specification" + $(NPM) run redocly-lint + @echo "${OK}" + .PHONY: lint lint: $(SRC) ## Run all linting @echo "${INFO}Running all linting" diff --git a/ui/api/spec.yaml b/ui/api/spec.yaml new file mode 100644 index 00000000..eaca3c33 --- /dev/null +++ b/ui/api/spec.yaml @@ -0,0 +1,3788 @@ +openapi: 3.1.0 +info: + title: Artemis REST API + version: 1.1.0 + license: + name: MIT License + identifier: MIT + contact: + email: "cso_appsec@warnermedia.com" +tags: + - name: groups + description: Group actions + - name: repo + description: Repository actions + - name: report + description: Report actions + - name: sbom + description: SBOM actions + - name: search + description: Search actions + - name: system + description: System actions + - name: users + description: User actions + - name: whitelist + description: Whitelist actions +servers: + - url: https://{host}/api/v1 + variables: + host: + default: localhost + description: API host +paths: + "/{service}": + parameters: + - name: service + in: path + description: The VCS the organization is in + required: true + schema: + type: string + post: + summary: Submit a repository for analysis + tags: + - repo + operationId: repo_post + requestBody: + content: + "application/json": + schema: + type: array + minimum: 1 + items: + $ref: "#/components/schemas/ScanRequestWithRepoOrg" + responses: + "200": + description: Repository was queued for analysis + content: + "application/json": + schema: + $ref: "#/components/schemas/ScanResponse" + "400": + description: Request validation failed + "/{service}/{org}/{repo}": + parameters: + - name: service + in: path + description: The VCS the organization is in + required: true + schema: + type: string + - name: org + in: path + description: The organization the repository is in + required: true + schema: + type: string + - name: repo + in: path + description: The name of the repository + required: true + schema: + type: string + get: + summary: Retrieve a report of a repository + tags: + - repo + operationId: repo_get + parameters: + - name: results + in: query + description: The type of results to filter + schema: + type: string + enum: + - vulnerabilities + - secrets + - static_analysis + - inventory + - configuration + - name: severity + in: query + description: The vulnerability severity to filter + schema: + type: string + enum: + - critical + - high + - medium + - low + - negligible + - name: secret + in: query + description: The secret type to filter + schema: + type: string + enum: + - aws + - ssh + - name: format + in: query + description: The report format to return + schema: + type: string + enum: + - full + - summary + responses: + "200": + description: Analysis report + content: + "application/json": + schema: + $ref: "#/components/schemas/AnalysisReport" + "404": + description: Repository not found + post: + summary: Submit the repository for analysis + tags: + - repo + operationId: repo_url_post + requestBody: + content: + "application/json": + schema: + $ref: "#/components/schemas/ScanRequest" + responses: + "200": + description: Repository was queued for analysis + content: + "application/json": + schema: + $ref: "#/components/schemas/ScanResponse" + "400": + description: Request validation failed + "/{service}/{org}/{repo}/{id}": + parameters: + - name: service + in: path + description: The VCS the organization is in + required: true + schema: + type: string + - name: org + in: path + description: The organization the repository is in + required: true + schema: + type: string + - name: repo + in: path + description: The name of the repository + required: true + schema: + type: string + - name: id + in: path + description: The scan ID + required: true + schema: + type: string + get: + summary: Retrieve a report of a repository + tags: + - repo + operationId: repo_get_by_id + parameters: + - name: results + in: query + description: The type of results to filter + schema: + type: string + enum: + - vulnerabilities + - secrets + - static_analysis + - inventory + - configuration + - name: severity + in: query + description: The vulnerability severity to filter + schema: + type: string + enum: + - critical + - high + - medium + - low + - negligible + - name: secret + in: query + description: The secret type to filter + schema: + type: string + enum: + - aws + - ssh + - name: format + in: query + description: The report format to return + schema: + type: string + enum: + - full + - summary + - name: filter_diff + in: query + description: Whether to filter out items not included in diff. Has no effect if diff_base was not included in scan. + required: false + schema: + type: boolean + default: true + allowEmptyValue: true + responses: + "200": + description: Analysis report + content: + "application/json": + schema: + $ref: "#/components/schemas/AnalysisReport" + "404": + description: Repository not found + "/{service}/{org}/{repo}/history": + parameters: + - name: service + in: path + description: The VCS the organization is in + required: true + schema: + type: string + - name: org + in: path + description: The organization the repository is in + required: true + schema: + type: string + - name: repo + in: path + description: The name of the repository + required: true + schema: + type: string + - name: limit + in: query + description: Limit the number of records returned to this number. + required: false + schema: + type: integer + - name: offset + in: query + description: The offset number to get the history from. + required: false + schema: + type: integer + - name: inititated_by + in: query + description: Filter history to scans initiated by just this user. + required: false + schema: + type: string + - name: include_batch + in: query + description: Whether to include batch priority scans in the history + required: false + schema: + type: boolean + default: false + allowEmptyValue: true + - name: include_diff + in: query + description: Whether to include diff scans in the history + required: false + schema: + type: boolean + default: false + allowEmptyValue: true + get: + summary: Retrieve the scan history for a repository + tags: + - repo + operationId: repo_get_history + responses: + "200": + description: Scan history + content: + "application/json": + schema: + $ref: "#/components/schemas/PagedScanHistory" + "404": + description: Repository not found + "/{service}/{org}/{repo}/whitelist": + parameters: + - name: service + in: path + description: The VCS the organization is in + required: true + schema: + type: string + - name: org + in: path + description: The organization the repository is in + required: true + schema: + type: string + - name: repo + in: path + description: The name of the repository + required: true + schema: + type: string + get: + summary: Retrieve the whitelist for a repository + tags: + - whitelist + operationId: whitelist_get_all + parameters: + - name: type + in: query + description: The type of whitelist item to filter openapi + schema: + type: string + enum: + - vulnerability + - secret + - secret_raw + - static_analysis + - configuration + responses: + "200": + description: Whitelist + content: + "application/json": + schema: + type: array + minimum: 1 + items: + $ref: "#/components/schemas/WhitelistItem" + "404": + description: Repository not found + post: + summary: Create a new whitelist item + tags: + - whitelist + operationId: whitelist_post + parameters: + - name: org + in: path + description: The organization the repository is in + required: true + schema: + type: string + format: uuid + - name: repo + in: path + description: The name of the repository + required: true + schema: + type: string + requestBody: + content: + "application/json": + schema: + $ref: "#/components/schemas/WhitelistItem" + responses: + "204": + description: Update successful + "404": + description: Item not found + "/{service}/{org}/{repo}/whitelist/{id}": + parameters: + - name: service + in: path + description: The VCS the organization is in + required: true + schema: + type: string + - name: org + in: path + description: The organization the repository is in + required: true + schema: + type: string + format: uuid + - name: repo + in: path + description: The name of the repository + required: true + schema: + type: string + - name: id + in: path + description: The ID of the whitelist item + required: true + schema: + type: string + get: + summary: Retrieve a specific whitelist item for a repository + tags: + - whitelist + operationId: whitelist_get + responses: + "200": + description: Whitelist + content: + "application/json": + schema: + $ref: "#/components/schemas/WhitelistItemWithId" + "404": + description: Item not found + put: + summary: Update a specific whitelist item + tags: + - whitelist + operationId: whitelist_put + requestBody: + content: + "application/json": + schema: + $ref: "#/components/schemas/WhitelistItem" + responses: + "204": + description: Update successful + "404": + description: Item not found + delete: + summary: Delete a specific whitelist item + tags: + - whitelist + operationId: whitelist_delete + responses: + "204": + description: Delete successful + "404": + description: Item not found + "/{service}/{org}/{repo}/{id}/report": + parameters: + - name: service + in: path + description: The VCS the organization is in + required: true + schema: + type: string + - name: org + in: path + description: The organization the repository is in + required: true + schema: + type: string + - name: repo + in: path + description: The name of the repository + required: true + schema: + type: string + - name: id + in: path + description: The scan ID + required: true + schema: + type: string + get: + summary: Retrieve the most recent report generated for the scan + tags: + - report + operationId: report_get_latest + responses: + "200": + description: Report metadata + content: + "application/json": + schema: + $ref: "#/components/schemas/ReportResponse" + "404": + description: Repository, scan, or report not found + post: + summary: Request a new report be generated + tags: + - report + operationId: report_post + requestBody: + content: + "application/json": + schema: + $ref: "#/components/schemas/ReportRequest" + responses: + "200": + description: Report request was queued for generation + content: + "application/json": + schema: + $ref: "#/components/schemas/ScanResponse" + "207": + description: Some report requests were queued for generation and some failed to be queued + content: + "application/json": + schema: + $ref: "#/components/schemas/ScanResponse" + "404": + description: Scan not found + "/{service}/{org}/{repo}/{id}/report/{report_id}": + parameters: + - name: service + in: path + description: The VCS the organization is in + required: true + schema: + type: string + - name: org + in: path + description: The organization the repository is in + required: true + schema: + type: string + format: uuid + - name: repo + in: path + description: The name of the repository + required: true + schema: + type: string + - name: id + in: path + description: The ID of the scan + required: true + schema: + type: string + - name: report_id + in: path + description: The ID of the report + required: true + schema: + type: string + get: + summary: Retrieve the report generated for the scan with the provided ID + tags: + - report + operationId: report_get_by_id + responses: + "200": + description: Report metadata + content: + "application/json": + schema: + $ref: "#/components/schemas/ReportResponse" + "404": + description: Repository, scan, or report not found + /users: + parameters: + - name: limit + in: query + description: Limit the number of records returned to this number. + required: false + schema: + type: integer + - name: offset + in: query + description: The offset number to get the history from. + required: false + schema: + type: integer + - name: admin + in: query + description: Filter on the admin flag + required: false + schema: + type: boolean + - name: email + in: query + description: Filter on the email (exact match) + required: false + schema: + type: string + - name: email__contains + in: query + description: Filter on the email (case-sensitive substring match) + required: false + schema: + type: string + - name: email__icontains + in: query + description: Filter on the email (case-insensitive substring match) + required: false + schema: + type: string + - name: scope + in: query + description: Filter on the scope (exact match) + required: false + schema: + type: string + - name: scope__contains + in: query + description: Filter on the scope (case-sensitive substring match) + required: false + schema: + type: string + - name: scope__icontains + in: query + description: Filter on the scope (case-insensitive substring match) + required: false + schema: + type: string + - name: features + in: query + description: Filter on the features (exact match) use -feature to exclude feature + required: false + schema: + type: string + - name: last_login + in: query + description: Filter on the last_login (exact match) + required: false + schema: + type: string + format: date-time + - name: last_login__lt + in: query + description: Filter on the last_login (match before time) + required: false + schema: + type: string + format: date-time + - name: last_login__gt + in: query + description: Filter on the last_login (match after time) + required: false + schema: + type: string + format: date-time + - name: order_by + in: query + description: Order the list by the fields listed + required: false + schema: + type: string + enum: + - admin + - -admin + - email + - -email + - scope + - -scope + - last_login + - -last_login + get: + summary: Return a list of users + tags: + - users + operationId: users + responses: + "200": + description: List of users + content: + "application/json": + schema: + $ref: "#/components/schemas/PagedUserItem" + "/users/{id}": + parameters: + - name: id + in: path + description: user ID (email address or "self") + required: true + schema: + type: string + get: + summary: Return information about the user + tags: + - users + operationId: users_id + responses: + "200": + description: Information specific to the logged in user. + content: + "application/json": + schema: + $ref: "#/components/schemas/UserItem" + post: + summary: Create a user + tags: + - users + operationId: users_id_post + requestBody: + content: + "application/json": + schema: + $ref: "#/components/schemas/UserRequest" + responses: + "200": + description: API key created + content: + "application/json": + schema: + $ref: "#/components/schemas/UserItem" + "400": + description: Request validation failed + "409": + description: User exists + put: + summary: Update a user + tags: + - users + operationId: users_id_put + requestBody: + content: + "application/json": + schema: + $ref: "#/components/schemas/UserRequest" + responses: + "200": + description: API key created + content: + "application/json": + schema: + $ref: "#/components/schemas/UserItem" + "400": + description: Request validation failed + delete: + summary: Delete a user + tags: + - users + operationId: users_id_delete + responses: + "204": + description: Delete successful + "404": + description: User not found + "/users/{id}/keys": + parameters: + - name: id + in: path + description: user ID (email address or "self") + required: true + schema: + type: string + - name: limit + in: query + description: Limit the number of records returned to this number. + required: false + schema: + type: integer + - name: offset + in: query + description: The offset number to get the history from. + required: false + schema: + type: integer + get: + summary: Return API key information + tags: + - users + operationId: users_id_keys + responses: + "200": + description: API keys + content: + "application/json": + schema: + type: array + minimum: 1 + items: + $ref: "#/components/schemas/PagedAPIKeyItem" + post: + summary: Create an API key + tags: + - users + operationId: users_id_keys_post + requestBody: + content: + "application/json": + schema: + $ref: "#/components/schemas/APIKeyRequest" + responses: + "200": + description: API key created + content: + "application/json": + schema: + $ref: "#/components/schemas/APIKeyResponse" + "400": + description: Request validation failed + "/users/{id}/keys/{kid}": + parameters: + - name: id + in: path + description: user ID (email address or "self") + required: true + schema: + type: string + - name: kid + in: path + description: API key ID + required: true + schema: + type: string + format: uuid + get: + summary: Return API key information + tags: + - users + operationId: users_id_keys_item + responses: + "200": + description: API key + content: + "application/json": + schema: + $ref: "#/components/schemas/APIKeyItem" + delete: + summary: Delete an API key + tags: + - users + operationId: users_self_keys_delete + responses: + "204": + description: Delete successful + "404": + description: Item not found + "/users/{id}/services": + parameters: + - name: id + in: path + description: user ID (email address or "self") + required: true + schema: + type: string + get: + summary: Return list of linked user services + tags: + - users + operationId: users_id_services_get + responses: + "200": + description: Get successful + content: + "application/json": + schema: + $ref: "#/components/schemas/UsersServicesResponse" + post: + summary: Link a new user service + tags: + - users + operationId: users_id_services_post + requestBody: + content: + "application/json": + schema: + $ref: "#/components/schemas/UsersServicesRequest" + responses: + "200": + description: Post successful + content: + "application/json": + schema: + $ref: "#/components/schemas/UsersServicesResponse" + "400": + description: | + Name is required, \ + params is required, \ + Service ID invalid, \ + Either auth_code or username param is required, \ + Invalid auth_code param + "409": + description: User exists + + "/users/{id}/services/{sid}": + parameters: + - name: id + in: path + description: user ID (email address or "self") + required: true + schema: + type: string + - name: sid + in: path + description: service ID + required: true + schema: + type: string + get: + summary: Return info for linked service + tags: + - users + operationId: users_id_services_sid_get + responses: + "200": + description: Get successful + content: + "application/json": + schema: + $ref: "#/components/schemas/UsersServicesServiceResponse" + "404": + description: Service not found for user + delete: + summary: Unlink user service + tags: + - users + operationId: users_id_services_sid_delete + responses: + "204": + description: Delete successful + + # SBOM paths + /sbom/components: + parameters: + - name: limit + in: query + description: Limit the number of records returned to this number. + required: false + schema: + type: integer + - name: offset + in: query + description: The offset number to get the paging from. + required: false + schema: + type: integer + - name: name + in: query + description: Filter on the component name (exact match) + required: false + schema: + type: string + - name: name__contains + in: query + description: Filter on the component name (case-sensitive substring match) + required: false + schema: + type: string + - name: name__icontains + in: query + description: Filter on the component name (case-insensitive substring match) + required: false + schema: + type: string + - name: version + in: query + description: Filter on the component version (exact match) + required: false + schema: + type: string + - name: version__contains + in: query + description: Filter on the component version (case-sensitive substring match) + required: false + schema: + type: string + - name: version__icontains + in: query + description: Filter on the component version (case-insensitive substring match) + required: false + schema: + type: string + - name: license + in: query + description: Filter on the component license (exact match) + required: false + schema: + type: string + - name: license__contains + in: query + description: Filter on the component license (case-sensitive substring match) + required: false + schema: + type: string + - name: license__icontains + in: query + description: Filter on the component license (case-insensitive substring match) + required: false + schema: + type: string + - name: service + in: query + description: Filter on the component repository service name (exact match) + required: false + schema: + type: string + - name: service__contains + in: query + description: Filter on the component repository service name (case-sensitive substring match) + required: false + schema: + type: string + - name: service__icontains + in: query + description: Filter on the component repository service name (case-insensitive substring match) + required: false + schema: + type: string + - name: repo + in: query + description: Filter on the component repository name (exact match) + required: false + schema: + type: string + - name: repo__contains + in: query + description: Filter on the component repository name (case-sensitive substring match) + required: false + schema: + type: string + - name: repo__icontains + in: query + description: Filter on the component repository name (case-insensitive substring match) + required: false + schema: + type: string + - name: last_scan + in: query + description: Filter on the component last scan time (exact match) + required: false + schema: + type: string + format: date-time + - name: last_scan__gt + in: query + description: Filter on the component last scan time (since timestamp) + required: false + schema: + type: string + format: date-time + - name: last_scan__lt + in: query + description: Filter on the component last scan time (prior to timestamp) + required: false + schema: + type: string + format: date-time + - name: order_by + in: query + description: Order the list by the fields listed + required: false + schema: + type: string + enum: + - name + - -name + - version + - -version + get: + summary: Return a list of components + tags: + - sbom + operationId: sbom_components + responses: + "200": + description: List of components + content: + "application/json": + schema: + $ref: "#/components/schemas/PagedSBOMComponents" + "/sbom/components/{name}": + parameters: + - name: name + in: path + description: Component name (URL-component-encoded) + required: true + schema: + type: string + - name: limit + in: query + description: Limit the number of records returned to this number. + required: false + schema: + type: integer + - name: offset + in: query + description: The offset number to get the paging from. + required: false + schema: + type: integer + - name: version + in: query + description: Filter on the component version (exact match) + required: false + schema: + type: string + - name: version__contains + in: query + description: Filter on the component version (case-sensitive substring match) + required: false + schema: + type: string + - name: version__icontains + in: query + description: Filter on the component version (case-insensitive substring match) + required: false + schema: + type: string + - name: license + in: query + description: Filter on the component license (exact match) + required: false + schema: + type: string + - name: license__contains + in: query + description: Filter on the component license (case-sensitive substring match) + required: false + schema: + type: string + - name: license__icontains + in: query + description: Filter on the component license (case-insensitive substring match) + required: false + schema: + type: string + - name: service + in: query + description: Filter on the component repository service name (exact match) + required: false + schema: + type: string + - name: service__contains + in: query + description: Filter on the component repository service name (case-sensitive substring match) + required: false + schema: + type: string + - name: service__icontains + in: query + description: Filter on the component repository service name (case-insensitive substring match) + required: false + schema: + type: string + - name: repo + in: query + description: Filter on the component repository name (exact match) + required: false + schema: + type: string + - name: repo__contains + in: query + description: Filter on the component repository name (case-sensitive substring match) + required: false + schema: + type: string + - name: repo__icontains + in: query + description: Filter on the component repository name (case-insensitive substring match) + required: false + schema: + type: string + - name: last_scan + in: query + description: Filter on the component last scan time (exact match) + required: false + schema: + type: string + format: date-time + - name: last_scan__gt + in: query + description: Filter on the component last scan time (since timestamp) + required: false + schema: + type: string + format: date-time + - name: last_scan__lt + in: query + description: Filter on the component last scan time (prior to timestamp) + required: false + schema: + type: string + format: date-time + - name: order_by + in: query + description: Order the list by the fields listed + required: false + schema: + type: string + enum: + - name + - -name + - version + - -version + get: + summary: Return a list of component versions + tags: + - sbom + operationId: sbom_components_name + responses: + "200": + description: List of component versions for the component name + content: + "application/json": + schema: + $ref: "#/components/schemas/PagedSBOMComponents" + "404": + description: Component not found + "/sbom/components/{name}/{version}": + parameters: + - name: name + in: path + description: Component name (URL-component-encoded) + required: true + schema: + type: string + - name: version + in: path + description: Component version (URL-component-encoded) + required: true + schema: + type: string + get: + summary: Return information about the specific version of the component + tags: + - sbom + operationId: sbom_components_name_version + responses: + "200": + description: Information about the component version + content: + "application/json": + schema: + $ref: "#/components/schemas/SBOMComponent" + "404": + description: Component version not found + "/sbom/components/{name}/{version}/repos": + parameters: + - name: name + in: path + description: Component name (URL-component-encoded) + required: true + schema: + type: string + - name: version + in: path + description: Component version (URL-component-encoded) + required: true + schema: + type: string + - name: limit + in: query + description: Limit the number of records returned to this number. + required: false + schema: + type: integer + - name: offset + in: query + description: The offset number to get the paging from. + required: false + schema: + type: integer + - name: license + in: query + description: Filter on the component license (exact match) + required: false + schema: + type: string + - name: service + in: query + description: Filter on the component repository service name (exact match) + required: false + schema: + type: string + - name: service__contains + in: query + description: Filter on the component repository service name (case-sensitive substring match) + required: false + schema: + type: string + - name: service__icontains + in: query + description: Filter on the component repository service name (case-insensitive substring match) + required: false + schema: + type: string + - name: repo + in: query + description: Filter on the component repository name (exact match) + required: false + schema: + type: string + - name: repo__contains + in: query + description: Filter on the component repository name (case-sensitive substring match) + required: false + schema: + type: string + - name: repo__icontains + in: query + description: Filter on the component repository name (case-insensitive substring match) + required: false + schema: + type: string + - name: last_scan + in: query + description: Filter on the component last scan time (exact match) + required: false + schema: + type: string + format: date-time + - name: last_scan__gt + in: query + description: Filter on the component last scan time (since timestamp) + required: false + schema: + type: string + format: date-time + - name: last_scan__lt + in: query + description: Filter on the component last scan time (prior to timestamp) + required: false + schema: + type: string + format: date-time + - name: order_by + in: query + description: Order the list by the fields listed + required: false + schema: + type: string + enum: + - service + - -service + - repo + - -repo + get: + summary: Return a list of repositories containing the component + tags: + - sbom + operationId: sbom_components_name_version_repos + responses: + "200": + description: List of repositories containing the component + content: + "application/json": + schema: + $ref: "#/components/schemas/PagedSBOMRepositories" + "404": + description: Component version not found + /sbom/licenses: + parameters: + - name: limit + in: query + description: Limit the number of records returned to this number. + required: false + schema: + type: integer + - name: offset + in: query + description: The offset number to get the paging from. + required: false + schema: + type: integer + - name: name + in: query + description: Filter on the component name (exact match) + required: false + schema: + type: string + - name: name__contains + in: query + description: Filter on the component name (case-sensitive substring match) + required: false + schema: + type: string + - name: name__icontains + in: query + description: Filter on the component name (case-insensitive substring match) + required: false + schema: + type: string + - name: order_by + in: query + description: Order the list by the fields listed + required: false + schema: + type: string + enum: + - name + - -name + get: + summary: Return a list of licenses + tags: + - sbom + operationId: sbom_licenses + responses: + "200": + description: List of licenses + content: + "application/json": + schema: + $ref: "#/components/schemas/PagedSBOMLicenses" + "/sbom/licenses/{id}": + parameters: + - name: id + in: path + description: License ID + required: true + schema: + type: string + get: + summary: Return information about the specific license + tags: + - sbom + operationId: sbom_licenses_id + responses: + "200": + description: Information about the license + content: + "application/json": + schema: + $ref: "#/components/schemas/SBOMLicense" + "404": + description: License not found + + # Search paths + /search/repositories: + parameters: + - name: limit + in: query + description: Limit the number of records returned to this number. + required: false + schema: + type: integer + - name: offset + in: query + description: The offset number to get the paging from. + required: false + schema: + type: integer + - name: service + in: query + description: Filter on the repository service name (exact match) + required: false + schema: + type: string + - name: service__contains + in: query + description: Filter on the repository service name (case-sensitive substring match) + required: false + schema: + type: string + - name: service__icontains + in: query + description: Filter on the repository service name (case-insensitive substring match) + required: false + schema: + type: string + - name: repo + in: query + description: Filter on the repository name (exact match) + required: false + schema: + type: string + - name: repo__contains + in: query + description: Filter on the repository name (case-sensitive substring match) + required: false + schema: + type: string + - name: repo__icontains + in: query + description: Filter on the repository name (case-insensitive substring match) + required: false + schema: + type: string + - name: last_qualified_scan + in: query + description: Filter on the last qualified scan time (exact match) + required: false + schema: + type: string + format: date-time + - name: last_qualified_scan__gt + in: query + description: Filter on the last qualified scan time (since timestamp) + required: false + schema: + type: string + format: date-time + - name: last_qualified_scan__lt + in: query + description: Filter on the last qualified scan time (prior to timestamp) + required: false + schema: + type: string + format: date-time + - name: last_qualified_scan__isnull + in: query + description: Filter on the presence of any qualified scan + required: false + schema: + type: boolean + - name: risk + in: query + description: Filter on the risk level of the repository + required: false + schema: + type: string + enum: + - priority + - critical + - high + - moderate + - low + - name: app_id + in: query + description: Filter on the repository application ID (exact match) + required: false + schema: + type: string + - name: app_id__isnull + in: query + description: Filter on the presense of any repository application ID (exact match) + required: false + schema: + type: boolean + - name: repo_contact + in: query + description: Filter on the repository contact (exact match) + required: false + schema: + type: string + - name: repo_contact__contains + in: query + description: Filter on the repository contact (case-sensitive substring match) + required: false + schema: + type: string + - name: repo_contact__icontains + in: query + description: Filter on the repository contact (case-insensitive substring match) + required: false + schema: + type: string + - name: repo_contact__isnull + in: query + description: Filter on the presense of a repository contact + required: false + schema: + type: boolean + - name: order_by + in: query + description: Order the list by the fields listed + required: false + schema: + type: string + enum: + - service + - -service + - repo + - -repo + - risk + - -risk + get: + summary: Return a list of repositories + tags: + - search + operationId: search_repositories + responses: + "200": + description: List of repositories + content: + "application/json": + schema: + $ref: "#/components/schemas/PagedSearchRepositories" + /search/scans: + parameters: + - $ref: "#/components/parameters/limit" + - $ref: "#/components/parameters/offset" + - $ref: "#/components/parameters/batch_id" + - $ref: "#/components/parameters/created" + - $ref: "#/components/parameters/created__lt" + - $ref: "#/components/parameters/created__gt" + - $ref: "#/components/parameters/service" + - $ref: "#/components/parameters/service__contains" + - $ref: "#/components/parameters/service__icontains" + - $ref: "#/components/parameters/repo" + - $ref: "#/components/parameters/repo__contains" + - $ref: "#/components/parameters/repo__icontains" + - $ref: "#/components/parameters/branch" + - $ref: "#/components/parameters/branch__contains" + - $ref: "#/components/parameters/branch__icontains" + - $ref: "#/components/parameters/branch__isnull" + - $ref: "#/components/parameters/sbom" + - $ref: "#/components/parameters/plugin_contains" + - $ref: "#/components/parameters/plugin_icontains" + - name: order_by + in: query + description: Order the list by the fields listed + required: false + schema: + type: string + enum: + - created + - -created + get: + summary: Return a list of scans + tags: + - search + operationId: search_scans + responses: + "200": + description: List of scans + content: + "application/json": + schema: + $ref: "#/components/schemas/PagedScanHistory" + + # System paths + /system/status: + get: + summary: Return the system status + tags: + - system + operationId: system_status + responses: + "200": + description: System status when not in maintenance + content: + "application/json": + schema: + $ref: "#/components/schemas/SystemStatus" + "503": + description: System status when in maintenance + content: + "application/json": + schema: + $ref: "#/components/schemas/SystemStatus" + /system/allowlist: + get: + summary: Retrieve the system-wide allowlist + tags: + - system_allowlist + operationId: system_allowlist_get_all + responses: + "200": + description: System allowlist + content: + "application/json": + schema: + type: array + minimum: 1 + items: + $ref: "#/components/schemas/PagedSystemAllowlistItem" + post: + summary: Create a new allowlist item + tags: + - system_allowlist + operationId: system_allowlist_post + requestBody: + content: + "application/json": + schema: + $ref: "#/components/schemas/SystemAllowlistItem" + responses: + "200": + description: Creation successful + content: + "application/json": + schema: + $ref: "#/components/schemas/SystemAllowlistItemWithId" + "/system/allowlist/{id}": + parameters: + - $ref: "#/components/parameters/id" + get: + summary: Retrieve a specific system-wide allowlist item + tags: + - system_allowlist + operationId: system_allowlist_get + responses: + "200": + description: Allowlist item + content: + "application/json": + schema: + $ref: "#/components/schemas/SystemAllowlistItemWithId" + "404": + description: Item not found + put: + summary: Update a specific system-wide allowlist item + tags: + - system_allowlist + operationId: system_allowlist_put + requestBody: + content: + "application/json": + schema: + $ref: "#/components/schemas/SystemAllowlistItem" + responses: + "204": + description: Update successful + "404": + description: Item not found + delete: + summary: Delete a specific system-wide allowlist item + tags: + - system_allowlist + operationId: system_allowlist_delete + responses: + "204": + description: Delete successful + "404": + description: Item not found + + /system/services: + get: + summary: Return a list of connected VCS services + tags: + - system + operationId: system_services_get_all + responses: + "200": + description: List of system services + content: + "application/json": + schema: + $ref: "#/components/schemas/PagedSystemServices" + + "/system/services/{id}": + parameters: + - $ref: "#/components/parameters/id" + get: + summary: Retrieve a specific system VCS service and its connectivity status + tags: + - system + operationId: system_services_get + responses: + "200": + description: System service item + content: + "application/json": + schema: + $ref: "#/components/schemas/SystemService" + "404": + description: Item not found + + "/system/services/{id}/stats": + parameters: + - $ref: "#/components/parameters/id" + get: + summary: Retrieve a specific system VCS service and its scanning stats + tags: + - system + operationId: system_services_stats_get + responses: + "200": + description: System service stats item + content: + "application/json": + schema: + $ref: "#/components/schemas/SystemServiceStats" + "404": + description: Item not found + + # Group paths + /groups: + parameters: + - $ref: "#/components/parameters/limit" + - $ref: "#/components/parameters/offset" + - $ref: "#/components/parameters/name" + - $ref: "#/components/parameters/name__contains" + - $ref: "#/components/parameters/name__icontains" + - $ref: "#/components/parameters/parent" + - $ref: "#/components/parameters/parent__contains" + - $ref: "#/components/parameters/parent__icontains" + - $ref: "#/components/parameters/description" + - $ref: "#/components/parameters/description__contains" + - $ref: "#/components/parameters/description__icontains" + - name: order_by + in: query + description: Order the list by the fields listed + required: false + schema: + type: string + enum: + - name + - -name + - parent + - -parent + - created + - -created + - allowlist + - -allowlist + get: + summary: Return a list of groups + tags: + - groups + operationId: groups + responses: + "200": + description: List of groups + content: + "application/json": + schema: + $ref: "#/components/schemas/PagedGroupItem" + post: + summary: Create a group + tags: + - groups + operationId: groups_post + requestBody: + content: + "application/json": + schema: + $ref: "#/components/schemas/GroupRequest" + responses: + "200": + description: Group created + content: + "application/json": + schema: + $ref: "#/components/schemas/GroupItem" + "400": + description: Request validation failed + "409": + description: Group exists + "/groups/{id}": + parameters: + - $ref: "#/components/parameters/id" + get: + summary: Return information about the group + tags: + - groups + operationId: groups_id + responses: + "200": + description: Information specific to the group. + content: + "application/json": + schema: + $ref: "#/components/schemas/GroupItem" + "404": + description: Group not found + put: + summary: Update a group + tags: + - groups + operationId: groups_id_put + requestBody: + content: + "application/json": + schema: + $ref: "#/components/schemas/GroupRequest" + responses: + "200": + description: Group updated + content: + "application/json": + schema: + $ref: "#/components/schemas/GroupItem" + "400": + description: Request validation failed + delete: + summary: Delete a group + tags: + - groups + operationId: group_id_delete + responses: + "204": + description: Delete successful + "404": + description: Group not found + "/groups/{id}/keys": + parameters: + - $ref: "#/components/parameters/id" + - $ref: "#/components/parameters/limit" + - $ref: "#/components/parameters/offset" + - $ref: "#/components/parameters/name" + - $ref: "#/components/parameters/name__contains" + - $ref: "#/components/parameters/name__icontains" + - $ref: "#/components/parameters/created" + - $ref: "#/components/parameters/created__lt" + - $ref: "#/components/parameters/created__gt" + - $ref: "#/components/parameters/expires" + - $ref: "#/components/parameters/expires__lt" + - $ref: "#/components/parameters/expires__gt" + - name: order_by + in: query + description: Order the list by the fields listed + required: false + schema: + type: string + enum: + - name + - -name + - created + - -created + - expires + - -expires + get: + summary: Return API key information + tags: + - groups + operationId: groups_id_keys + responses: + "200": + description: API keys + content: + "application/json": + schema: + type: array + minimum: 1 + items: + $ref: "#/components/schemas/PagedAPIKeyItem" + "404": + description: Group not found + post: + summary: Create an API key + tags: + - groups + operationId: groups_id_keys_post + requestBody: + content: + "application/json": + schema: + $ref: "#/components/schemas/APIKeyRequest" + responses: + "200": + description: API key created + content: + "application/json": + schema: + $ref: "#/components/schemas/APIKeyResponse" + "400": + description: Request validation failed + "404": + description: Group not found + "/groups/{id}/keys/{kid}": + parameters: + - $ref: "#/components/parameters/id" + - $ref: "#/components/parameters/kid" + get: + summary: Return API key information + tags: + - groups + operationId: groups_id_keys_item + responses: + "200": + description: API key + content: + "application/json": + schema: + $ref: "#/components/schemas/APIKeyItem" + "404": + description: Group or key not found + delete: + summary: Delete an API key + tags: + - groups + operationId: groups_id_keys_delete + responses: + "204": + description: Delete successful + "404": + description: Group or key not found + "/groups/{id}/members": + parameters: + - $ref: "#/components/parameters/id" + get: + summary: Return list of group members + tags: + - groups + operationId: groups_id_members_get + responses: + "200": + description: Get successful + content: + "application/json": + schema: + $ref: "#/components/schemas/PagedGroupMemberItem" + "404": + description: Group not found + "/groups/{id}/members/{uid}": + parameters: + - $ref: "#/components/parameters/id" + - $ref: "#/components/parameters/uid" + get: + summary: Return group members + tags: + - groups + operationId: groups_id_members_uid_get + responses: + "200": + description: Get successful + content: + "application/json": + schema: + $ref: "#/components/schemas/GroupMemberItem" + "404": + description: Group or member not found + post: + summary: Add a user to a group + tags: + - groups + operationId: groups_id_members_uid_post + requestBody: + content: + "application/json": + schema: + $ref: "#/components/schemas/GroupMemberRequest" + responses: + "200": + description: Post successful + content: + "application/json": + schema: + $ref: "#/components/schemas/GroupMemberItem" + "400": + description: Invalid request + "404": + description: Group or user not found + "409": + description: User is already a member + put: + summary: Update a user in a group + tags: + - groups + operationId: groups_id_members_uid_put + requestBody: + content: + "application/json": + schema: + $ref: "#/components/schemas/GroupMemberRequest" + responses: + "200": + description: Update successful + content: + "application/json": + schema: + $ref: "#/components/schemas/GroupMemberItem" + "400": + description: Invalid request + "404": + description: Group or user not found + delete: + summary: Remove a user from a group + tags: + - groups + operationId: groups_id_members_uid_delete + responses: + "204": + description: Removal successful + "404": + description: Group or user not found + +security: + - x-api-key: [] + +components: + # Reusable object schemas + schemas: + ScanRequest: + type: object + properties: + branch: + description: Repository branch + type: string + plugins: + description: List of plugins to run during analysis + type: array + items: + type: string + enum: + - checkov + - swiftlint + - detekt + - aqua_cli_scanner + - findsecbugs_java7 + - findsecbugs_java8 + - findsecbugs_java13 + - gitsecrets + - github_repo_health + - gitlab_repo_health + - node_dependencies + - owasp_dependency_check + - php_sensio_security_checker + - python_code_checker + - technology_discovery + - cicd_tools + - trufflehog + - brakeman + - bundler_audit + - bandit + - eslint + - nodejsscan + categories: + description: List of plugin categories to run during analysis + type: array + items: + type: string + enum: + - vulnerability + - secret + - static_analysis + - inventory + - configuration + depth: + description: Max number of commits to analyze + type: integer + format: int32 + default: 500 + include_dev: + description: Whether to include dev dependencies in analysis + type: boolean + default: false + callback: + description: Scan complete callback + type: object + properties: + url: + description: Callback URL to POST to + type: string + client_id: + description: Client-specified ID to echo back in POST + type: string + batch_priority: + description: Whether to give the scan batch (lower) batch_priority + type: boolean + default: false + diff_base: + description: Commit hash or branch name to use for diff-based reporting + type: + - string + - "null" + minLength: 1 + maxLength: 256 + batch_id: + description: Scan Batch ID + type: string + include_paths: + description: List of paths within the repo to include in the scan. Stacks with exclude_paths. Optional, by default the entire repo is scanned. If include_paths is used and exclude_paths is missing or empty exclude_paths defaults to ["*"]. + type: array + items: + type: string + exclude_paths: + description: List of paths within the repo to exclude from the scan. If include_paths is used and exclude_paths is missing or empty exclude_paths defaults to ["*"]. + type: array + items: + type: string + ScanRequestWithRepoOrg: + allOf: + - $ref: "#/components/schemas/ScanRequest" + - type: object + required: + - repo + properties: + repo: + description: Name of the repository + type: string + org: + description: Organization the repository belongs to + type: string + ScanResponse: + type: object + properties: + queued: + description: Repositories successfully queued with scan IDs + type: array + items: + type: string + failed: + description: Repositories that failed + type: array + items: + properties: + repo: + description: Repository name + type: string + error: + description: Error message + type: string + ScanHistoryItem: + type: object + required: + - repo + - branch + - timestamp + - initiated_by + properties: + repo: + description: Repo name with scan ID + type: string + branch: + description: Scan branch name + type: string + timestamps: + description: Start and end times of scan + type: object + properties: + queued: + description: Time the scan was queued + type: string + format: date-time + start: + description: Time scan started + type: string + format: date-time + end: + description: Time scan finished + type: string + format: date-time + initiated_by: + description: User ID of the user that initiated the scan + type: string + status: + description: Status of the most recent analysis job + type: string + enum: + - queued + - processing + - completed + - failed + status_detail: + description: Detailed scan status + type: object + properties: + plugin_name: + description: Currently running plugin + type: string + plugin_start_time: + description: Start time of current plugin + type: string + format: date-time + current_plugin: + description: Count of plugins run + type: integer + format: int32 + total_plugins: + description: Total number of plugins + type: integer + format: int32 + scan_options: + description: Options used at scan creation + $ref: "#/components/schemas/ScanRequest" + PagedScanHistory: + type: object + required: + - history + properties: + history: + description: One page of scan history results. + type: array + items: + $ref: "#/components/schemas/ScanHistoryItem" + last_scan_id: + description: identifies the last scan in the page of results, used to get the next page of results in a subsequent request + type: string + AnalysisReport: + type: object + properties: + repo: + description: Repository name + type: string + scan_id: + description: Scan ID + type: string + branch: + description: Branch name + type: string + engine_id: + description: ID of the engine that ran the scan, for troubleshooting purposes + type: string + initiated_by: + description: User ID of the user that initiated the scan + type: string + scan_options: + description: Options used at scan creation + $ref: "#/components/schemas/ScanRequest" + status: + description: Status of the most recent analysis job + type: string + enum: + - queued + - processing + - completed + - failed + status_detail: + description: Detailed scan status + type: object + properties: + plugin_name: + description: Currently running plugin + type: string + plugin_start_time: + description: Start time of current plugin + type: string + format: date-time + current_plugin: + description: Count of plugins run + type: integer + format: int32 + total_plugins: + description: Total number of plugins + type: integer + format: int32 + success: + description: Whether the scan found no issues taking current filters into account + type: boolean + truncated: + description: Whether the raw results exceeded storage limits and were truncated + type: boolean + timestamps: + description: Start and end times of scan + type: object + properties: + queued: + description: Time the scan was queued + type: string + format: date-time + start: + description: Time scan started + type: string + format: date-time + end: + description: Time scan finished + type: string + format: date-time + errors: + description: Error messages + type: object + additionalProperties: + type: array + items: + description: Error messages + type: string + alerts: + description: Messages alerting the user to addressable things that are not scan failures + type: object + additionalProperties: + type: array + items: + description: Alert messages + type: string + debug: + description: Debug messages + type: object + additionalProperties: + type: array + items: + description: Debug messages + type: string + results_summary: + description: Summary scan results + type: object + properties: + vulnerabilities: + type: object + description: The summary of vulnerablities + properties: + critical: + description: The number of critical severity vulnerabilities + type: integer + format: int32 + high: + description: The number of high severity vulnerabilities + type: integer + format: int32 + medium: + description: The number of medium severity vulnerabilities + type: integer + format: int32 + low: + description: The number of low severity vulnerabilities + type: integer + format: int32 + negligible: + description: The number of negligible vulnerabilities + type: integer + format: int32 + secrets: + type: integer + description: The number of secrets + format: int32 + static_analysis: + type: object + description: The summary of static analysis findings + properties: + critical: + description: The number of critical severity findings + type: integer + format: int32 + high: + description: The number of high severity findings + type: integer + format: int32 + medium: + description: The number of medium severity findings + type: integer + format: int32 + low: + description: The number of low severity findings + type: integer + format: int32 + negligible: + description: The number of negligible findings + type: integer + format: int32 + inventory: + type: object + description: The summary of inventory findings + properties: + technology_discovery: + description: The number of technologies discovered + type: integer + format: int32 + base_images: + description: The number of base images + type: integer + format: int32 + configuration: + type: object + description: The summary of configuration findings + properties: + critical: + description: The number of critical severity findings + type: integer + format: int32 + high: + description: The number of high severity findings + type: integer + format: int32 + medium: + description: The number of medium severity findings + type: integer + format: int32 + low: + description: The number of low severity findings + type: integer + format: int32 + negligible: + description: The number of negligible findings + type: integer + format: int32 + results: + description: Scan results + type: object + properties: + vulnerabilities: + type: object + description: The vulnerable component + additionalProperties: + type: object + description: The ID of the vulnerability + properties: + source: + description: The dependency source of the component + type: array + items: + type: string + severity: + description: The severity of the vulnerability + type: string + enum: + - critical + - high + - medium + - low + - negligible + description: + description: Short description of the vulnerability + type: string + remediation: + description: Remediation steps for the vulnerability + type: string + secrets: + type: object + description: The name of the file with the secret + additionalProperties: + type: array + items: + type: object + properties: + type: + description: Type of secret + type: string + enum: + - aws + - ssh + - mongo + - postgres + - redis + - urlauth + - google + - slack + - other + line: + description: Location within the file + type: integer + commit: + description: Hash of commit that added the secret + type: string + static_analysis: + type: object + description: File that is noted to have vulnerabilities or insecure code + additionalProperties: + type: array + items: + type: object + properties: + line: + description: Location within the file + type: integer + message: + description: message provided by analysis regarding issue + type: string + severity: + description: The severity of the insecurity or issue + type: string + enum: + - critical + - high + - medium + - low + - negligible + type: + description: Type of issue or insecurity + type: string + inventory: + type: object + description: Name of plugin providing information about the project + additionalProperties: + type: object + description: output of the plugin + configuration: + type: object + description: Configuration check that does not meet the requirements + additionalProperties: + type: object + description: The ID of the vulnerability + properties: + name: + description: Human-readable name for the check + type: string + description: + description: Short description of the check + type: string + severity: + description: The severity of the failing check + type: string + enum: + - critical + - high + - medium + - low + - negligible + WhitelistItem: + type: object + required: + - type + - value + - reason + - created_by + - created + - updated + properties: + type: + description: Whitelist item type + type: string + enum: + - vulnerability + - vulnerability_raw + - secret + - secret_raw + - static_analysis + - configuration + value: + description: The whitelisted value + oneOf: + - $ref: "#/components/schemas/WhitelistVulnItem" + - $ref: "#/components/schemas/WhitelistVulnRawItem" + - $ref: "#/components/schemas/WhitelistSecretItem" + - $ref: "#/components/schemas/WhitelistSecretRawItem" + - $ref: "#/components/schemas/WhitelistStaticAnalysisItem" + expires: + description: Expiration timestamp + type: string + format: date-time + reason: + description: Reason for creation + type: string + created_by: + description: Autoset User that created the item, ignored if passed in post/put requests. + type: string + updated_by: + description: Autoset User that last updated the item, ignored if passed in post/put requests + type: string + created: + description: Autoset date-time the item was created, ignored if passed in post/put requests + type: string + format: date-time + updated: + description: Autoset date-time the item was last updated, ignored if passed in post/put requests + type: string + format: date-time + WhitelistItemWithId: + allOf: + - $ref: "#/components/schemas/WhitelistItem" + - type: object + required: + - id + - reason + - created_by + - created + - updated + properties: + id: + description: ID of the whitelist item + type: string + format: uuid + created_by: + description: Autoset User that created the item, ignored if passed in post/put requests. + type: string + updated_by: + description: Autoset User that last updated the item, ignored if passed in post/put requests + type: string + created: + description: Autoset date-time the item was created, ignored if passed in post/put requests + type: string + format: date-time + updated: + description: Autoset date-time the item was last updated, ignored if passed in post/put requests + type: string + format: date-time + WhitelistVulnItem: + type: object + properties: + component: + description: Vulnerable component + type: string + id: + description: Vulnerability ID + type: string + source: + description: Vulnerable component dependency source + type: string + WhitelistSecretItem: + type: object + properties: + filename: + description: Secret-containing filename + type: string + line: + description: Secret location in file + type: integer + commit: + description: Secret-containing commit + type: string + WhitelistStaticAnalysisItem: + type: object + properties: + filename: + description: Finding-containing filename + type: string + line: + description: Finding location in file + type: integer + type: + description: Finding type + type: string + WhitelistSecretRawItem: + type: object + properties: + value: + description: Secret value to whitelist repo-wide + type: string + WhitelistVulnRawItem: + type: object + properties: + id: + description: Secret value to whitelist repo-wide + type: string + UserItem: + type: object + properties: + email: + description: User email address + type: string + admin: + description: User admin privileges + type: boolean + last_login: + description: User's last login time + type: string + format: date-time + scope: + description: User scan scope + type: array + items: + type: string + features: + description: User feature flags + type: object + scan_orgs: + description: Scan orgs that are accessible to this user + type: array + items: + type: string + PagedUserItem: + type: object + required: + - results + - count + - next + - previous + properties: + results: + description: One page of users. + type: array + items: + $ref: "#/components/schemas/UserItem" + count: + description: Number of items returned + type: integer + format: int32 + next: + description: Link to next page of results + type: string + previous: + description: Link to the previous page of results + type: string + UserRequest: + type: object + properties: + scope: + description: User scope + type: array + items: + type: string + admin: + description: User admin privileges + type: boolean + features: + description: User feature flags + type: object + + APIKeyItem: + type: object + required: + - id + - name + - scope + - expires + - created + - last_used + properties: + id: + description: API key ID + type: string + format: uuid + name: + description: API key name + type: string + scope: + description: API key scope + type: array + items: + type: string + expires: + description: API key expiration time + type: string + format: date-time + created: + description: API key created time + type: string + format: date-time + last_used: + description: API key last_used time + type: string + format: date-time + PagedAPIKeyItem: + type: object + required: + - results + - count + - next + - previous + properties: + results: + description: One page of API keys + type: array + items: + $ref: "#/components/schemas/APIKeyItem" + count: + description: Number of items returned + type: integer + format: int32 + next: + description: Link to next page of results + type: string + previous: + description: Link to the previous page of results + type: string + APIKeyRequest: + type: object + required: + - name + - scope + properties: + name: + description: API key name + type: string + scope: + description: API key scope + type: array + items: + type: string + expires: + description: API key expiration time + type: string + format: date-time + APIKeyResponse: + type: object + required: + - key + properties: + key: + description: API key + type: string + ReportRequest: + type: object + required: + - type + properties: + type: + description: Report format type + type: string + enum: + - pdf + filters: + description: Filters applied to the scan results during report generation + $ref: "#/components/schemas/ReportFilters" + ReportResponse: + type: object + required: + - report_id + - report_type + - status + - created_by + - timestamps + - scan_id + - filters + - download + properties: + report_id: + description: Report ID + type: string + format: uuid + report_type: + description: Report format type + type: string + enum: + - pdf + status: + description: Report generation status + type: string + enum: + - queued + - processing + - completed + - failed + - error + - terminated + created_by: + description: User that initiated the report generation + type: string + timestamps: + description: Report generation timestamps + type: object + properties: + requested: + description: Time the report generation was requested + type: string + format: date-time + completed: + description: Time report generation request completed + type: string + format: date-time + scan_id: + description: ID of the scan this report is for + type: string + format: uuid + filters: + description: Filters applied to the scan results during report generation + $ref: "#/components/schemas/ReportFilters" + download: + description: Report download location + type: object + properties: + url: + description: Report download URL + type: string + expires: + description: Report downloads URL expiration time + type: string + format: date-time + ReportFilters: + type: object + properties: + format: + description: Report filtering format + type: string + enum: + - full + - summary + filter_diff: + description: Whether to filter out items not included in diff. Has no effect if diff_base was not included in scan. + type: boolean + default: true + results: + description: The type of results to filter + type: array + items: + type: string + enum: + - vulnerabilities + - secrets + - static_analysis + - inventory + - configuration + severity: + description: The vulnerability severity to filter + type: array + items: + type: string + enum: + - critical + - high + - medium + - low + - negligible + secret: + description: The secret type to filter + type: array + items: + type: string + enum: + - aws + - ssh + UsersServicesRequest: + type: object + properties: + services: + description: List of linked services + type: array + items: + type: string + enum: + - github + UsersServicesResponse: + type: object + properties: + name: + description: Name of service + type: string + enum: + - github + params: + description: Parameters + type: object + properties: + auth_code: + description: GitHub oauth auth code + type: string + UsersServicesServiceResponse: + type: object + properties: + name: + description: Name of service + type: string + enum: + - github + username: + description: Service username + type: string + linked: + description: Timestamp of when linked + type: string + + # SBOM Schemas + SBOMLicense: + type: object + required: + - id + - name + properties: + id: + description: License ID (short name) + type: string + name: + description: License name (long name) + type: string + SBOMComponent: + type: object + required: + - name + - version + - licenses + properties: + name: + description: Component name + type: string + version: + description: Component version + type: string + licenses: + description: Component licenses + type: array + items: + $ref: "#/components/schemas/SBOMLicense" + SBOMRepository: + type: object + required: + - service + - repo + - sources + properties: + service: + description: Service name + type: string + repo: + description: Repository name + type: string + sources: + description: Source file paths + type: array + items: + type: string + + # Paged SBOM Schemas + PagedSBOMLicenses: + type: object + required: + - results + - count + - next + - previous + properties: + results: + description: One page of SBOM licenses + type: array + items: + $ref: "#/components/schemas/SBOMLicense" + count: + description: Number of items returned + type: integer + format: int32 + next: + description: Link to next page of results + type: string + previous: + description: Link to the previous page of results + type: string + PagedSBOMComponents: + type: object + required: + - results + - count + - next + - previous + properties: + results: + description: One page of SBOM components + type: array + items: + $ref: "#/components/schemas/SBOMComponent" + count: + description: Number of items returned + type: integer + format: int32 + next: + description: Link to next page of results + type: string + previous: + description: Link to the previous page of results + type: string + PagedSBOMRepositories: + type: object + required: + - results + - count + - next + - previous + properties: + results: + description: One page of SBOM licenses + type: array + items: + $ref: "#/components/schemas/SBOMRepository" + count: + description: Number of items returned + type: integer + format: int32 + next: + description: Link to next page of results + type: string + previous: + description: Link to the previous page of results + type: string + + # Search Schemas + SearchRepository: + type: object + required: + - service + - repo + - risk + - qualified_scan + - application_metadata + properties: + service: + description: Service name + type: string + repo: + description: Repo name (org/repo) + type: string + risk: + description: Risk level + type: string + enum: + - priority + - critical + - high + - moderate + - low + qualified_scan: + description: Identifying details of last qualified scan + type: object + properties: + created: + description: Timestamp of when the scan was created + type: string + format: date-time + scan_id: + description: ID of the scan + type: string + format: uuid + application_metadata: + description: Metadata for identifying the repo owner and associated application + type: object + + # Paged Search Schemas + PagedSearchRepositories: + type: object + required: + - results + - count + - next + - previous + properties: + results: + description: One page of repositories + type: array + items: + $ref: "#/components/schemas/SearchRepository" + count: + description: Number of items returned + type: integer + format: int32 + next: + description: Link to next page of results + type: string + previous: + description: Link to the previous page of results + type: string + + # System Status + SystemStatus: + type: object + required: + - maintenance + - engines + properties: + maintenance: + description: Maintenance information + type: object + properties: + enabled: + description: Whether the system is in maintenance mode + type: boolean + message: + description: Informational message accompanying maintenance mode + type: string + engines: + description: Engine status summary + type: object + properties: + status: + description: Metadata conforming to the WarnerMedia baseline requirements + type: string + enum: + - OK + - DEGRADED + - FAILED + - OFFLINE + count: + description: Number of online engines + type: integer + format: int32 + + #System Service + SystemService: + type: object + required: + - service + - service_type + - reachable + - auth_successful + - auth_type + - error + properties: + service: + description: Service name + type: string + service_type: + description: Type of VCS service + type: string + reachable: + description: Whether the service is reachable + type: boolean + auth_successful: + description: Whether Artemis can successfully authenticate to the service + type: boolean + auth_type: + description: Type of authentication Artemis uses to connect to the service + type: string + error: + description: Error encountered when testing connection from Artemis to service + type: + - string + - "null" + + SystemServiceStats: + type: object + required: + - service + - repo_count + - total_scans + - successful_scans + - failed_scans + - timestamps + properties: + service: + description: Service name + type: string + repo_count: + description: Count of repos scanned in the service + type: integer + format: int32 + total_scans: + description: Count of all scans run on repos in this service + type: integer + format: int32 + successful_scans: + description: Count of successful scans run on repos in this service + type: integer + format: int32 + failed_scans: + description: Count of failed scans run on repos in this service + type: integer + format: int32 + timestamps: + description: Oldest and latest retained scans run on this service + type: object + properties: + oldest_scan: + description: Timestamp of oldest retained scan run on a repo in this service + type: string + format: date-time + latest_scan: + description: Timestamp of most recent scan run on a repo in this service + type: string + format: date-time + + PagedSystemServices: + type: object + required: + - results + - count + - next + - previous + properties: + results: + description: One page of system services + type: array + items: + $ref: "#/components/schemas/SystemService" + count: + description: Number of items returned + type: integer + format: int32 + next: + description: Link to next page of results + type: string + previous: + description: Link to the previous page of results + type: string + + # Groups + GroupItem: + type: object + properties: + id: + description: Group UUID + type: string + format: uuid + parent: + description: Parent group UUID + type: string + format: uuid + name: + description: Group name + type: string + description: + description: Group description + type: string + created: + description: Group creation timestamp + type: string + format: date-time + created_by: + description: User that created the group + type: string + updated: + description: Group update timestamp + type: string + format: date-time + permissions: + description: Group permissions + type: object + properties: + scope: + description: Authorization scope for this group + type: array + items: + type: string + features: + description: Group feature flags + type: object + admin: + description: Group admin privileges + type: boolean + allowlist: + description: Whether the group members can do allowlist operations within the scope + type: boolean + PagedGroupItem: + type: object + required: + - results + - count + - next + - previous + properties: + results: + description: One page of groups. + type: array + items: + $ref: "#/components/schemas/GroupItem" + count: + description: Number of items returned + type: integer + format: int32 + next: + description: Link to next page of results + type: string + previous: + description: Link to the previous page of results + type: string + GroupRequest: + type: object + properties: + parent: + description: Parent group UUID + type: string + format: uuid + name: + description: Group name + type: string + description: + description: Group description + type: string + permissions: + description: Group permissions + type: object + properties: + scope: + description: Authorization scope for this group + type: array + items: + type: string + features: + description: Group feature flags + type: object + admin: + description: Group admin privileges + type: boolean + allowlist: + description: Whether the group members can do allowlist operations within the scope + type: boolean + + # Group members + GroupMemberItem: + type: object + properties: + email: + description: User email + type: string + group_admin: + description: Whether the user is an admin of the group + type: boolean + added: + description: When the user was added to the group + type: string + format: date-time + PagedGroupMemberItem: + type: object + required: + - results + - count + - next + - previous + properties: + results: + description: One page of group members + type: array + items: + $ref: "#/components/schemas/GroupMemberItem" + count: + description: Number of items returned + type: integer + format: int32 + next: + description: Link to next page of results + type: string + previous: + description: Link to the previous page of results + type: string + GroupMemberRequest: + type: object + properties: + group_admin: + description: Whether the user is an admin of the group + type: boolean + + # System Allowlist + SystemAllowlistItem: + type: object + required: + - type + - value + - reason + properties: + type: + description: System-wide allowlist item type + type: string + enum: + - secret + value: + description: The allowlisted value + oneOf: + - $ref: "#/components/schemas/SystemAllowlistSecretItem" + reason: + description: Reason for creation + type: string + created_by: + description: Autoset principal that created the item, ignored if passed in post/put requests. + type: string + updated_by: + description: Autoset principal that last updated the item, ignored if passed in post/put requests + type: string + created: + description: Autoset date-time the item was created, ignored if passed in post/put requests + type: string + format: date-time + updated: + description: Autoset date-time the item was last updated, ignored if passed in post/put requests + type: string + format: date-time + SystemAllowlistItemWithId: + allOf: + - $ref: "#/components/schemas/SystemAllowlistItem" + - type: object + required: + - id + properties: + id: + description: ID of the allowlist item + type: string + format: uuid + PagedSystemAllowlistItem: + type: object + required: + - results + - count + - next + - previous + properties: + results: + description: One page of system-wide allowlist items + type: array + items: + $ref: "#/components/schemas/SystemAllowlistItemWithId" + count: + description: Number of items returned + type: integer + format: int32 + next: + description: Link to next page of results + type: string + previous: + description: Link to the previous page of results + type: string + SystemAllowlistSecretItem: + type: object + properties: + filename: + description: Secret-containing filename (wildcard supported) + type: string + value: + description: Secret value to ignore (wildcard supported) + type: string + + # Reusable parameter definitions + parameters: + limit: + name: limit + in: query + description: Limit the number of records returned to this number. + required: false + schema: + type: integer + offset: + name: offset + in: query + description: The offset number to get the history from. + required: false + schema: + type: integer + name: + name: name + in: query + description: Filter on the name (exact match) + required: false + schema: + type: string + name__contains: + name: name__contains + in: query + description: Filter on the name (case-sensitive substring match) + required: false + schema: + type: string + name__icontains: + name: name__icontains + in: query + description: Filter on the name (case-insensitive substring match) + required: false + schema: + type: string + parent: + name: parent + in: query + description: Filter on the parent (exact match) + required: false + schema: + type: string + parent__contains: + name: parent__contains + in: query + description: Filter on the parent (case-sensitive substring match) + required: false + schema: + type: string + parent__icontains: + name: parent__icontains + in: query + description: Filter on the parent (case-insensitive substring match) + required: false + schema: + type: string + description: + name: description + in: query + description: Filter on the description (exact match) + required: false + schema: + type: string + description__contains: + name: description__contains + in: query + description: Filter on the description (case-sensitive substring match) + required: false + schema: + type: string + description__icontains: + name: description__icontains + in: query + description: Filter on the description (case-insensitive substring match) + required: false + schema: + type: string + created: + name: created + in: query + description: Filter on the created time (exact match) + required: false + schema: + type: string + format: date-time + created__gt: + name: created__gt + in: query + description: Filter on the created time (since timestamp) + required: false + schema: + type: string + format: date-time + created__lt: + name: created__lt + in: query + description: Filter on the created time (prior to timestamp) + required: false + schema: + type: string + format: date-time + expires: + name: expires + in: query + description: Filter on the expires time (exact match) + required: false + schema: + type: string + format: date-time + expires__gt: + name: expires__gt + in: query + description: Filter on the expires time (since timestamp) + required: false + schema: + type: string + format: date-time + expires__lt: + name: expires__lt + in: query + description: Filter on the expires time (prior to timestamp) + required: false + schema: + type: string + format: date-time + id: + name: id + in: path + description: ID + required: true + schema: + type: string + kid: + name: kid + in: path + description: API key ID + required: true + schema: + type: string + format: uuid + uid: + name: uid + in: path + description: User email address + required: true + schema: + type: string + batch_id: + name: batch_id + in: query + description: Filter on the batch ID (exact match) + required: false + schema: + type: string + format: uuid + service: + name: service + in: query + description: Filter on the service (exact match) + required: false + schema: + type: string + service__contains: + name: service__contains + in: query + description: Filter on the service (case-sensitive substring match) + required: false + schema: + type: string + service__icontains: + name: service__icontains + in: query + description: Filter on the service (case-insensitive substring match) + required: false + schema: + type: string + repo: + name: repo + in: query + description: Filter on the repo (exact match) + required: false + schema: + type: string + repo__contains: + name: repo__contains + in: query + description: Filter on the repo (case-sensitive substring match) + required: false + schema: + type: string + repo__icontains: + name: repo__icontains + in: query + description: Filter on the repo (case-insensitive substring match) + required: false + schema: + type: string + branch: + name: branch + in: query + description: Filter on the branch (exact match) + required: false + schema: + type: string + branch__contains: + name: branch__contains + in: query + description: Filter on the branch (case-sensitive substring match) + required: false + schema: + type: string + branch__icontains: + name: branch__icontains + in: query + description: Filter on the branch (case-insensitive substring match) + required: false + schema: + type: string + branch__isnull: + name: branch__isnull + in: query + description: Filter on the branch being null + required: false + schema: + type: boolean + sbom: + name: sbom + in: query + description: Filter on the scan being an SBOM scan + required: false + schema: + type: boolean + plugin_contains: + name: plugin__contains + in: query + description: Filter on a plugin (case-sensitive substring match) + required: false + schema: + type: string + plugin_icontains: + name: plugin__icontains + in: query + description: Filter on a plugin (case-insensitive substring match) + required: false + schema: + type: string + + securitySchemes: + x-api-key: + type: apiKey + description: API key + name: x-api-key + in: header diff --git a/ui/deploy.sh b/ui/deploy.sh index 823b5843..ccf9acc0 100755 --- a/ui/deploy.sh +++ b/ui/deploy.sh @@ -64,5 +64,6 @@ ${AWS} s3 cp "s3://${S3_BUCKET}/index.html" "s3://${S3_BUCKET}/results" --conten ${AWS} s3 cp "s3://${S3_BUCKET}/index.html" "s3://${S3_BUCKET}/settings" --content-type "text/html" --cache-control "no-cache" && ${AWS} s3 cp "s3://${S3_BUCKET}/index.html" "s3://${S3_BUCKET}/users" --content-type "text/html" --cache-control "no-cache" && ${AWS} s3 cp "s3://${S3_BUCKET}/index.html" "s3://${S3_BUCKET}/search" --content-type "text/html" --cache-control "no-cache" && +${AWS} s3 cp "s3://${S3_BUCKET}/api/index.html" "s3://${S3_BUCKET}/api" --content-type "text/html" --cache-control "no-cache" && ${AWS} cloudfront create-invalidation --distribution-id "${CLOUDFRONT_DIST_ID}" --paths "/" && echo -e "${OK}" diff --git a/ui/package-lock.json b/ui/package-lock.json index 38048560..6d5bfd19 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -51,6 +51,7 @@ "@babel/types": "^7.26.0", "@lingui/cli": "^4.13.0", "@lingui/macro": "^4.13.0", + "@redocly/cli": "^1.25.11", "@testing-library/jest-dom": "^5.17.0", "@testing-library/react": "^16.0.1", "@testing-library/user-event": "^14.5.2", @@ -2227,6 +2228,30 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, + "node_modules/@cfaester/enzyme-adapter-react-18": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@cfaester/enzyme-adapter-react-18/-/enzyme-adapter-react-18-0.8.0.tgz", + "integrity": "sha512-3Z3ThTUouHwz8oIyhTYQljEMNRFtlVyc3VOOHCbxs47U6cnXs8K9ygi/c1tv49s7MBlTXeIcuN+Ttd9aPtILFQ==", + "dev": true, + "dependencies": { + "enzyme-shallow-equal": "^1.0.0", + "function.prototype.name": "^1.1.6", + "has": "^1.0.4", + "react-is": "^18.2.0", + "react-shallow-renderer": "^16.15.0" + }, + "peerDependencies": { + "enzyme": "^3.11.0", + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/@cfaester/enzyme-adapter-react-18/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 + }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", @@ -3142,6 +3167,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@exodus/schemasafe": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@exodus/schemasafe/-/schemasafe-1.3.0.tgz", + "integrity": "sha512-5Aap/GaRupgNx/feGBwLLTVv8OQFfv3pq2lPRzPg9R+IOBnDgghTGW7l7EuVXOvg5cc/xSAlRW8rBrjIC3Nvqw==", + "dev": true + }, "node_modules/@floating-ui/core": { "version": "1.6.8", "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.8.tgz", @@ -4797,6 +4828,174 @@ "url": "https://opencollective.com/popperjs" } }, + "node_modules/@redocly/ajv": { + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/@redocly/ajv/-/ajv-8.11.2.tgz", + "integrity": "sha512-io1JpnwtIcvojV7QKDUSIuMN/ikdOUd1ReEnUnMKGfDVridQZ31J0MmIuqwuRjWDZfmvr+Q0MqCcfHM2gTivOg==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js-replace": "^1.0.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@redocly/cli": { + "version": "1.25.11", + "resolved": "https://registry.npmjs.org/@redocly/cli/-/cli-1.25.11.tgz", + "integrity": "sha512-dttBsmLnnbTlJCTa+s7Sy+qtXDq692n7Ru3nUUIHp9XdCbhXIHWhpc8uAl+GmR4MGbVe8ohATl3J+zX3aFy82A==", + "dev": true, + "dependencies": { + "@redocly/openapi-core": "1.25.11", + "abort-controller": "^3.0.0", + "chokidar": "^3.5.1", + "colorette": "^1.2.0", + "core-js": "^3.32.1", + "form-data": "^4.0.0", + "get-port-please": "^3.0.1", + "glob": "^7.1.6", + "handlebars": "^4.7.6", + "mobx": "^6.0.4", + "node-fetch": "^2.6.1", + "pluralize": "^8.0.0", + "react": "^17.0.0 || ^18.2.0", + "react-dom": "^17.0.0 || ^18.2.0", + "redoc": "~2.2.0", + "semver": "^7.5.2", + "simple-websocket": "^9.0.0", + "styled-components": "^6.0.7", + "yargs": "17.0.1" + }, + "bin": { + "openapi": "bin/cli.js", + "redocly": "bin/cli.js" + }, + "engines": { + "node": ">=14.19.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@redocly/cli/node_modules/colorette": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", + "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", + "dev": true + }, + "node_modules/@redocly/cli/node_modules/yargs": { + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.0.1.tgz", + "integrity": "sha512-xBBulfCc8Y6gLFcrPvtqKz9hz8SO0l1Ni8GgDekvBX2ro0HRQImDGnikfc33cgzcYUSncapnNcZDjVFIH3f6KQ==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@redocly/config": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@redocly/config/-/config-0.16.0.tgz", + "integrity": "sha512-t9jnODbUcuANRSl/K4L9nb12V+U5acIHnVSl26NWrtSdDZVtoqUXk2yGFPZzohYf62cCfEQUT8ouJ3bhPfpnJg==", + "dev": true + }, + "node_modules/@redocly/openapi-core": { + "version": "1.25.11", + "resolved": "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-1.25.11.tgz", + "integrity": "sha512-bH+a8izQz4fnKROKoX3bEU8sQ9rjvEIZOqU6qTmxlhOJ0NsKa5e+LmU18SV0oFeg5YhWQhhEDihXkvKJ1wMMNQ==", + "dev": true, + "dependencies": { + "@redocly/ajv": "^8.11.2", + "@redocly/config": "^0.16.0", + "colorette": "^1.2.0", + "https-proxy-agent": "^7.0.4", + "js-levenshtein": "^1.1.6", + "js-yaml": "^4.1.0", + "lodash.isequal": "^4.5.0", + "minimatch": "^5.0.1", + "node-fetch": "^2.6.1", + "pluralize": "^8.0.0", + "yaml-ast-parser": "0.0.43" + }, + "engines": { + "node": ">=14.19.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@redocly/openapi-core/node_modules/agent-base": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "dev": true, + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@redocly/openapi-core/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, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@redocly/openapi-core/node_modules/colorette": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", + "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", + "dev": true + }, + "node_modules/@redocly/openapi-core/node_modules/https-proxy-agent": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", + "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "dev": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@redocly/openapi-core/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, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@redocly/openapi-core/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, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@redux-saga/core": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@redux-saga/core/-/core-1.3.0.tgz", @@ -5846,6 +6045,12 @@ "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", "dev": true }, + "node_modules/@types/stylis": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@types/stylis/-/stylis-4.2.5.tgz", + "integrity": "sha512-1Xve+NMN7FWjY14vLoY5tL3BVEQ/n42YLwaqJIPYhotZ9uBHt87VceMwWQpzmdEt2TNXIorIFG+YeCUUW7RInw==", + "dev": true + }, "node_modules/@types/testing-library__jest-dom": { "version": "5.14.3", "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.3.tgz", @@ -6328,6 +6533,18 @@ "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", "dev": true }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dev": true, + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -6577,6 +6794,22 @@ "dequal": "^2.0.3" } }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array-flatten": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", @@ -6602,6 +6835,27 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/array.prototype.filter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/array.prototype.filter/-/array.prototype.filter-1.0.4.tgz", + "integrity": "sha512-r+mCJ7zXgXElgR4IRC+fkvNCeoaavWBs6EdCso5Tbcf+iEMKzBU/His60lt34WEZ9vlb8wDkZvQGcVI5GwkfoQ==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-array-method-boxes-properly": "^1.0.0", + "es-object-atoms": "^1.0.0", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array.prototype.flat": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz", @@ -6657,6 +6911,28 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", @@ -6730,6 +7006,21 @@ "remove-accents": "^0.4.2" } }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/axe-core": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.4.2.tgz", @@ -7358,6 +7649,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/call-me-maybe": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", + "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==", + "dev": true + }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -7397,6 +7694,15 @@ "node": ">= 6" } }, + "node_modules/camelize": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", + "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/caniuse-api": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", @@ -7511,85 +7817,313 @@ "integrity": "sha512-tzWzvgePgLORb9/3a0YenggReLKAIb2owL03H2Xdoe5pKcUyWRSEQ8xfCar8t2SIAuEDwtmx2da1YB52YuHQMQ==", "dev": true }, - "node_modules/chokidar": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", - "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "node_modules/cheerio": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0.tgz", + "integrity": "sha512-quS9HgjQpdaXOvsZz82Oz7uxtXiy6UIsIQcpBj7HRw2M63Skasm9qlDocAM7jNuaxdhpPU7c4kJN+gA5MCu4ww==", "dev": true, + "peer": true, "dependencies": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.5.0" + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.1.0", + "encoding-sniffer": "^0.2.0", + "htmlparser2": "^9.1.0", + "parse5": "^7.1.2", + "parse5-htmlparser2-tree-adapter": "^7.0.0", + "parse5-parser-stream": "^7.1.2", + "undici": "^6.19.5", + "whatwg-mimetype": "^4.0.0" }, "engines": { - "node": ">= 8.10.0" + "node": ">=18.17" }, - "optionalDependencies": { - "fsevents": "~2.3.1" + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" } }, - "node_modules/chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "node_modules/cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", "dev": true, - "engines": { - "node": ">=6.0" + "peer": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" } }, - "node_modules/ci-info": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.1.tgz", - "integrity": "sha512-SXgeMX9VwDe7iFFaEWkA5AstuER9YKqy4EhHqr4DVqkwmD9rpVimkMKWHdjn30Ja45txyjhSn63lVX69eVCckg==", - "dev": true - }, - "node_modules/cjs-module-lexer": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", - "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", - "dev": true - }, - "node_modules/clean-css": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.0.tgz", - "integrity": "sha512-YYuuxv4H/iNb1Z/5IbMRoxgrzjWGhOEFfd+groZ5dMCVkpENiMZmwspdrzBo9286JjM1gZJPAyL7ZIdzuvu2AQ==", + "node_modules/cheerio-select/node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", "dev": true, + "peer": true, "dependencies": { - "source-map": "~0.6.0" + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" }, - "engines": { - "node": ">= 10.0" + "funding": { + "url": "https://github.com/sponsors/fb55" } }, - "node_modules/clean-css/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==", + "node_modules/cheerio-select/node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "dev": true, - "engines": { - "node": ">=0.10.0" + "peer": true, + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" } }, - "node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "node_modules/cheerio-select/node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "dev": true, + "peer": true, "dependencies": { - "restore-cursor": "^3.1.0" + "domelementtype": "^2.3.0" }, "engines": { - "node": ">=8" + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" } }, - "node_modules/cli-spinners": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", - "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", + "node_modules/cheerio-select/node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "dev": true, + "peer": true, + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/cheerio-select/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/cheerio/node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "peer": true, + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/cheerio/node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "peer": true, + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/cheerio/node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "dev": true, + "peer": true, + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/cheerio/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/cheerio/node_modules/htmlparser2": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-9.1.0.tgz", + "integrity": "sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "peer": true, + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.1.0", + "entities": "^4.5.0" + } + }, + "node_modules/cheerio/node_modules/parse5": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", + "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", + "dev": true, + "peer": true, + "dependencies": { + "entities": "^4.5.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/cheerio/node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/chokidar": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.1" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/ci-info": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.1.tgz", + "integrity": "sha512-SXgeMX9VwDe7iFFaEWkA5AstuER9YKqy4EhHqr4DVqkwmD9rpVimkMKWHdjn30Ja45txyjhSn63lVX69eVCckg==", + "dev": true + }, + "node_modules/cjs-module-lexer": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", + "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", + "dev": true + }, + "node_modules/classnames": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", + "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==", + "dev": true + }, + "node_modules/clean-css": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.0.tgz", + "integrity": "sha512-YYuuxv4H/iNb1Z/5IbMRoxgrzjWGhOEFfd+groZ5dMCVkpENiMZmwspdrzBo9286JjM1gZJPAyL7ZIdzuvu2AQ==", + "dev": true, + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, + "node_modules/clean-css/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", + "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", "dev": true, "engines": { "node": ">=6" @@ -7976,9 +8510,9 @@ } }, "node_modules/core-js": { - "version": "3.22.7", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.22.7.tgz", - "integrity": "sha512-Jt8SReuDKVNZnZEzyEQT5eK6T2RRCXkfTq7Lo09kpm+fHjgGewSbNjV+Wt4yZMhPDdzz2x1ulI5z/w4nxpBseg==", + "version": "3.39.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.39.0.tgz", + "integrity": "sha512-raM0ew0/jJUqkJ0E6e8UDtl+y/7ktFivgWvqw8dNSQeNWoSDLvQ1H/RN3aPXB9tBd4/FhyR4RDPGhsNIMsAn7g==", "dev": true, "hasInstallScript": true, "funding": { @@ -8080,6 +8614,15 @@ "postcss": "^8.4" } }, + "node_modules/css-color-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", + "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/css-declaration-sorter": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.2.2.tgz", @@ -8251,6 +8794,17 @@ "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", "dev": true }, + "node_modules/css-to-react-native": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz", + "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==", + "dev": true, + "dependencies": { + "camelize": "^1.0.0", + "css-color-keywords": "^1.0.0", + "postcss-value-parser": "^4.0.2" + } + }, "node_modules/css-tree": { "version": "1.0.0-alpha.37", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", @@ -8588,6 +9142,57 @@ "node": ">=10" } }, + "node_modules/data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/date-fns": { "version": "2.29.3", "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz", @@ -8639,6 +9244,12 @@ "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==" }, + "node_modules/decko": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decko/-/decko-1.2.0.tgz", + "integrity": "sha512-m8FnyHXV1QX+S1cl+KPFDIl6NMkxtKsy6+U/aYyjrOqWMuwAwYWu7ePqrsUHtDR5Y8Yk2pi/KIDSgF+vT4cPOQ==", + "dev": true + }, "node_modules/decode-uri-component": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.4.1.tgz", @@ -8720,11 +9331,12 @@ } }, "node_modules/define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, "dependencies": { + "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, @@ -8879,6 +9491,13 @@ "node": ">=8" } }, + "node_modules/discontinuous-range": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz", + "integrity": "sha512-c68LpLbO+7kP/b1Hr1qs8/BJ09F5khZGTxqxZuhzxpmwJKOgRFHJWIb9/KmqnqHhLdO55aOxFH/EGBvUQbL/RQ==", + "dev": true, + "peer": true + }, "node_modules/dlv": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", @@ -9001,6 +9620,12 @@ "url": "https://github.com/fb55/domhandler?sponsor=1" } }, + "node_modules/dompurify": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.2.0.tgz", + "integrity": "sha512-AMdOzK44oFWqHEi0wpOqix/fUNY707OmoeFDnbi3Q5I8uOpy21ufUA5cDJPr0bosxrflOVD/H2DMSvuGKJGfmQ==", + "dev": true + }, "node_modules/domutils": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", @@ -9109,6 +9734,46 @@ "node": ">= 0.8" } }, + "node_modules/encoding-sniffer": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.0.tgz", + "integrity": "sha512-ju7Wq1kg04I3HtiYIOrUrdfdDvkyO9s5XM8QAj/bN61Yo/Vb4vgJxy5vi4Yxk01gWHbrofpPtpxM8bKger9jhg==", + "dev": true, + "peer": true, + "dependencies": { + "iconv-lite": "^0.6.3", + "whatwg-encoding": "^3.1.1" + }, + "funding": { + "url": "https://github.com/fb55/encoding-sniffer?sponsor=1" + } + }, + "node_modules/encoding-sniffer/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "peer": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/encoding-sniffer/node_modules/whatwg-encoding": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "dev": true, + "peer": true, + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/enhanced-resolve": { "version": "5.17.1", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", @@ -9156,6 +9821,53 @@ "node": ">= 6" } }, + "node_modules/enzyme": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/enzyme/-/enzyme-3.11.0.tgz", + "integrity": "sha512-Dw8/Gs4vRjxY6/6i9wU0V+utmQO9kvh9XLnz3LIudviOnVYDEe2ec+0k+NQoMamn1VrjKgCUOWj5jG/5M5M0Qw==", + "dev": true, + "peer": true, + "dependencies": { + "array.prototype.flat": "^1.2.3", + "cheerio": "^1.0.0-rc.3", + "enzyme-shallow-equal": "^1.0.1", + "function.prototype.name": "^1.1.2", + "has": "^1.0.3", + "html-element-map": "^1.2.0", + "is-boolean-object": "^1.0.1", + "is-callable": "^1.1.5", + "is-number-object": "^1.0.4", + "is-regex": "^1.0.5", + "is-string": "^1.0.5", + "is-subset": "^0.1.1", + "lodash.escape": "^4.0.1", + "lodash.isequal": "^4.5.0", + "object-inspect": "^1.7.0", + "object-is": "^1.0.2", + "object.assign": "^4.1.0", + "object.entries": "^1.1.1", + "object.values": "^1.1.1", + "raf": "^3.4.1", + "rst-selector-parser": "^2.2.3", + "string.prototype.trim": "^1.2.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/enzyme-shallow-equal": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/enzyme-shallow-equal/-/enzyme-shallow-equal-1.0.7.tgz", + "integrity": "sha512-/um0GFqUXnpM9SvKtje+9Tjoz3f1fpBC3eXRFrNs8kpYn69JljciYP7KZTqM/YQbUY9KUjvKB4jo/q+L6WGGvg==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0", + "object-is": "^1.1.5" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -9174,34 +9886,57 @@ } }, "node_modules/es-abstract": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz", - "integrity": "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==", + "version": "1.23.4", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.4.tgz", + "integrity": "sha512-HR1gxH5OaiN7XH7uiWH0RLw0RcFySiSoW1ctxmD1ahTw3uGBtkmm/ng0tDU1OtYx5OK6EOL5Y6O21cDflG3Jcg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.1", - "get-symbol-description": "^1.0.0", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", - "is-negative-zero": "^2.0.2", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", + "is-shared-array-buffer": "^1.0.3", "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.0", + "object-inspect": "^1.13.3", "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "regexp.prototype.flags": "^1.4.3", - "string.prototype.trimend": "^1.0.5", - "string.prototype.trimstart": "^1.0.5", - "unbox-primitive": "^1.0.2" + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.3", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.15" }, "engines": { "node": ">= 0.4" @@ -9243,6 +9978,32 @@ "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", "dev": true }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-shim-unscopables": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", @@ -9269,6 +10030,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es6-promise": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", + "integrity": "sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==", + "dev": true + }, "node_modules/esbuild": { "version": "0.17.18", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.18.tgz", @@ -10074,6 +10841,15 @@ "node": ">= 0.6" } }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", @@ -10318,6 +11094,12 @@ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", + "dev": true + }, "node_modules/fastq": { "version": "1.13.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", @@ -10583,6 +11365,21 @@ } } }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/foreach": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.6.tgz", + "integrity": "sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg==", + "dev": true + }, "node_modules/fork-ts-checker-webpack-plugin": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.2.tgz", @@ -10853,20 +11650,21 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" }, "engines": { "node": ">= 0.4" @@ -10942,6 +11740,12 @@ "node": ">=8.0.0" } }, + "node_modules/get-port-please": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/get-port-please/-/get-port-please-3.1.2.tgz", + "integrity": "sha512-Gxc29eLs1fbn6LQ4jSU4vXjlwyZhF5HsGuMAa7gqBP4Rw4yxxltyDUuF5MBclFzDTXO+ACchGQoeela4DSfzdQ==", + "dev": true + }, "node_modules/get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", @@ -10955,13 +11759,14 @@ } }, "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" }, "engines": { "node": ">= 0.4" @@ -11055,6 +11860,22 @@ "node": ">=4" } }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/globby": { "version": "14.0.1", "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.1.tgz", @@ -11138,6 +11959,36 @@ "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", "dev": true }, + "node_modules/handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/handlebars/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, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/harmony-reflect": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz", @@ -11145,12 +11996,9 @@ "dev": true }, "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dependencies": { - "function-bind": "^1.1.1" - }, + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz", + "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==", "engines": { "node": ">= 0.4.0" } @@ -11210,12 +12058,12 @@ } }, "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, "dependencies": { - "has-symbols": "^1.0.2" + "has-symbols": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -11341,6 +12189,20 @@ "safe-buffer": "~5.1.0" } }, + "node_modules/html-element-map": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/html-element-map/-/html-element-map-1.3.1.tgz", + "integrity": "sha512-6XMlxrAFX4UEEGxctfFnmrFaaZFNf9i5fNuV5wZ3WWQ4FVaNP1aX1LkX9j2mfEx1NpjeE/rL3nmgEn23GdFmrg==", + "dev": true, + "peer": true, + "dependencies": { + "array.prototype.filter": "^1.0.0", + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/html-encoding-sniffer": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", @@ -11517,6 +12379,12 @@ } } }, + "node_modules/http2-client": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/http2-client/-/http2-client-1.3.5.tgz", + "integrity": "sha512-EC2utToWl4RKfs5zd36Mxq7nzHHBuomZboI0yYL6Y0RmBgT7Sgkq4rQ0ezFTYoIsSs7Tm9SJe+o2FcAg6GBhGA==", + "dev": true + }, "node_modules/https-proxy-agent": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", @@ -11724,13 +12592,13 @@ } }, "node_modules/internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", "dev": true, "dependencies": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", + "es-errors": "^1.3.0", + "hasown": "^2.0.0", "side-channel": "^1.0.4" }, "engines": { @@ -11776,6 +12644,22 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -11822,9 +12706,9 @@ } }, "node_modules/is-callable": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true, "engines": { "node": ">= 0.4" @@ -11844,6 +12728,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dev": true, + "dependencies": { + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-date-object": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", @@ -11947,9 +12846,9 @@ "dev": true }, "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true, "engines": { "node": ">= 0.4" @@ -12044,12 +12943,15 @@ } }, "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2" + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -12082,6 +12984,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-subset": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz", + "integrity": "sha512-6Ybun0IkarhmEqxXCNw/C0bna6Zb/TkfUX9UbwJtK6ObwAVCxmAP308WWTHviM/zAqXk05cdhYsUsZeGQh99iw==", + "dev": true, + "peer": true + }, "node_modules/is-symbol": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", @@ -12097,6 +13006,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dev": true, + "dependencies": { + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -13978,6 +14902,15 @@ "jiti": "bin/jiti.js" } }, + "node_modules/js-levenshtein": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", + "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/js-sha256": { "version": "0.10.1", "resolved": "https://registry.npmjs.org/js-sha256/-/js-sha256-0.10.1.tgz", @@ -14087,6 +15020,15 @@ "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==" }, + "node_modules/json-pointer": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/json-pointer/-/json-pointer-0.6.2.tgz", + "integrity": "sha512-vLWcKbOaXlO+jvRy4qNd+TI1QUPZzfJj1tpJ3vAXDych5XJf93ftpUKe5pKCrzyIIwgBJcOcCVRUfqQP25afBw==", + "dev": true, + "dependencies": { + "foreach": "^2.0.4" + } + }, "node_modules/json-schema": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", @@ -14296,12 +15238,32 @@ "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", "dev": true }, + "node_modules/lodash.escape": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-4.0.1.tgz", + "integrity": "sha512-nXEOnb/jK9g0DYMr1/Xvq6l5xMD7GDG55+GSYIYmS0G4tBk/hURD4JR9WCavs04t33WmJx9kCyp9vJ+mr4BOUw==", + "dev": true, + "peer": true + }, + "node_modules/lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", + "dev": true, + "peer": true + }, "node_modules/lodash.get": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", "dev": true }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", + "dev": true + }, "node_modules/lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", @@ -14375,6 +15337,12 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/lunr": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", + "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", + "dev": true + }, "node_modules/luxon": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.5.0.tgz", @@ -14443,6 +15411,12 @@ "tmpl": "1.0.5" } }, + "node_modules/mark.js": { + "version": "8.11.1", + "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz", + "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==", + "dev": true + }, "node_modules/markdown-it": { "version": "14.1.0", "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", @@ -14557,6 +15531,18 @@ "url": "https://github.com/sponsors/DavidAnson" } }, + "node_modules/marked": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", + "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", + "dev": true, + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 12" + } + }, "node_modules/mdn-data": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", @@ -14786,6 +15772,66 @@ "node": ">=10" } }, + "node_modules/mobx": { + "version": "6.13.5", + "resolved": "https://registry.npmjs.org/mobx/-/mobx-6.13.5.tgz", + "integrity": "sha512-/HTWzW2s8J1Gqt+WmUj5Y0mddZk+LInejADc79NJadrWla3rHzmRHki/mnEUH1AvOmbNTZ1BRbKxr8DSgfdjMA==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mobx" + } + }, + "node_modules/mobx-react": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/mobx-react/-/mobx-react-9.1.1.tgz", + "integrity": "sha512-gVV7AdSrAAxqXOJ2bAbGa5TkPqvITSzaPiiEkzpW4rRsMhSec7C2NBCJYILADHKp2tzOAIETGRsIY0UaCV5aEw==", + "dev": true, + "dependencies": { + "mobx-react-lite": "^4.0.7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mobx" + }, + "peerDependencies": { + "mobx": "^6.9.0", + "react": "^16.8.0 || ^17 || ^18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "node_modules/mobx-react-lite": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/mobx-react-lite/-/mobx-react-lite-4.0.7.tgz", + "integrity": "sha512-RjwdseshK9Mg8On5tyJZHtGD+J78ZnCnRaxeQDSiciKVQDUbfZcXhmld0VMxAwvcTnPEHZySGGewm467Fcpreg==", + "dev": true, + "dependencies": { + "use-sync-external-store": "^1.2.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mobx" + }, + "peerDependencies": { + "mobx": "^6.9.0", + "react": "^16.8.0 || ^17 || ^18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, "node_modules/moo": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.2.tgz", @@ -14844,6 +15890,36 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, + "node_modules/nearley": { + "version": "2.20.1", + "resolved": "https://registry.npmjs.org/nearley/-/nearley-2.20.1.tgz", + "integrity": "sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ==", + "dev": true, + "peer": true, + "dependencies": { + "commander": "^2.19.0", + "moo": "^0.5.0", + "railroad-diagrams": "^1.0.0", + "randexp": "0.4.6" + }, + "bin": { + "nearley-railroad": "bin/nearley-railroad.js", + "nearley-test": "bin/nearley-test.js", + "nearley-unparse": "bin/nearley-unparse.js", + "nearleyc": "bin/nearleyc.js" + }, + "funding": { + "type": "individual", + "url": "https://nearley.js.org/#give-to-nearley" + } + }, + "node_modules/nearley/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "peer": true + }, "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -14869,6 +15945,60 @@ "tslib": "^2.0.3" } }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dev": true, + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-fetch-h2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/node-fetch-h2/-/node-fetch-h2-2.3.0.tgz", + "integrity": "sha512-ofRW94Ab0T4AOh5Fk8t0h8OBWrmjb0SSB20xh1H8YnPV9EJ+f5AMoYSUQ2zgJ4Iq2HAK0I2l5/Nequ8YzFS3Hg==", + "dev": true, + "dependencies": { + "http2-client": "^1.2.5" + }, + "engines": { + "node": "4.x || >=6.0.0" + } + }, + "node_modules/node-fetch/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true + }, + "node_modules/node-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true + }, + "node_modules/node-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/node-forge": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", @@ -14884,6 +16014,15 @@ "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", "dev": true }, + "node_modules/node-readfiles": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/node-readfiles/-/node-readfiles-0.2.0.tgz", + "integrity": "sha512-SU00ZarexNlE4Rjdm83vglt5Y9yiQ+XI1XpflWlb7q7UTN1JUItm69xMeiQCTxtTfnzt+83T8Cx+vI2ED++VDA==", + "dev": true, + "dependencies": { + "es6-promise": "^3.2.1" + } + }, "node_modules/node-releases": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", @@ -14950,6 +16089,117 @@ "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", "dev": true }, + "node_modules/oas-kit-common": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/oas-kit-common/-/oas-kit-common-1.0.8.tgz", + "integrity": "sha512-pJTS2+T0oGIwgjGpw7sIRU8RQMcUoKCDWFLdBqKB2BNmGpbBMH2sdqAaOXUg8OzonZHU0L7vfJu1mJFEiYDWOQ==", + "dev": true, + "dependencies": { + "fast-safe-stringify": "^2.0.7" + } + }, + "node_modules/oas-linter": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/oas-linter/-/oas-linter-3.2.2.tgz", + "integrity": "sha512-KEGjPDVoU5K6swgo9hJVA/qYGlwfbFx+Kg2QB/kd7rzV5N8N5Mg6PlsoCMohVnQmo+pzJap/F610qTodKzecGQ==", + "dev": true, + "dependencies": { + "@exodus/schemasafe": "^1.0.0-rc.2", + "should": "^13.2.1", + "yaml": "^1.10.0" + }, + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/oas-resolver": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/oas-resolver/-/oas-resolver-2.5.6.tgz", + "integrity": "sha512-Yx5PWQNZomfEhPPOphFbZKi9W93CocQj18NlD2Pa4GWZzdZpSJvYwoiuurRI7m3SpcChrnO08hkuQDL3FGsVFQ==", + "dev": true, + "dependencies": { + "node-fetch-h2": "^2.3.0", + "oas-kit-common": "^1.0.8", + "reftools": "^1.1.9", + "yaml": "^1.10.0", + "yargs": "^17.0.1" + }, + "bin": { + "resolve": "resolve.js" + }, + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/oas-resolver/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, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/oas-resolver/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, + "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/oas-resolver/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, + "engines": { + "node": ">=12" + } + }, + "node_modules/oas-schema-walker": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/oas-schema-walker/-/oas-schema-walker-1.1.5.tgz", + "integrity": "sha512-2yucenq1a9YPmeNExoUa9Qwrt9RFkjqaMAA1X+U7sbb0AqBeTIdMHky9SQQ6iN94bO5NW0W4TRYXerG+BdAvAQ==", + "dev": true, + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/oas-validator": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/oas-validator/-/oas-validator-5.0.8.tgz", + "integrity": "sha512-cu20/HE5N5HKqVygs3dt94eYJfBi0TsZvPVXDhbXQHiEityDN+RROTleefoKRKKJ9dFAF2JBkDHgvWj0sjKGmw==", + "dev": true, + "dependencies": { + "call-me-maybe": "^1.0.1", + "oas-kit-common": "^1.0.8", + "oas-linter": "^3.2.2", + "oas-resolver": "^2.5.6", + "oas-schema-walker": "^1.1.5", + "reftools": "^1.1.9", + "should": "^13.2.1", + "yaml": "^1.10.0" + }, + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -14968,10 +16218,26 @@ } }, "node_modules/object-inspect": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", - "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", + "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" + }, "engines": { "node": ">= 0.4" }, @@ -14989,14 +16255,14 @@ } }, "node_modules/object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", "object-keys": "^1.1.1" }, "engines": { @@ -15153,6 +16419,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/openapi-sampler": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/openapi-sampler/-/openapi-sampler-1.5.1.tgz", + "integrity": "sha512-tIWIrZUKNAsbqf3bd9U1oH6JEXo8LNYuDlXw26By67EygpjT+ArFnsxxyTMjFWRfbqo5ozkvgSQDK69Gd8CddA==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.7", + "json-pointer": "0.6.2" + } + }, "node_modules/optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", @@ -15312,6 +16588,101 @@ "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", "dev": true }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", + "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", + "dev": true, + "peer": true, + "dependencies": { + "domhandler": "^5.0.3", + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter/node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "peer": true, + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter/node_modules/parse5": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", + "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", + "dev": true, + "peer": true, + "dependencies": { + "entities": "^4.5.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-parser-stream": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz", + "integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==", + "dev": true, + "peer": true, + "dependencies": { + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-parser-stream/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/parse5-parser-stream/node_modules/parse5": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", + "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", + "dev": true, + "peer": true, + "dependencies": { + "entities": "^4.5.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -15331,6 +16702,12 @@ "tslib": "^2.0.3" } }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true + }, "node_modules/path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", @@ -15383,6 +16760,12 @@ "integrity": "sha512-ODbEPR0KKHqECXW1GoxdDb+AZvULmXjVPy4rt+pGo2+TnjJTIPJQSVS6N63n8T2Ip+syHhbn52OewKicV0373w==", "dev": true }, + "node_modules/perfect-scrollbar": { + "version": "1.5.6", + "resolved": "https://registry.npmjs.org/perfect-scrollbar/-/perfect-scrollbar-1.5.6.tgz", + "integrity": "sha512-rixgxw3SxyJbCaSpo1n35A/fwI1r2rdwMKOTCg/AcG+xOEyZcE8UHVjpZMFCVImzsFoCZeJTT+M/rdEIQYO2nw==", + "dev": true + }, "node_modules/performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -15486,12 +16869,42 @@ "node": ">=8" } }, + "node_modules/pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/pofile": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/pofile/-/pofile-1.1.4.tgz", "integrity": "sha512-r6Q21sKsY1AjTVVjOuU02VYKVNQGJNQHjTIvs4dEbeuuYfxgYk/DGD2mqqq4RDaVkwdSq0VEtmQUOPe/wH8X3g==", "dev": true }, + "node_modules/polished": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/polished/-/polished-4.3.1.tgz", + "integrity": "sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.17.8" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/postcss": { "version": "8.4.41", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz", @@ -16758,9 +18171,9 @@ } }, "node_modules/prismjs": { - "version": "1.28.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.28.0.tgz", - "integrity": "sha512-8aaXdYvl1F7iC7Xm1spqSaY/OJBpYW3v+KJ+F17iYxvdc8sfjW194COK5wVhMZX45tGteiBQgdvD/nhxcRwylw==", + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", + "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", "engines": { "node": ">=6" } @@ -16979,12 +18392,33 @@ "performance-now": "^2.1.0" } }, + "node_modules/railroad-diagrams": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz", + "integrity": "sha512-cz93DjNeLY0idrCNOH6PviZGRN9GJhsdm9hpn1YCS879fj4W+x5IFJhhkRZcwVgMmFF7R82UA/7Oh+R8lLZg6A==", + "dev": true, + "peer": true + }, "node_modules/ramda": { "version": "0.27.2", "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.2.tgz", "integrity": "sha512-SbiLPU40JuJniHexQSAgad32hfwd+DRUdwF2PlVuI5RZD0/vahUco7R8vD86J/tcEKKF9vZrUVwgtmGCqlCKyA==", "dev": true }, + "node_modules/randexp": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.4.6.tgz", + "integrity": "sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==", + "dev": true, + "peer": true, + "dependencies": { + "discontinuous-range": "1.0.0", + "ret": "~0.1.10" + }, + "engines": { + "node": ">=0.12" + } + }, "node_modules/random-material-color": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/random-material-color/-/random-material-color-1.0.5.tgz", @@ -17438,6 +18872,19 @@ "node": ">=12" } }, + "node_modules/react-shallow-renderer": { + "version": "16.15.0", + "resolved": "https://registry.npmjs.org/react-shallow-renderer/-/react-shallow-renderer-16.15.0.tgz", + "integrity": "sha512-oScf2FqQ9LFVQgA73vr86xl2NaOIX73rh+YFqcOp68CWj56tSfgtGKrEbyhCj0rSijyG9M1CYprTh39fBi5hzA==", + "dev": true, + "dependencies": { + "object-assign": "^4.1.1", + "react-is": "^16.12.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependencies": { + "react": "^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/react-smooth": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/react-smooth/-/react-smooth-4.0.1.tgz", @@ -17468,6 +18915,28 @@ "react": ">= 0.14.0" } }, + "node_modules/react-tabs": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/react-tabs/-/react-tabs-6.0.2.tgz", + "integrity": "sha512-aQXTKolnM28k3KguGDBSAbJvcowOQr23A+CUJdzJtOSDOtTwzEaJA+1U4KwhNL9+Obe+jFS7geuvA7ICQPXOnQ==", + "dev": true, + "dependencies": { + "clsx": "^2.0.0", + "prop-types": "^15.5.0" + }, + "peerDependencies": { + "react": "^18.0.0" + } + }, + "node_modules/react-tabs/node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/react-transition-group": { "version": "4.4.5", "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", @@ -17577,6 +19046,53 @@ "node": ">=8" } }, + "node_modules/redoc": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/redoc/-/redoc-2.2.0.tgz", + "integrity": "sha512-52rz/xJtpUBc3Y/GAkaX03czKhQXTxoU7WnkXNzRLuGwiGb/iEO4OgwcgQqtwHWrYNaZXTyqZ4MAVXpi/e1gAg==", + "dev": true, + "dependencies": { + "@cfaester/enzyme-adapter-react-18": "^0.8.0", + "@redocly/openapi-core": "^1.4.0", + "classnames": "^2.3.2", + "decko": "^1.2.0", + "dompurify": "^3.0.6", + "eventemitter3": "^5.0.1", + "json-pointer": "^0.6.2", + "lunr": "^2.3.9", + "mark.js": "^8.11.1", + "marked": "^4.3.0", + "mobx-react": "^9.1.1", + "openapi-sampler": "^1.5.0", + "path-browserify": "^1.0.1", + "perfect-scrollbar": "^1.5.5", + "polished": "^4.2.2", + "prismjs": "^1.29.0", + "prop-types": "^15.8.1", + "react-tabs": "^6.0.2", + "slugify": "~1.4.7", + "stickyfill": "^1.1.1", + "swagger2openapi": "^7.0.8", + "url-template": "^2.0.8" + }, + "engines": { + "node": ">=6.9", + "npm": ">=3.0.0" + }, + "peerDependencies": { + "core-js": "^3.1.4", + "mobx": "^6.0.4", + "react": "^16.8.4 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.4 || ^17.0.0 || ^18.0.0", + "styled-components": "^4.1.1 || ^5.1.1 || ^6.0.5" + } + }, + "node_modules/redoc/node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "dev": true + }, "node_modules/redux": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", @@ -17631,6 +19147,15 @@ "node": ">=6" } }, + "node_modules/reftools": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/reftools/-/reftools-1.1.9.tgz", + "integrity": "sha512-OVede/NQE13xBQ+ob5CKd5KyeJYU2YInb1bmV4nRoOfquZPkAkxuOXicSe1PvqIuZZ4kD13sPKBbR7UFDmli6w==", + "dev": true, + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, "node_modules/regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", @@ -17671,14 +19196,15 @@ "dev": true }, "node_modules/regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz", + "integrity": "sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -17926,6 +19452,16 @@ "node": ">=8" } }, + "node_modules/ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.12" + } + }, "node_modules/retry": { "version": "0.13.1", "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", @@ -18027,6 +19563,17 @@ "integrity": "sha512-2+MhsfPhvauN1O8KaXpXAOfR/fwe8dnUXVM+xw7yt40lJRfPVQxV6yryZm0cgRvAj5fMF/mdRZbL2ptwbs5i2g==", "dev": true }, + "node_modules/rst-selector-parser": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/rst-selector-parser/-/rst-selector-parser-2.2.3.tgz", + "integrity": "sha512-nDG1rZeP6oFTLN6yNDV/uiAvs1+FS/KlrEwh7+y7dpuApDBy6bI2HTBcc0/V8lv9OTqfyD34eF7au2pm8aBbhA==", + "dev": true, + "peer": true, + "dependencies": { + "lodash.flattendeep": "^4.4.0", + "nearley": "^2.7.10" + } + }, "node_modules/run-async": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", @@ -18077,11 +19624,52 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true }, + "node_modules/safe-array-concat": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-array-concat/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, "node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, + "node_modules/safe-regex-test": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -18410,12 +19998,33 @@ "node": ">= 0.4" } }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", "dev": true }, + "node_modules/shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", + "dev": true + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -18428,19 +20037,73 @@ "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==", + "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, + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz", + "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==", + "dev": true + }, + "node_modules/should": { + "version": "13.2.3", + "resolved": "https://registry.npmjs.org/should/-/should-13.2.3.tgz", + "integrity": "sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ==", + "dev": true, + "dependencies": { + "should-equal": "^2.0.0", + "should-format": "^3.0.3", + "should-type": "^1.4.0", + "should-type-adaptors": "^1.0.1", + "should-util": "^1.0.0" + } + }, + "node_modules/should-equal": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/should-equal/-/should-equal-2.0.0.tgz", + "integrity": "sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA==", + "dev": true, + "dependencies": { + "should-type": "^1.4.0" + } + }, + "node_modules/should-format": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/should-format/-/should-format-3.0.3.tgz", + "integrity": "sha512-hZ58adtulAk0gKtua7QxevgUaXTTXxIi8t41L3zo9AHvjXO1/7sdLECuHeIN2SRtYXpNkmhoUP2pdeWgricQ+Q==", + "dev": true, + "dependencies": { + "should-type": "^1.3.0", + "should-type-adaptors": "^1.0.1" + } + }, + "node_modules/should-type": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/should-type/-/should-type-1.4.0.tgz", + "integrity": "sha512-MdAsTu3n25yDbIe1NeN69G4n6mUnJGtSJHygX3+oN0ZbO3DTiATnf7XnYJdGT42JCXurTb1JI0qOBR65shvhPQ==", + "dev": true + }, + "node_modules/should-type-adaptors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/should-type-adaptors/-/should-type-adaptors-1.1.0.tgz", + "integrity": "sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA==", "dev": true, - "engines": { - "node": ">=8" + "dependencies": { + "should-type": "^1.3.0", + "should-util": "^1.0.0" } }, - "node_modules/shell-quote": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz", - "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==", + "node_modules/should-util": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/should-util/-/should-util-1.0.1.tgz", + "integrity": "sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g==", "dev": true }, "node_modules/side-channel": { @@ -18467,6 +20130,33 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, + "node_modules/simple-websocket": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/simple-websocket/-/simple-websocket-9.1.0.tgz", + "integrity": "sha512-8MJPnjRN6A8UCp1I+H/dSFyjwJhp6wta4hsVRhjf8w9qBHRzxYt14RaOcjvQnhD1N4yKOddEjflwMnQM4VtXjQ==", + "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" + } + ], + "dependencies": { + "debug": "^4.3.1", + "queue-microtask": "^1.2.2", + "randombytes": "^2.1.0", + "readable-stream": "^3.6.0", + "ws": "^7.4.2" + } + }, "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", @@ -18485,6 +20175,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/slugify": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.4.7.tgz", + "integrity": "sha512-tf+h5W1IrjNm/9rKKj0JU2MDMruiopx0jjVA5zCdBtcGjfp0+c5rHw/zADLC3IeKlGHtVbHtpfzvYA0OYT+HKg==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/sockjs": { "version": "0.3.24", "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", @@ -18727,6 +20426,12 @@ "node": ">= 0.8" } }, + "node_modules/stickyfill": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stickyfill/-/stickyfill-1.1.1.tgz", + "integrity": "sha512-GCp7vHAfpao+Qh/3Flh9DXEJ/qSi0KJwJw6zYlZOtRYXWUIpMM6mC2rIep/dK8RQqwW0KxGJIllmjPIBOGN8AA==", + "dev": true + }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -18814,29 +20519,50 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/string.prototype.trim": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/string.prototype.trimend": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", - "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", - "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -18923,6 +20649,107 @@ "webpack": "^5.0.0" } }, + "node_modules/styled-components": { + "version": "6.1.13", + "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-6.1.13.tgz", + "integrity": "sha512-M0+N2xSnAtwcVAQeFEsGWFFxXDftHUD7XrKla06QbpUMmbmtFBMMTcKWvFXtWxuD5qQkB8iU5gk6QASlx2ZRMw==", + "dev": true, + "dependencies": { + "@emotion/is-prop-valid": "1.2.2", + "@emotion/unitless": "0.8.1", + "@types/stylis": "4.2.5", + "css-to-react-native": "3.2.0", + "csstype": "3.1.3", + "postcss": "8.4.38", + "shallowequal": "1.1.0", + "stylis": "4.3.2", + "tslib": "2.6.2" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/styled-components" + }, + "peerDependencies": { + "react": ">= 16.8.0", + "react-dom": ">= 16.8.0" + } + }, + "node_modules/styled-components/node_modules/@emotion/is-prop-valid": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz", + "integrity": "sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==", + "dev": true, + "dependencies": { + "@emotion/memoize": "^0.8.1" + } + }, + "node_modules/styled-components/node_modules/@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==", + "dev": true + }, + "node_modules/styled-components/node_modules/@emotion/unitless": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", + "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==", + "dev": true + }, + "node_modules/styled-components/node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/styled-components/node_modules/postcss": { + "version": "8.4.38", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", + "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/styled-components/node_modules/stylis": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.2.tgz", + "integrity": "sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==", + "dev": true + }, "node_modules/stylehacks": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.0.tgz", @@ -19156,6 +20983,74 @@ "node": ">=4" } }, + "node_modules/swagger2openapi": { + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/swagger2openapi/-/swagger2openapi-7.0.8.tgz", + "integrity": "sha512-upi/0ZGkYgEcLeGieoz8gT74oWHA0E7JivX7aN9mAf+Tc7BQoRBvnIGHoPDw+f9TXTW4s6kGYCZJtauP6OYp7g==", + "dev": true, + "dependencies": { + "call-me-maybe": "^1.0.1", + "node-fetch": "^2.6.1", + "node-fetch-h2": "^2.3.0", + "node-readfiles": "^0.2.0", + "oas-kit-common": "^1.0.8", + "oas-resolver": "^2.5.6", + "oas-schema-walker": "^1.1.5", + "oas-validator": "^5.0.8", + "reftools": "^1.1.9", + "yaml": "^1.10.0", + "yargs": "^17.0.1" + }, + "bin": { + "boast": "boast.js", + "oas-validate": "oas-validate.js", + "swagger2openapi": "swagger2openapi.js" + }, + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/swagger2openapi/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, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/swagger2openapi/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, + "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/swagger2openapi/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, + "engines": { + "node": ">=12" + } + }, "node_modules/symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", @@ -19665,9 +21560,9 @@ } }, "node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, "node_modules/tss-react": { "version": "4.9.13", @@ -19760,6 +21655,79 @@ "node": ">= 0.6" } }, + "node_modules/typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/typedarray-to-buffer": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", @@ -19813,6 +21781,19 @@ "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", "dev": true }, + "node_modules/uglify-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", + "dev": true, + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", @@ -19828,6 +21809,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/undici": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.21.0.tgz", + "integrity": "sha512-BUgJXc752Kou3oOIuU1i+yZZypyZRqNPW0vqoMPl8VaoalSfeR0D8/t4iAS3yirs79SSMTxTag+ZC86uswv+Cw==", + "dev": true, + "peer": true, + "engines": { + "node": ">=18.17" + } + }, "node_modules/undici-types": { "version": "6.19.8", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", @@ -19975,6 +21966,12 @@ "punycode": "^2.1.0" } }, + "node_modules/uri-js-replace": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uri-js-replace/-/uri-js-replace-1.0.1.tgz", + "integrity": "sha512-W+C9NWNLFOoBI2QWDp4UT9pv65r2w5Cx+3sTYFvtMdDBxkKt1syCqsUdSFAChbEe1uK5TfS04wt/nGwmaeIQ0g==", + "dev": true + }, "node_modules/url-parse": { "version": "1.5.10", "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", @@ -19985,10 +21982,16 @@ "requires-port": "^1.0.0" } }, + "node_modules/url-template": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz", + "integrity": "sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw==", + "dev": true + }, "node_modules/use-sync-external-store": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.1.0.tgz", - "integrity": "sha512-SEnieB2FPKEVne66NpXPd1Np4R1lTNKfjuy3XdIoPQKYBAFdzbzSZlSn1KJZUiihQLQC5Znot4SBz1EOTBwQAQ==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz", + "integrity": "sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==", "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } @@ -20574,6 +22577,25 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/which-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/word-wrap": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", @@ -20583,6 +22605,12 @@ "node": ">=0.10.0" } }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true + }, "node_modules/workbox-background-sync": { "version": "6.5.3", "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.5.3.tgz", @@ -20952,6 +22980,12 @@ "node": ">= 6" } }, + "node_modules/yaml-ast-parser": { + "version": "0.0.43", + "resolved": "https://registry.npmjs.org/yaml-ast-parser/-/yaml-ast-parser-0.0.43.tgz", + "integrity": "sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A==", + "dev": true + }, "node_modules/yargs": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", diff --git a/ui/package.json b/ui/package.json index 478c92fe..9b2da6fe 100644 --- a/ui/package.json +++ b/ui/package.json @@ -55,6 +55,7 @@ "@babel/types": "^7.26.0", "@lingui/cli": "^4.13.0", "@lingui/macro": "^4.13.0", + "@redocly/cli": "^1.25.11", "@testing-library/jest-dom": "^5.17.0", "@testing-library/react": "^16.0.1", "@testing-library/user-event": "^14.5.2", @@ -76,9 +77,9 @@ }, "scripts": { "analyze": "source-map-explorer 'build/static/js/*.js'", - "start": "npm run compile && react-scripts start", - "build": "npm run compile -- strict && react-scripts build", - "build:nonprod": "npm run compile -- strict && env-cmd -f ./.env.nonprod react-scripts build", + "start": "npm run redocly && npm run compile && react-scripts start", + "build": "npm run redocly && npm run compile -- strict && react-scripts build", + "build:nonprod": "npm run redocly && npm run compile -- strict && env-cmd -f ./.env.nonprod react-scripts build", "test": "npm run compile && react-scripts test --reporters=default --reporters=jest-html-reporter", "test-debug": "npm run compile && react-scripts --inspect-brk test --runInBand --no-cache", "test-precommit": "react-scripts test --watchAll=false --env=jsdom --coverage --reporters=default --reporters=jest-html-reporter --silent", @@ -88,7 +89,9 @@ "eslint": "npx eslint \"src/**/*.ts\" \"src/**/*.tsx\"", "dockerlint": "make dockerlint", "mdlint": "markdownlint-cli2 README.md", - "lint": "npm run eslint && npm run dockerlint && npm run mdlint", + "redocly": "env-cmd -f ./redocly.env redocly build-docs --output public/api/index.html", + "redocly-lint": "env-cmd -f ./redocly.env redocly lint", + "lint": "npm run eslint && npm run dockerlint && npm run mdlint && npm run redocly-lint", "prettier-check": "prettier --check \"src/**/*.ts\" \"src/**/*.tsx\"", "prettier-write": "prettier --write \"src/**/*.ts\" \"src/**/*.tsx\"", "precommit": "npm run lint && npm audit --only=prod && npm run prettier-write && npm run extract && npm run compile", diff --git a/ui/redocly.env b/ui/redocly.env new file mode 100644 index 00000000..432aeed9 --- /dev/null +++ b/ui/redocly.env @@ -0,0 +1,3 @@ +# Environment variables set when running Redocly-CLI via package.json scripts. +REDOCLY_TELEMETRY=off +REDOCLY_SUPPRESS_UPDATE_NOTICE=true diff --git a/ui/redocly.yml b/ui/redocly.yml new file mode 100644 index 00000000..ca36d829 --- /dev/null +++ b/ui/redocly.yml @@ -0,0 +1,16 @@ +extends: + - recommended + +apis: + artemis@v1: + root: ./api/spec.yaml + +rules: + # Known issue; will be addressed in a future update to the spec. + operation-4xx-response: off + + # The following paths appear to be ambiguous in the spec, but the value of {id} + # cannot be "whitelist" so the path resolves correctly. + # /{service}/{org}/{repo}/whitelist/{id} + # /{service}/{org}/{repo}/{id}/report + no-ambiguous-paths: off