diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
new file mode 100644
index 00000000..5328925e
--- /dev/null
+++ b/.github/workflows/build.yml
@@ -0,0 +1,45 @@
+name: Run Tests
+on:
+ - push
+jobs:
+ test:
+ runs-on: ubuntu-latest
+ env:
+ AWS_ACCESS_KEY_ID: ci
+ AWS_SECRET_ACCESS_KEY: ci
+ steps:
+ - uses: actions/checkout@v3
+ - uses: actions/setup-node@v3
+ with:
+ node-version: 16.x
+ cache: "npm"
+ - run: npm ci
+ - name: Check code style
+ run: npm run prettier
+ - name: Run tests
+ run: npm run test:coverage
+ validate-template:
+ runs-on: ubuntu-latest
+ permissions:
+ id-token: write
+ contents: read
+ environment: test
+ steps:
+ - uses: aws-actions/setup-sam@v1
+ - uses: aws-actions/configure-aws-credentials@master
+ with:
+ role-to-assume: arn:aws:iam::${{ secrets.AwsAccount }}:role/github-actions-role
+ aws-region: us-east-1
+ - uses: actions/checkout@v3
+ - name: Validate template
+ run: sam build && sam validate
+ validate-api-spec:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v3
+ - name: Validate OpenAPI Spec
+ run: |
+ docker run -u 1001 --rm --workdir /github/workspace \
+ -v $GITHUB_WORKSPACE:/github/workspace \
+ openapitools/openapi-generator-cli:latest validate \
+ -i /github/workspace/docs/docs/spec/openapi.yaml
diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml
new file mode 100644
index 00000000..2c36a3b5
--- /dev/null
+++ b/.github/workflows/deploy.yml
@@ -0,0 +1,91 @@
+name: Deploy
+on:
+ push:
+ branches:
+ - deploy/staging
+ - main
+env:
+ CONFIG_ENV: ${{ github.ref == 'refs/heads/main' && 'production' || 'staging' }}
+jobs:
+ build-deploy:
+ runs-on: ubuntu-latest
+ permissions:
+ id-token: write
+ contents: read
+ environment: ${{ github.ref == 'refs/heads/main' && 'production' || 'staging' }}
+ steps:
+ - name: Set GitHub Deploy Key
+ uses: webfactory/ssh-agent@v0.5.3
+ with:
+ ssh-private-key: ${{ secrets.TFVARS_DEPLOY_KEY }}
+ - uses: actions/checkout@v2
+ - uses: actions/checkout@v2
+ with:
+ repository: "nulib/tfvars"
+ ref: main
+ path: ".tfvars"
+ - uses: actions/setup-python@v2
+ - uses: aws-actions/setup-sam@v1
+ - uses: aws-actions/configure-aws-credentials@master
+ with:
+ role-to-assume: arn:aws:iam::${{ secrets.AwsAccount }}:role/github-actions-role
+ aws-region: us-east-1
+ - run: ln -s .tfvars/dc-api/samconfig.toml .
+ - run: sam build
+ - run: sam deploy --no-confirm-changeset --no-fail-on-empty-changeset --config-env $CONFIG_ENV
+ docs-changed:
+ runs-on: ubuntu-latest
+ outputs:
+ result: ${{ steps.changed-files.outputs.any_modified == 'true' }}
+ steps:
+ - uses: actions/checkout@v2
+ with:
+ fetch-depth: 2
+ - name: Get changed doc files
+ id: changed-files
+ uses: tj-actions/changed-files@v29.0.2
+ with:
+ files: |
+ .github/workflows/docs.yaml
+ docs/*
+ publish-docs:
+ needs: docs-changed
+ if: ${{ needs.docs-changed.outputs.result == 'true' }}
+ runs-on: ubuntu-latest
+ permissions:
+ id-token: write
+ contents: read
+ environment: ${{ github.ref == 'refs/heads/main' && 'production' || 'staging' }}
+ steps:
+ - name: Configure AWS Credentials
+ uses: aws-actions/configure-aws-credentials@master
+ with:
+ role-to-assume: arn:aws:iam::${{ secrets.AwsAccount }}:role/github-actions-role
+ aws-region: us-east-1
+ - uses: actions/checkout@v2
+ - uses: actions/setup-python@v2
+ with:
+ python-version: 3.9
+ - uses: abatilo/actions-poetry@v2
+ with:
+ poetry-version: 1.1.14
+ - name: Install dependencies
+ run: poetry install
+ working-directory: ./docs
+ - name: Build docs
+ run: poetry run mkdocs build --clean
+ working-directory: ./docs
+ - name: Determine correct deploy domain for environment
+ run: sed -i s/rdc\\.library\\.northwestern\\.edu/${ZONE}/g docs/site/spec/openapi.*
+ env:
+ ZONE: ${{ secrets.HostedZone }}
+ - name: Generate JSON API
+ uses: openapi-generators/openapitools-generator-action@v1
+ with:
+ generator: openapi
+ openapi-file: docs/site/spec/openapi.yaml
+ command-args: -o docs/site/spec
+ - name: Copy to S3
+ run: aws s3 sync --delete docs/site/ s3://dcapi-docs.${ZONE}/
+ env:
+ ZONE: ${{ secrets.HostedZone }}
diff --git a/.gitignore b/.gitignore
index a9f33f38..ba72ff82 100644
--- a/.gitignore
+++ b/.gitignore
@@ -205,6 +205,12 @@ $RECYCLE.BIN/
# Windows shortcuts
*.lnk
-samconfig.toml
-
# End of https://www.toptal.com/developers/gitignore/api/osx,node,linux,windows,sam
+
+/docs/docs/spec/.openapi-*
+/docs/docs/spec/openapi.json
+/docs/site
+
+.vscode
+/samconfig.toml
+/env.json
diff --git a/.mocharc.js b/.mocharc.js
new file mode 100644
index 00000000..b07081b6
--- /dev/null
+++ b/.mocharc.js
@@ -0,0 +1,5 @@
+module.exports = {
+ ignore: ["test/test-helpers/**/*"],
+ recursive: true,
+ require: "test/test-helpers"
+}
\ No newline at end of file
diff --git a/.npmignore b/.npmignore
index e7e1fb04..ab1cfb4e 100644
--- a/.npmignore
+++ b/.npmignore
@@ -1 +1 @@
-tests/*
+test/*
diff --git a/README.md b/README.md
index c5fe290b..781adfb4 100644
--- a/README.md
+++ b/README.md
@@ -1,15 +1,70 @@
# dc-api-v2
+
+
## Directory structure
```
-src/
- api/ - code that directly supports API requests
- request/ - code to wrap/transform/modify incoming queries
- response/ - code to transform OpenSearch responses into the proper result format
- iiif/ - iiif formatted response transformers
- opensearch/ - opensearch formatted response transformers
- oai-pmh/ - oai-pmh formatted response transformers
- aws/ - lower-level code to interact with AWS resources and OpenSearch
- handlers/ - minimal code required to bridge between API Gateway request and core logic
+.
+├── docs/ - mkdocs-based API documentation
+├── events/ - sample HTTP API Lambda events
+├── src/
+│ └── api/ - code that directly supports API requests
+│ ├── request/ - code to wrap/transform/modify incoming queries
+│ ├── response/ - code to transform OpenSearch responses into the proper result format
+│ │ ├── iiif/ - iiif formatted response transformers
+│ │ ├── opensearch/ - opensearch formatted response transformers
+│ │ └── oai-pmh/ - oai-pmh formatted response transformers
+│ ├── aws/ - lower-level code to interact with AWS resources and OpenSearch
+│ └── handlers/ - minimal code required to bridge between API Gateway request and core logic
+└── test/ - tests and test helpers
+```
+
+## Local development setup
+
+### `samconfig.toml`
+
+The configuration file that tells the `sam` command how to run and deploy the API is called `samconfig.toml`. There are two ways to get that file. From the local project root:
+
+1. For local development only: `ln -s dev/samconfig.toml .`
+2. If you need to be able to deploy: `ln -s /path/to/tfvars/dc-api/samconfig.toml .` (You will need to have a local working copy of the private `tfvars` repo first.)
+
+Whichever you choose, the resulting file will be ignored by `git`.
+
+### `env.json`
+
+The `env.json` file contains environment variable values for the lambda functions defined in the API for use in local development. An initial (empty) version with all the names of the necessary variables is in `dev/env.json`. Copy (**do not symlink**) this file into the project root and customize it for your own environment. It will also be ignored by `git`.
+
+Some of the values can be found as follows:
+
+- `API_TOKEN_SECRET` - already defined; value has to exist but doesn't matter in dev mode
+- `ELASTICSEARCH_ENDPOINT` - run the following command:
+ ```
+ aws secretsmanager get-secret-value \
+ --secret-id dev-environment/config/meadow --query SecretString \
+ --output text | jq -r '.index.index_endpoint | sub("^https?://";"")'
+ ```
+- `ENV_PREFIX` - The username and environment indicating which index to use. Usually your dev environment user prefix followed by `-dev` (e.g., `mbk-dev`), but if you want to use your test index or someone else's index, adjust the value accordingly.
+
+## Running the API locally
+
+To start the API in development mode, run the following commands:
+
+```
+rm -rf .aws-sam
+sam local start-api --host 0.0.0.0 --log-file dc-api.log
+```
+
+The API will be available at:
+
+- `http://localhost:3000` (from your dev environment)
+- `http://USER_PREFIX.dev.library.northwestern.edu:3000` (from elsewhere)
+ - Don't forget to [open port 3000](https://github.com/nulib/aws-developer-environment#convenience-scripts) if you want to access it remotely
+
+## Running the API locally via our AWS dev domain
+
+Use the [https-proxy](https://github.com/nulib/aws-developer-environment#convenience-scripts) script to make the local environment live at: https://[DEV_PREFIX].dev.rdc.library.northwestern.edu:3002/search
+
+```
+https-proxy start 3002 3000
```
diff --git a/dev/env.json b/dev/env.json
new file mode 100644
index 00000000..ffcaadf5
--- /dev/null
+++ b/dev/env.json
@@ -0,0 +1,8 @@
+{
+ "Parameters": {
+ "API_TOKEN_SECRET": "DEVELOPMENT_SECRET",
+ "ELASTICSEARCH_ENDPOINT": "",
+ "ENV_PREFIX": "",
+ "DC_URL": ""
+ }
+}
\ No newline at end of file
diff --git a/dev/samconfig.toml b/dev/samconfig.toml
new file mode 100644
index 00000000..00efd7e8
--- /dev/null
+++ b/dev/samconfig.toml
@@ -0,0 +1,7 @@
+version = 0.1
+[default]
+[default.deploy]
+[default.deploy.parameters]
+
+[default.local_start_api.parameters]
+env_vars = "env.json"
diff --git a/docs/docs/css/fonts.css b/docs/docs/css/fonts.css
new file mode 100644
index 00000000..0a834ef4
--- /dev/null
+++ b/docs/docs/css/fonts.css
@@ -0,0 +1,83 @@
+@font-face {
+ font-family: "Akkurat Pro Light";
+ src: url("https://common.northwestern.edu/v8/css/fonts/AkkuratProLight.woff") format("woff");
+ font-weight: normal;
+ font-style:normal
+}
+
+@font-face {
+ font-family: "Akkurat Pro Light Italic";
+ src: url("https://common.northwestern.edu/v8/css/fonts/AkkuratProLightItalic.woff") format("woff");
+ font-weight: normal;
+ font-style:normal
+}
+
+@font-face {
+ font-family: "Akkurat Pro Regular";
+ src: url("https://common.northwestern.edu/v8/css/fonts/AkkuratProRegular.woff") format("woff");
+ font-weight: normal;
+ font-style:normal
+}
+
+@font-face {
+ font-family: "Akkurat Pro Italic";
+ src: url("https://common.northwestern.edu/v8/css/fonts/AkkuratProItalic.woff") format("woff");
+ font-weight: normal;
+ font-style:normal
+}
+
+@font-face {
+ font-family: "Akkurat Pro Bold";
+ src: url("https://common.northwestern.edu/v8/css/fonts/AkkuratProBold.woff") format("woff");
+ font-weight: normal;
+ font-style:normal
+}
+
+@font-face {
+ font-family: "Akkurat Pro Bold Italic";
+ src: url("https://common.northwestern.edu/v8/css/fonts/AkkuratProBoldItalic.woff") format("woff");
+ font-weight: normal;
+ font-style:normal
+}
+
+@font-face {
+ font-family: "Campton Book";
+ src: url("https://common.northwestern.edu/v8/css/fonts/CamptonBook.woff") format("woff");
+ font-weight: normal;
+ font-style:normal
+}
+
+@font-face {
+ font-family: "Campton Bold";
+ src: url("https://common.northwestern.edu/v8/css/fonts/CamptonBold.woff") format("woff");
+ font-weight: normal;
+ font-style:normal
+}
+
+@font-face {
+ font-family: "Campton Extra Bold";
+ src: url("https://common.northwestern.edu/v8/css/fonts/CamptonExtraBold.woff") format("woff");
+ font-weight: normal;
+ font-style:normal
+}
+
+@font-face {
+ font-family: "Campton Extra Light";
+ src: url("https://common.northwestern.edu/v8/css/fonts/CamptonExtraLight.woff") format("woff");
+ font-weight: normal;
+ font-style:normal
+}
+
+@font-face {
+ font-family: "Noto Serif Italic";
+ font-style: italic;
+ font-weight: 400;
+ src: url("https://common.northwestern.edu/v8/css/fonts/noto-serif-v16-latin-italic.woff") format("woff")
+}
+
+@font-face {
+ font-family: "Noto Serif Bold Italic";
+ font-style: italic;
+ font-weight: 700;
+ src: url("https://common.northwestern.edu/v8/css/fonts/noto-serif-v16-latin-700italic.woff") format("woff")
+}
\ No newline at end of file
diff --git a/docs/docs/css/overrides.css b/docs/docs/css/overrides.css
new file mode 100644
index 00000000..8ab993ef
--- /dev/null
+++ b/docs/docs/css/overrides.css
@@ -0,0 +1,3 @@
+body {
+ font-family: "Akkurat Pro Regular", -apple-system, BlinkMacSystemFont, Helvetica, Arial, sans-serif
+}
\ No newline at end of file
diff --git a/docs/docs/index.md b/docs/docs/index.md
new file mode 100644
index 00000000..4c2e2179
--- /dev/null
+++ b/docs/docs/index.md
@@ -0,0 +1,7 @@
+## Overview
+
+Here are the docs.
+
+[Here](./spec/openapi.json) is the OpenAPI spec.
+
+[Here](./spec/openapi.html) is the Swagger UI documentation.
\ No newline at end of file
diff --git a/docs/docs/spec/openapi.html b/docs/docs/spec/openapi.html
new file mode 100644
index 00000000..4ab7c82f
--- /dev/null
+++ b/docs/docs/spec/openapi.html
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+ SwaggerUI
+
+
+
+
+
+
+
+
+
diff --git a/docs/docs/spec/openapi.yaml b/docs/docs/spec/openapi.yaml
new file mode 100644
index 00000000..aec9aaa0
--- /dev/null
+++ b/docs/docs/spec/openapi.yaml
@@ -0,0 +1,183 @@
+openapi: 3.0.1
+info:
+ title: Northwestern University Libraries Digital Collections API
+ description: >
+ This is full Markdown intro text. This API drives the [Northwestern University Libraries Digital
+ Collections](https://dc.library.northwestern.edu) site.
+
+ I can even put line breaks in it. I can also link back to the [main documentation](..).
+ version: 2.0.0
+ contact:
+ name: NUL Repository Team
+ email: repository@northwestern.edu
+servers:
+ - url: https://dcapi.rdc.library.northwestern.edu/api/v2
+tags:
+ - name: Models
+ description: >
+ Endpoints for listing and retrieving Collections, FileSets, and Works.
+ - name: Search
+ description: >
+ Endpoints for searching the index.
+paths:
+ /collections:
+ get:
+ operationId: getCollections
+ tags:
+ - Collection
+ parameters:
+ - $ref: "./types.yaml#/components/parameters/page"
+ - $ref: "./types.yaml#/components/parameters/size"
+ - $ref: "./types.yaml#/components/parameters/sort"
+ responses:
+ 200:
+ $ref: "./types.yaml#/components/responses/SearchResponse"
+ /collections/{id}:
+ get:
+ tags:
+ - Collection
+ operationId: getCollectionById
+ parameters:
+ - $ref: "./types.yaml#/components/parameters/id"
+ - $ref: "./types.yaml#/components/parameters/as"
+ responses:
+ 200:
+ $ref: "./types.yaml#/components/responses/DocumentResponse"
+ /collections/{id}/thumbnail:
+ get:
+ operationId: getCollectionThumbnail
+ tags:
+ - Collection
+ parameters:
+ - $ref: "./types.yaml#/components/parameters/id"
+ - $ref: "./types.yaml#/components/parameters/id"
+ - $ref: "./types.yaml#/components/parameters/thumbnailAspect"
+ - $ref: "./types.yaml#/components/parameters/thumbnailSize"
+ responses:
+ 200:
+ description: A thumbnail image for the given collection
+ content:
+ image/jpeg:
+ schema:
+ type: string
+ format: binary
+ /file-sets/{id}:
+ get:
+ operationId: getFileSetById
+ tags:
+ - FileSet
+ parameters:
+ - $ref: "./types.yaml#/components/parameters/id"
+ responses:
+ 200:
+ $ref: "./types.yaml#/components/responses/DocumentResponse"
+ /file-sets/{id}/authorization:
+ get:
+ operationId: getFileSetAuth
+ tags:
+ - FileSet
+ parameters:
+ - $ref: "./types.yaml#/components/parameters/id"
+ responses:
+ 204:
+ description: "The resource is authorized"
+ 403:
+ $ref: "The resource is not authorized"
+ /works/{id}:
+ get:
+ operationId: getWorkById
+ tags:
+ - Work
+ parameters:
+ - $ref: "./types.yaml#/components/parameters/id"
+ responses:
+ 200:
+ $ref: "./types.yaml#/components/responses/DocumentResponse"
+ /works/{id}/similar:
+ get:
+ operationId: getSimilarWorks
+ tags:
+ - Work
+ parameters:
+ - $ref: "./types.yaml#/components/parameters/id"
+ - $ref: "./types.yaml#/components/parameters/page"
+ - $ref: "./types.yaml#/components/parameters/size"
+ - $ref: "./types.yaml#/components/parameters/sort"
+ - $ref: "./types.yaml#/components/parameters/as"
+ responses:
+ 200:
+ $ref: "./types.yaml#/components/responses/SearchResponse"
+ /works/{id}/thumbnail:
+ get:
+ operationId: getWorkThumbnail
+ tags:
+ - Work
+ parameters:
+ - $ref: "./types.yaml#/components/parameters/id"
+ - $ref: "./types.yaml#/components/parameters/thumbnailAspect"
+ - $ref: "./types.yaml#/components/parameters/thumbnailSize"
+ responses:
+ 200:
+ description: A thumbnail image for the given work
+ content:
+ image/jpeg:
+ schema:
+ type: string
+ format: binary
+ /search:
+ get:
+ operationId: getSearch
+ tags:
+ - Search
+ parameters:
+ - $ref: "./types.yaml#/components/parameters/query"
+ - $ref: "./types.yaml#/components/parameters/searchToken"
+ - $ref: "./types.yaml#/components/parameters/page"
+ - $ref: "./types.yaml#/components/parameters/size"
+ - $ref: "./types.yaml#/components/parameters/sort"
+ - $ref: "./types.yaml#/components/parameters/as"
+ responses:
+ 200:
+ $ref: "./types.yaml#/components/responses/SearchResponse"
+ post:
+ operationId: postSearch
+ tags:
+ - Search
+ requestBody:
+ content:
+ application/json:
+ schema:
+ type: object
+
+ responses:
+ 200:
+ $ref: "./types.yaml#/components/responses/SearchResponse"
+ /search/{models}:
+ get:
+ operationId: getSearchWithModels
+ tags:
+ - Search
+ parameters:
+ - $ref: "./types.yaml#/components/parameters/models"
+ - $ref: "./types.yaml#/components/parameters/query"
+ - $ref: "./types.yaml#/components/parameters/searchToken"
+ - $ref: "./types.yaml#/components/parameters/page"
+ - $ref: "./types.yaml#/components/parameters/size"
+ - $ref: "./types.yaml#/components/parameters/sort"
+ - $ref: "./types.yaml#/components/parameters/as"
+ responses:
+ 200:
+ $ref: "./types.yaml#/components/responses/SearchResponse"
+ post:
+ operationId: postSearchWithModels
+ tags:
+ - Search
+ parameters:
+ - $ref: "./types.yaml#/components/parameters/models"
+ - $ref: "./types.yaml#/components/parameters/page"
+ - $ref: "./types.yaml#/components/parameters/size"
+ - $ref: "./types.yaml#/components/parameters/sort"
+ - $ref: "./types.yaml#/components/parameters/as"
+ responses:
+ 200:
+ $ref: "./types.yaml#/components/responses/SearchResponse"
diff --git a/docs/docs/spec/types.yaml b/docs/docs/spec/types.yaml
new file mode 100644
index 00000000..ba9e2ad6
--- /dev/null
+++ b/docs/docs/spec/types.yaml
@@ -0,0 +1,156 @@
+openapi: 3.0.1
+components:
+ parameters:
+ models:
+ name: models
+ in: path
+ description: Comma-delimited list of models to search
+ required: true
+ schema:
+ type: array
+ items:
+ type: string
+ enum:
+ - collections
+ - file-sets
+ - Works
+ style: simple
+ id:
+ name: id
+ in: path
+ required: true
+ description: Collection, FileSet, or Work ID
+ schema:
+ type: string
+ format: uuid
+ query:
+ name: query
+ in: query
+ required: false
+ description: Keyword query
+ schema:
+ type: string
+ searchToken:
+ name: searchToken
+ in: query
+ required: false
+ description: Search token from previous search response
+ schema:
+ type: string
+ page:
+ name: page
+ in: query
+ required: false
+ description: Page number of results to retrieve
+ schema:
+ type: integer
+ minimum: 1
+ size:
+ name: size
+ in: query
+ required: false
+ description: Maximum number of results per page
+ schema:
+ type: integer
+ minimum: 0
+ sort:
+ name: sort
+ in: query
+ required: false
+ description: Comma-delimited list of fields to sort search results (e.g. "create_date:asc,modified_date:desc")
+ schema:
+ type: string
+ as:
+ name: as
+ in: query
+ required: false
+ description: Desired output format
+ schema:
+ type: string
+ enum:
+ - iiif
+ - opensearch
+ thumbnailAspect:
+ name: aspect
+ in: query
+ required: false
+ description: Desired aspect ratio
+ schema:
+ type: string
+ enum:
+ - full
+ - square
+ thumbnailSize:
+ name: size
+ in: query
+ required: false
+ description: Size of largest dimension
+ schema:
+ type: integer
+ minimum: 1
+ maximum: 300
+ responses:
+ DocumentResponse:
+ description: A single document response
+ content:
+ application/json:
+ schema:
+ type: object
+ properties:
+ data:
+ $ref: "#/components/schemas/IndexDocument"
+ info:
+ type: object
+ SearchResponse:
+ description: A page of search results
+ content:
+ application/json:
+ schema:
+ oneOf:
+ - $ref: "#/components/schemas/OpenSearchResponse"
+ - $ref: "#/components/schemas/IiifPresentationManifest"
+ schemas:
+ IiifPresentationManifest:
+ type: object
+ description: A [IIIF Presentation v3.x](https://iiif.io/api/presentation/3.0/) Manifest
+ IndexDocument:
+ type: object
+ description: A single index document
+ OpenSearchResponse:
+ type: object
+ properties:
+ data:
+ type: array
+ items:
+ $ref: "#/components/schemas/IndexDocument"
+ description: An array of response documents
+ pagination:
+ $ref: "#/components/schemas/PaginationInfo"
+ PaginationInfo:
+ type: object
+ description: Pagination info for the current response
+ properties:
+ next_url:
+ type: string
+ description: Full URL to the next page of results
+ prev_url:
+ type: string
+ description: Full URL to the previous page of results
+ query_url:
+ type: string
+ description: Base URL to repeat this query for a given page
+ current_page:
+ type: integer
+ description: Index of current page of results
+ limit:
+ type: integer
+ description: Number of results per page
+ offset:
+ type: integer
+ description: Starting index of first result on the current page
+ total_hits:
+ type: integer
+ description: Total number of results
+ total_pages:
+ type: integer
+ description: Total number of result pages
diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml
new file mode 100644
index 00000000..3c87ebc7
--- /dev/null
+++ b/docs/mkdocs.yml
@@ -0,0 +1,28 @@
+site_name: "NUL Digital Collections API"
+site_url: https://dcapi.rdc.library.northwestern.edu/api/v2/
+use_directory_urls: true
+theme:
+ name: material
+extra_css:
+- css/fonts.css
+- css/overrides.css
+repo_name: "nulib/dc-api-v2"
+repo_url: "https://github.com/nulib/dc-api-v2"
+edit_uri: blob/main/docs/docs/
+plugins:
+ - macros
+ - search
+markdown_extensions:
+ - admonition #adds ability to have custom highlight boxes with !!!
+ - codehilite:
+ guess_lang: false
+ - def_list
+ - footnotes
+ - smarty
+ - pymdownx.details
+ - pymdownx.inlinehilite
+ - pymdownx.mark
+ - pymdownx.superfences
+ - pymdownx.tilde
+ - toc:
+ permalink: true
diff --git a/docs/poetry.lock b/docs/poetry.lock
new file mode 100644
index 00000000..a3fe5ac7
--- /dev/null
+++ b/docs/poetry.lock
@@ -0,0 +1,497 @@
+[[package]]
+name = "click"
+version = "8.1.3"
+description = "Composable command line interface toolkit"
+category = "main"
+optional = false
+python-versions = ">=3.7"
+
+[package.dependencies]
+colorama = {version = "*", markers = "platform_system == \"Windows\""}
+
+[[package]]
+name = "colorama"
+version = "0.4.5"
+description = "Cross-platform colored terminal text."
+category = "main"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+
+[[package]]
+name = "diagrams"
+version = "0.21.1"
+description = "Diagram as Code"
+category = "main"
+optional = false
+python-versions = ">=3.6,<4.0"
+
+[package.dependencies]
+graphviz = ">=0.13.2,<0.20.0"
+jinja2 = ">=2.10,<4.0"
+
+[[package]]
+name = "ghp-import"
+version = "2.1.0"
+description = "Copy your docs directly to the gh-pages branch."
+category = "main"
+optional = false
+python-versions = "*"
+
+[package.dependencies]
+python-dateutil = ">=2.8.1"
+
+[package.extras]
+dev = ["wheel", "flake8", "markdown", "twine"]
+
+[[package]]
+name = "graphviz"
+version = "0.19.2"
+description = "Simple Python interface for Graphviz"
+category = "main"
+optional = false
+python-versions = ">=3.7"
+
+[package.extras]
+dev = ["tox (>=3)", "flake8", "pep8-naming", "wheel", "twine"]
+docs = ["sphinx (>=1.8)", "sphinx-autodoc-typehints", "sphinx-rtd-theme"]
+test = ["pytest (>=6)", "pytest-mock (>=3)", "mock (>=4)", "pytest-cov", "coverage"]
+
+[[package]]
+name = "importlib-metadata"
+version = "4.12.0"
+description = "Read metadata from Python packages"
+category = "main"
+optional = false
+python-versions = ">=3.7"
+
+[package.dependencies]
+zipp = ">=0.5"
+
+[package.extras]
+docs = ["sphinx", "jaraco.packaging (>=9)", "rst.linker (>=1.9)"]
+perf = ["ipython"]
+testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.3)", "packaging", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)", "importlib-resources (>=1.3)"]
+
+[[package]]
+name = "jinja2"
+version = "3.1.2"
+description = "A very fast and expressive template engine."
+category = "main"
+optional = false
+python-versions = ">=3.7"
+
+[package.dependencies]
+MarkupSafe = ">=2.0"
+
+[package.extras]
+i18n = ["Babel (>=2.7)"]
+
+[[package]]
+name = "markdown"
+version = "3.3.7"
+description = "Python implementation of Markdown."
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[package.dependencies]
+importlib-metadata = {version = ">=4.4", markers = "python_version < \"3.10\""}
+
+[package.extras]
+testing = ["coverage", "pyyaml"]
+
+[[package]]
+name = "markupsafe"
+version = "2.1.1"
+description = "Safely add untrusted strings to HTML/XML markup."
+category = "main"
+optional = false
+python-versions = ">=3.7"
+
+[[package]]
+name = "mergedeep"
+version = "1.3.4"
+description = "A deep merge function for 🐍."
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[[package]]
+name = "mkdocs"
+version = "1.3.1"
+description = "Project documentation with Markdown."
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[package.dependencies]
+click = ">=3.3"
+ghp-import = ">=1.0"
+importlib-metadata = ">=4.3"
+Jinja2 = ">=2.10.2"
+Markdown = ">=3.2.1,<3.4"
+mergedeep = ">=1.3.4"
+packaging = ">=20.5"
+PyYAML = ">=3.10"
+pyyaml-env-tag = ">=0.1"
+watchdog = ">=2.0"
+
+[package.extras]
+i18n = ["babel (>=2.9.0)"]
+
+[[package]]
+name = "mkdocs-macros-plugin"
+version = "0.5.12"
+description = ""
+category = "main"
+optional = false
+python-versions = ">=3.5"
+develop = false
+
+[package.dependencies]
+jinja2 = "*"
+mkdocs = ">=0.17"
+python-dateutil = "*"
+pyyaml = "*"
+termcolor = "*"
+
+[package.extras]
+test = ["mkdocs-macros-test", "mkdocs-material (>=6.2)", "mkdocs-include-markdown-plugin"]
+
+[package.source]
+type = "git"
+url = "https://github.com/fralau/mkdocs_macros_plugin.git"
+reference = "v0.5.12"
+resolved_reference = "4bf847b3460471ee9cf2559cd5562954f378fe3b"
+
+[[package]]
+name = "mkdocs-material"
+version = "8.4.2"
+description = "Documentation that simply works"
+category = "main"
+optional = false
+python-versions = ">=3.7"
+
+[package.dependencies]
+jinja2 = ">=3.0.2"
+markdown = ">=3.2"
+mkdocs = ">=1.3.0"
+mkdocs-material-extensions = ">=1.0.3"
+pygments = ">=2.12"
+pymdown-extensions = ">=9.4"
+
+[[package]]
+name = "mkdocs-material-extensions"
+version = "1.0.3"
+description = "Extension pack for Python Markdown."
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[[package]]
+name = "packaging"
+version = "21.3"
+description = "Core utilities for Python packages"
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[package.dependencies]
+pyparsing = ">=2.0.2,<3.0.5 || >3.0.5"
+
+[[package]]
+name = "pygments"
+version = "2.13.0"
+description = "Pygments is a syntax highlighting package written in Python."
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[package.extras]
+plugins = ["importlib-metadata"]
+
+[[package]]
+name = "pymdown-extensions"
+version = "9.5"
+description = "Extension pack for Python Markdown."
+category = "main"
+optional = false
+python-versions = ">=3.7"
+
+[package.dependencies]
+markdown = ">=3.2"
+
+[[package]]
+name = "pyparsing"
+version = "3.0.9"
+description = "pyparsing module - Classes and methods to define and execute parsing grammars"
+category = "main"
+optional = false
+python-versions = ">=3.6.8"
+
+[package.extras]
+diagrams = ["railroad-diagrams", "jinja2"]
+
+[[package]]
+name = "python-dateutil"
+version = "2.8.2"
+description = "Extensions to the standard Python datetime module"
+category = "main"
+optional = false
+python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7"
+
+[package.dependencies]
+six = ">=1.5"
+
+[[package]]
+name = "pyyaml"
+version = "6.0"
+description = "YAML parser and emitter for Python"
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[[package]]
+name = "pyyaml-env-tag"
+version = "0.1"
+description = "A custom YAML tag for referencing environment variables in YAML files. "
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[package.dependencies]
+pyyaml = "*"
+
+[[package]]
+name = "six"
+version = "1.16.0"
+description = "Python 2 and 3 compatibility utilities"
+category = "main"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*"
+
+[[package]]
+name = "termcolor"
+version = "1.1.0"
+description = "ANSII Color formatting for output in terminal."
+category = "main"
+optional = false
+python-versions = "*"
+
+[[package]]
+name = "watchdog"
+version = "2.1.9"
+description = "Filesystem events monitoring"
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[package.extras]
+watchmedo = ["PyYAML (>=3.10)"]
+
+[[package]]
+name = "zipp"
+version = "3.8.1"
+description = "Backport of pathlib-compatible object wrapper for zip files"
+category = "main"
+optional = false
+python-versions = ">=3.7"
+
+[package.extras]
+docs = ["sphinx", "jaraco.packaging (>=9)", "rst.linker (>=1.9)", "jaraco.tidelift (>=1.4)"]
+testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.3)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)"]
+
+[metadata]
+lock-version = "1.1"
+python-versions = "^3.8"
+content-hash = "19c6631c5ea5f1b10be8c0d9c93637d1b6930d4c437196825d483dcb1474dd09"
+
+[metadata.files]
+click = [
+ {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"},
+ {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"},
+]
+colorama = [
+ {file = "colorama-0.4.5-py2.py3-none-any.whl", hash = "sha256:854bf444933e37f5824ae7bfc1e98d5bce2ebe4160d46b5edf346a89358e99da"},
+ {file = "colorama-0.4.5.tar.gz", hash = "sha256:e6c6b4334fc50988a639d9b98aa429a0b57da6e17b9a44f0451f930b6967b7a4"},
+]
+diagrams = [
+ {file = "diagrams-0.21.1-py3-none-any.whl", hash = "sha256:1d0fea187ed76136dadccf943da914dd9974ebdd3cbb993f4283ec8f51cf90f2"},
+ {file = "diagrams-0.21.1.tar.gz", hash = "sha256:732caa4e61113a06b9a80965be6171c4c5858f3570b5b1f5ba52304a6eeade60"},
+]
+ghp-import = [
+ {file = "ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343"},
+ {file = "ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619"},
+]
+graphviz = [
+ {file = "graphviz-0.19.2-py3-none-any.whl", hash = "sha256:c0a6ac9fadaa308c4ab0d526749c6e127425ec5a76644bbb03e2e04b19a9da9f"},
+ {file = "graphviz-0.19.2.zip", hash = "sha256:7c90cebc147c18bcdffcd3c76db58cbface5d45fe0247a2f3bfb144d32a8c77c"},
+]
+importlib-metadata = [
+ {file = "importlib_metadata-4.12.0-py3-none-any.whl", hash = "sha256:7401a975809ea1fdc658c3aa4f78cc2195a0e019c5cbc4c06122884e9ae80c23"},
+ {file = "importlib_metadata-4.12.0.tar.gz", hash = "sha256:637245b8bab2b6502fcbc752cc4b7a6f6243bb02b31c5c26156ad103d3d45670"},
+]
+jinja2 = [
+ {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"},
+ {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"},
+]
+markdown = [
+ {file = "Markdown-3.3.7-py3-none-any.whl", hash = "sha256:f5da449a6e1c989a4cea2631aa8ee67caa5a2ef855d551c88f9e309f4634c621"},
+ {file = "Markdown-3.3.7.tar.gz", hash = "sha256:cbb516f16218e643d8e0a95b309f77eb118cb138d39a4f27851e6a63581db874"},
+]
+markupsafe = [
+ {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812"},
+ {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a"},
+ {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e"},
+ {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5"},
+ {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4"},
+ {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f"},
+ {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e"},
+ {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933"},
+ {file = "MarkupSafe-2.1.1-cp310-cp310-win32.whl", hash = "sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6"},
+ {file = "MarkupSafe-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417"},
+ {file = "MarkupSafe-2.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02"},
+ {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a"},
+ {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37"},
+ {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980"},
+ {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a"},
+ {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3"},
+ {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a"},
+ {file = "MarkupSafe-2.1.1-cp37-cp37m-win32.whl", hash = "sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff"},
+ {file = "MarkupSafe-2.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a"},
+ {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452"},
+ {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003"},
+ {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1"},
+ {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601"},
+ {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925"},
+ {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f"},
+ {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88"},
+ {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63"},
+ {file = "MarkupSafe-2.1.1-cp38-cp38-win32.whl", hash = "sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1"},
+ {file = "MarkupSafe-2.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7"},
+ {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a"},
+ {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f"},
+ {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6"},
+ {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77"},
+ {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603"},
+ {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7"},
+ {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135"},
+ {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96"},
+ {file = "MarkupSafe-2.1.1-cp39-cp39-win32.whl", hash = "sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c"},
+ {file = "MarkupSafe-2.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247"},
+ {file = "MarkupSafe-2.1.1.tar.gz", hash = "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b"},
+]
+mergedeep = [
+ {file = "mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307"},
+ {file = "mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8"},
+]
+mkdocs = [
+ {file = "mkdocs-1.3.1-py3-none-any.whl", hash = "sha256:fda92466393127d2da830bc6edc3a625a14b436316d1caf347690648e774c4f0"},
+ {file = "mkdocs-1.3.1.tar.gz", hash = "sha256:a41a2ff25ce3bbacc953f9844ba07d106233cd76c88bac1f59cb1564ac0d87ed"},
+]
+mkdocs-macros-plugin = []
+mkdocs-material = [
+ {file = "mkdocs-material-8.4.2.tar.gz", hash = "sha256:704c64c3fff126a3923c2961d95f26b19be621342a6a4e49ed039f0bb7a5c540"},
+ {file = "mkdocs_material-8.4.2-py2.py3-none-any.whl", hash = "sha256:166287bb0e4197804906bf0389a852d5ced43182c30127ac8b48a4e497ecd7e5"},
+]
+mkdocs-material-extensions = [
+ {file = "mkdocs-material-extensions-1.0.3.tar.gz", hash = "sha256:bfd24dfdef7b41c312ede42648f9eb83476ea168ec163b613f9abd12bbfddba2"},
+ {file = "mkdocs_material_extensions-1.0.3-py3-none-any.whl", hash = "sha256:a82b70e533ce060b2a5d9eb2bc2e1be201cf61f901f93704b4acf6e3d5983a44"},
+]
+packaging = [
+ {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"},
+ {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"},
+]
+pygments = [
+ {file = "Pygments-2.13.0-py3-none-any.whl", hash = "sha256:f643f331ab57ba3c9d89212ee4a2dabc6e94f117cf4eefde99a0574720d14c42"},
+ {file = "Pygments-2.13.0.tar.gz", hash = "sha256:56a8508ae95f98e2b9bdf93a6be5ae3f7d8af858b43e02c5a2ff083726be40c1"},
+]
+pymdown-extensions = [
+ {file = "pymdown_extensions-9.5-py3-none-any.whl", hash = "sha256:ec141c0f4983755349f0c8710416348d1a13753976c028186ed14f190c8061c4"},
+ {file = "pymdown_extensions-9.5.tar.gz", hash = "sha256:3ef2d998c0d5fa7eb09291926d90d69391283561cf6306f85cd588a5eb5befa0"},
+]
+pyparsing = [
+ {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"},
+ {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"},
+]
+python-dateutil = [
+ {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"},
+ {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"},
+]
+pyyaml = [
+ {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"},
+ {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"},
+ {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"},
+ {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"},
+ {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"},
+ {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"},
+ {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"},
+ {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"},
+ {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"},
+ {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"},
+ {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"},
+ {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"},
+ {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"},
+ {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"},
+ {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"},
+ {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"},
+ {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"},
+ {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"},
+ {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"},
+ {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"},
+ {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"},
+ {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"},
+ {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"},
+ {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"},
+ {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"},
+ {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"},
+ {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"},
+ {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"},
+ {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"},
+ {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"},
+ {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"},
+ {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"},
+ {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"},
+]
+pyyaml-env-tag = [
+ {file = "pyyaml_env_tag-0.1-py3-none-any.whl", hash = "sha256:af31106dec8a4d68c60207c1886031cbf839b68aa7abccdb19868200532c2069"},
+ {file = "pyyaml_env_tag-0.1.tar.gz", hash = "sha256:70092675bda14fdec33b31ba77e7543de9ddc88f2e5b99160396572d11525bdb"},
+]
+six = [
+ {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"},
+ {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"},
+]
+termcolor = [
+ {file = "termcolor-1.1.0.tar.gz", hash = "sha256:1d6d69ce66211143803fbc56652b41d73b4a400a2891d7bf7a1cdf4c02de613b"},
+]
+watchdog = [
+ {file = "watchdog-2.1.9-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a735a990a1095f75ca4f36ea2ef2752c99e6ee997c46b0de507ba40a09bf7330"},
+ {file = "watchdog-2.1.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b17d302850c8d412784d9246cfe8d7e3af6bcd45f958abb2d08a6f8bedf695d"},
+ {file = "watchdog-2.1.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ee3e38a6cc050a8830089f79cbec8a3878ec2fe5160cdb2dc8ccb6def8552658"},
+ {file = "watchdog-2.1.9-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:64a27aed691408a6abd83394b38503e8176f69031ca25d64131d8d640a307591"},
+ {file = "watchdog-2.1.9-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:195fc70c6e41237362ba720e9aaf394f8178bfc7fa68207f112d108edef1af33"},
+ {file = "watchdog-2.1.9-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:bfc4d351e6348d6ec51df007432e6fe80adb53fd41183716017026af03427846"},
+ {file = "watchdog-2.1.9-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8250546a98388cbc00c3ee3cc5cf96799b5a595270dfcfa855491a64b86ef8c3"},
+ {file = "watchdog-2.1.9-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:117ffc6ec261639a0209a3252546b12800670d4bf5f84fbd355957a0595fe654"},
+ {file = "watchdog-2.1.9-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:97f9752208f5154e9e7b76acc8c4f5a58801b338de2af14e7e181ee3b28a5d39"},
+ {file = "watchdog-2.1.9-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:247dcf1df956daa24828bfea5a138d0e7a7c98b1a47cf1fa5b0c3c16241fcbb7"},
+ {file = "watchdog-2.1.9-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:226b3c6c468ce72051a4c15a4cc2ef317c32590d82ba0b330403cafd98a62cfd"},
+ {file = "watchdog-2.1.9-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d9820fe47c20c13e3c9dd544d3706a2a26c02b2b43c993b62fcd8011bcc0adb3"},
+ {file = "watchdog-2.1.9-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:70af927aa1613ded6a68089a9262a009fbdf819f46d09c1a908d4b36e1ba2b2d"},
+ {file = "watchdog-2.1.9-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ed80a1628cee19f5cfc6bb74e173f1b4189eb532e705e2a13e3250312a62e0c9"},
+ {file = "watchdog-2.1.9-py3-none-manylinux2014_aarch64.whl", hash = "sha256:9f05a5f7c12452f6a27203f76779ae3f46fa30f1dd833037ea8cbc2887c60213"},
+ {file = "watchdog-2.1.9-py3-none-manylinux2014_armv7l.whl", hash = "sha256:255bb5758f7e89b1a13c05a5bceccec2219f8995a3a4c4d6968fe1de6a3b2892"},
+ {file = "watchdog-2.1.9-py3-none-manylinux2014_i686.whl", hash = "sha256:d3dda00aca282b26194bdd0adec21e4c21e916956d972369359ba63ade616153"},
+ {file = "watchdog-2.1.9-py3-none-manylinux2014_ppc64.whl", hash = "sha256:186f6c55abc5e03872ae14c2f294a153ec7292f807af99f57611acc8caa75306"},
+ {file = "watchdog-2.1.9-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:083171652584e1b8829581f965b9b7723ca5f9a2cd7e20271edf264cfd7c1412"},
+ {file = "watchdog-2.1.9-py3-none-manylinux2014_s390x.whl", hash = "sha256:b530ae007a5f5d50b7fbba96634c7ee21abec70dc3e7f0233339c81943848dc1"},
+ {file = "watchdog-2.1.9-py3-none-manylinux2014_x86_64.whl", hash = "sha256:4f4e1c4aa54fb86316a62a87b3378c025e228178d55481d30d857c6c438897d6"},
+ {file = "watchdog-2.1.9-py3-none-win32.whl", hash = "sha256:5952135968519e2447a01875a6f5fc8c03190b24d14ee52b0f4b1682259520b1"},
+ {file = "watchdog-2.1.9-py3-none-win_amd64.whl", hash = "sha256:7a833211f49143c3d336729b0020ffd1274078e94b0ae42e22f596999f50279c"},
+ {file = "watchdog-2.1.9-py3-none-win_ia64.whl", hash = "sha256:ad576a565260d8f99d97f2e64b0f97a48228317095908568a9d5c786c829d428"},
+ {file = "watchdog-2.1.9.tar.gz", hash = "sha256:43ce20ebb36a51f21fa376f76d1d4692452b2527ccd601950d69ed36b9e21609"},
+]
+zipp = [
+ {file = "zipp-3.8.1-py3-none-any.whl", hash = "sha256:47c40d7fe183a6f21403a199b3e4192cca5774656965b0a4988ad2f8feb5f009"},
+ {file = "zipp-3.8.1.tar.gz", hash = "sha256:05b45f1ee8f807d0cc928485ca40a07cb491cf092ff587c0df9cb1fd154848d2"},
+]
diff --git a/docs/pyproject.toml b/docs/pyproject.toml
new file mode 100644
index 00000000..e49aef63
--- /dev/null
+++ b/docs/pyproject.toml
@@ -0,0 +1,19 @@
+[tool.poetry]
+name = "dc-api-v2"
+version = "2.0.0"
+description = "Northwestern University Library Digital Collections API Documentation"
+authors = ["Michael B. Klein "]
+
+[tool.poetry.dependencies]
+python = "^3.8"
+mkdocs = "^1.1.2"
+mkdocs-macros-plugin = { git = "https://github.com/fralau/mkdocs_macros_plugin.git", tag = "v0.5.12" }
+Pygments = "^2.7.3"
+diagrams = "^0.21.1"
+mkdocs-material = "^8.4.2"
+
+[tool.poetry.dev-dependencies]
+
+[build-system]
+requires = ["poetry-core>=1.0.0"]
+build-backend = "poetry.core.masonry.api"
diff --git a/nyc.config.js b/nyc.config.js
new file mode 100644
index 00000000..cfd60f0d
--- /dev/null
+++ b/nyc.config.js
@@ -0,0 +1,9 @@
+'use strict';
+
+const defaultExclude = require('@istanbuljs/schema/default-exclude');
+const localExclude = [".aws-sam/**/*", "docs/**/*"];
+module.exports = {
+ all: true,
+ "check-coverage": true,
+ exclude: defaultExclude.concat(localExclude)
+};
diff --git a/package-lock.json b/package-lock.json
index dabd618a..f1ab05ac 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,1905 +1,4828 @@
{
- "name": "hello_world",
- "version": "1.0.0",
+ "name": "dc-api-build",
+ "version": "2.0.0pre",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
- "name": "hello_world",
- "version": "1.0.0",
- "license": "MIT",
+ "name": "dc-api-build",
+ "version": "2.0.0pre",
+ "hasInstallScript": true,
+ "license": "Apache-2.0",
"dependencies": {
- "axios": ">=0.21.1"
+ "dc-api": "file:./src"
},
"devDependencies": {
- "aws-sdk": "^2.1187.0",
"chai": "^4.2.0",
+ "chai-http": "^4.3.0",
"mocha": "^9.1.4",
+ "nock": "^13.2.9",
+ "nyc": "^15.1.0",
"prettier": "^2.7.1"
}
},
- "node_modules/@ungap/promise-all-settled": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz",
- "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==",
- "dev": true
- },
- "node_modules/ansi-colors": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
- "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/ansi-regex": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
- "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "node_modules/@ampproject/remapping": {
+ "version": "2.2.0",
"dev": true,
+ "license": "Apache-2.0",
"dependencies": {
- "color-convert": "^2.0.1"
+ "@jridgewell/gen-mapping": "^0.1.0",
+ "@jridgewell/trace-mapping": "^0.3.9"
},
"engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ "node": ">=6.0.0"
}
},
- "node_modules/anymatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
- "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
- "dev": true,
+ "node_modules/@aws-crypto/ie11-detection": {
+ "version": "2.0.0",
+ "license": "Apache-2.0",
"dependencies": {
- "normalize-path": "^3.0.0",
- "picomatch": "^2.0.4"
- },
- "engines": {
- "node": ">= 8"
+ "tslib": "^1.11.1"
}
},
- "node_modules/argparse": {
+ "node_modules/@aws-crypto/ie11-detection/node_modules/tslib": {
+ "version": "1.14.1",
+ "license": "0BSD"
+ },
+ "node_modules/@aws-crypto/sha256-browser": {
"version": "2.0.1",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
- "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
- "dev": true
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-crypto/ie11-detection": "^2.0.0",
+ "@aws-crypto/sha256-js": "^2.0.1",
+ "@aws-crypto/supports-web-crypto": "^2.0.0",
+ "@aws-crypto/util": "^2.0.1",
+ "@aws-sdk/types": "^3.1.0",
+ "@aws-sdk/util-locate-window": "^3.0.0",
+ "@aws-sdk/util-utf8-browser": "^3.0.0",
+ "tslib": "^1.11.1"
+ }
},
- "node_modules/assertion-error": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
- "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==",
- "dev": true,
- "engines": {
- "node": "*"
+ "node_modules/@aws-crypto/sha256-browser/node_modules/@aws-crypto/sha256-js": {
+ "version": "2.0.1",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-crypto/util": "^2.0.1",
+ "@aws-sdk/types": "^3.1.0",
+ "tslib": "^1.11.1"
}
},
- "node_modules/asynckit": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
- "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
+ "node_modules/@aws-crypto/sha256-browser/node_modules/tslib": {
+ "version": "1.14.1",
+ "license": "0BSD"
},
- "node_modules/available-typed-arrays": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz",
- "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==",
- "dev": true,
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node_modules/@aws-crypto/sha256-js": {
+ "version": "2.0.0",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-crypto/util": "^2.0.0",
+ "@aws-sdk/types": "^3.1.0",
+ "tslib": "^1.11.1"
}
},
- "node_modules/aws-sdk": {
- "version": "2.1187.0",
- "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1187.0.tgz",
- "integrity": "sha512-QcxQ3asIhH9QQnN/5JO3MaHRjwcy3/AsBzcAjPU+lHZGV0drnuDmg3ZkZuAa/mOgQ3MEi68G3gYD+481QJgnMg==",
- "dev": true,
+ "node_modules/@aws-crypto/sha256-js/node_modules/tslib": {
+ "version": "1.14.1",
+ "license": "0BSD"
+ },
+ "node_modules/@aws-crypto/supports-web-crypto": {
+ "version": "2.0.0",
+ "license": "Apache-2.0",
"dependencies": {
- "buffer": "4.9.2",
- "events": "1.1.1",
- "ieee754": "1.1.13",
- "jmespath": "0.16.0",
- "querystring": "0.2.0",
- "sax": "1.2.1",
- "url": "0.10.3",
- "util": "^0.12.4",
- "uuid": "8.0.0",
- "xml2js": "0.4.19"
- },
- "engines": {
- "node": ">= 10.0.0"
+ "tslib": "^1.11.1"
}
},
- "node_modules/axios": {
- "version": "0.27.2",
- "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz",
- "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==",
+ "node_modules/@aws-crypto/supports-web-crypto/node_modules/tslib": {
+ "version": "1.14.1",
+ "license": "0BSD"
+ },
+ "node_modules/@aws-crypto/util": {
+ "version": "2.0.1",
+ "license": "Apache-2.0",
"dependencies": {
- "follow-redirects": "^1.14.9",
- "form-data": "^4.0.0"
+ "@aws-sdk/types": "^3.1.0",
+ "@aws-sdk/util-utf8-browser": "^3.0.0",
+ "tslib": "^1.11.1"
}
},
- "node_modules/balanced-match": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
- "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
- "dev": true
- },
- "node_modules/base64-js": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
- "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
- "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"
- }
- ]
+ "node_modules/@aws-crypto/util/node_modules/tslib": {
+ "version": "1.14.1",
+ "license": "0BSD"
},
- "node_modules/binary-extensions": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
- "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
- "dev": true,
+ "node_modules/@aws-sdk/abort-controller": {
+ "version": "3.127.0",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/types": "3.127.0",
+ "tslib": "^2.3.1"
+ },
"engines": {
- "node": ">=8"
+ "node": ">= 12.0.0"
}
},
- "node_modules/brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "dev": true,
+ "node_modules/@aws-sdk/client-sso": {
+ "version": "3.142.0",
+ "license": "Apache-2.0",
"dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
+ "@aws-crypto/sha256-browser": "2.0.0",
+ "@aws-crypto/sha256-js": "2.0.0",
+ "@aws-sdk/config-resolver": "3.130.0",
+ "@aws-sdk/fetch-http-handler": "3.131.0",
+ "@aws-sdk/hash-node": "3.127.0",
+ "@aws-sdk/invalid-dependency": "3.127.0",
+ "@aws-sdk/middleware-content-length": "3.127.0",
+ "@aws-sdk/middleware-host-header": "3.127.0",
+ "@aws-sdk/middleware-logger": "3.127.0",
+ "@aws-sdk/middleware-recursion-detection": "3.127.0",
+ "@aws-sdk/middleware-retry": "3.127.0",
+ "@aws-sdk/middleware-serde": "3.127.0",
+ "@aws-sdk/middleware-stack": "3.127.0",
+ "@aws-sdk/middleware-user-agent": "3.127.0",
+ "@aws-sdk/node-config-provider": "3.127.0",
+ "@aws-sdk/node-http-handler": "3.127.0",
+ "@aws-sdk/protocol-http": "3.127.0",
+ "@aws-sdk/smithy-client": "3.142.0",
+ "@aws-sdk/types": "3.127.0",
+ "@aws-sdk/url-parser": "3.127.0",
+ "@aws-sdk/util-base64-browser": "3.109.0",
+ "@aws-sdk/util-base64-node": "3.55.0",
+ "@aws-sdk/util-body-length-browser": "3.55.0",
+ "@aws-sdk/util-body-length-node": "3.55.0",
+ "@aws-sdk/util-defaults-mode-browser": "3.142.0",
+ "@aws-sdk/util-defaults-mode-node": "3.142.0",
+ "@aws-sdk/util-user-agent-browser": "3.127.0",
+ "@aws-sdk/util-user-agent-node": "3.127.0",
+ "@aws-sdk/util-utf8-browser": "3.109.0",
+ "@aws-sdk/util-utf8-node": "3.109.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=12.0.0"
}
},
- "node_modules/braces": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
- "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
- "dev": true,
+ "node_modules/@aws-sdk/client-sso/node_modules/@aws-crypto/sha256-browser": {
+ "version": "2.0.0",
+ "license": "Apache-2.0",
"dependencies": {
- "fill-range": "^7.0.1"
+ "@aws-crypto/ie11-detection": "^2.0.0",
+ "@aws-crypto/sha256-js": "^2.0.0",
+ "@aws-crypto/supports-web-crypto": "^2.0.0",
+ "@aws-crypto/util": "^2.0.0",
+ "@aws-sdk/types": "^3.1.0",
+ "@aws-sdk/util-locate-window": "^3.0.0",
+ "@aws-sdk/util-utf8-browser": "^3.0.0",
+ "tslib": "^1.11.1"
+ }
+ },
+ "node_modules/@aws-sdk/client-sso/node_modules/@aws-crypto/sha256-browser/node_modules/tslib": {
+ "version": "1.14.1",
+ "license": "0BSD"
+ },
+ "node_modules/@aws-sdk/config-resolver": {
+ "version": "3.130.0",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/signature-v4": "3.130.0",
+ "@aws-sdk/types": "3.127.0",
+ "@aws-sdk/util-config-provider": "3.109.0",
+ "@aws-sdk/util-middleware": "3.127.0",
+ "tslib": "^2.3.1"
},
"engines": {
- "node": ">=8"
+ "node": ">= 12.0.0"
}
},
- "node_modules/browser-stdout": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
- "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
- "dev": true
- },
- "node_modules/buffer": {
- "version": "4.9.2",
- "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz",
- "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==",
- "dev": true,
+ "node_modules/@aws-sdk/credential-provider-env": {
+ "version": "3.127.0",
+ "license": "Apache-2.0",
"dependencies": {
- "base64-js": "^1.0.2",
- "ieee754": "^1.1.4",
- "isarray": "^1.0.0"
+ "@aws-sdk/property-provider": "3.127.0",
+ "@aws-sdk/types": "3.127.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
}
},
- "node_modules/call-bind": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
- "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
- "dev": true,
+ "node_modules/@aws-sdk/credential-provider-imds": {
+ "version": "3.127.0",
+ "license": "Apache-2.0",
"dependencies": {
- "function-bind": "^1.1.1",
- "get-intrinsic": "^1.0.2"
+ "@aws-sdk/node-config-provider": "3.127.0",
+ "@aws-sdk/property-provider": "3.127.0",
+ "@aws-sdk/types": "3.127.0",
+ "@aws-sdk/url-parser": "3.127.0",
+ "tslib": "^2.3.1"
},
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/camelcase": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
- "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
- "dev": true,
"engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": ">= 12.0.0"
}
},
- "node_modules/chai": {
- "version": "4.3.6",
- "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.6.tgz",
- "integrity": "sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q==",
- "dev": true,
+ "node_modules/@aws-sdk/credential-provider-ini": {
+ "version": "3.142.0",
+ "license": "Apache-2.0",
"dependencies": {
- "assertion-error": "^1.1.0",
- "check-error": "^1.0.2",
- "deep-eql": "^3.0.1",
- "get-func-name": "^2.0.0",
- "loupe": "^2.3.1",
- "pathval": "^1.1.1",
- "type-detect": "^4.0.5"
+ "@aws-sdk/credential-provider-env": "3.127.0",
+ "@aws-sdk/credential-provider-imds": "3.127.0",
+ "@aws-sdk/credential-provider-sso": "3.142.0",
+ "@aws-sdk/credential-provider-web-identity": "3.127.0",
+ "@aws-sdk/property-provider": "3.127.0",
+ "@aws-sdk/shared-ini-file-loader": "3.127.0",
+ "@aws-sdk/types": "3.127.0",
+ "tslib": "^2.3.1"
},
"engines": {
- "node": ">=4"
+ "node": ">= 12.0.0"
}
},
- "node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dev": true,
+ "node_modules/@aws-sdk/credential-provider-node": {
+ "version": "3.142.0",
+ "license": "Apache-2.0",
"dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
+ "@aws-sdk/credential-provider-env": "3.127.0",
+ "@aws-sdk/credential-provider-imds": "3.127.0",
+ "@aws-sdk/credential-provider-ini": "3.142.0",
+ "@aws-sdk/credential-provider-process": "3.127.0",
+ "@aws-sdk/credential-provider-sso": "3.142.0",
+ "@aws-sdk/credential-provider-web-identity": "3.127.0",
+ "@aws-sdk/property-provider": "3.127.0",
+ "@aws-sdk/shared-ini-file-loader": "3.127.0",
+ "@aws-sdk/types": "3.127.0",
+ "tslib": "^2.3.1"
},
"engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
+ "node": ">=12.0.0"
}
},
- "node_modules/chalk/node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
+ "node_modules/@aws-sdk/credential-provider-process": {
+ "version": "3.127.0",
+ "license": "Apache-2.0",
"dependencies": {
- "has-flag": "^4.0.0"
+ "@aws-sdk/property-provider": "3.127.0",
+ "@aws-sdk/shared-ini-file-loader": "3.127.0",
+ "@aws-sdk/types": "3.127.0",
+ "tslib": "^2.3.1"
},
"engines": {
- "node": ">=8"
+ "node": ">= 12.0.0"
}
},
- "node_modules/check-error": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz",
- "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==",
- "dev": true,
+ "node_modules/@aws-sdk/credential-provider-sso": {
+ "version": "3.142.0",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/client-sso": "3.142.0",
+ "@aws-sdk/property-provider": "3.127.0",
+ "@aws-sdk/shared-ini-file-loader": "3.127.0",
+ "@aws-sdk/types": "3.127.0",
+ "tslib": "^2.3.1"
+ },
"engines": {
- "node": "*"
+ "node": ">= 12.0.0"
}
},
- "node_modules/chokidar": {
- "version": "3.5.3",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
- "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://paulmillr.com/funding/"
- }
- ],
+ "node_modules/@aws-sdk/credential-provider-web-identity": {
+ "version": "3.127.0",
+ "license": "Apache-2.0",
"dependencies": {
- "anymatch": "~3.1.2",
- "braces": "~3.0.2",
- "glob-parent": "~5.1.2",
- "is-binary-path": "~2.1.0",
- "is-glob": "~4.0.1",
- "normalize-path": "~3.0.0",
- "readdirp": "~3.6.0"
+ "@aws-sdk/property-provider": "3.127.0",
+ "@aws-sdk/types": "3.127.0",
+ "tslib": "^2.3.1"
},
"engines": {
- "node": ">= 8.10.0"
- },
- "optionalDependencies": {
- "fsevents": "~2.3.2"
+ "node": ">= 12.0.0"
}
},
- "node_modules/cliui": {
- "version": "7.0.4",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
- "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
- "dev": true,
+ "node_modules/@aws-sdk/fetch-http-handler": {
+ "version": "3.131.0",
+ "license": "Apache-2.0",
"dependencies": {
- "string-width": "^4.2.0",
- "strip-ansi": "^6.0.0",
- "wrap-ansi": "^7.0.0"
+ "@aws-sdk/protocol-http": "3.127.0",
+ "@aws-sdk/querystring-builder": "3.127.0",
+ "@aws-sdk/types": "3.127.0",
+ "@aws-sdk/util-base64-browser": "3.109.0",
+ "tslib": "^2.3.1"
}
},
- "node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
+ "node_modules/@aws-sdk/hash-node": {
+ "version": "3.127.0",
+ "license": "Apache-2.0",
"dependencies": {
- "color-name": "~1.1.4"
+ "@aws-sdk/types": "3.127.0",
+ "@aws-sdk/util-buffer-from": "3.55.0",
+ "tslib": "^2.3.1"
},
"engines": {
- "node": ">=7.0.0"
+ "node": ">= 12.0.0"
}
},
- "node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
+ "node_modules/@aws-sdk/invalid-dependency": {
+ "version": "3.127.0",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/types": "3.127.0",
+ "tslib": "^2.3.1"
+ }
},
- "node_modules/combined-stream": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
- "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "node_modules/@aws-sdk/is-array-buffer": {
+ "version": "3.55.0",
+ "license": "Apache-2.0",
"dependencies": {
- "delayed-stream": "~1.0.0"
+ "tslib": "^2.3.1"
},
"engines": {
- "node": ">= 0.8"
+ "node": ">= 12.0.0"
}
},
- "node_modules/concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
- "dev": true
- },
- "node_modules/debug": {
- "version": "4.3.3",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz",
- "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==",
- "dev": true,
+ "node_modules/@aws-sdk/middleware-content-length": {
+ "version": "3.127.0",
+ "license": "Apache-2.0",
"dependencies": {
- "ms": "2.1.2"
+ "@aws-sdk/protocol-http": "3.127.0",
+ "@aws-sdk/types": "3.127.0",
+ "tslib": "^2.3.1"
},
"engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
+ "node": ">= 12.0.0"
}
},
- "node_modules/debug/node_modules/ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true
- },
- "node_modules/decamelize": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz",
- "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==",
- "dev": true,
- "engines": {
- "node": ">=10"
+ "node_modules/@aws-sdk/middleware-host-header": {
+ "version": "3.127.0",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/protocol-http": "3.127.0",
+ "@aws-sdk/types": "3.127.0",
+ "tslib": "^2.3.1"
},
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "engines": {
+ "node": ">= 12.0.0"
}
},
- "node_modules/deep-eql": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz",
- "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==",
- "dev": true,
+ "node_modules/@aws-sdk/middleware-logger": {
+ "version": "3.127.0",
+ "license": "Apache-2.0",
"dependencies": {
- "type-detect": "^4.0.0"
+ "@aws-sdk/types": "3.127.0",
+ "tslib": "^2.3.1"
},
"engines": {
- "node": ">=0.12"
+ "node": ">= 12.0.0"
}
},
- "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==",
- "dev": true,
+ "node_modules/@aws-sdk/middleware-recursion-detection": {
+ "version": "3.127.0",
+ "license": "Apache-2.0",
"dependencies": {
- "has-property-descriptors": "^1.0.0",
- "object-keys": "^1.1.1"
+ "@aws-sdk/protocol-http": "3.127.0",
+ "@aws-sdk/types": "3.127.0",
+ "tslib": "^2.3.1"
},
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">= 12.0.0"
}
},
- "node_modules/delayed-stream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
- "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+ "node_modules/@aws-sdk/middleware-retry": {
+ "version": "3.127.0",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/protocol-http": "3.127.0",
+ "@aws-sdk/service-error-classification": "3.127.0",
+ "@aws-sdk/types": "3.127.0",
+ "@aws-sdk/util-middleware": "3.127.0",
+ "tslib": "^2.3.1",
+ "uuid": "^8.3.2"
+ },
"engines": {
- "node": ">=0.4.0"
+ "node": ">= 12.0.0"
}
},
- "node_modules/diff": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz",
- "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==",
- "dev": true,
+ "node_modules/@aws-sdk/middleware-serde": {
+ "version": "3.127.0",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/types": "3.127.0",
+ "tslib": "^2.3.1"
+ },
"engines": {
- "node": ">=0.3.1"
+ "node": ">= 12.0.0"
}
},
- "node_modules/emoji-regex": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
- "dev": true
- },
- "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==",
- "dev": true,
+ "node_modules/@aws-sdk/middleware-stack": {
+ "version": "3.127.0",
+ "license": "Apache-2.0",
"dependencies": {
- "call-bind": "^1.0.2",
- "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",
- "has-symbols": "^1.0.3",
- "internal-slot": "^1.0.3",
- "is-callable": "^1.2.4",
- "is-negative-zero": "^2.0.2",
- "is-regex": "^1.1.4",
- "is-shared-array-buffer": "^1.0.2",
- "is-string": "^1.0.7",
- "is-weakref": "^1.0.2",
- "object-inspect": "^1.12.0",
- "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"
+ "tslib": "^2.3.1"
},
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">= 12.0.0"
}
},
- "node_modules/es-to-primitive": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
- "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
- "dev": true,
+ "node_modules/@aws-sdk/middleware-user-agent": {
+ "version": "3.127.0",
+ "license": "Apache-2.0",
"dependencies": {
- "is-callable": "^1.1.4",
- "is-date-object": "^1.0.1",
- "is-symbol": "^1.0.2"
+ "@aws-sdk/protocol-http": "3.127.0",
+ "@aws-sdk/types": "3.127.0",
+ "tslib": "^2.3.1"
},
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">= 12.0.0"
}
},
- "node_modules/escalade": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
- "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
- "dev": true,
+ "node_modules/@aws-sdk/node-config-provider": {
+ "version": "3.127.0",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/property-provider": "3.127.0",
+ "@aws-sdk/shared-ini-file-loader": "3.127.0",
+ "@aws-sdk/types": "3.127.0",
+ "tslib": "^2.3.1"
+ },
"engines": {
- "node": ">=6"
+ "node": ">= 12.0.0"
}
},
- "node_modules/escape-string-regexp": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
- "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
- "dev": true,
- "engines": {
- "node": ">=10"
+ "node_modules/@aws-sdk/node-http-handler": {
+ "version": "3.127.0",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/abort-controller": "3.127.0",
+ "@aws-sdk/protocol-http": "3.127.0",
+ "@aws-sdk/querystring-builder": "3.127.0",
+ "@aws-sdk/types": "3.127.0",
+ "tslib": "^2.3.1"
},
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "engines": {
+ "node": ">= 12.0.0"
}
},
- "node_modules/events": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz",
- "integrity": "sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==",
- "dev": true,
+ "node_modules/@aws-sdk/property-provider": {
+ "version": "3.127.0",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/types": "3.127.0",
+ "tslib": "^2.3.1"
+ },
"engines": {
- "node": ">=0.4.x"
+ "node": ">= 12.0.0"
}
},
- "node_modules/fill-range": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
- "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
- "dev": true,
+ "node_modules/@aws-sdk/protocol-http": {
+ "version": "3.127.0",
+ "license": "Apache-2.0",
"dependencies": {
- "to-regex-range": "^5.0.1"
+ "@aws-sdk/types": "3.127.0",
+ "tslib": "^2.3.1"
},
"engines": {
- "node": ">=8"
+ "node": ">= 12.0.0"
}
},
- "node_modules/find-up": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
- "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
- "dev": true,
+ "node_modules/@aws-sdk/querystring-builder": {
+ "version": "3.127.0",
+ "license": "Apache-2.0",
"dependencies": {
- "locate-path": "^6.0.0",
- "path-exists": "^4.0.0"
+ "@aws-sdk/types": "3.127.0",
+ "@aws-sdk/util-uri-escape": "3.55.0",
+ "tslib": "^2.3.1"
},
"engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": ">= 12.0.0"
}
},
- "node_modules/flat": {
- "version": "5.0.2",
- "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz",
- "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==",
- "dev": true,
- "bin": {
- "flat": "cli.js"
+ "node_modules/@aws-sdk/querystring-parser": {
+ "version": "3.127.0",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/types": "3.127.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
}
},
- "node_modules/follow-redirects": {
- "version": "1.15.1",
- "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz",
- "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==",
- "funding": [
- {
- "type": "individual",
- "url": "https://github.com/sponsors/RubenVerborgh"
- }
- ],
+ "node_modules/@aws-sdk/service-error-classification": {
+ "version": "3.127.0",
+ "license": "Apache-2.0",
"engines": {
- "node": ">=4.0"
- },
- "peerDependenciesMeta": {
- "debug": {
- "optional": true
- }
+ "node": ">= 12.0.0"
}
},
- "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,
+ "node_modules/@aws-sdk/shared-ini-file-loader": {
+ "version": "3.127.0",
+ "license": "Apache-2.0",
"dependencies": {
- "is-callable": "^1.1.3"
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
}
},
- "node_modules/form-data": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
- "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
+ "node_modules/@aws-sdk/signature-v4": {
+ "version": "3.130.0",
+ "license": "Apache-2.0",
"dependencies": {
- "asynckit": "^0.4.0",
- "combined-stream": "^1.0.8",
- "mime-types": "^2.1.12"
+ "@aws-sdk/is-array-buffer": "3.55.0",
+ "@aws-sdk/types": "3.127.0",
+ "@aws-sdk/util-hex-encoding": "3.109.0",
+ "@aws-sdk/util-middleware": "3.127.0",
+ "@aws-sdk/util-uri-escape": "3.55.0",
+ "tslib": "^2.3.1"
},
"engines": {
- "node": ">= 6"
+ "node": ">= 12.0.0"
}
},
- "node_modules/fs.realpath": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
- "dev": true
+ "node_modules/@aws-sdk/smithy-client": {
+ "version": "3.142.0",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/middleware-stack": "3.127.0",
+ "@aws-sdk/types": "3.127.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
},
- "node_modules/fsevents": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
- "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
- "dev": true,
- "hasInstallScript": true,
- "optional": true,
- "os": [
- "darwin"
- ],
+ "node_modules/@aws-sdk/types": {
+ "version": "3.127.0",
+ "license": "Apache-2.0",
"engines": {
- "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ "node": ">= 12.0.0"
}
},
- "node_modules/function-bind": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
- "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
- "dev": true
+ "node_modules/@aws-sdk/url-parser": {
+ "version": "3.127.0",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/querystring-parser": "3.127.0",
+ "@aws-sdk/types": "3.127.0",
+ "tslib": "^2.3.1"
+ }
},
- "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==",
- "dev": true,
+ "node_modules/@aws-sdk/util-base64-browser": {
+ "version": "3.109.0",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "tslib": "^2.3.1"
+ }
+ },
+ "node_modules/@aws-sdk/util-base64-node": {
+ "version": "3.55.0",
+ "license": "Apache-2.0",
"dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.3",
- "es-abstract": "^1.19.0",
- "functions-have-names": "^1.2.2"
+ "@aws-sdk/util-buffer-from": "3.55.0",
+ "tslib": "^2.3.1"
},
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">= 12.0.0"
}
},
- "node_modules/functions-have-names": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
- "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
- "dev": true,
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node_modules/@aws-sdk/util-body-length-browser": {
+ "version": "3.55.0",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "tslib": "^2.3.1"
}
},
- "node_modules/get-caller-file": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
- "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
- "dev": true,
+ "node_modules/@aws-sdk/util-body-length-node": {
+ "version": "3.55.0",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "tslib": "^2.3.1"
+ },
"engines": {
- "node": "6.* || 8.* || >= 10.*"
+ "node": ">= 12.0.0"
}
},
- "node_modules/get-func-name": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz",
- "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==",
- "dev": true,
+ "node_modules/@aws-sdk/util-buffer-from": {
+ "version": "3.55.0",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/is-array-buffer": "3.55.0",
+ "tslib": "^2.3.1"
+ },
"engines": {
- "node": "*"
+ "node": ">= 12.0.0"
}
},
- "node_modules/get-intrinsic": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz",
- "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==",
- "dev": true,
+ "node_modules/@aws-sdk/util-config-provider": {
+ "version": "3.109.0",
+ "license": "Apache-2.0",
"dependencies": {
- "function-bind": "^1.1.1",
- "has": "^1.0.3",
- "has-symbols": "^1.0.3"
+ "tslib": "^2.3.1"
},
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "engines": {
+ "node": ">= 12.0.0"
}
},
- "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==",
- "dev": true,
+ "node_modules/@aws-sdk/util-defaults-mode-browser": {
+ "version": "3.142.0",
+ "license": "Apache-2.0",
"dependencies": {
- "call-bind": "^1.0.2",
- "get-intrinsic": "^1.1.1"
+ "@aws-sdk/property-provider": "3.127.0",
+ "@aws-sdk/types": "3.127.0",
+ "bowser": "^2.11.0",
+ "tslib": "^2.3.1"
},
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">= 10.0.0"
}
},
- "node_modules/glob": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
- "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
- "dev": true,
+ "node_modules/@aws-sdk/util-defaults-mode-node": {
+ "version": "3.142.0",
+ "license": "Apache-2.0",
"dependencies": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.0.4",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
+ "@aws-sdk/config-resolver": "3.130.0",
+ "@aws-sdk/credential-provider-imds": "3.127.0",
+ "@aws-sdk/node-config-provider": "3.127.0",
+ "@aws-sdk/property-provider": "3.127.0",
+ "@aws-sdk/types": "3.127.0",
+ "tslib": "^2.3.1"
},
"engines": {
- "node": "*"
+ "node": ">= 10.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/util-hex-encoding": {
+ "version": "3.109.0",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "tslib": "^2.3.1"
},
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
+ "engines": {
+ "node": ">= 12.0.0"
}
},
- "node_modules/glob-parent": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
- "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
- "dev": true,
+ "node_modules/@aws-sdk/util-locate-window": {
+ "version": "3.55.0",
+ "license": "Apache-2.0",
"dependencies": {
- "is-glob": "^4.0.1"
+ "tslib": "^2.3.1"
},
"engines": {
- "node": ">= 6"
+ "node": ">= 12.0.0"
}
},
- "node_modules/glob/node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
- "dev": true,
+ "node_modules/@aws-sdk/util-middleware": {
+ "version": "3.127.0",
+ "license": "Apache-2.0",
"dependencies": {
- "brace-expansion": "^1.1.7"
+ "tslib": "^2.3.1"
},
"engines": {
- "node": "*"
+ "node": ">= 12.0.0"
}
},
- "node_modules/growl": {
- "version": "1.10.5",
- "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz",
- "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==",
- "dev": true,
+ "node_modules/@aws-sdk/util-uri-escape": {
+ "version": "3.55.0",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "tslib": "^2.3.1"
+ },
"engines": {
- "node": ">=4.x"
+ "node": ">= 12.0.0"
}
},
- "node_modules/has": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
- "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
- "dev": true,
+ "node_modules/@aws-sdk/util-user-agent-browser": {
+ "version": "3.127.0",
+ "license": "Apache-2.0",
"dependencies": {
- "function-bind": "^1.1.1"
+ "@aws-sdk/types": "3.127.0",
+ "bowser": "^2.11.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "node_modules/@aws-sdk/util-user-agent-node": {
+ "version": "3.127.0",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/node-config-provider": "3.127.0",
+ "@aws-sdk/types": "3.127.0",
+ "tslib": "^2.3.1"
},
"engines": {
- "node": ">= 0.4.0"
+ "node": ">= 12.0.0"
+ },
+ "peerDependencies": {
+ "aws-crt": ">=1.0.0"
+ },
+ "peerDependenciesMeta": {
+ "aws-crt": {
+ "optional": true
+ }
}
},
- "node_modules/has-bigints": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz",
- "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==",
- "dev": true,
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node_modules/@aws-sdk/util-utf8-browser": {
+ "version": "3.109.0",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "tslib": "^2.3.1"
}
},
- "node_modules/has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true,
+ "node_modules/@aws-sdk/util-utf8-node": {
+ "version": "3.109.0",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/util-buffer-from": "3.55.0",
+ "tslib": "^2.3.1"
+ },
"engines": {
- "node": ">=8"
+ "node": ">= 12.0.0"
}
},
- "node_modules/has-property-descriptors": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz",
- "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==",
+ "node_modules/@babel/code-frame": {
+ "version": "7.18.6",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "get-intrinsic": "^1.1.1"
+ "@babel/highlight": "^7.18.6"
},
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "engines": {
+ "node": ">=6.9.0"
}
},
- "node_modules/has-symbols": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
- "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
+ "node_modules/@babel/compat-data": {
+ "version": "7.18.8",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">=6.9.0"
}
},
- "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==",
+ "node_modules/@babel/core": {
+ "version": "7.18.10",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "has-symbols": "^1.0.2"
+ "@ampproject/remapping": "^2.1.0",
+ "@babel/code-frame": "^7.18.6",
+ "@babel/generator": "^7.18.10",
+ "@babel/helper-compilation-targets": "^7.18.9",
+ "@babel/helper-module-transforms": "^7.18.9",
+ "@babel/helpers": "^7.18.9",
+ "@babel/parser": "^7.18.10",
+ "@babel/template": "^7.18.10",
+ "@babel/traverse": "^7.18.10",
+ "@babel/types": "^7.18.10",
+ "convert-source-map": "^1.7.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.2",
+ "json5": "^2.2.1",
+ "semver": "^6.3.0"
},
"engines": {
- "node": ">= 0.4"
+ "node": ">=6.9.0"
},
"funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "type": "opencollective",
+ "url": "https://opencollective.com/babel"
}
},
- "node_modules/he": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
- "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
+ "node_modules/@babel/generator": {
+ "version": "7.18.12",
"dev": true,
- "bin": {
- "he": "bin/he"
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.18.10",
+ "@jridgewell/gen-mapping": "^0.3.2",
+ "jsesc": "^2.5.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
}
},
- "node_modules/ieee754": {
- "version": "1.1.13",
- "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz",
- "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==",
- "dev": true
- },
- "node_modules/inflight": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
- "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.2",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "once": "^1.3.0",
- "wrappy": "1"
+ "@jridgewell/set-array": "^1.0.1",
+ "@jridgewell/sourcemap-codec": "^1.4.10",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ },
+ "engines": {
+ "node": ">=6.0.0"
}
},
- "node_modules/inherits": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
- "dev": true
- },
- "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==",
+ "node_modules/@babel/helper-compilation-targets": {
+ "version": "7.18.9",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "get-intrinsic": "^1.1.0",
- "has": "^1.0.3",
- "side-channel": "^1.0.4"
+ "@babel/compat-data": "^7.18.8",
+ "@babel/helper-validator-option": "^7.18.6",
+ "browserslist": "^4.20.2",
+ "semver": "^6.3.0"
},
"engines": {
- "node": ">= 0.4"
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
}
},
- "node_modules/is-arguments": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz",
- "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==",
+ "node_modules/@babel/helper-environment-visitor": {
+ "version": "7.18.9",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-function-name": {
+ "version": "7.18.9",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.2",
- "has-tostringtag": "^1.0.0"
+ "@babel/template": "^7.18.6",
+ "@babel/types": "^7.18.9"
},
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">=6.9.0"
}
},
- "node_modules/is-bigint": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
- "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
+ "node_modules/@babel/helper-hoist-variables": {
+ "version": "7.18.6",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "has-bigints": "^1.0.1"
+ "@babel/types": "^7.18.6"
},
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "engines": {
+ "node": ">=6.9.0"
}
},
- "node_modules/is-binary-path": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
- "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "node_modules/@babel/helper-module-imports": {
+ "version": "7.18.6",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "binary-extensions": "^2.0.0"
+ "@babel/types": "^7.18.6"
},
"engines": {
- "node": ">=8"
+ "node": ">=6.9.0"
}
},
- "node_modules/is-boolean-object": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
- "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
+ "node_modules/@babel/helper-module-transforms": {
+ "version": "7.18.9",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.2",
- "has-tostringtag": "^1.0.0"
+ "@babel/helper-environment-visitor": "^7.18.9",
+ "@babel/helper-module-imports": "^7.18.6",
+ "@babel/helper-simple-access": "^7.18.6",
+ "@babel/helper-split-export-declaration": "^7.18.6",
+ "@babel/helper-validator-identifier": "^7.18.6",
+ "@babel/template": "^7.18.6",
+ "@babel/traverse": "^7.18.9",
+ "@babel/types": "^7.18.9"
},
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">=6.9.0"
}
},
- "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==",
+ "node_modules/@babel/helper-simple-access": {
+ "version": "7.18.6",
"dev": true,
- "engines": {
- "node": ">= 0.4"
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.18.6"
},
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "engines": {
+ "node": ">=6.9.0"
}
},
- "node_modules/is-date-object": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
- "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
+ "node_modules/@babel/helper-split-export-declaration": {
+ "version": "7.18.6",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "has-tostringtag": "^1.0.0"
+ "@babel/types": "^7.18.6"
},
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">=6.9.0"
}
},
- "node_modules/is-extglob": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
- "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.18.10",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=0.10.0"
+ "node": ">=6.9.0"
}
},
- "node_modules/is-fullwidth-code-point": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
- "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.18.6",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-option": {
+ "version": "7.18.6",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=8"
+ "node": ">=6.9.0"
}
},
- "node_modules/is-generator-function": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz",
- "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==",
+ "node_modules/@babel/helpers": {
+ "version": "7.18.9",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "has-tostringtag": "^1.0.0"
+ "@babel/template": "^7.18.6",
+ "@babel/traverse": "^7.18.9",
+ "@babel/types": "^7.18.9"
},
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">=6.9.0"
}
},
- "node_modules/is-glob": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
- "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "node_modules/@babel/highlight": {
+ "version": "7.18.6",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "is-extglob": "^2.1.1"
+ "@babel/helper-validator-identifier": "^7.18.6",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
},
"engines": {
- "node": ">=0.10.0"
+ "node": ">=6.9.0"
}
},
- "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==",
+ "node_modules/@babel/highlight/node_modules/ansi-styles": {
+ "version": "3.2.1",
"dev": true,
- "engines": {
- "node": ">= 0.4"
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^1.9.0"
},
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "engines": {
+ "node": ">=4"
}
},
- "node_modules/is-number": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
- "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "node_modules/@babel/highlight/node_modules/chalk": {
+ "version": "2.4.2",
"dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
"engines": {
- "node": ">=0.12.0"
+ "node": ">=4"
}
},
- "node_modules/is-number-object": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz",
- "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==",
+ "node_modules/@babel/highlight/node_modules/color-convert": {
+ "version": "1.9.3",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "has-tostringtag": "^1.0.0"
- },
+ "color-name": "1.1.3"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/color-name": {
+ "version": "1.1.3",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@babel/highlight/node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "dev": true,
+ "license": "MIT",
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">=0.8.0"
}
},
- "node_modules/is-plain-obj": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
- "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
+ "node_modules/@babel/highlight/node_modules/has-flag": {
+ "version": "3.0.0",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=8"
+ "node": ">=4"
}
},
- "node_modules/is-regex": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
- "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
+ "node_modules/@babel/highlight/node_modules/supports-color": {
+ "version": "5.5.0",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.2",
- "has-tostringtag": "^1.0.0"
+ "has-flag": "^3.0.0"
},
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">=4"
}
},
- "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==",
+ "node_modules/@babel/parser": {
+ "version": "7.18.11",
"dev": true,
- "dependencies": {
- "call-bind": "^1.0.2"
+ "license": "MIT",
+ "bin": {
+ "parser": "bin/babel-parser.js"
},
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "engines": {
+ "node": ">=6.0.0"
}
},
- "node_modules/is-string": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
- "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
- "dev": true,
+ "node_modules/@babel/runtime": {
+ "version": "7.19.4",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.4.tgz",
+ "integrity": "sha512-EXpLCrk55f+cYqmHsSR+yD/0gAIMxxA9QK9lnQWzhMCvt+YmoBN7Zx94s++Kv0+unHk39vxNO8t+CMA2WSS3wA==",
"dependencies": {
- "has-tostringtag": "^1.0.0"
+ "regenerator-runtime": "^0.13.4"
},
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">=6.9.0"
}
},
- "node_modules/is-symbol": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
- "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
+ "node_modules/@babel/template": {
+ "version": "7.18.10",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "has-symbols": "^1.0.2"
+ "@babel/code-frame": "^7.18.6",
+ "@babel/parser": "^7.18.10",
+ "@babel/types": "^7.18.10"
},
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">=6.9.0"
}
},
- "node_modules/is-typed-array": {
- "version": "1.1.9",
- "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.9.tgz",
- "integrity": "sha512-kfrlnTTn8pZkfpJMUgYD7YZ3qzeJgWUn8XfVYBARc4wnmNOmLbmuuaAs3q5fvB0UJOn6yHAKaGTPM7d6ezoD/A==",
+ "node_modules/@babel/traverse": {
+ "version": "7.18.11",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "available-typed-arrays": "^1.0.5",
- "call-bind": "^1.0.2",
- "es-abstract": "^1.20.0",
- "for-each": "^0.3.3",
- "has-tostringtag": "^1.0.0"
+ "@babel/code-frame": "^7.18.6",
+ "@babel/generator": "^7.18.10",
+ "@babel/helper-environment-visitor": "^7.18.9",
+ "@babel/helper-function-name": "^7.18.9",
+ "@babel/helper-hoist-variables": "^7.18.6",
+ "@babel/helper-split-export-declaration": "^7.18.6",
+ "@babel/parser": "^7.18.11",
+ "@babel/types": "^7.18.10",
+ "debug": "^4.1.0",
+ "globals": "^11.1.0"
},
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">=6.9.0"
}
},
- "node_modules/is-unicode-supported": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
- "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
+ "node_modules/@babel/types": {
+ "version": "7.18.10",
"dev": true,
- "engines": {
- "node": ">=10"
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.18.10",
+ "@babel/helper-validator-identifier": "^7.18.6",
+ "to-fast-properties": "^2.0.0"
},
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "engines": {
+ "node": ">=6.9.0"
}
},
- "node_modules/is-weakref": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
- "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==",
+ "node_modules/@iiif/parser": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@iiif/parser/-/parser-1.1.0.tgz",
+ "integrity": "sha512-p2pqngR/L+ML+LS8Ah70CTITgW192fmWXxOovSapQnI5rKN6daYrbjl5UuIK9R+n0lFFlJwjW5+tA96E+V39hw==",
+ "dependencies": {
+ "@iiif/presentation-2": "^1.0.4",
+ "@iiif/presentation-3": "^1.1.3",
+ "@types/geojson": "^7946.0.8"
+ }
+ },
+ "node_modules/@iiif/presentation-2": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/@iiif/presentation-2/-/presentation-2-1.0.4.tgz",
+ "integrity": "sha512-hJakpq62VBajesLJrYPtFm6hcn6c/HkKP7CmKZ5atuzu40m0nifWYsqigR1l9sZGvhhHb/DRshPmiW/0GNrJoA==",
+ "peerDependencies": {
+ "@iiif/presentation-3": "*"
+ }
+ },
+ "node_modules/@iiif/presentation-3": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/@iiif/presentation-3/-/presentation-3-1.1.3.tgz",
+ "integrity": "sha512-Ek+25nkQouo0pXAqCsWYbAeS4jLDEBQA7iul2jzgnvoJrucxDQN2lXyNLgOUDRqpTdSqJ69iz5lm6DLaxil+Nw==",
+ "dependencies": {
+ "@types/geojson": "^7946.0.7"
+ }
+ },
+ "node_modules/@iiif/vault": {
+ "version": "0.9.19",
+ "resolved": "https://registry.npmjs.org/@iiif/vault/-/vault-0.9.19.tgz",
+ "integrity": "sha512-YoRp4waV1mGMOJaaTpzn/YnZKRnHZdbXwCt2LbCA89CZhtlTh6QUhs04KWNrGxrxnk/Wtt67/U4SyZgD10g0NQ==",
+ "dependencies": {
+ "@iiif/parser": "1.*",
+ "@iiif/presentation-2": "1.*",
+ "@iiif/presentation-3": "1.*",
+ "mitt": "^3.0.0",
+ "node-fetch": "^3.1.1",
+ "redux": "^4.1.2",
+ "tiny-invariant": "^1.2.0",
+ "typesafe-actions": "^5.1.0"
+ }
+ },
+ "node_modules/@istanbuljs/load-nyc-config": {
+ "version": "1.1.0",
"dev": true,
+ "license": "ISC",
"dependencies": {
- "call-bind": "^1.0.2"
+ "camelcase": "^5.3.1",
+ "find-up": "^4.1.0",
+ "get-package-type": "^0.1.0",
+ "js-yaml": "^3.13.1",
+ "resolve-from": "^5.0.0"
},
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "engines": {
+ "node": ">=8"
}
},
- "node_modules/isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
- "dev": true
- },
- "node_modules/isexe": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
- "dev": true
+ "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": {
+ "version": "1.0.10",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "sprintf-js": "~1.0.2"
+ }
},
- "node_modules/jmespath": {
- "version": "0.16.0",
- "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.16.0.tgz",
- "integrity": "sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==",
+ "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": {
+ "version": "5.3.1",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">= 0.6.0"
+ "node": ">=6"
}
},
- "node_modules/js-yaml": {
+ "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": {
"version": "4.1.0",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
- "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "argparse": "^2.0.1"
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": {
+ "version": "3.14.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
},
"bin": {
"js-yaml": "bin/js-yaml.js"
}
},
- "node_modules/locate-path": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
- "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": {
+ "version": "5.0.0",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "p-locate": "^5.0.0"
+ "p-locate": "^4.1.0"
},
"engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": ">=8"
}
},
- "node_modules/log-symbols": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
- "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
+ "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": {
+ "version": "2.3.0",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "chalk": "^4.1.0",
- "is-unicode-supported": "^0.1.0"
+ "p-try": "^2.0.0"
},
"engines": {
- "node": ">=10"
+ "node": ">=6"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/loupe": {
- "version": "2.3.4",
- "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.4.tgz",
- "integrity": "sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ==",
+ "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": {
+ "version": "4.1.0",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "get-func-name": "^2.0.0"
+ "p-limit": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "node_modules/mime-db": {
- "version": "1.52.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
- "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "node_modules/@istanbuljs/schema": {
+ "version": "0.1.3",
+ "dev": true,
+ "license": "MIT",
"engines": {
- "node": ">= 0.6"
+ "node": ">=8"
}
},
- "node_modules/mime-types": {
- "version": "2.1.35",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
- "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.1.1",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "mime-db": "1.52.0"
+ "@jridgewell/set-array": "^1.0.0",
+ "@jridgewell/sourcemap-codec": "^1.4.10"
},
"engines": {
- "node": ">= 0.6"
+ "node": ">=6.0.0"
}
},
- "node_modules/minimatch": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-4.2.1.tgz",
- "integrity": "sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==",
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.0",
"dev": true,
- "dependencies": {
- "brace-expansion": "^1.1.7"
- },
+ "license": "MIT",
"engines": {
- "node": ">=10"
+ "node": ">=6.0.0"
}
},
- "node_modules/mocha": {
- "version": "9.2.2",
- "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.2.tgz",
- "integrity": "sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==",
+ "node_modules/@jridgewell/set-array": {
+ "version": "1.1.2",
"dev": true,
- "dependencies": {
- "@ungap/promise-all-settled": "1.1.2",
- "ansi-colors": "4.1.1",
- "browser-stdout": "1.3.1",
- "chokidar": "3.5.3",
- "debug": "4.3.3",
- "diff": "5.0.0",
- "escape-string-regexp": "4.0.0",
- "find-up": "5.0.0",
- "glob": "7.2.0",
- "growl": "1.10.5",
- "he": "1.2.0",
- "js-yaml": "4.1.0",
- "log-symbols": "4.1.0",
- "minimatch": "4.2.1",
- "ms": "2.1.3",
- "nanoid": "3.3.1",
- "serialize-javascript": "6.0.0",
- "strip-json-comments": "3.1.1",
- "supports-color": "8.1.1",
- "which": "2.0.2",
- "workerpool": "6.2.0",
- "yargs": "16.2.0",
- "yargs-parser": "20.2.4",
- "yargs-unparser": "2.0.0"
- },
- "bin": {
- "_mocha": "bin/_mocha",
- "mocha": "bin/mocha"
- },
+ "license": "MIT",
"engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/mochajs"
+ "node": ">=6.0.0"
}
},
- "node_modules/ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "dev": true
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.4.14",
+ "dev": true,
+ "license": "MIT"
},
- "node_modules/nanoid": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz",
- "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==",
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.14",
"dev": true,
- "bin": {
- "nanoid": "bin/nanoid.cjs"
- },
- "engines": {
- "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.0.3",
+ "@jridgewell/sourcemap-codec": "^1.4.10"
}
},
- "node_modules/normalize-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
- "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "node_modules/@types/chai": {
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.3.tgz",
+ "integrity": "sha512-hC7OMnszpxhZPduX+m+nrx+uFoLkWOMiR4oa/AZF3MuSETYTZmFfJAHqZEM8MVlvfG7BEUcgvtwoCTxBp6hm3g==",
+ "dev": true
+ },
+ "node_modules/@types/cookiejar": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.2.tgz",
+ "integrity": "sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog==",
+ "dev": true
+ },
+ "node_modules/@types/geojson": {
+ "version": "7946.0.10",
+ "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.10.tgz",
+ "integrity": "sha512-Nmh0K3iWQJzniTuPRcJn5hxXkfB1T1pgB89SBig5PlJQU5yocazeu4jATJlaA0GYFKWMqDdvYemoSnF2pXgLVA=="
+ },
+ "node_modules/@types/node": {
+ "version": "18.11.3",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.3.tgz",
+ "integrity": "sha512-fNjDQzzOsZeKZu5NATgXUPsaFaTxeRgFXoosrHivTl8RGeV733OLawXsGfEk9a8/tySyZUyiZ6E8LcjPFZ2y1A==",
+ "dev": true
+ },
+ "node_modules/@types/superagent": {
+ "version": "3.8.7",
+ "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-3.8.7.tgz",
+ "integrity": "sha512-9KhCkyXv268A2nZ1Wvu7rQWM+BmdYUVkycFeNnYrUL5Zwu7o8wPQ3wBfW59dDP+wuoxw0ww8YKgTNv8j/cgscA==",
"dev": true,
- "engines": {
- "node": ">=0.10.0"
+ "dependencies": {
+ "@types/cookiejar": "*",
+ "@types/node": "*"
}
},
- "node_modules/object-inspect": {
- "version": "1.12.2",
- "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz",
- "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==",
+ "node_modules/@ungap/promise-all-settled": {
+ "version": "1.1.2",
"dev": true,
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
+ "license": "ISC"
},
- "node_modules/object-keys": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
- "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+ "node_modules/aggregate-error": {
+ "version": "3.1.0",
"dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "clean-stack": "^2.0.0",
+ "indent-string": "^4.0.0"
+ },
"engines": {
- "node": ">= 0.4"
+ "node": ">=8"
}
},
- "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==",
+ "node_modules/ansi-colors": {
+ "version": "4.1.1",
"dev": true,
- "dependencies": {
- "call-bind": "^1.0.0",
- "define-properties": "^1.1.3",
- "has-symbols": "^1.0.1",
- "object-keys": "^1.1.1"
- },
+ "license": "MIT",
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">=6"
}
},
- "node_modules/once": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "node_modules/ansi-regex": {
+ "version": "5.0.1",
"dev": true,
- "dependencies": {
- "wrappy": "1"
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
}
},
- "node_modules/p-limit": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
- "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "yocto-queue": "^0.1.0"
+ "color-convert": "^2.0.1"
},
"engines": {
- "node": ">=10"
+ "node": ">=8"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
- "node_modules/p-locate": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
- "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "node_modules/anymatch": {
+ "version": "3.1.2",
"dev": true,
+ "license": "ISC",
"dependencies": {
- "p-limit": "^3.0.2"
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
},
"engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": ">= 8"
}
},
- "node_modules/path-exists": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
- "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "node_modules/append-transform": {
+ "version": "2.0.0",
"dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "default-require-extensions": "^3.0.0"
+ },
"engines": {
"node": ">=8"
}
},
- "node_modules/path-is-absolute": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+ "node_modules/archy": {
+ "version": "1.0.0",
"dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
+ "license": "MIT"
},
- "node_modules/pathval": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz",
- "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==",
+ "node_modules/argparse": {
+ "version": "2.0.1",
+ "dev": true,
+ "license": "Python-2.0"
+ },
+ "node_modules/assertion-error": {
+ "version": "1.1.0",
"dev": true,
+ "license": "MIT",
"engines": {
"node": "*"
}
},
- "node_modules/picomatch": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
- "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
- "dev": true,
- "engines": {
- "node": ">=8.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
+ "node_modules/asynckit": {
+ "version": "0.4.0",
+ "license": "MIT"
+ },
+ "node_modules/axios": {
+ "version": "0.27.2",
+ "license": "MIT",
+ "dependencies": {
+ "follow-redirects": "^1.14.9",
+ "form-data": "^4.0.0"
}
},
- "node_modules/prettier": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz",
- "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==",
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
"dev": true,
- "bin": {
- "prettier": "bin-prettier.js"
- },
+ "license": "MIT"
+ },
+ "node_modules/binary-extensions": {
+ "version": "2.2.0",
+ "dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=10.13.0"
- },
- "funding": {
- "url": "https://github.com/prettier/prettier?sponsor=1"
+ "node": ">=8"
}
},
- "node_modules/punycode": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
- "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==",
- "dev": true
+ "node_modules/bowser": {
+ "version": "2.11.0",
+ "license": "MIT"
},
- "node_modules/querystring": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
- "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==",
- "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.",
+ "node_modules/brace-expansion": {
+ "version": "1.1.11",
"dev": true,
- "engines": {
- "node": ">=0.4.x"
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
}
},
- "node_modules/randombytes": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
- "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+ "node_modules/braces": {
+ "version": "3.0.2",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "safe-buffer": "^5.1.0"
+ "fill-range": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "node_modules/readdirp": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
- "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "node_modules/browser-stdout": {
+ "version": "1.3.1",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/browserslist": {
+ "version": "4.21.3",
"dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ }
+ ],
+ "license": "MIT",
"dependencies": {
- "picomatch": "^2.2.1"
+ "caniuse-lite": "^1.0.30001370",
+ "electron-to-chromium": "^1.4.202",
+ "node-releases": "^2.0.6",
+ "update-browserslist-db": "^1.0.5"
+ },
+ "bin": {
+ "browserslist": "cli.js"
},
"engines": {
- "node": ">=8.10.0"
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
}
},
- "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==",
+ "node_modules/buffer-equal-constant-time": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
+ "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA=="
+ },
+ "node_modules/caching-transform": {
+ "version": "4.0.0",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.3",
- "functions-have-names": "^1.2.2"
+ "hasha": "^5.0.0",
+ "make-dir": "^3.0.0",
+ "package-hash": "^4.0.0",
+ "write-file-atomic": "^3.0.0"
},
"engines": {
- "node": ">= 0.4"
+ "node": ">=8"
+ }
+ },
+ "node_modules/call-bind": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
+ "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
+ "dev": true,
+ "dependencies": {
+ "function-bind": "^1.1.1",
+ "get-intrinsic": "^1.0.2"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/require-directory": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
- "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+ "node_modules/camelcase": {
+ "version": "6.3.0",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=0.10.0"
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/safe-buffer": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
- "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001374",
"dev": true,
"funding": [
{
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
},
{
- "type": "consulting",
- "url": "https://feross.org/support"
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
}
- ]
- },
- "node_modules/sax": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz",
- "integrity": "sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==",
- "dev": true
+ ],
+ "license": "CC-BY-4.0"
},
- "node_modules/serialize-javascript": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz",
- "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==",
+ "node_modules/chai": {
+ "version": "4.3.6",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "randombytes": "^2.1.0"
+ "assertion-error": "^1.1.0",
+ "check-error": "^1.0.2",
+ "deep-eql": "^3.0.1",
+ "get-func-name": "^2.0.0",
+ "loupe": "^2.3.1",
+ "pathval": "^1.1.1",
+ "type-detect": "^4.0.5"
+ },
+ "engines": {
+ "node": ">=4"
}
},
- "node_modules/side-channel": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
- "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
+ "node_modules/chai-http": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/chai-http/-/chai-http-4.3.0.tgz",
+ "integrity": "sha512-zFTxlN7HLMv+7+SPXZdkd5wUlK+KxH6Q7bIEMiEx0FK3zuuMqL7cwICAQ0V1+yYRozBburYuxN1qZstgHpFZQg==",
"dev": true,
"dependencies": {
- "call-bind": "^1.0.0",
- "get-intrinsic": "^1.0.2",
- "object-inspect": "^1.9.0"
+ "@types/chai": "4",
+ "@types/superagent": "^3.8.3",
+ "cookiejar": "^2.1.1",
+ "is-ip": "^2.0.0",
+ "methods": "^1.1.2",
+ "qs": "^6.5.1",
+ "superagent": "^3.7.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
},
"funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "url": "https://github.com/chalk/chalk?sponsor=1"
}
},
- "node_modules/string-width": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
- "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "node_modules/chalk/node_modules/supports-color": {
+ "version": "7.2.0",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.1"
+ "has-flag": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
- "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==",
+ "node_modules/check-error": {
+ "version": "1.0.2",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/chokidar": {
+ "version": "3.5.3",
"dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.4",
- "es-abstract": "^1.19.5"
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
},
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
}
},
- "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==",
+ "node_modules/clean-stack": {
+ "version": "2.2.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/cliui": {
+ "version": "7.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.4",
- "es-abstract": "^1.19.5"
+ "color-name": "~1.1.4"
},
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "engines": {
+ "node": ">=7.0.0"
}
},
- "node_modules/strip-ansi": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
- "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "node_modules/color-name": {
+ "version": "1.1.4",
"dev": true,
+ "license": "MIT"
+ },
+ "node_modules/combined-stream": {
+ "version": "1.0.8",
+ "license": "MIT",
"dependencies": {
- "ansi-regex": "^5.0.1"
+ "delayed-stream": "~1.0.0"
},
"engines": {
- "node": ">=8"
+ "node": ">= 0.8"
}
},
- "node_modules/strip-json-comments": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
- "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "node_modules/commondir": {
+ "version": "1.0.1",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/component-emitter": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
+ "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==",
+ "dev": true
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/convert-source-map": {
+ "version": "1.8.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "~5.1.1"
+ }
+ },
+ "node_modules/convert-source-map/node_modules/safe-buffer": {
+ "version": "5.1.2",
"dev": true,
+ "license": "MIT"
+ },
+ "node_modules/cookie": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
+ "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==",
"engines": {
- "node": ">=8"
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/cookiejar": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.3.tgz",
+ "integrity": "sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ==",
+ "dev": true
+ },
+ "node_modules/core-util-is": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
+ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
+ "dev": true
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.3",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/data-uri-to-buffer": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz",
+ "integrity": "sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA==",
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/dc-api": {
+ "resolved": "src",
+ "link": true
+ },
+ "node_modules/debug": {
+ "version": "4.3.3",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/decamelize": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/supports-color": {
- "version": "8.1.1",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
- "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "node_modules/deep-eql": {
+ "version": "3.0.1",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "has-flag": "^4.0.0"
+ "type-detect": "^4.0.0"
},
+ "engines": {
+ "node": ">=0.12"
+ }
+ },
+ "node_modules/default-require-extensions": {
+ "version": "3.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "strip-bom": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/delayed-stream": {
+ "version": "1.0.0",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/detect-indent": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz",
+ "integrity": "sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/detect-newline": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz",
+ "integrity": "sha512-CwffZFvlJffUg9zZA0uqrjQayUTC8ob94pnr5sFwaVv3IOmkfUHcWH+jXaQK3askE51Cqe8/9Ql/0uXNwqZ8Zg==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/diff": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "node_modules/ecdsa-sig-formatter": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
+ "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
+ "dependencies": {
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.4.211",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/es6-error": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/escalade": {
+ "version": "3.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
"engines": {
"node": ">=10"
},
"funding": {
- "url": "https://github.com/chalk/supports-color?sponsor=1"
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/esprima": {
+ "version": "4.0.1",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "bin": {
+ "esparse": "bin/esparse.js",
+ "esvalidate": "bin/esvalidate.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/extend": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
+ "dev": true
+ },
+ "node_modules/fetch-blob": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz",
+ "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/jimmywarting"
+ },
+ {
+ "type": "paypal",
+ "url": "https://paypal.me/jimmywarting"
+ }
+ ],
+ "dependencies": {
+ "node-domexception": "^1.0.0",
+ "web-streams-polyfill": "^3.0.3"
+ },
+ "engines": {
+ "node": "^12.20 || >= 14.13"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.0.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/find-cache-dir": {
+ "version": "3.3.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "commondir": "^1.0.1",
+ "make-dir": "^3.0.2",
+ "pkg-dir": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/avajs/find-cache-dir?sponsor=1"
+ }
+ },
+ "node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/flat": {
+ "version": "5.0.2",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "bin": {
+ "flat": "cli.js"
+ }
+ },
+ "node_modules/follow-redirects": {
+ "version": "1.15.1",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/RubenVerborgh"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=4.0"
+ },
+ "peerDependenciesMeta": {
+ "debug": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/foreground-child": {
+ "version": "2.0.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "cross-spawn": "^7.0.0",
+ "signal-exit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/form-data": {
+ "version": "4.0.0",
+ "license": "MIT",
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/formdata-polyfill": {
+ "version": "4.0.10",
+ "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz",
+ "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==",
+ "dependencies": {
+ "fetch-blob": "^3.1.2"
+ },
+ "engines": {
+ "node": ">=12.20.0"
+ }
+ },
+ "node_modules/formidable": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.6.tgz",
+ "integrity": "sha512-KcpbcpuLNOwrEjnbpMC0gS+X8ciDoZE1kkqzat4a8vrprf+s9pKNQ/QIwWfbfs4ltgmFl3MD177SNTkve3BwGQ==",
+ "deprecated": "Please upgrade to latest, formidable@v2 or formidable@v3! Check these notes: https://bit.ly/2ZEqIau",
+ "dev": true,
+ "funding": {
+ "url": "https://ko-fi.com/tunnckoCore/commissions"
+ }
+ },
+ "node_modules/fromentries": {
+ "version": "1.3.2",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+ "dev": true
+ },
+ "node_modules/gensync": {
+ "version": "1.0.0-beta.2",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/get-caller-file": {
+ "version": "2.0.5",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
+ }
+ },
+ "node_modules/get-func-name": {
+ "version": "2.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/get-intrinsic": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz",
+ "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==",
+ "dev": true,
+ "dependencies": {
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-package-type": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/glob": {
+ "version": "7.2.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "5.1.2",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/glob/node_modules/minimatch": {
+ "version": "3.1.2",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/globals": {
+ "version": "11.12.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/graceful-fs": {
+ "version": "4.2.10",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/growl": {
+ "version": "1.10.5",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4.x"
+ }
+ },
+ "node_modules/has": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+ "dev": true,
+ "dependencies": {
+ "function-bind": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/has-flag": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/has-symbols": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
+ "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/hasha": {
+ "version": "5.2.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-stream": "^2.0.0",
+ "type-fest": "^0.8.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/he": {
+ "version": "1.2.0",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "he": "bin/he"
+ }
+ },
+ "node_modules/html-escaper": {
+ "version": "2.0.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/iiif-builder": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/iiif-builder/-/iiif-builder-1.0.6.tgz",
+ "integrity": "sha512-nNmDDBmbH97Z3HxJ969OBsDaUXgM0cYDZa4/7mH6D8LdzuFHy/4cDzmRQKYdg5BztCD+Ec5fNPDgfvKekwJ/vw==",
+ "dependencies": {
+ "@iiif/parser": "1.x",
+ "@iiif/presentation-3": "1.x",
+ "@iiif/vault": "0.9.x || 1.x"
+ }
+ },
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "node_modules/indent-string": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/ip-regex": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz",
+ "integrity": "sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/is-binary-path": {
+ "version": "2.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "binary-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-ip": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-ip/-/is-ip-2.0.0.tgz",
+ "integrity": "sha512-9MTn0dteHETtyUx8pxqMwg5hMBi3pvlyglJ+b79KOCca0po23337LbVV2Hl4xmMvfw++ljnO0/+5G6G+0Szh6g==",
+ "dev": true,
+ "dependencies": {
+ "ip-regex": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-plain-obj": {
+ "version": "2.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-stream": {
+ "version": "2.0.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-typedarray": {
+ "version": "1.0.0",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/is-unicode-supported": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-windows": {
+ "version": "1.0.2",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
+ "dev": true
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/istanbul-lib-coverage": {
+ "version": "3.2.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/istanbul-lib-hook": {
+ "version": "3.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "append-transform": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/istanbul-lib-instrument": {
+ "version": "4.0.3",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@babel/core": "^7.7.5",
+ "@istanbuljs/schema": "^0.1.2",
+ "istanbul-lib-coverage": "^3.0.0",
+ "semver": "^6.3.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/istanbul-lib-processinfo": {
+ "version": "2.0.3",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "archy": "^1.0.0",
+ "cross-spawn": "^7.0.3",
+ "istanbul-lib-coverage": "^3.2.0",
+ "p-map": "^3.0.0",
+ "rimraf": "^3.0.0",
+ "uuid": "^8.3.2"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/istanbul-lib-report": {
+ "version": "3.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "istanbul-lib-coverage": "^3.0.0",
+ "make-dir": "^3.0.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/istanbul-lib-report/node_modules/supports-color": {
+ "version": "7.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/istanbul-lib-source-maps": {
+ "version": "4.0.1",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "debug": "^4.1.1",
+ "istanbul-lib-coverage": "^3.0.0",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/istanbul-reports": {
+ "version": "3.1.5",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "html-escaper": "^2.0.0",
+ "istanbul-lib-report": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/js-yaml": {
+ "version": "4.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/jsesc": {
+ "version": "2.5.2",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/json-stringify-safe": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/json5": {
+ "version": "2.2.1",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/jsonwebtoken": {
+ "version": "8.5.1",
+ "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz",
+ "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==",
+ "dependencies": {
+ "jws": "^3.2.2",
+ "lodash.includes": "^4.3.0",
+ "lodash.isboolean": "^3.0.3",
+ "lodash.isinteger": "^4.0.4",
+ "lodash.isnumber": "^3.0.3",
+ "lodash.isplainobject": "^4.0.6",
+ "lodash.isstring": "^4.0.1",
+ "lodash.once": "^4.0.0",
+ "ms": "^2.1.1",
+ "semver": "^5.6.0"
+ },
+ "engines": {
+ "node": ">=4",
+ "npm": ">=1.4.28"
+ }
+ },
+ "node_modules/jsonwebtoken/node_modules/semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/jwa": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz",
+ "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==",
+ "dependencies": {
+ "buffer-equal-constant-time": "1.0.1",
+ "ecdsa-sig-formatter": "1.0.11",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/jws": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz",
+ "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==",
+ "dependencies": {
+ "jwa": "^1.4.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/lodash": {
+ "version": "4.17.21",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/lodash.flattendeep": {
+ "version": "4.4.0",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/lodash.includes": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
+ "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w=="
+ },
+ "node_modules/lodash.isboolean": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
+ "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg=="
+ },
+ "node_modules/lodash.isinteger": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz",
+ "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA=="
+ },
+ "node_modules/lodash.isnumber": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz",
+ "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw=="
+ },
+ "node_modules/lodash.isobject": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-3.0.2.tgz",
+ "integrity": "sha512-3/Qptq2vr7WeJbB4KHUSKlq8Pl7ASXi3UG6CMbBm8WRtXi8+GHm7mKaU3urfpSEzWe2wCIChs6/sdocUsTKJiA=="
+ },
+ "node_modules/lodash.isplainobject": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
+ "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA=="
+ },
+ "node_modules/lodash.isstring": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
+ "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw=="
+ },
+ "node_modules/lodash.once": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
+ "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg=="
+ },
+ "node_modules/log-symbols": {
+ "version": "4.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "chalk": "^4.1.0",
+ "is-unicode-supported": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/loupe": {
+ "version": "2.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "get-func-name": "^2.0.0"
+ }
+ },
+ "node_modules/lz-string": {
+ "version": "1.4.4",
+ "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.4.4.tgz",
+ "integrity": "sha512-0ckx7ZHRPqb0oUm8zNr+90mtf9DQB60H1wMCjBtfi62Kl3a7JbHob6gA2bC+xRvZoOL+1hzUK8jeuEIQE8svEQ==",
+ "bin": {
+ "lz-string": "bin/bin.js"
+ }
+ },
+ "node_modules/make-dir": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "semver": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/methods": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
+ "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+ "dev": true,
+ "bin": {
+ "mime": "cli.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/mime-db": {
+ "version": "1.52.0",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "2.1.35",
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "4.2.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/minimist": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz",
+ "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/mitt": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.0.tgz",
+ "integrity": "sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ=="
+ },
+ "node_modules/mocha": {
+ "version": "9.2.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@ungap/promise-all-settled": "1.1.2",
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.3",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "7.2.0",
+ "growl": "1.10.5",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "4.2.1",
+ "ms": "2.1.3",
+ "nanoid": "3.3.1",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "which": "2.0.2",
+ "workerpool": "6.2.0",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mochajs"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "license": "MIT"
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.1",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/nock": {
+ "version": "13.2.9",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.1.0",
+ "json-stringify-safe": "^5.0.1",
+ "lodash": "^4.17.21",
+ "propagate": "^2.0.0"
+ },
+ "engines": {
+ "node": ">= 10.13"
+ }
+ },
+ "node_modules/node-domexception": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz",
+ "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/jimmywarting"
+ },
+ {
+ "type": "github",
+ "url": "https://paypal.me/jimmywarting"
+ }
+ ],
+ "engines": {
+ "node": ">=10.5.0"
+ }
+ },
+ "node_modules/node-fetch": {
+ "version": "3.2.10",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.2.10.tgz",
+ "integrity": "sha512-MhuzNwdURnZ1Cp4XTazr69K0BTizsBroX7Zx3UgDSVcZYKF/6p0CBe4EUb/hLqmzVhl0UpYfgRljQ4yxE+iCxA==",
+ "dependencies": {
+ "data-uri-to-buffer": "^4.0.0",
+ "fetch-blob": "^3.1.4",
+ "formdata-polyfill": "^4.0.10"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/node-fetch"
+ }
+ },
+ "node_modules/node-preload": {
+ "version": "0.2.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "process-on-spawn": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.6",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/normalize-path": {
+ "version": "3.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/nyc": {
+ "version": "15.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "@istanbuljs/load-nyc-config": "^1.0.0",
+ "@istanbuljs/schema": "^0.1.2",
+ "caching-transform": "^4.0.0",
+ "convert-source-map": "^1.7.0",
+ "decamelize": "^1.2.0",
+ "find-cache-dir": "^3.2.0",
+ "find-up": "^4.1.0",
+ "foreground-child": "^2.0.0",
+ "get-package-type": "^0.1.0",
+ "glob": "^7.1.6",
+ "istanbul-lib-coverage": "^3.0.0",
+ "istanbul-lib-hook": "^3.0.0",
+ "istanbul-lib-instrument": "^4.0.0",
+ "istanbul-lib-processinfo": "^2.0.2",
+ "istanbul-lib-report": "^3.0.0",
+ "istanbul-lib-source-maps": "^4.0.0",
+ "istanbul-reports": "^3.0.2",
+ "make-dir": "^3.0.0",
+ "node-preload": "^0.2.1",
+ "p-map": "^3.0.0",
+ "process-on-spawn": "^1.0.0",
+ "resolve-from": "^5.0.0",
+ "rimraf": "^3.0.0",
+ "signal-exit": "^3.0.2",
+ "spawn-wrap": "^2.0.0",
+ "test-exclude": "^6.0.0",
+ "yargs": "^15.0.2"
+ },
+ "bin": {
+ "nyc": "bin/nyc.js"
+ },
+ "engines": {
+ "node": ">=8.9"
+ }
+ },
+ "node_modules/nyc/node_modules/camelcase": {
+ "version": "5.3.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/nyc/node_modules/cliui": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^6.2.0"
+ }
+ },
+ "node_modules/nyc/node_modules/decamelize": {
+ "version": "1.2.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/nyc/node_modules/find-up": {
+ "version": "4.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/nyc/node_modules/locate-path": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/nyc/node_modules/p-limit": {
+ "version": "2.3.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/nyc/node_modules/p-locate": {
+ "version": "4.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/nyc/node_modules/wrap-ansi": {
+ "version": "6.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/nyc/node_modules/y18n": {
+ "version": "4.0.3",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/nyc/node_modules/yargs": {
+ "version": "15.4.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^6.0.0",
+ "decamelize": "^1.2.0",
+ "find-up": "^4.1.0",
+ "get-caller-file": "^2.0.1",
+ "require-directory": "^2.1.1",
+ "require-main-filename": "^2.0.0",
+ "set-blocking": "^2.0.0",
+ "string-width": "^4.2.0",
+ "which-module": "^2.0.0",
+ "y18n": "^4.0.0",
+ "yargs-parser": "^18.1.2"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/nyc/node_modules/yargs-parser": {
+ "version": "18.1.3",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "camelcase": "^5.0.0",
+ "decamelize": "^1.2.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/object-inspect": {
+ "version": "1.12.2",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz",
+ "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-map": {
+ "version": "3.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "aggregate-error": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/p-try": {
+ "version": "2.2.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/package-hash": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "graceful-fs": "^4.1.15",
+ "hasha": "^5.0.0",
+ "lodash.flattendeep": "^4.4.0",
+ "release-zalgo": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/parse-http-header": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parse-http-header/-/parse-http-header-1.0.1.tgz",
+ "integrity": "sha512-xOoH7vzokDoenX4e3c+4ik8lf30kq9Pawq20TH5uq3RURsIJquqFTE0gS7OAEE6nvMQzuP5OXxubYuN7YLsTiw=="
+ },
+ "node_modules/path-exists": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-is-absolute": {
+ "version": "1.0.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/pathval": {
+ "version": "1.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/picocolors": {
+ "version": "1.0.0",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/pkg-dir": {
+ "version": "4.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "find-up": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/pkg-dir/node_modules/find-up": {
+ "version": "4.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/pkg-dir/node_modules/locate-path": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/pkg-dir/node_modules/p-limit": {
+ "version": "2.3.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/pkg-dir/node_modules/p-locate": {
+ "version": "4.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/prettier": {
+ "version": "2.7.1",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "prettier": "bin-prettier.js"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ },
+ "funding": {
+ "url": "https://github.com/prettier/prettier?sponsor=1"
+ }
+ },
+ "node_modules/process-nextick-args": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
+ "dev": true
+ },
+ "node_modules/process-on-spawn": {
+ "version": "1.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fromentries": "^1.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/propagate": {
+ "version": "2.0.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/qs": {
+ "version": "6.11.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
+ "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
+ "dev": true,
+ "dependencies": {
+ "side-channel": "^1.0.4"
+ },
+ "engines": {
+ "node": ">=0.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/randombytes": {
+ "version": "2.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "^5.1.0"
+ }
+ },
+ "node_modules/readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "dev": true,
+ "dependencies": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "node_modules/readable-stream/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==",
+ "dev": true
+ },
+ "node_modules/readdirp": {
+ "version": "3.6.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ }
+ },
+ "node_modules/redux": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.0.tgz",
+ "integrity": "sha512-oSBmcKKIuIR4ME29/AeNUnl5L+hvBq7OaJWzaptTQJAntaPvxIJqfnjbaEiCzzaIz+XmVILfqAM3Ob0aXLPfjA==",
+ "dependencies": {
+ "@babel/runtime": "^7.9.2"
+ }
+ },
+ "node_modules/regenerator-runtime": {
+ "version": "0.13.10",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz",
+ "integrity": "sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw=="
+ },
+ "node_modules/release-zalgo": {
+ "version": "1.0.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "es6-error": "^4.0.1"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/require-directory": {
+ "version": "2.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/require-main-filename": {
+ "version": "2.0.0",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/resolve-from": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/rimraf": {
+ "version": "3.0.2",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/semver": {
+ "version": "6.3.0",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "node_modules/set-blocking": {
+ "version": "2.0.0",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/side-channel": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
+ "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.0",
+ "get-intrinsic": "^1.0.2",
+ "object-inspect": "^1.9.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/signal-exit": {
+ "version": "3.0.7",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/sort-json": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/sort-json/-/sort-json-2.0.1.tgz",
+ "integrity": "sha512-s8cs2bcsQCzo/P2T/uoU6Js4dS/jnX8+4xunziNoq9qmSpZNCrRIAIvp4avsz0ST18HycV4z/7myJ7jsHWB2XQ==",
+ "dependencies": {
+ "detect-indent": "^5.0.0",
+ "detect-newline": "^2.1.0",
+ "minimist": "^1.2.0"
+ },
+ "bin": {
+ "sort-json": "app/cmd.js"
+ }
+ },
+ "node_modules/source-map": {
+ "version": "0.6.1",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/spawn-wrap": {
+ "version": "2.0.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "foreground-child": "^2.0.0",
+ "is-windows": "^1.0.2",
+ "make-dir": "^3.0.0",
+ "rimraf": "^3.0.0",
+ "signal-exit": "^3.0.2",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/sprintf-js": {
+ "version": "1.0.3",
+ "dev": true,
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "dev": true,
+ "dependencies": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
+ "node_modules/string_decoder/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==",
+ "dev": true
+ },
+ "node_modules/string-width": {
+ "version": "4.2.3",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-bom": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-json-comments": {
+ "version": "3.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/superagent": {
+ "version": "3.8.3",
+ "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.3.tgz",
+ "integrity": "sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA==",
+ "deprecated": "Please upgrade to v7.0.2+ of superagent. We have fixed numerous issues with streams, form-data, attach(), filesystem errors not bubbling up (ENOENT on attach()), and all tests are now passing. See the releases tab for more information at .",
+ "dev": true,
+ "dependencies": {
+ "component-emitter": "^1.2.0",
+ "cookiejar": "^2.1.0",
+ "debug": "^3.1.0",
+ "extend": "^3.0.0",
+ "form-data": "^2.3.1",
+ "formidable": "^1.2.0",
+ "methods": "^1.1.1",
+ "mime": "^1.4.1",
+ "qs": "^6.5.1",
+ "readable-stream": "^2.3.5"
+ },
+ "engines": {
+ "node": ">= 4.0"
+ }
+ },
+ "node_modules/superagent/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/superagent/node_modules/form-data": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz",
+ "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==",
+ "dev": true,
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.6",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 0.12"
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "node_modules/test-exclude": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "@istanbuljs/schema": "^0.1.2",
+ "glob": "^7.1.4",
+ "minimatch": "^3.0.4"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/test-exclude/node_modules/minimatch": {
+ "version": "3.1.2",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/tiny-invariant": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz",
+ "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw=="
+ },
+ "node_modules/to-fast-properties": {
+ "version": "2.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/tslib": {
+ "version": "2.4.0",
+ "license": "0BSD"
+ },
+ "node_modules/type-detect": {
+ "version": "4.0.8",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/type-fest": {
+ "version": "0.8.1",
+ "dev": true,
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/typedarray-to-buffer": {
+ "version": "3.1.5",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-typedarray": "^1.0.0"
+ }
+ },
+ "node_modules/typesafe-actions": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/typesafe-actions/-/typesafe-actions-5.1.0.tgz",
+ "integrity": "sha512-bna6Yi1pRznoo6Bz1cE6btB/Yy8Xywytyfrzu/wc+NFW3ZF0I+2iCGImhBsoYYCOWuICtRO4yHcnDlzgo1AdNg==",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/update-browserslist-db": {
+ "version": "1.0.5",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "escalade": "^3.1.1",
+ "picocolors": "^1.0.0"
+ },
+ "bin": {
+ "browserslist-lint": "cli.js"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
+ }
+ },
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+ "dev": true
+ },
+ "node_modules/uuid": {
+ "version": "8.3.2",
+ "license": "MIT",
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
+ "node_modules/web-streams-polyfill": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz",
+ "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/which-module": {
+ "version": "2.0.0",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/workerpool": {
+ "version": "6.2.0",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/write-file-atomic": {
+ "version": "3.0.3",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "imurmurhash": "^0.1.4",
+ "is-typedarray": "^1.0.0",
+ "signal-exit": "^3.0.2",
+ "typedarray-to-buffer": "^3.1.5"
+ }
+ },
+ "node_modules/y18n": {
+ "version": "5.0.8",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yargs": {
+ "version": "16.2.0",
+ "dev": true,
+ "license": "MIT",
+ "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": ">=10"
+ }
+ },
+ "node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yargs-unparser": {
+ "version": "2.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "camelcase": "^6.0.0",
+ "decamelize": "^4.0.0",
+ "flat": "^5.0.2",
+ "is-plain-obj": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "src": {
+ "name": "dc-api",
+ "version": "2.0.0pre",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-crypto/sha256-browser": "^2.0.1",
+ "@aws-sdk/credential-provider-node": "^3.142.0",
+ "@aws-sdk/node-http-handler": "^3.127.0",
+ "@aws-sdk/protocol-http": "^3.127.0",
+ "@aws-sdk/signature-v4": "^3.130.0",
+ "axios": ">=0.21.1",
+ "cookie": "^0.5.0",
+ "iiif-builder": "^1.0.6",
+ "jsonwebtoken": "^8.5.1",
+ "lodash.isobject": "^3.0.2",
+ "lz-string": "^1.4.4",
+ "parse-http-header": "^1.0.1",
+ "sort-json": "^2.0.1"
+ }
+ }
+ },
+ "dependencies": {
+ "@ampproject/remapping": {
+ "version": "2.2.0",
+ "dev": true,
+ "requires": {
+ "@jridgewell/gen-mapping": "^0.1.0",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ }
+ },
+ "@aws-crypto/ie11-detection": {
+ "version": "2.0.0",
+ "requires": {
+ "tslib": "^1.11.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "1.14.1"
+ }
+ }
+ },
+ "@aws-crypto/sha256-browser": {
+ "version": "2.0.1",
+ "requires": {
+ "@aws-crypto/ie11-detection": "^2.0.0",
+ "@aws-crypto/sha256-js": "^2.0.1",
+ "@aws-crypto/supports-web-crypto": "^2.0.0",
+ "@aws-crypto/util": "^2.0.1",
+ "@aws-sdk/types": "^3.1.0",
+ "@aws-sdk/util-locate-window": "^3.0.0",
+ "@aws-sdk/util-utf8-browser": "^3.0.0",
+ "tslib": "^1.11.1"
+ },
+ "dependencies": {
+ "@aws-crypto/sha256-js": {
+ "version": "2.0.1",
+ "requires": {
+ "@aws-crypto/util": "^2.0.1",
+ "@aws-sdk/types": "^3.1.0",
+ "tslib": "^1.11.1"
+ }
+ },
+ "tslib": {
+ "version": "1.14.1"
+ }
+ }
+ },
+ "@aws-crypto/sha256-js": {
+ "version": "2.0.0",
+ "requires": {
+ "@aws-crypto/util": "^2.0.0",
+ "@aws-sdk/types": "^3.1.0",
+ "tslib": "^1.11.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "1.14.1"
+ }
+ }
+ },
+ "@aws-crypto/supports-web-crypto": {
+ "version": "2.0.0",
+ "requires": {
+ "tslib": "^1.11.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "1.14.1"
+ }
+ }
+ },
+ "@aws-crypto/util": {
+ "version": "2.0.1",
+ "requires": {
+ "@aws-sdk/types": "^3.1.0",
+ "@aws-sdk/util-utf8-browser": "^3.0.0",
+ "tslib": "^1.11.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "1.14.1"
+ }
+ }
+ },
+ "@aws-sdk/abort-controller": {
+ "version": "3.127.0",
+ "requires": {
+ "@aws-sdk/types": "3.127.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/client-sso": {
+ "version": "3.142.0",
+ "requires": {
+ "@aws-crypto/sha256-browser": "2.0.0",
+ "@aws-crypto/sha256-js": "2.0.0",
+ "@aws-sdk/config-resolver": "3.130.0",
+ "@aws-sdk/fetch-http-handler": "3.131.0",
+ "@aws-sdk/hash-node": "3.127.0",
+ "@aws-sdk/invalid-dependency": "3.127.0",
+ "@aws-sdk/middleware-content-length": "3.127.0",
+ "@aws-sdk/middleware-host-header": "3.127.0",
+ "@aws-sdk/middleware-logger": "3.127.0",
+ "@aws-sdk/middleware-recursion-detection": "3.127.0",
+ "@aws-sdk/middleware-retry": "3.127.0",
+ "@aws-sdk/middleware-serde": "3.127.0",
+ "@aws-sdk/middleware-stack": "3.127.0",
+ "@aws-sdk/middleware-user-agent": "3.127.0",
+ "@aws-sdk/node-config-provider": "3.127.0",
+ "@aws-sdk/node-http-handler": "3.127.0",
+ "@aws-sdk/protocol-http": "3.127.0",
+ "@aws-sdk/smithy-client": "3.142.0",
+ "@aws-sdk/types": "3.127.0",
+ "@aws-sdk/url-parser": "3.127.0",
+ "@aws-sdk/util-base64-browser": "3.109.0",
+ "@aws-sdk/util-base64-node": "3.55.0",
+ "@aws-sdk/util-body-length-browser": "3.55.0",
+ "@aws-sdk/util-body-length-node": "3.55.0",
+ "@aws-sdk/util-defaults-mode-browser": "3.142.0",
+ "@aws-sdk/util-defaults-mode-node": "3.142.0",
+ "@aws-sdk/util-user-agent-browser": "3.127.0",
+ "@aws-sdk/util-user-agent-node": "3.127.0",
+ "@aws-sdk/util-utf8-browser": "3.109.0",
+ "@aws-sdk/util-utf8-node": "3.109.0",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "@aws-crypto/sha256-browser": {
+ "version": "2.0.0",
+ "requires": {
+ "@aws-crypto/ie11-detection": "^2.0.0",
+ "@aws-crypto/sha256-js": "^2.0.0",
+ "@aws-crypto/supports-web-crypto": "^2.0.0",
+ "@aws-crypto/util": "^2.0.0",
+ "@aws-sdk/types": "^3.1.0",
+ "@aws-sdk/util-locate-window": "^3.0.0",
+ "@aws-sdk/util-utf8-browser": "^3.0.0",
+ "tslib": "^1.11.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "1.14.1"
+ }
+ }
+ }
+ }
+ },
+ "@aws-sdk/config-resolver": {
+ "version": "3.130.0",
+ "requires": {
+ "@aws-sdk/signature-v4": "3.130.0",
+ "@aws-sdk/types": "3.127.0",
+ "@aws-sdk/util-config-provider": "3.109.0",
+ "@aws-sdk/util-middleware": "3.127.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/credential-provider-env": {
+ "version": "3.127.0",
+ "requires": {
+ "@aws-sdk/property-provider": "3.127.0",
+ "@aws-sdk/types": "3.127.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/credential-provider-imds": {
+ "version": "3.127.0",
+ "requires": {
+ "@aws-sdk/node-config-provider": "3.127.0",
+ "@aws-sdk/property-provider": "3.127.0",
+ "@aws-sdk/types": "3.127.0",
+ "@aws-sdk/url-parser": "3.127.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/credential-provider-ini": {
+ "version": "3.142.0",
+ "requires": {
+ "@aws-sdk/credential-provider-env": "3.127.0",
+ "@aws-sdk/credential-provider-imds": "3.127.0",
+ "@aws-sdk/credential-provider-sso": "3.142.0",
+ "@aws-sdk/credential-provider-web-identity": "3.127.0",
+ "@aws-sdk/property-provider": "3.127.0",
+ "@aws-sdk/shared-ini-file-loader": "3.127.0",
+ "@aws-sdk/types": "3.127.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/credential-provider-node": {
+ "version": "3.142.0",
+ "requires": {
+ "@aws-sdk/credential-provider-env": "3.127.0",
+ "@aws-sdk/credential-provider-imds": "3.127.0",
+ "@aws-sdk/credential-provider-ini": "3.142.0",
+ "@aws-sdk/credential-provider-process": "3.127.0",
+ "@aws-sdk/credential-provider-sso": "3.142.0",
+ "@aws-sdk/credential-provider-web-identity": "3.127.0",
+ "@aws-sdk/property-provider": "3.127.0",
+ "@aws-sdk/shared-ini-file-loader": "3.127.0",
+ "@aws-sdk/types": "3.127.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/credential-provider-process": {
+ "version": "3.127.0",
+ "requires": {
+ "@aws-sdk/property-provider": "3.127.0",
+ "@aws-sdk/shared-ini-file-loader": "3.127.0",
+ "@aws-sdk/types": "3.127.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/credential-provider-sso": {
+ "version": "3.142.0",
+ "requires": {
+ "@aws-sdk/client-sso": "3.142.0",
+ "@aws-sdk/property-provider": "3.127.0",
+ "@aws-sdk/shared-ini-file-loader": "3.127.0",
+ "@aws-sdk/types": "3.127.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/credential-provider-web-identity": {
+ "version": "3.127.0",
+ "requires": {
+ "@aws-sdk/property-provider": "3.127.0",
+ "@aws-sdk/types": "3.127.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/fetch-http-handler": {
+ "version": "3.131.0",
+ "requires": {
+ "@aws-sdk/protocol-http": "3.127.0",
+ "@aws-sdk/querystring-builder": "3.127.0",
+ "@aws-sdk/types": "3.127.0",
+ "@aws-sdk/util-base64-browser": "3.109.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/hash-node": {
+ "version": "3.127.0",
+ "requires": {
+ "@aws-sdk/types": "3.127.0",
+ "@aws-sdk/util-buffer-from": "3.55.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/invalid-dependency": {
+ "version": "3.127.0",
+ "requires": {
+ "@aws-sdk/types": "3.127.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/is-array-buffer": {
+ "version": "3.55.0",
+ "requires": {
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/middleware-content-length": {
+ "version": "3.127.0",
+ "requires": {
+ "@aws-sdk/protocol-http": "3.127.0",
+ "@aws-sdk/types": "3.127.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/middleware-host-header": {
+ "version": "3.127.0",
+ "requires": {
+ "@aws-sdk/protocol-http": "3.127.0",
+ "@aws-sdk/types": "3.127.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/middleware-logger": {
+ "version": "3.127.0",
+ "requires": {
+ "@aws-sdk/types": "3.127.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/middleware-recursion-detection": {
+ "version": "3.127.0",
+ "requires": {
+ "@aws-sdk/protocol-http": "3.127.0",
+ "@aws-sdk/types": "3.127.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/middleware-retry": {
+ "version": "3.127.0",
+ "requires": {
+ "@aws-sdk/protocol-http": "3.127.0",
+ "@aws-sdk/service-error-classification": "3.127.0",
+ "@aws-sdk/types": "3.127.0",
+ "@aws-sdk/util-middleware": "3.127.0",
+ "tslib": "^2.3.1",
+ "uuid": "^8.3.2"
+ }
+ },
+ "@aws-sdk/middleware-serde": {
+ "version": "3.127.0",
+ "requires": {
+ "@aws-sdk/types": "3.127.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/middleware-stack": {
+ "version": "3.127.0",
+ "requires": {
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/middleware-user-agent": {
+ "version": "3.127.0",
+ "requires": {
+ "@aws-sdk/protocol-http": "3.127.0",
+ "@aws-sdk/types": "3.127.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/node-config-provider": {
+ "version": "3.127.0",
+ "requires": {
+ "@aws-sdk/property-provider": "3.127.0",
+ "@aws-sdk/shared-ini-file-loader": "3.127.0",
+ "@aws-sdk/types": "3.127.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/node-http-handler": {
+ "version": "3.127.0",
+ "requires": {
+ "@aws-sdk/abort-controller": "3.127.0",
+ "@aws-sdk/protocol-http": "3.127.0",
+ "@aws-sdk/querystring-builder": "3.127.0",
+ "@aws-sdk/types": "3.127.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/property-provider": {
+ "version": "3.127.0",
+ "requires": {
+ "@aws-sdk/types": "3.127.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/protocol-http": {
+ "version": "3.127.0",
+ "requires": {
+ "@aws-sdk/types": "3.127.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/querystring-builder": {
+ "version": "3.127.0",
+ "requires": {
+ "@aws-sdk/types": "3.127.0",
+ "@aws-sdk/util-uri-escape": "3.55.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/querystring-parser": {
+ "version": "3.127.0",
+ "requires": {
+ "@aws-sdk/types": "3.127.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/service-error-classification": {
+ "version": "3.127.0"
+ },
+ "@aws-sdk/shared-ini-file-loader": {
+ "version": "3.127.0",
+ "requires": {
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/signature-v4": {
+ "version": "3.130.0",
+ "requires": {
+ "@aws-sdk/is-array-buffer": "3.55.0",
+ "@aws-sdk/types": "3.127.0",
+ "@aws-sdk/util-hex-encoding": "3.109.0",
+ "@aws-sdk/util-middleware": "3.127.0",
+ "@aws-sdk/util-uri-escape": "3.55.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/smithy-client": {
+ "version": "3.142.0",
+ "requires": {
+ "@aws-sdk/middleware-stack": "3.127.0",
+ "@aws-sdk/types": "3.127.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/types": {
+ "version": "3.127.0"
+ },
+ "@aws-sdk/url-parser": {
+ "version": "3.127.0",
+ "requires": {
+ "@aws-sdk/querystring-parser": "3.127.0",
+ "@aws-sdk/types": "3.127.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/util-base64-browser": {
+ "version": "3.109.0",
+ "requires": {
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/util-base64-node": {
+ "version": "3.55.0",
+ "requires": {
+ "@aws-sdk/util-buffer-from": "3.55.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/util-body-length-browser": {
+ "version": "3.55.0",
+ "requires": {
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/util-body-length-node": {
+ "version": "3.55.0",
+ "requires": {
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/util-buffer-from": {
+ "version": "3.55.0",
+ "requires": {
+ "@aws-sdk/is-array-buffer": "3.55.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/util-config-provider": {
+ "version": "3.109.0",
+ "requires": {
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/util-defaults-mode-browser": {
+ "version": "3.142.0",
+ "requires": {
+ "@aws-sdk/property-provider": "3.127.0",
+ "@aws-sdk/types": "3.127.0",
+ "bowser": "^2.11.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/util-defaults-mode-node": {
+ "version": "3.142.0",
+ "requires": {
+ "@aws-sdk/config-resolver": "3.130.0",
+ "@aws-sdk/credential-provider-imds": "3.127.0",
+ "@aws-sdk/node-config-provider": "3.127.0",
+ "@aws-sdk/property-provider": "3.127.0",
+ "@aws-sdk/types": "3.127.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/util-hex-encoding": {
+ "version": "3.109.0",
+ "requires": {
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/util-locate-window": {
+ "version": "3.55.0",
+ "requires": {
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/util-middleware": {
+ "version": "3.127.0",
+ "requires": {
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/util-uri-escape": {
+ "version": "3.55.0",
+ "requires": {
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/util-user-agent-browser": {
+ "version": "3.127.0",
+ "requires": {
+ "@aws-sdk/types": "3.127.0",
+ "bowser": "^2.11.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/util-user-agent-node": {
+ "version": "3.127.0",
+ "requires": {
+ "@aws-sdk/node-config-provider": "3.127.0",
+ "@aws-sdk/types": "3.127.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/util-utf8-browser": {
+ "version": "3.109.0",
+ "requires": {
+ "tslib": "^2.3.1"
+ }
+ },
+ "@aws-sdk/util-utf8-node": {
+ "version": "3.109.0",
+ "requires": {
+ "@aws-sdk/util-buffer-from": "3.55.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "@babel/code-frame": {
+ "version": "7.18.6",
+ "dev": true,
+ "requires": {
+ "@babel/highlight": "^7.18.6"
+ }
+ },
+ "@babel/compat-data": {
+ "version": "7.18.8",
+ "dev": true
+ },
+ "@babel/core": {
+ "version": "7.18.10",
+ "dev": true,
+ "requires": {
+ "@ampproject/remapping": "^2.1.0",
+ "@babel/code-frame": "^7.18.6",
+ "@babel/generator": "^7.18.10",
+ "@babel/helper-compilation-targets": "^7.18.9",
+ "@babel/helper-module-transforms": "^7.18.9",
+ "@babel/helpers": "^7.18.9",
+ "@babel/parser": "^7.18.10",
+ "@babel/template": "^7.18.10",
+ "@babel/traverse": "^7.18.10",
+ "@babel/types": "^7.18.10",
+ "convert-source-map": "^1.7.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.2",
+ "json5": "^2.2.1",
+ "semver": "^6.3.0"
+ }
+ },
+ "@babel/generator": {
+ "version": "7.18.12",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.18.10",
+ "@jridgewell/gen-mapping": "^0.3.2",
+ "jsesc": "^2.5.1"
+ },
+ "dependencies": {
+ "@jridgewell/gen-mapping": {
+ "version": "0.3.2",
+ "dev": true,
+ "requires": {
+ "@jridgewell/set-array": "^1.0.1",
+ "@jridgewell/sourcemap-codec": "^1.4.10",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ }
+ }
}
},
- "node_modules/to-regex-range": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
- "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "@babel/helper-compilation-targets": {
+ "version": "7.18.9",
"dev": true,
- "dependencies": {
- "is-number": "^7.0.0"
- },
- "engines": {
- "node": ">=8.0"
+ "requires": {
+ "@babel/compat-data": "^7.18.8",
+ "@babel/helper-validator-option": "^7.18.6",
+ "browserslist": "^4.20.2",
+ "semver": "^6.3.0"
}
},
- "node_modules/type-detect": {
- "version": "4.0.8",
- "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
- "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
+ "@babel/helper-environment-visitor": {
+ "version": "7.18.9",
+ "dev": true
+ },
+ "@babel/helper-function-name": {
+ "version": "7.18.9",
"dev": true,
- "engines": {
- "node": ">=4"
+ "requires": {
+ "@babel/template": "^7.18.6",
+ "@babel/types": "^7.18.9"
}
},
- "node_modules/unbox-primitive": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz",
- "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==",
+ "@babel/helper-hoist-variables": {
+ "version": "7.18.6",
"dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "has-bigints": "^1.0.2",
- "has-symbols": "^1.0.3",
- "which-boxed-primitive": "^1.0.2"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "requires": {
+ "@babel/types": "^7.18.6"
}
},
- "node_modules/url": {
- "version": "0.10.3",
- "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz",
- "integrity": "sha512-hzSUW2q06EqL1gKM/a+obYHLIO6ct2hwPuviqTTOcfFVc61UbfJ2Q32+uGL/HCPxKqrdGB5QUwIe7UqlDgwsOQ==",
+ "@babel/helper-module-imports": {
+ "version": "7.18.6",
"dev": true,
- "dependencies": {
- "punycode": "1.3.2",
- "querystring": "0.2.0"
+ "requires": {
+ "@babel/types": "^7.18.6"
}
},
- "node_modules/util": {
- "version": "0.12.4",
- "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz",
- "integrity": "sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==",
+ "@babel/helper-module-transforms": {
+ "version": "7.18.9",
"dev": true,
- "dependencies": {
- "inherits": "^2.0.3",
- "is-arguments": "^1.0.4",
- "is-generator-function": "^1.0.7",
- "is-typed-array": "^1.1.3",
- "safe-buffer": "^5.1.2",
- "which-typed-array": "^1.1.2"
+ "requires": {
+ "@babel/helper-environment-visitor": "^7.18.9",
+ "@babel/helper-module-imports": "^7.18.6",
+ "@babel/helper-simple-access": "^7.18.6",
+ "@babel/helper-split-export-declaration": "^7.18.6",
+ "@babel/helper-validator-identifier": "^7.18.6",
+ "@babel/template": "^7.18.6",
+ "@babel/traverse": "^7.18.9",
+ "@babel/types": "^7.18.9"
}
},
- "node_modules/uuid": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.0.0.tgz",
- "integrity": "sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==",
+ "@babel/helper-simple-access": {
+ "version": "7.18.6",
"dev": true,
- "bin": {
- "uuid": "dist/bin/uuid"
+ "requires": {
+ "@babel/types": "^7.18.6"
}
},
- "node_modules/which": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
- "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "@babel/helper-split-export-declaration": {
+ "version": "7.18.6",
"dev": true,
- "dependencies": {
- "isexe": "^2.0.0"
- },
- "bin": {
- "node-which": "bin/node-which"
- },
- "engines": {
- "node": ">= 8"
+ "requires": {
+ "@babel/types": "^7.18.6"
}
},
- "node_modules/which-boxed-primitive": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
- "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
+ "@babel/helper-string-parser": {
+ "version": "7.18.10",
+ "dev": true
+ },
+ "@babel/helper-validator-identifier": {
+ "version": "7.18.6",
+ "dev": true
+ },
+ "@babel/helper-validator-option": {
+ "version": "7.18.6",
+ "dev": true
+ },
+ "@babel/helpers": {
+ "version": "7.18.9",
"dev": true,
- "dependencies": {
- "is-bigint": "^1.0.1",
- "is-boolean-object": "^1.1.0",
- "is-number-object": "^1.0.4",
- "is-string": "^1.0.5",
- "is-symbol": "^1.0.3"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "requires": {
+ "@babel/template": "^7.18.6",
+ "@babel/traverse": "^7.18.9",
+ "@babel/types": "^7.18.9"
}
},
- "node_modules/which-typed-array": {
- "version": "1.1.8",
- "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.8.tgz",
- "integrity": "sha512-Jn4e5PItbcAHyLoRDwvPj1ypu27DJbtdYXUa5zsinrUx77Uvfb0cXwwnGMTn7cjUfhhqgVQnVJCwF+7cgU7tpw==",
+ "@babel/highlight": {
+ "version": "7.18.6",
"dev": true,
- "dependencies": {
- "available-typed-arrays": "^1.0.5",
- "call-bind": "^1.0.2",
- "es-abstract": "^1.20.0",
- "for-each": "^0.3.3",
- "has-tostringtag": "^1.0.0",
- "is-typed-array": "^1.1.9"
- },
- "engines": {
- "node": ">= 0.4"
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.18.6",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
},
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "dependencies": {
+ "ansi-styles": {
+ "version": "3.2.1",
+ "dev": true,
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "chalk": {
+ "version": "2.4.2",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "color-convert": {
+ "version": "1.9.3",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "dev": true
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "5.5.0",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ }
}
},
- "node_modules/workerpool": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.0.tgz",
- "integrity": "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==",
+ "@babel/parser": {
+ "version": "7.18.11",
"dev": true
},
- "node_modules/wrap-ansi": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
- "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^4.0.0",
- "string-width": "^4.1.0",
- "strip-ansi": "^6.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ "@babel/runtime": {
+ "version": "7.19.4",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.4.tgz",
+ "integrity": "sha512-EXpLCrk55f+cYqmHsSR+yD/0gAIMxxA9QK9lnQWzhMCvt+YmoBN7Zx94s++Kv0+unHk39vxNO8t+CMA2WSS3wA==",
+ "requires": {
+ "regenerator-runtime": "^0.13.4"
}
},
- "node_modules/wrappy": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
- "dev": true
- },
- "node_modules/xml2js": {
- "version": "0.4.19",
- "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz",
- "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==",
+ "@babel/template": {
+ "version": "7.18.10",
"dev": true,
- "dependencies": {
- "sax": ">=0.6.0",
- "xmlbuilder": "~9.0.1"
+ "requires": {
+ "@babel/code-frame": "^7.18.6",
+ "@babel/parser": "^7.18.10",
+ "@babel/types": "^7.18.10"
}
},
- "node_modules/xmlbuilder": {
- "version": "9.0.7",
- "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz",
- "integrity": "sha512-7YXTQc3P2l9+0rjaUbLwMKRhtmwg1M1eDf6nag7urC7pIPYLD9W/jmzQ4ptRSUbodw5S0jfoGTflLemQibSpeQ==",
+ "@babel/traverse": {
+ "version": "7.18.11",
"dev": true,
- "engines": {
- "node": ">=4.0"
+ "requires": {
+ "@babel/code-frame": "^7.18.6",
+ "@babel/generator": "^7.18.10",
+ "@babel/helper-environment-visitor": "^7.18.9",
+ "@babel/helper-function-name": "^7.18.9",
+ "@babel/helper-hoist-variables": "^7.18.6",
+ "@babel/helper-split-export-declaration": "^7.18.6",
+ "@babel/parser": "^7.18.11",
+ "@babel/types": "^7.18.10",
+ "debug": "^4.1.0",
+ "globals": "^11.1.0"
}
},
- "node_modules/y18n": {
- "version": "5.0.8",
- "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
- "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "@babel/types": {
+ "version": "7.18.10",
"dev": true,
- "engines": {
- "node": ">=10"
+ "requires": {
+ "@babel/helper-string-parser": "^7.18.10",
+ "@babel/helper-validator-identifier": "^7.18.6",
+ "to-fast-properties": "^2.0.0"
}
},
- "node_modules/yargs": {
- "version": "16.2.0",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
- "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
+ "@iiif/parser": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@iiif/parser/-/parser-1.1.0.tgz",
+ "integrity": "sha512-p2pqngR/L+ML+LS8Ah70CTITgW192fmWXxOovSapQnI5rKN6daYrbjl5UuIK9R+n0lFFlJwjW5+tA96E+V39hw==",
+ "requires": {
+ "@iiif/presentation-2": "^1.0.4",
+ "@iiif/presentation-3": "^1.1.3",
+ "@types/geojson": "^7946.0.8"
+ }
+ },
+ "@iiif/presentation-2": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/@iiif/presentation-2/-/presentation-2-1.0.4.tgz",
+ "integrity": "sha512-hJakpq62VBajesLJrYPtFm6hcn6c/HkKP7CmKZ5atuzu40m0nifWYsqigR1l9sZGvhhHb/DRshPmiW/0GNrJoA==",
+ "requires": {}
+ },
+ "@iiif/presentation-3": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/@iiif/presentation-3/-/presentation-3-1.1.3.tgz",
+ "integrity": "sha512-Ek+25nkQouo0pXAqCsWYbAeS4jLDEBQA7iul2jzgnvoJrucxDQN2lXyNLgOUDRqpTdSqJ69iz5lm6DLaxil+Nw==",
+ "requires": {
+ "@types/geojson": "^7946.0.7"
+ }
+ },
+ "@iiif/vault": {
+ "version": "0.9.19",
+ "resolved": "https://registry.npmjs.org/@iiif/vault/-/vault-0.9.19.tgz",
+ "integrity": "sha512-YoRp4waV1mGMOJaaTpzn/YnZKRnHZdbXwCt2LbCA89CZhtlTh6QUhs04KWNrGxrxnk/Wtt67/U4SyZgD10g0NQ==",
+ "requires": {
+ "@iiif/parser": "1.*",
+ "@iiif/presentation-2": "1.*",
+ "@iiif/presentation-3": "1.*",
+ "mitt": "^3.0.0",
+ "node-fetch": "^3.1.1",
+ "redux": "^4.1.2",
+ "tiny-invariant": "^1.2.0",
+ "typesafe-actions": "^5.1.0"
+ }
+ },
+ "@istanbuljs/load-nyc-config": {
+ "version": "1.1.0",
"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"
+ "requires": {
+ "camelcase": "^5.3.1",
+ "find-up": "^4.1.0",
+ "get-package-type": "^0.1.0",
+ "js-yaml": "^3.13.1",
+ "resolve-from": "^5.0.0"
},
- "engines": {
- "node": ">=10"
+ "dependencies": {
+ "argparse": {
+ "version": "1.0.10",
+ "dev": true,
+ "requires": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "camelcase": {
+ "version": "5.3.1",
+ "dev": true
+ },
+ "find-up": {
+ "version": "4.1.0",
+ "dev": true,
+ "requires": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ }
+ },
+ "js-yaml": {
+ "version": "3.14.1",
+ "dev": true,
+ "requires": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ }
+ },
+ "locate-path": {
+ "version": "5.0.0",
+ "dev": true,
+ "requires": {
+ "p-locate": "^4.1.0"
+ }
+ },
+ "p-limit": {
+ "version": "2.3.0",
+ "dev": true,
+ "requires": {
+ "p-try": "^2.0.0"
+ }
+ },
+ "p-locate": {
+ "version": "4.1.0",
+ "dev": true,
+ "requires": {
+ "p-limit": "^2.2.0"
+ }
+ }
}
},
- "node_modules/yargs-parser": {
- "version": "20.2.4",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz",
- "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==",
+ "@istanbuljs/schema": {
+ "version": "0.1.3",
+ "dev": true
+ },
+ "@jridgewell/gen-mapping": {
+ "version": "0.1.1",
"dev": true,
- "engines": {
- "node": ">=10"
+ "requires": {
+ "@jridgewell/set-array": "^1.0.0",
+ "@jridgewell/sourcemap-codec": "^1.4.10"
}
},
- "node_modules/yargs-unparser": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz",
- "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==",
+ "@jridgewell/resolve-uri": {
+ "version": "3.1.0",
+ "dev": true
+ },
+ "@jridgewell/set-array": {
+ "version": "1.1.2",
+ "dev": true
+ },
+ "@jridgewell/sourcemap-codec": {
+ "version": "1.4.14",
+ "dev": true
+ },
+ "@jridgewell/trace-mapping": {
+ "version": "0.3.14",
"dev": true,
- "dependencies": {
- "camelcase": "^6.0.0",
- "decamelize": "^4.0.0",
- "flat": "^5.0.2",
- "is-plain-obj": "^2.1.0"
- },
- "engines": {
- "node": ">=10"
+ "requires": {
+ "@jridgewell/resolve-uri": "^3.0.3",
+ "@jridgewell/sourcemap-codec": "^1.4.10"
}
},
- "node_modules/yocto-queue": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
- "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "@types/chai": {
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.3.tgz",
+ "integrity": "sha512-hC7OMnszpxhZPduX+m+nrx+uFoLkWOMiR4oa/AZF3MuSETYTZmFfJAHqZEM8MVlvfG7BEUcgvtwoCTxBp6hm3g==",
+ "dev": true
+ },
+ "@types/cookiejar": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.2.tgz",
+ "integrity": "sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog==",
+ "dev": true
+ },
+ "@types/geojson": {
+ "version": "7946.0.10",
+ "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.10.tgz",
+ "integrity": "sha512-Nmh0K3iWQJzniTuPRcJn5hxXkfB1T1pgB89SBig5PlJQU5yocazeu4jATJlaA0GYFKWMqDdvYemoSnF2pXgLVA=="
+ },
+ "@types/node": {
+ "version": "18.11.3",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.3.tgz",
+ "integrity": "sha512-fNjDQzzOsZeKZu5NATgXUPsaFaTxeRgFXoosrHivTl8RGeV733OLawXsGfEk9a8/tySyZUyiZ6E8LcjPFZ2y1A==",
+ "dev": true
+ },
+ "@types/superagent": {
+ "version": "3.8.7",
+ "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-3.8.7.tgz",
+ "integrity": "sha512-9KhCkyXv268A2nZ1Wvu7rQWM+BmdYUVkycFeNnYrUL5Zwu7o8wPQ3wBfW59dDP+wuoxw0ww8YKgTNv8j/cgscA==",
"dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "requires": {
+ "@types/cookiejar": "*",
+ "@types/node": "*"
}
- }
- },
- "dependencies": {
+ },
"@ungap/promise-all-settled": {
"version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz",
- "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==",
"dev": true
},
+ "aggregate-error": {
+ "version": "3.1.0",
+ "dev": true,
+ "requires": {
+ "clean-stack": "^2.0.0",
+ "indent-string": "^4.0.0"
+ }
+ },
"ansi-colors": {
"version": "4.1.1",
- "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
- "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
"dev": true
},
"ansi-regex": {
"version": "5.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
- "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
"dev": true
},
"ansi-styles": {
"version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"requires": {
"color-convert": "^2.0.1"
@@ -1907,59 +4830,36 @@
},
"anymatch": {
"version": "3.1.2",
- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
- "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
"dev": true,
"requires": {
"normalize-path": "^3.0.0",
"picomatch": "^2.0.4"
}
},
+ "append-transform": {
+ "version": "2.0.0",
+ "dev": true,
+ "requires": {
+ "default-require-extensions": "^3.0.0"
+ }
+ },
+ "archy": {
+ "version": "1.0.0",
+ "dev": true
+ },
"argparse": {
"version": "2.0.1",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
- "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
"dev": true
},
"assertion-error": {
"version": "1.1.0",
- "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
- "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==",
"dev": true
},
"asynckit": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
- "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
- },
- "available-typed-arrays": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz",
- "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==",
- "dev": true
- },
- "aws-sdk": {
- "version": "2.1187.0",
- "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1187.0.tgz",
- "integrity": "sha512-QcxQ3asIhH9QQnN/5JO3MaHRjwcy3/AsBzcAjPU+lHZGV0drnuDmg3ZkZuAa/mOgQ3MEi68G3gYD+481QJgnMg==",
- "dev": true,
- "requires": {
- "buffer": "4.9.2",
- "events": "1.1.1",
- "ieee754": "1.1.13",
- "jmespath": "0.16.0",
- "querystring": "0.2.0",
- "sax": "1.2.1",
- "url": "0.10.3",
- "util": "^0.12.4",
- "uuid": "8.0.0",
- "xml2js": "0.4.19"
- }
+ "version": "0.4.0"
},
"axios": {
"version": "0.27.2",
- "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz",
- "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==",
"requires": {
"follow-redirects": "^1.14.9",
"form-data": "^4.0.0"
@@ -1967,26 +4867,17 @@
},
"balanced-match": {
"version": "1.0.2",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
- "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
- "dev": true
- },
- "base64-js": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
- "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
"dev": true
},
"binary-extensions": {
"version": "2.2.0",
- "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
- "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
"dev": true
},
+ "bowser": {
+ "version": "2.11.0"
+ },
"brace-expansion": {
"version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
"dev": true,
"requires": {
"balanced-match": "^1.0.0",
@@ -1995,8 +4886,6 @@
},
"braces": {
"version": "3.0.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
- "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
"dev": true,
"requires": {
"fill-range": "^7.0.1"
@@ -2004,19 +4893,31 @@
},
"browser-stdout": {
"version": "1.3.1",
- "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
- "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
"dev": true
},
- "buffer": {
- "version": "4.9.2",
- "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz",
- "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==",
+ "browserslist": {
+ "version": "4.21.3",
"dev": true,
"requires": {
- "base64-js": "^1.0.2",
- "ieee754": "^1.1.4",
- "isarray": "^1.0.0"
+ "caniuse-lite": "^1.0.30001370",
+ "electron-to-chromium": "^1.4.202",
+ "node-releases": "^2.0.6",
+ "update-browserslist-db": "^1.0.5"
+ }
+ },
+ "buffer-equal-constant-time": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
+ "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA=="
+ },
+ "caching-transform": {
+ "version": "4.0.0",
+ "dev": true,
+ "requires": {
+ "hasha": "^5.0.0",
+ "make-dir": "^3.0.0",
+ "package-hash": "^4.0.0",
+ "write-file-atomic": "^3.0.0"
}
},
"call-bind": {
@@ -2031,14 +4932,14 @@
},
"camelcase": {
"version": "6.3.0",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
- "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
+ "dev": true
+ },
+ "caniuse-lite": {
+ "version": "1.0.30001374",
"dev": true
},
"chai": {
"version": "4.3.6",
- "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.6.tgz",
- "integrity": "sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q==",
"dev": true,
"requires": {
"assertion-error": "^1.1.0",
@@ -2050,10 +4951,23 @@
"type-detect": "^4.0.5"
}
},
+ "chai-http": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/chai-http/-/chai-http-4.3.0.tgz",
+ "integrity": "sha512-zFTxlN7HLMv+7+SPXZdkd5wUlK+KxH6Q7bIEMiEx0FK3zuuMqL7cwICAQ0V1+yYRozBburYuxN1qZstgHpFZQg==",
+ "dev": true,
+ "requires": {
+ "@types/chai": "4",
+ "@types/superagent": "^3.8.3",
+ "cookiejar": "^2.1.1",
+ "is-ip": "^2.0.0",
+ "methods": "^1.1.2",
+ "qs": "^6.5.1",
+ "superagent": "^3.7.0"
+ }
+ },
"chalk": {
"version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
"dev": true,
"requires": {
"ansi-styles": "^4.1.0",
@@ -2062,8 +4976,6 @@
"dependencies": {
"supports-color": {
"version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dev": true,
"requires": {
"has-flag": "^4.0.0"
@@ -2073,14 +4985,10 @@
},
"check-error": {
"version": "1.0.2",
- "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz",
- "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==",
"dev": true
},
"chokidar": {
"version": "3.5.3",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
- "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
"dev": true,
"requires": {
"anymatch": "~3.1.2",
@@ -2093,10 +5001,12 @@
"readdirp": "~3.6.0"
}
},
+ "clean-stack": {
+ "version": "2.2.0",
+ "dev": true
+ },
"cliui": {
"version": "7.0.4",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
- "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
"dev": true,
"requires": {
"string-width": "^4.2.0",
@@ -2106,8 +5016,6 @@
},
"color-convert": {
"version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"requires": {
"color-name": "~1.1.4"
@@ -2115,28 +5023,92 @@
},
"color-name": {
"version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true
},
"combined-stream": {
"version": "1.0.8",
- "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
- "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
"requires": {
"delayed-stream": "~1.0.0"
}
},
+ "commondir": {
+ "version": "1.0.1",
+ "dev": true
+ },
+ "component-emitter": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
+ "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==",
+ "dev": true
+ },
"concat-map": {
"version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
"dev": true
},
+ "convert-source-map": {
+ "version": "1.8.0",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "~5.1.1"
+ },
+ "dependencies": {
+ "safe-buffer": {
+ "version": "5.1.2",
+ "dev": true
+ }
+ }
+ },
+ "cookie": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
+ "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw=="
+ },
+ "cookiejar": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.3.tgz",
+ "integrity": "sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ==",
+ "dev": true
+ },
+ "core-util-is": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
+ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
+ "dev": true
+ },
+ "cross-spawn": {
+ "version": "7.0.3",
+ "dev": true,
+ "requires": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ }
+ },
+ "data-uri-to-buffer": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz",
+ "integrity": "sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA=="
+ },
+ "dc-api": {
+ "version": "file:src",
+ "requires": {
+ "@aws-crypto/sha256-browser": "^2.0.1",
+ "@aws-sdk/credential-provider-node": "^3.142.0",
+ "@aws-sdk/node-http-handler": "^3.127.0",
+ "@aws-sdk/protocol-http": "^3.127.0",
+ "@aws-sdk/signature-v4": "^3.130.0",
+ "axios": ">=0.21.1",
+ "cookie": "^0.5.0",
+ "iiif-builder": "^1.0.6",
+ "jsonwebtoken": "^8.5.1",
+ "lodash.isobject": "^3.0.2",
+ "lz-string": "^1.4.4",
+ "parse-http-header": "^1.0.1",
+ "sort-json": "^2.0.1"
+ }
+ },
"debug": {
"version": "4.3.3",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz",
- "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==",
"dev": true,
"requires": {
"ms": "2.1.2"
@@ -2144,127 +5116,110 @@
"dependencies": {
"ms": {
"version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
"dev": true
}
}
},
"decamelize": {
"version": "4.0.0",
- "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz",
- "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==",
"dev": true
},
"deep-eql": {
"version": "3.0.1",
- "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz",
- "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==",
"dev": true,
"requires": {
"type-detect": "^4.0.0"
}
},
- "define-properties": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz",
- "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==",
+ "default-require-extensions": {
+ "version": "3.0.0",
"dev": true,
"requires": {
- "has-property-descriptors": "^1.0.0",
- "object-keys": "^1.1.1"
+ "strip-bom": "^4.0.0"
}
},
"delayed-stream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
- "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="
+ "version": "1.0.0"
+ },
+ "detect-indent": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz",
+ "integrity": "sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g=="
+ },
+ "detect-newline": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz",
+ "integrity": "sha512-CwffZFvlJffUg9zZA0uqrjQayUTC8ob94pnr5sFwaVv3IOmkfUHcWH+jXaQK3askE51Cqe8/9Ql/0uXNwqZ8Zg=="
},
"diff": {
"version": "5.0.0",
- "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz",
- "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==",
+ "dev": true
+ },
+ "ecdsa-sig-formatter": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
+ "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
+ "requires": {
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "electron-to-chromium": {
+ "version": "1.4.211",
"dev": true
},
"emoji-regex": {
"version": "8.0.0",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
"dev": true
},
- "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==",
- "dev": true,
- "requires": {
- "call-bind": "^1.0.2",
- "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",
- "has-symbols": "^1.0.3",
- "internal-slot": "^1.0.3",
- "is-callable": "^1.2.4",
- "is-negative-zero": "^2.0.2",
- "is-regex": "^1.1.4",
- "is-shared-array-buffer": "^1.0.2",
- "is-string": "^1.0.7",
- "is-weakref": "^1.0.2",
- "object-inspect": "^1.12.0",
- "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"
- }
- },
- "es-to-primitive": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
- "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
- "dev": true,
- "requires": {
- "is-callable": "^1.1.4",
- "is-date-object": "^1.0.1",
- "is-symbol": "^1.0.2"
- }
+ "es6-error": {
+ "version": "4.1.1",
+ "dev": true
},
"escalade": {
"version": "3.1.1",
- "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
- "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
"dev": true
},
"escape-string-regexp": {
"version": "4.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
- "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
"dev": true
},
- "events": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz",
- "integrity": "sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==",
+ "esprima": {
+ "version": "4.0.1",
+ "dev": true
+ },
+ "extend": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
"dev": true
},
+ "fetch-blob": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz",
+ "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==",
+ "requires": {
+ "node-domexception": "^1.0.0",
+ "web-streams-polyfill": "^3.0.3"
+ }
+ },
"fill-range": {
"version": "7.0.1",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
- "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
"dev": true,
"requires": {
"to-regex-range": "^5.0.1"
}
},
+ "find-cache-dir": {
+ "version": "3.3.2",
+ "dev": true,
+ "requires": {
+ "commondir": "^1.0.1",
+ "make-dir": "^3.0.2",
+ "pkg-dir": "^4.1.0"
+ }
+ },
"find-up": {
"version": "5.0.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
- "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
"dev": true,
"requires": {
"locate-path": "^6.0.0",
@@ -2273,87 +5228,71 @@
},
"flat": {
"version": "5.0.2",
- "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz",
- "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==",
"dev": true
},
"follow-redirects": {
- "version": "1.15.1",
- "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz",
- "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA=="
+ "version": "1.15.1"
},
- "for-each": {
- "version": "0.3.3",
- "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
- "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
+ "foreground-child": {
+ "version": "2.0.0",
"dev": true,
"requires": {
- "is-callable": "^1.1.3"
+ "cross-spawn": "^7.0.0",
+ "signal-exit": "^3.0.2"
}
},
"form-data": {
"version": "4.0.0",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
- "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
"requires": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.8",
"mime-types": "^2.1.12"
}
},
+ "formdata-polyfill": {
+ "version": "4.0.10",
+ "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz",
+ "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==",
+ "requires": {
+ "fetch-blob": "^3.1.2"
+ }
+ },
+ "formidable": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.6.tgz",
+ "integrity": "sha512-KcpbcpuLNOwrEjnbpMC0gS+X8ciDoZE1kkqzat4a8vrprf+s9pKNQ/QIwWfbfs4ltgmFl3MD177SNTkve3BwGQ==",
+ "dev": true
+ },
+ "fromentries": {
+ "version": "1.3.2",
+ "dev": true
+ },
"fs.realpath": {
"version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
"dev": true
},
- "fsevents": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
- "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
- "dev": true,
- "optional": true
- },
"function-bind": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
"dev": true
},
- "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==",
- "dev": true,
- "requires": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.3",
- "es-abstract": "^1.19.0",
- "functions-have-names": "^1.2.2"
- }
- },
- "functions-have-names": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
- "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
+ "gensync": {
+ "version": "1.0.0-beta.2",
"dev": true
},
"get-caller-file": {
"version": "2.0.5",
- "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
- "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
"dev": true
},
"get-func-name": {
"version": "2.0.0",
- "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz",
- "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==",
"dev": true
},
"get-intrinsic": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz",
- "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==",
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz",
+ "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==",
"dev": true,
"requires": {
"function-bind": "^1.1.1",
@@ -2361,20 +5300,12 @@
"has-symbols": "^1.0.3"
}
},
- "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==",
- "dev": true,
- "requires": {
- "call-bind": "^1.0.2",
- "get-intrinsic": "^1.1.1"
- }
+ "get-package-type": {
+ "version": "0.1.0",
+ "dev": true
},
"glob": {
"version": "7.2.0",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
- "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
"dev": true,
"requires": {
"fs.realpath": "^1.0.0",
@@ -2387,8 +5318,6 @@
"dependencies": {
"minimatch": {
"version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
"dev": true,
"requires": {
"brace-expansion": "^1.1.7"
@@ -2398,17 +5327,21 @@
},
"glob-parent": {
"version": "5.1.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
- "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
"dev": true,
"requires": {
"is-glob": "^4.0.1"
}
},
+ "globals": {
+ "version": "11.12.0",
+ "dev": true
+ },
+ "graceful-fs": {
+ "version": "4.2.10",
+ "dev": true
+ },
"growl": {
"version": "1.10.5",
- "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz",
- "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==",
"dev": true
},
"has": {
@@ -2420,58 +5353,52 @@
"function-bind": "^1.1.1"
}
},
- "has-bigints": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz",
- "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==",
- "dev": true
- },
"has-flag": {
"version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true
},
- "has-property-descriptors": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz",
- "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==",
- "dev": true,
- "requires": {
- "get-intrinsic": "^1.1.1"
- }
- },
"has-symbols": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
"integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
"dev": true
},
- "has-tostringtag": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
- "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
+ "hasha": {
+ "version": "5.2.2",
"dev": true,
"requires": {
- "has-symbols": "^1.0.2"
+ "is-stream": "^2.0.0",
+ "type-fest": "^0.8.0"
}
},
"he": {
"version": "1.2.0",
- "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
- "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
"dev": true
},
- "ieee754": {
- "version": "1.1.13",
- "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz",
- "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==",
+ "html-escaper": {
+ "version": "2.0.2",
+ "dev": true
+ },
+ "iiif-builder": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/iiif-builder/-/iiif-builder-1.0.6.tgz",
+ "integrity": "sha512-nNmDDBmbH97Z3HxJ969OBsDaUXgM0cYDZa4/7mH6D8LdzuFHy/4cDzmRQKYdg5BztCD+Ec5fNPDgfvKekwJ/vw==",
+ "requires": {
+ "@iiif/parser": "1.x",
+ "@iiif/presentation-3": "1.x",
+ "@iiif/vault": "0.9.x || 1.x"
+ }
+ },
+ "imurmurhash": {
+ "version": "0.1.4",
+ "dev": true
+ },
+ "indent-string": {
+ "version": "4.0.0",
"dev": true
},
"inflight": {
"version": "1.0.6",
- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
- "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
"dev": true,
"requires": {
"once": "^1.3.0",
@@ -2480,236 +5407,270 @@
},
"inherits": {
"version": "2.0.4",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
"dev": true
},
- "internal-slot": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz",
- "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==",
- "dev": true,
- "requires": {
- "get-intrinsic": "^1.1.0",
- "has": "^1.0.3",
- "side-channel": "^1.0.4"
- }
- },
- "is-arguments": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz",
- "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==",
- "dev": true,
- "requires": {
- "call-bind": "^1.0.2",
- "has-tostringtag": "^1.0.0"
- }
- },
- "is-bigint": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
- "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
- "dev": true,
- "requires": {
- "has-bigints": "^1.0.1"
- }
+ "ip-regex": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz",
+ "integrity": "sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw==",
+ "dev": true
},
"is-binary-path": {
"version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
- "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
"dev": true,
"requires": {
"binary-extensions": "^2.0.0"
}
},
- "is-boolean-object": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
- "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
- "dev": true,
- "requires": {
- "call-bind": "^1.0.2",
- "has-tostringtag": "^1.0.0"
- }
- },
- "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==",
- "dev": true
- },
- "is-date-object": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
- "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
- "dev": true,
- "requires": {
- "has-tostringtag": "^1.0.0"
- }
- },
"is-extglob": {
"version": "2.1.1",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
- "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
"dev": true
},
"is-fullwidth-code-point": {
"version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
- "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
"dev": true
},
- "is-generator-function": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz",
- "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==",
- "dev": true,
- "requires": {
- "has-tostringtag": "^1.0.0"
- }
- },
"is-glob": {
"version": "4.0.3",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
- "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
"dev": true,
"requires": {
"is-extglob": "^2.1.1"
}
},
- "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==",
- "dev": true
+ "is-ip": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-ip/-/is-ip-2.0.0.tgz",
+ "integrity": "sha512-9MTn0dteHETtyUx8pxqMwg5hMBi3pvlyglJ+b79KOCca0po23337LbVV2Hl4xmMvfw++ljnO0/+5G6G+0Szh6g==",
+ "dev": true,
+ "requires": {
+ "ip-regex": "^2.0.0"
+ }
},
"is-number": {
"version": "7.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
- "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
"dev": true
},
- "is-number-object": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz",
- "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==",
- "dev": true,
- "requires": {
- "has-tostringtag": "^1.0.0"
- }
- },
"is-plain-obj": {
"version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
- "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
"dev": true
},
- "is-regex": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
- "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
+ "is-stream": {
+ "version": "2.0.1",
+ "dev": true
+ },
+ "is-typedarray": {
+ "version": "1.0.0",
+ "dev": true
+ },
+ "is-unicode-supported": {
+ "version": "0.1.0",
+ "dev": true
+ },
+ "is-windows": {
+ "version": "1.0.2",
+ "dev": true
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
+ "dev": true
+ },
+ "isexe": {
+ "version": "2.0.0",
+ "dev": true
+ },
+ "istanbul-lib-coverage": {
+ "version": "3.2.0",
+ "dev": true
+ },
+ "istanbul-lib-hook": {
+ "version": "3.0.0",
"dev": true,
"requires": {
- "call-bind": "^1.0.2",
- "has-tostringtag": "^1.0.0"
+ "append-transform": "^2.0.0"
}
},
- "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==",
+ "istanbul-lib-instrument": {
+ "version": "4.0.3",
"dev": true,
"requires": {
- "call-bind": "^1.0.2"
+ "@babel/core": "^7.7.5",
+ "@istanbuljs/schema": "^0.1.2",
+ "istanbul-lib-coverage": "^3.0.0",
+ "semver": "^6.3.0"
}
},
- "is-string": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
- "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
+ "istanbul-lib-processinfo": {
+ "version": "2.0.3",
"dev": true,
"requires": {
- "has-tostringtag": "^1.0.0"
+ "archy": "^1.0.0",
+ "cross-spawn": "^7.0.3",
+ "istanbul-lib-coverage": "^3.2.0",
+ "p-map": "^3.0.0",
+ "rimraf": "^3.0.0",
+ "uuid": "^8.3.2"
}
},
- "is-symbol": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
- "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
+ "istanbul-lib-report": {
+ "version": "3.0.0",
+ "dev": true,
+ "requires": {
+ "istanbul-lib-coverage": "^3.0.0",
+ "make-dir": "^3.0.0",
+ "supports-color": "^7.1.0"
+ },
+ "dependencies": {
+ "supports-color": {
+ "version": "7.2.0",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "istanbul-lib-source-maps": {
+ "version": "4.0.1",
"dev": true,
"requires": {
- "has-symbols": "^1.0.2"
+ "debug": "^4.1.1",
+ "istanbul-lib-coverage": "^3.0.0",
+ "source-map": "^0.6.1"
}
},
- "is-typed-array": {
- "version": "1.1.9",
- "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.9.tgz",
- "integrity": "sha512-kfrlnTTn8pZkfpJMUgYD7YZ3qzeJgWUn8XfVYBARc4wnmNOmLbmuuaAs3q5fvB0UJOn6yHAKaGTPM7d6ezoD/A==",
+ "istanbul-reports": {
+ "version": "3.1.5",
"dev": true,
"requires": {
- "available-typed-arrays": "^1.0.5",
- "call-bind": "^1.0.2",
- "es-abstract": "^1.20.0",
- "for-each": "^0.3.3",
- "has-tostringtag": "^1.0.0"
+ "html-escaper": "^2.0.0",
+ "istanbul-lib-report": "^3.0.0"
}
},
- "is-unicode-supported": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
- "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
+ "js-tokens": {
+ "version": "4.0.0",
"dev": true
},
- "is-weakref": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
- "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==",
+ "js-yaml": {
+ "version": "4.1.0",
"dev": true,
"requires": {
- "call-bind": "^1.0.2"
+ "argparse": "^2.0.1"
}
},
- "isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
+ "jsesc": {
+ "version": "2.5.2",
"dev": true
},
- "isexe": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "json-stringify-safe": {
+ "version": "5.0.1",
"dev": true
},
- "jmespath": {
- "version": "0.16.0",
- "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.16.0.tgz",
- "integrity": "sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==",
+ "json5": {
+ "version": "2.2.1",
"dev": true
},
- "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,
+ "jsonwebtoken": {
+ "version": "8.5.1",
+ "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz",
+ "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==",
"requires": {
- "argparse": "^2.0.1"
+ "jws": "^3.2.2",
+ "lodash.includes": "^4.3.0",
+ "lodash.isboolean": "^3.0.3",
+ "lodash.isinteger": "^4.0.4",
+ "lodash.isnumber": "^3.0.3",
+ "lodash.isplainobject": "^4.0.6",
+ "lodash.isstring": "^4.0.1",
+ "lodash.once": "^4.0.0",
+ "ms": "^2.1.1",
+ "semver": "^5.6.0"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
+ }
+ }
+ },
+ "jwa": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz",
+ "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==",
+ "requires": {
+ "buffer-equal-constant-time": "1.0.1",
+ "ecdsa-sig-formatter": "1.0.11",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "jws": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz",
+ "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==",
+ "requires": {
+ "jwa": "^1.4.1",
+ "safe-buffer": "^5.0.1"
}
},
"locate-path": {
"version": "6.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
- "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
"dev": true,
"requires": {
"p-locate": "^5.0.0"
}
},
+ "lodash": {
+ "version": "4.17.21",
+ "dev": true
+ },
+ "lodash.flattendeep": {
+ "version": "4.4.0",
+ "dev": true
+ },
+ "lodash.includes": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
+ "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w=="
+ },
+ "lodash.isboolean": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
+ "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg=="
+ },
+ "lodash.isinteger": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz",
+ "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA=="
+ },
+ "lodash.isnumber": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz",
+ "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw=="
+ },
+ "lodash.isobject": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-3.0.2.tgz",
+ "integrity": "sha512-3/Qptq2vr7WeJbB4KHUSKlq8Pl7ASXi3UG6CMbBm8WRtXi8+GHm7mKaU3urfpSEzWe2wCIChs6/sdocUsTKJiA=="
+ },
+ "lodash.isplainobject": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
+ "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA=="
+ },
+ "lodash.isstring": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
+ "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw=="
+ },
+ "lodash.once": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
+ "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg=="
+ },
"log-symbols": {
"version": "4.1.0",
- "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
- "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
"dev": true,
"requires": {
"chalk": "^4.1.0",
@@ -2718,39 +5679,63 @@
},
"loupe": {
"version": "2.3.4",
- "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.4.tgz",
- "integrity": "sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ==",
"dev": true,
"requires": {
"get-func-name": "^2.0.0"
}
},
+ "lz-string": {
+ "version": "1.4.4",
+ "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.4.4.tgz",
+ "integrity": "sha512-0ckx7ZHRPqb0oUm8zNr+90mtf9DQB60H1wMCjBtfi62Kl3a7JbHob6gA2bC+xRvZoOL+1hzUK8jeuEIQE8svEQ=="
+ },
+ "make-dir": {
+ "version": "3.1.0",
+ "dev": true,
+ "requires": {
+ "semver": "^6.0.0"
+ }
+ },
+ "methods": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
+ "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
+ "dev": true
+ },
+ "mime": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+ "dev": true
+ },
"mime-db": {
- "version": "1.52.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
- "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="
+ "version": "1.52.0"
},
"mime-types": {
"version": "2.1.35",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
- "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
"requires": {
"mime-db": "1.52.0"
}
},
"minimatch": {
"version": "4.2.1",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-4.2.1.tgz",
- "integrity": "sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==",
"dev": true,
"requires": {
"brace-expansion": "^1.1.7"
}
},
+ "minimist": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz",
+ "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g=="
+ },
+ "mitt": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.0.tgz",
+ "integrity": "sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ=="
+ },
"mocha": {
"version": "9.2.2",
- "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.2.tgz",
- "integrity": "sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==",
"dev": true,
"requires": {
"@ungap/promise-all-settled": "1.1.2",
@@ -2779,52 +5764,180 @@
"yargs-unparser": "2.0.0"
}
},
- "ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "dev": true
+ "ms": {
+ "version": "2.1.3"
},
"nanoid": {
"version": "3.3.1",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz",
- "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==",
+ "dev": true
+ },
+ "nock": {
+ "version": "13.2.9",
+ "dev": true,
+ "requires": {
+ "debug": "^4.1.0",
+ "json-stringify-safe": "^5.0.1",
+ "lodash": "^4.17.21",
+ "propagate": "^2.0.0"
+ }
+ },
+ "node-domexception": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz",
+ "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ=="
+ },
+ "node-fetch": {
+ "version": "3.2.10",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.2.10.tgz",
+ "integrity": "sha512-MhuzNwdURnZ1Cp4XTazr69K0BTizsBroX7Zx3UgDSVcZYKF/6p0CBe4EUb/hLqmzVhl0UpYfgRljQ4yxE+iCxA==",
+ "requires": {
+ "data-uri-to-buffer": "^4.0.0",
+ "fetch-blob": "^3.1.4",
+ "formdata-polyfill": "^4.0.10"
+ }
+ },
+ "node-preload": {
+ "version": "0.2.1",
+ "dev": true,
+ "requires": {
+ "process-on-spawn": "^1.0.0"
+ }
+ },
+ "node-releases": {
+ "version": "2.0.6",
"dev": true
},
"normalize-path": {
"version": "3.0.0",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
- "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
"dev": true
},
+ "nyc": {
+ "version": "15.1.0",
+ "dev": true,
+ "requires": {
+ "@istanbuljs/load-nyc-config": "^1.0.0",
+ "@istanbuljs/schema": "^0.1.2",
+ "caching-transform": "^4.0.0",
+ "convert-source-map": "^1.7.0",
+ "decamelize": "^1.2.0",
+ "find-cache-dir": "^3.2.0",
+ "find-up": "^4.1.0",
+ "foreground-child": "^2.0.0",
+ "get-package-type": "^0.1.0",
+ "glob": "^7.1.6",
+ "istanbul-lib-coverage": "^3.0.0",
+ "istanbul-lib-hook": "^3.0.0",
+ "istanbul-lib-instrument": "^4.0.0",
+ "istanbul-lib-processinfo": "^2.0.2",
+ "istanbul-lib-report": "^3.0.0",
+ "istanbul-lib-source-maps": "^4.0.0",
+ "istanbul-reports": "^3.0.2",
+ "make-dir": "^3.0.0",
+ "node-preload": "^0.2.1",
+ "p-map": "^3.0.0",
+ "process-on-spawn": "^1.0.0",
+ "resolve-from": "^5.0.0",
+ "rimraf": "^3.0.0",
+ "signal-exit": "^3.0.2",
+ "spawn-wrap": "^2.0.0",
+ "test-exclude": "^6.0.0",
+ "yargs": "^15.0.2"
+ },
+ "dependencies": {
+ "camelcase": {
+ "version": "5.3.1",
+ "dev": true
+ },
+ "cliui": {
+ "version": "6.0.0",
+ "dev": true,
+ "requires": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^6.2.0"
+ }
+ },
+ "decamelize": {
+ "version": "1.2.0",
+ "dev": true
+ },
+ "find-up": {
+ "version": "4.1.0",
+ "dev": true,
+ "requires": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ }
+ },
+ "locate-path": {
+ "version": "5.0.0",
+ "dev": true,
+ "requires": {
+ "p-locate": "^4.1.0"
+ }
+ },
+ "p-limit": {
+ "version": "2.3.0",
+ "dev": true,
+ "requires": {
+ "p-try": "^2.0.0"
+ }
+ },
+ "p-locate": {
+ "version": "4.1.0",
+ "dev": true,
+ "requires": {
+ "p-limit": "^2.2.0"
+ }
+ },
+ "wrap-ansi": {
+ "version": "6.2.0",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ }
+ },
+ "y18n": {
+ "version": "4.0.3",
+ "dev": true
+ },
+ "yargs": {
+ "version": "15.4.1",
+ "dev": true,
+ "requires": {
+ "cliui": "^6.0.0",
+ "decamelize": "^1.2.0",
+ "find-up": "^4.1.0",
+ "get-caller-file": "^2.0.1",
+ "require-directory": "^2.1.1",
+ "require-main-filename": "^2.0.0",
+ "set-blocking": "^2.0.0",
+ "string-width": "^4.2.0",
+ "which-module": "^2.0.0",
+ "y18n": "^4.0.0",
+ "yargs-parser": "^18.1.2"
+ }
+ },
+ "yargs-parser": {
+ "version": "18.1.3",
+ "dev": true,
+ "requires": {
+ "camelcase": "^5.0.0",
+ "decamelize": "^1.2.0"
+ }
+ }
+ }
+ },
"object-inspect": {
"version": "1.12.2",
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz",
"integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==",
"dev": true
},
- "object-keys": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
- "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
- "dev": true
- },
- "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==",
- "dev": true,
- "requires": {
- "call-bind": "^1.0.0",
- "define-properties": "^1.1.3",
- "has-symbols": "^1.0.1",
- "object-keys": "^1.1.1"
- }
- },
"once": {
"version": "1.4.0",
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
"dev": true,
"requires": {
"wrappy": "1"
@@ -2832,8 +5945,6 @@
},
"p-limit": {
"version": "3.1.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
- "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
"dev": true,
"requires": {
"yocto-queue": "^0.1.0"
@@ -2841,111 +5952,234 @@
},
"p-locate": {
"version": "5.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
- "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
"dev": true,
"requires": {
"p-limit": "^3.0.2"
}
},
+ "p-map": {
+ "version": "3.0.0",
+ "dev": true,
+ "requires": {
+ "aggregate-error": "^3.0.0"
+ }
+ },
+ "p-try": {
+ "version": "2.2.0",
+ "dev": true
+ },
+ "package-hash": {
+ "version": "4.0.0",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.15",
+ "hasha": "^5.0.0",
+ "lodash.flattendeep": "^4.4.0",
+ "release-zalgo": "^1.0.0"
+ }
+ },
+ "parse-http-header": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parse-http-header/-/parse-http-header-1.0.1.tgz",
+ "integrity": "sha512-xOoH7vzokDoenX4e3c+4ik8lf30kq9Pawq20TH5uq3RURsIJquqFTE0gS7OAEE6nvMQzuP5OXxubYuN7YLsTiw=="
+ },
"path-exists": {
"version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
- "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
"dev": true
},
"path-is-absolute": {
"version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+ "dev": true
+ },
+ "path-key": {
+ "version": "3.1.1",
"dev": true
},
"pathval": {
"version": "1.1.1",
- "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz",
- "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==",
+ "dev": true
+ },
+ "picocolors": {
+ "version": "1.0.0",
"dev": true
},
"picomatch": {
"version": "2.3.1",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
- "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
"dev": true
},
+ "pkg-dir": {
+ "version": "4.2.0",
+ "dev": true,
+ "requires": {
+ "find-up": "^4.0.0"
+ },
+ "dependencies": {
+ "find-up": {
+ "version": "4.1.0",
+ "dev": true,
+ "requires": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ }
+ },
+ "locate-path": {
+ "version": "5.0.0",
+ "dev": true,
+ "requires": {
+ "p-locate": "^4.1.0"
+ }
+ },
+ "p-limit": {
+ "version": "2.3.0",
+ "dev": true,
+ "requires": {
+ "p-try": "^2.0.0"
+ }
+ },
+ "p-locate": {
+ "version": "4.1.0",
+ "dev": true,
+ "requires": {
+ "p-limit": "^2.2.0"
+ }
+ }
+ }
+ },
"prettier": {
"version": "2.7.1",
- "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz",
- "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==",
"dev": true
},
- "punycode": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
- "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==",
+ "process-nextick-args": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
"dev": true
},
- "querystring": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
- "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==",
+ "process-on-spawn": {
+ "version": "1.0.0",
+ "dev": true,
+ "requires": {
+ "fromentries": "^1.2.0"
+ }
+ },
+ "propagate": {
+ "version": "2.0.1",
"dev": true
},
+ "qs": {
+ "version": "6.11.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
+ "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
+ "dev": true,
+ "requires": {
+ "side-channel": "^1.0.4"
+ }
+ },
"randombytes": {
"version": "2.1.0",
- "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
- "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
"dev": true,
"requires": {
"safe-buffer": "^5.1.0"
}
},
+ "readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "dev": true,
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ },
+ "dependencies": {
+ "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==",
+ "dev": true
+ }
+ }
+ },
"readdirp": {
"version": "3.6.0",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
- "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
"dev": true,
"requires": {
"picomatch": "^2.2.1"
}
},
- "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==",
+ "redux": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.0.tgz",
+ "integrity": "sha512-oSBmcKKIuIR4ME29/AeNUnl5L+hvBq7OaJWzaptTQJAntaPvxIJqfnjbaEiCzzaIz+XmVILfqAM3Ob0aXLPfjA==",
+ "requires": {
+ "@babel/runtime": "^7.9.2"
+ }
+ },
+ "regenerator-runtime": {
+ "version": "0.13.10",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz",
+ "integrity": "sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw=="
+ },
+ "release-zalgo": {
+ "version": "1.0.0",
"dev": true,
"requires": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.3",
- "functions-have-names": "^1.2.2"
+ "es6-error": "^4.0.1"
}
},
"require-directory": {
"version": "2.1.1",
- "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
- "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
"dev": true
},
- "safe-buffer": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
- "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "require-main-filename": {
+ "version": "2.0.0",
+ "dev": true
+ },
+ "resolve-from": {
+ "version": "5.0.0",
"dev": true
},
- "sax": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz",
- "integrity": "sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==",
+ "rimraf": {
+ "version": "3.0.2",
+ "dev": true,
+ "requires": {
+ "glob": "^7.1.3"
+ }
+ },
+ "safe-buffer": {
+ "version": "5.2.1"
+ },
+ "semver": {
+ "version": "6.3.0",
"dev": true
},
"serialize-javascript": {
"version": "6.0.0",
- "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz",
- "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==",
"dev": true,
"requires": {
"randombytes": "^2.1.0"
}
},
+ "set-blocking": {
+ "version": "2.0.0",
+ "dev": true
+ },
+ "shebang-command": {
+ "version": "2.0.0",
+ "dev": true,
+ "requires": {
+ "shebang-regex": "^3.0.0"
+ }
+ },
+ "shebang-regex": {
+ "version": "3.0.0",
+ "dev": true
+ },
"side-channel": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
@@ -2957,166 +6191,224 @@
"object-inspect": "^1.9.0"
}
},
- "string-width": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
- "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "signal-exit": {
+ "version": "3.0.7",
+ "dev": true
+ },
+ "sort-json": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/sort-json/-/sort-json-2.0.1.tgz",
+ "integrity": "sha512-s8cs2bcsQCzo/P2T/uoU6Js4dS/jnX8+4xunziNoq9qmSpZNCrRIAIvp4avsz0ST18HycV4z/7myJ7jsHWB2XQ==",
+ "requires": {
+ "detect-indent": "^5.0.0",
+ "detect-newline": "^2.1.0",
+ "minimist": "^1.2.0"
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "dev": true
+ },
+ "spawn-wrap": {
+ "version": "2.0.0",
"dev": true,
"requires": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.1"
+ "foreground-child": "^2.0.0",
+ "is-windows": "^1.0.2",
+ "make-dir": "^3.0.0",
+ "rimraf": "^3.0.0",
+ "signal-exit": "^3.0.2",
+ "which": "^2.0.1"
}
},
- "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==",
+ "sprintf-js": {
+ "version": "1.0.3",
+ "dev": true
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
"dev": true,
"requires": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.4",
- "es-abstract": "^1.19.5"
+ "safe-buffer": "~5.1.0"
+ },
+ "dependencies": {
+ "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==",
+ "dev": true
+ }
}
},
- "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==",
+ "string-width": {
+ "version": "4.2.3",
"dev": true,
"requires": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.4",
- "es-abstract": "^1.19.5"
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
}
},
"strip-ansi": {
"version": "6.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
- "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
"dev": true,
"requires": {
"ansi-regex": "^5.0.1"
}
},
+ "strip-bom": {
+ "version": "4.0.0",
+ "dev": true
+ },
"strip-json-comments": {
"version": "3.1.1",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
- "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
"dev": true
},
+ "superagent": {
+ "version": "3.8.3",
+ "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.3.tgz",
+ "integrity": "sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA==",
+ "dev": true,
+ "requires": {
+ "component-emitter": "^1.2.0",
+ "cookiejar": "^2.1.0",
+ "debug": "^3.1.0",
+ "extend": "^3.0.0",
+ "form-data": "^2.3.1",
+ "formidable": "^1.2.0",
+ "methods": "^1.1.1",
+ "mime": "^1.4.1",
+ "qs": "^6.5.1",
+ "readable-stream": "^2.3.5"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
+ "requires": {
+ "ms": "^2.1.1"
+ }
+ },
+ "form-data": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz",
+ "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==",
+ "dev": true,
+ "requires": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.6",
+ "mime-types": "^2.1.12"
+ }
+ }
+ }
+ },
"supports-color": {
"version": "8.1.1",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
- "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
"dev": true,
"requires": {
"has-flag": "^4.0.0"
}
},
+ "test-exclude": {
+ "version": "6.0.0",
+ "dev": true,
+ "requires": {
+ "@istanbuljs/schema": "^0.1.2",
+ "glob": "^7.1.4",
+ "minimatch": "^3.0.4"
+ },
+ "dependencies": {
+ "minimatch": {
+ "version": "3.1.2",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "^1.1.7"
+ }
+ }
+ }
+ },
+ "tiny-invariant": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz",
+ "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw=="
+ },
+ "to-fast-properties": {
+ "version": "2.0.0",
+ "dev": true
+ },
"to-regex-range": {
"version": "5.0.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
- "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
"dev": true,
"requires": {
"is-number": "^7.0.0"
}
},
+ "tslib": {
+ "version": "2.4.0"
+ },
"type-detect": {
"version": "4.0.8",
- "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
- "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
"dev": true
},
- "unbox-primitive": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz",
- "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==",
- "dev": true,
- "requires": {
- "call-bind": "^1.0.2",
- "has-bigints": "^1.0.2",
- "has-symbols": "^1.0.3",
- "which-boxed-primitive": "^1.0.2"
- }
+ "type-fest": {
+ "version": "0.8.1",
+ "dev": true
},
- "url": {
- "version": "0.10.3",
- "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz",
- "integrity": "sha512-hzSUW2q06EqL1gKM/a+obYHLIO6ct2hwPuviqTTOcfFVc61UbfJ2Q32+uGL/HCPxKqrdGB5QUwIe7UqlDgwsOQ==",
+ "typedarray-to-buffer": {
+ "version": "3.1.5",
"dev": true,
"requires": {
- "punycode": "1.3.2",
- "querystring": "0.2.0"
+ "is-typedarray": "^1.0.0"
}
},
- "util": {
- "version": "0.12.4",
- "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz",
- "integrity": "sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==",
+ "typesafe-actions": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/typesafe-actions/-/typesafe-actions-5.1.0.tgz",
+ "integrity": "sha512-bna6Yi1pRznoo6Bz1cE6btB/Yy8Xywytyfrzu/wc+NFW3ZF0I+2iCGImhBsoYYCOWuICtRO4yHcnDlzgo1AdNg=="
+ },
+ "update-browserslist-db": {
+ "version": "1.0.5",
"dev": true,
"requires": {
- "inherits": "^2.0.3",
- "is-arguments": "^1.0.4",
- "is-generator-function": "^1.0.7",
- "is-typed-array": "^1.1.3",
- "safe-buffer": "^5.1.2",
- "which-typed-array": "^1.1.2"
+ "escalade": "^3.1.1",
+ "picocolors": "^1.0.0"
}
},
- "uuid": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.0.0.tgz",
- "integrity": "sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==",
+ "util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
"dev": true
},
+ "uuid": {
+ "version": "8.3.2"
+ },
+ "web-streams-polyfill": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz",
+ "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q=="
+ },
"which": {
"version": "2.0.2",
- "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
- "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
"dev": true,
"requires": {
"isexe": "^2.0.0"
}
},
- "which-boxed-primitive": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
- "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
- "dev": true,
- "requires": {
- "is-bigint": "^1.0.1",
- "is-boolean-object": "^1.1.0",
- "is-number-object": "^1.0.4",
- "is-string": "^1.0.5",
- "is-symbol": "^1.0.3"
- }
- },
- "which-typed-array": {
- "version": "1.1.8",
- "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.8.tgz",
- "integrity": "sha512-Jn4e5PItbcAHyLoRDwvPj1ypu27DJbtdYXUa5zsinrUx77Uvfb0cXwwnGMTn7cjUfhhqgVQnVJCwF+7cgU7tpw==",
- "dev": true,
- "requires": {
- "available-typed-arrays": "^1.0.5",
- "call-bind": "^1.0.2",
- "es-abstract": "^1.20.0",
- "for-each": "^0.3.3",
- "has-tostringtag": "^1.0.0",
- "is-typed-array": "^1.1.9"
- }
+ "which-module": {
+ "version": "2.0.0",
+ "dev": true
},
"workerpool": {
"version": "6.2.0",
- "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.0.tgz",
- "integrity": "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==",
"dev": true
},
"wrap-ansi": {
"version": "7.0.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
- "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
"dev": true,
"requires": {
"ansi-styles": "^4.0.0",
@@ -3126,36 +6418,24 @@
},
"wrappy": {
"version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
"dev": true
},
- "xml2js": {
- "version": "0.4.19",
- "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz",
- "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==",
+ "write-file-atomic": {
+ "version": "3.0.3",
"dev": true,
"requires": {
- "sax": ">=0.6.0",
- "xmlbuilder": "~9.0.1"
+ "imurmurhash": "^0.1.4",
+ "is-typedarray": "^1.0.0",
+ "signal-exit": "^3.0.2",
+ "typedarray-to-buffer": "^3.1.5"
}
},
- "xmlbuilder": {
- "version": "9.0.7",
- "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz",
- "integrity": "sha512-7YXTQc3P2l9+0rjaUbLwMKRhtmwg1M1eDf6nag7urC7pIPYLD9W/jmzQ4ptRSUbodw5S0jfoGTflLemQibSpeQ==",
- "dev": true
- },
"y18n": {
"version": "5.0.8",
- "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
- "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
"dev": true
},
"yargs": {
"version": "16.2.0",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
- "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
"dev": true,
"requires": {
"cliui": "^7.0.2",
@@ -3169,14 +6449,10 @@
},
"yargs-parser": {
"version": "20.2.4",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz",
- "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==",
"dev": true
},
"yargs-unparser": {
"version": "2.0.0",
- "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz",
- "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==",
"dev": true,
"requires": {
"camelcase": "^6.0.0",
@@ -3187,8 +6463,6 @@
},
"yocto-queue": {
"version": "0.1.0",
- "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
- "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
"dev": true
}
}
diff --git a/package.json b/package.json
index 5b109f67..8e37829d 100644
--- a/package.json
+++ b/package.json
@@ -1,21 +1,26 @@
{
- "name": "hello_world",
- "version": "1.0.0",
- "description": "hello world sample for NodeJS",
- "main": "hello.js",
- "repository": "https://github.com/awslabs/aws-sam-cli/tree/develop/samcli/local/init/templates/cookiecutter-aws-sam-hello-nodejs",
- "author": "SAM CLI",
- "license": "MIT",
+ "name": "dc-api-build",
+ "version": "2.0.0pre",
+ "description": "NUL Digital Collections API Build Environment",
+ "repository": "https://github.com/nulib/dc-api-v2",
+ "author": "nulib",
+ "license": "Apache-2.0",
"dependencies": {
- "axios": ">=0.21.1"
+ "dc-api": "file:./src"
},
"scripts": {
- "test": "mocha tests/unit/"
+ "preinstall": "cd src && npm i && cd -",
+ "prettier": "prettier -c src test",
+ "prettier:fix": "prettier -cw src test",
+ "test": "mocha",
+ "test:coverage": "nyc npm test"
},
"devDependencies": {
- "aws-sdk": "^2.1187.0",
"chai": "^4.2.0",
+ "chai-http": "^4.3.0",
"mocha": "^9.1.4",
+ "nock": "^13.2.9",
+ "nyc": "^15.1.0",
"prettier": "^2.7.1"
}
}
\ No newline at end of file
diff --git a/redirect/index.js b/redirect/index.js
new file mode 100644
index 00000000..ca667b76
--- /dev/null
+++ b/redirect/index.js
@@ -0,0 +1,12 @@
+exports.handler = async () => {
+ const target = process.env.REDIRECT_TO;
+
+ return {
+ statusCode: 302,
+ headers: {
+ "content-type": "text/html",
+ location: target
+ },
+ body: `Redirecting to API Documentation
`
+ }
+}
diff --git a/src/api/opensearch.js b/src/api/opensearch.js
index 82c81e57..22ea4cc7 100644
--- a/src/api/opensearch.js
+++ b/src/api/opensearch.js
@@ -1,35 +1,29 @@
-const AWS = require("aws-sdk");
+const { HttpRequest } = require("@aws-sdk/protocol-http");
const { awsFetch } = require("../aws/fetch");
-const { prefix } = require("../aws/environment");
+const { elasticsearchEndpoint, prefix } = require("../aws/environment");
-const elasticsearchEndpoint = process.env.ELASTICSEARCH_ENDPOINT;
-const region = process.env.AWS_REGION || "us-east-1";
-
-async function getCollection(id) {
- return getDocument("dc-v2-collection", id);
+async function getCollection(id, opts) {
+ return getDocument("dc-v2-collection", id, opts);
}
-async function getFileSet(id) {
- return getDocument("dc-v2-file-set", id);
+async function getFileSet(id, opts) {
+ return getDocument("dc-v2-file-set", id, opts);
}
-async function getWork(id) {
- return getDocument("dc-v2-work", id);
+async function getWork(id, opts) {
+ return getDocument("dc-v2-work", id, opts);
}
-async function getDocument(index, id) {
- const endpoint = new AWS.Endpoint(elasticsearchEndpoint);
- const request = new AWS.HttpRequest(endpoint, region);
-
- request.method = "GET";
- request.path += prefix(index) + `/_doc/${id}`;
- request.headers["host"] = elasticsearchEndpoint;
- request.headers["Content-Type"] = "application/json";
+async function getSharedLink(id, opts) {
+ return getDocument("shared_links", id, opts);
+}
+async function getDocument(index, id, opts = {}) {
+ const request = initRequest(`/${prefix(index)}/_doc/${id}`);
let response = await awsFetch(request);
if (response.statusCode === 200) {
const body = JSON.parse(response.body);
- if (!isVisible(body)) {
+ if (index != "shared_links" && !isVisible(body, opts)) {
let responseBody = {
_index: prefix(index),
_type: "_doc",
@@ -46,25 +40,43 @@ async function getDocument(index, id) {
return response;
}
-function isVisible(doc) {
- if (doc?._source.api_model == "FileSet") {
- return doc?._source?.visibility !== "Private";
- } else {
- return doc?._source?.published && doc?._source?.visibility !== "Private";
- }
+function isVisible(doc, { allowPrivate, allowUnpublished }) {
+ if (!doc?.found) return false;
+ const isAllowedVisibility =
+ allowPrivate || doc?._source.visibility !== "Private";
+ const isAllowedPublished = allowUnpublished || doc?._source.published;
+ return isAllowedVisibility && isAllowedPublished;
+}
+
+function initRequest(path) {
+ const endpoint = elasticsearchEndpoint();
+
+ return new HttpRequest({
+ method: "GET",
+ hostname: endpoint,
+ headers: {
+ Host: endpoint,
+ "Content-Type": "application/json",
+ },
+ path: path,
+ });
}
async function search(targets, body) {
- const endpoint = new AWS.Endpoint(elasticsearchEndpoint);
- const request = new AWS.HttpRequest(endpoint, region);
+ const endpoint = elasticsearchEndpoint();
- request.method = "POST";
- request.body = body;
- request.path += `${targets}/_search`;
- request.headers["host"] = elasticsearchEndpoint;
- request.headers["Content-Type"] = "application/json";
+ const request = new HttpRequest({
+ method: "POST",
+ hostname: endpoint,
+ headers: {
+ Host: endpoint,
+ "Content-Type": "application/json",
+ },
+ body: body,
+ path: `/${targets}/_search`,
+ });
return await awsFetch(request);
}
-module.exports = { getCollection, getFileSet, getWork, search };
+module.exports = { getCollection, getFileSet, getSharedLink, getWork, search };
diff --git a/src/api/pagination.js b/src/api/pagination.js
new file mode 100644
index 00000000..1ac351d2
--- /dev/null
+++ b/src/api/pagination.js
@@ -0,0 +1,106 @@
+const {
+ decompressFromEncodedURIComponent: decompress,
+ compressToEncodedURIComponent: compress,
+} = require("lz-string");
+
+const encodeFields = ["query", "size", "sort", "fields", "_source"];
+
+async function decodeSearchToken(token) {
+ return JSON.parse(await decompress(token));
+}
+
+async function encodeSearchToken(models, body, format, options) {
+ let token = { body: { size: 10 }, models, format, options };
+ for (const field in body) {
+ if (encodeFields.includes(field)) {
+ token.body[field] = body[field];
+ }
+ }
+ return await compress(JSON.stringify(token));
+}
+
+function from(body) {
+ return body?.from || 0;
+}
+
+function size(body) {
+ return body?.size || 10;
+}
+
+function maxPage(body, count) {
+ return Math.ceil(count / size(body));
+}
+
+function nextPage(body, count) {
+ const current = thisPage(body);
+ return maxPage(body, count) > current ? current + 1 : null;
+}
+
+function prevPage(body, _count) {
+ return body.from > 0 ? thisPage(body) - 1 : null;
+}
+
+function thisPage(body) {
+ return Math.floor(from(body) / size(body) + 1);
+}
+
+class Paginator {
+ constructor(baseUrl, route, models, body, format, options) {
+ this.baseUrl = baseUrl;
+ this.route = route;
+ this.models = models;
+ this.body = { ...body };
+ this.format = format;
+ this.options = options;
+ }
+
+ async pageInfo(count) {
+ let url = new URL(this.route, this.baseUrl);
+ if (this.options?.includeToken != false) {
+ url.searchParams.set(
+ "searchToken",
+ await encodeSearchToken(
+ this.models,
+ this.body,
+ this.format,
+ this.options
+ )
+ );
+ }
+
+ const queryStringParameters =
+ this.options?.parameterOverrides || this.options?.queryStringParameters;
+ if (typeof queryStringParameters === "object") {
+ for (const param in queryStringParameters) {
+ url.searchParams.set(param, queryStringParameters[param]);
+ }
+ }
+
+ const prev = prevPage(this.body, count);
+ const next = nextPage(this.body, count);
+ url.searchParams.delete("from");
+
+ let result = {
+ query_url: url.toString(),
+ current_page: thisPage(this.body),
+ limit: size(this.body),
+ offset: from(this.body),
+ total_hits: count,
+ total_pages: maxPage(this.body, count),
+ options: this.options,
+ format: this.format,
+ };
+ if (prev) {
+ url.searchParams.set("page", prev);
+ result.prev_url = url.toString();
+ }
+ if (next) {
+ url.searchParams.set("page", next);
+ result.next_url = url.toString();
+ }
+
+ return result;
+ }
+}
+
+module.exports = { decodeSearchToken, encodeSearchToken, Paginator };
diff --git a/src/api/request/models.js b/src/api/request/models.js
new file mode 100644
index 00000000..e2a91e73
--- /dev/null
+++ b/src/api/request/models.js
@@ -0,0 +1,28 @@
+const { prefix } = require("../../aws/environment");
+
+const mapTargets = {
+ works: "dc-v2-work",
+ "file-sets": "dc-v2-file-set",
+ collections: "dc-v2-collection",
+};
+
+function extractRequestedModels(requestedModels) {
+ return requestedModels == null ? ["works"] : requestedModels.split(",");
+}
+
+function validModels(models, format) {
+ if (format === "iiif") {
+ return models.length == 1 && models.every((model) => model === "works");
+ }
+ return models.every(isAllowed);
+}
+
+function isAllowed(model) {
+ return mapTargets.hasOwnProperty(model);
+}
+
+function modelsToTargets(models) {
+ return String(models.map((model) => prefix(mapTargets[model])));
+}
+
+module.exports = { extractRequestedModels, modelsToTargets, validModels };
diff --git a/src/api/request/pipeline.js b/src/api/request/pipeline.js
index 187da6ad..691b2c1e 100644
--- a/src/api/request/pipeline.js
+++ b/src/api/request/pipeline.js
@@ -1,28 +1,38 @@
+const { isFromReadingRoom } = require("../../helpers");
+const sortJson = require("sort-json");
+
+function filterFor(query, event) {
+ const matchTheQuery = query;
+ const beUnpublished = { term: { published: false } };
+ const beRestricted = { term: { visibility: "Private" } };
+
+ const filter = isFromReadingRoom(event)
+ ? { must: [matchTheQuery], must_not: [beUnpublished] }
+ : { must: [matchTheQuery], must_not: [beUnpublished, beRestricted] };
+
+ return { bool: filter };
+}
+
module.exports = class RequestPipeline {
- constructor(body) {
- this.body = JSON.parse(body);
+ constructor(searchContext) {
+ this.searchContext = { ...searchContext };
+ if (!this.searchContext.size) this.searchContext.size = 10;
+ if (!this.searchContext.from) this.searchContext.from = 0;
}
// Things tranformer needs to do:
// - not allow unpuplished or restricted items
// - Reading room/IP (not in first iteration)
- // - Add `track_total_hits` to body of search (so we can get accurate hits.total.value)
-
- authFilter() {
- const matchTheQuery = this.body.query || { match_all: {} };
- const beUnpublished = { term: { published: false } };
- const beRestricted = { term: { visibility: "Private" } };
-
- this.body.query = {
- bool: {
- must: [matchTheQuery],
- must_not: [beUnpublished, beRestricted],
- },
- };
+ // - Add `track_total_hits` to search context (so we can get accurate hits.total.value)
+
+ authFilter(event) {
+ this.searchContext.query = filterFor(this.searchContext.query, event);
+ this.searchContext.track_total_hits = true;
+
return this;
}
toJson() {
- return JSON.stringify(this.body);
+ return JSON.stringify(sortJson(this.searchContext));
}
};
diff --git a/src/api/response/iiif/collection.js b/src/api/response/iiif/collection.js
new file mode 100644
index 00000000..2d7a8bee
--- /dev/null
+++ b/src/api/response/iiif/collection.js
@@ -0,0 +1,153 @@
+const { dcApiEndpoint, dcUrl } = require("../../../aws/environment");
+
+async function transform(response, pager) {
+ if (response.statusCode === 200) {
+ const responseBody = JSON.parse(response.body);
+ const pageInfo = await pager.pageInfo(responseBody.hits.total.value);
+
+ return {
+ statusCode: 200,
+ headers: {
+ "content-type": "application/json",
+ },
+ body: JSON.stringify(await buildCollection(responseBody, pageInfo)),
+ };
+ }
+ return transformError(response);
+}
+
+async function buildCollection(responseBody, pageInfo) {
+ const {
+ options: {
+ queryStringParameters: {
+ collectionLabel = "IIIF Collection",
+ collectionSummary = "",
+ },
+ },
+ } = pageInfo;
+
+ result = {
+ "@context": ["http://iiif.io/api/presentation/3/context.json"],
+ id: collectionId(pageInfo),
+ type: "Collection",
+ label: { none: [collectionLabel] },
+ summary: { none: [collectionSummary] },
+ homepage: [
+ {
+ id: homepageUrl(pageInfo),
+ type: "Text",
+ format: "text/html",
+ label: {
+ none: [collectionLabel],
+ },
+ },
+ ],
+
+ items: getItems(responseBody?.hits?.hits, pageInfo),
+ };
+
+ if (pageInfo.options?.parameterOverrides) {
+ const collectionId = new URL(pageInfo.query_url).pathname
+ .split("/")
+ .reverse()[0];
+ const thumbnailId = `${dcApiEndpoint()}/collections/${collectionId}/thumbnail`;
+ result.thumbnail = [
+ {
+ id: thumbnailId,
+ type: "Image",
+ format: "image/jpeg",
+ width: 400,
+ height: 400,
+ },
+ ];
+ }
+
+ return result;
+}
+
+function getItems(hits, pageInfo) {
+ const items = hits.map((item) => loadItem(item["_source"]));
+
+ if (pageInfo?.next_url) {
+ items.push({
+ id: pageInfo.next_url,
+ type: "Collection",
+ label: {
+ none: ["Next page"],
+ },
+ });
+ }
+
+ return items;
+}
+
+function collectionId(pageInfo) {
+ let collectionId = new URL(pageInfo.query_url);
+ if (pageInfo.current_page > 1) {
+ collectionId.searchParams.set("page", pageInfo.current_page);
+ }
+ return collectionId;
+}
+
+function homepageUrl(pageInfo) {
+ let result;
+
+ if (pageInfo.options?.parameterOverrides) {
+ const collectionId = new URL(pageInfo.query_url).pathname
+ .split("/")
+ .reverse()[0];
+ result = new URL(`/collections/${collectionId}`, dcUrl());
+ } else {
+ result = new URL("/search", dcUrl());
+ if (pageInfo.options?.queryStringParameters?.query)
+ result.searchParams.set(
+ "q",
+ pageInfo.options.queryStringParameters.query
+ );
+ }
+
+ return result;
+}
+
+function loadItem(item) {
+ return {
+ id: item.iiif_manifest,
+ type: "Manifest",
+ homepage: [
+ {
+ id: new URL(`/items/${item.id}`, dcUrl()),
+ type: "Text",
+ format: "text/html",
+ label: {
+ none: [`${item.title}`],
+ },
+ },
+ ],
+ label: {
+ none: [`${item.title}`],
+ },
+ summary: {
+ none: [`${item.work_type}`],
+ },
+ thumbnail: [
+ {
+ id: item.thumbnail,
+ format: "image/jpeg",
+ type: "Image",
+ width: 400,
+ height: 400,
+ },
+ ],
+ };
+}
+
+function transformError(response) {
+ const responseBody = { status: response.statusCode, error: "TODO" };
+
+ return {
+ statusCode: response.statusCode,
+ body: JSON.stringify(responseBody),
+ };
+}
+
+module.exports = { transform };
diff --git a/src/api/response/iiif/manifest.js b/src/api/response/iiif/manifest.js
new file mode 100644
index 00000000..e051f121
--- /dev/null
+++ b/src/api/response/iiif/manifest.js
@@ -0,0 +1,261 @@
+const { IIIFBuilder } = require("iiif-builder");
+const { dcApiEndpoint, dcUrl } = require("../../../aws/environment");
+const {
+ buildAnnotationBody,
+ buildImageResourceId,
+ buildImageService,
+ isAudioVideo,
+ isImage,
+} = require("./presentation-api/items");
+const { metadataLabelFields } = require("./presentation-api/metadata");
+
+function transform(response) {
+ if (response.statusCode === 200) {
+ const builder = new IIIFBuilder();
+ const openSearchResponse = JSON.parse(response.body);
+ const source = openSearchResponse._source;
+
+ const manifestId = `${dcApiEndpoint()}/works/${source.id}?as=iiif`;
+
+ const annotationsToTagOnAtEnd = [];
+
+ const normalizedFlatManifestObj = builder.createManifest(
+ manifestId,
+ (manifest) => {
+ function buildCanvasFromFileSet(fileSet, index, isAuxiliary) {
+ const canvasId = `${manifestId}/canvas/${fileSet.role.toLowerCase()}/${index}`;
+ manifest.createCanvas(canvasId, (canvas) => {
+ if (isAudioVideo(source.work_type))
+ canvas.duration = fileSet.duration || 1;
+
+ canvas.height = fileSet.height || 100;
+ canvas.width = fileSet.width || 100;
+
+ canvas.addLabel(fileSet.label, "none");
+
+ /** Add thumbnail for Canvas */
+ if (fileSet.representative_image_url) {
+ const canvasThumbnail = {
+ id: buildImageResourceId(fileSet.representative_image_url),
+ type: "Image",
+ width: 300,
+ height: 300,
+ format: "image/jpeg",
+ service: buildImageService(fileSet.representative_image_url),
+ };
+ canvas.addThumbnail(canvasThumbnail);
+ }
+
+ const annotationId = `${canvasId}/annotation/0`;
+ canvas.createAnnotation(annotationId, {
+ id: annotationId,
+ type: "Annotation",
+ motivation: "painting",
+ body: buildAnnotationBody(
+ fileSet,
+ isAuxiliary ? "Image" : source.work_type
+ ),
+ });
+
+ if (!isAuxiliary && fileSet.webvtt) {
+ const annotations = {
+ id: `${canvasId}/annotations/page/0`,
+ type: "AnnotationPage",
+ items: [
+ {
+ id: `${canvasId}/annotations/page/0/a0`,
+ type: "Annotation",
+ motivation: "supplementing",
+ body: {
+ id: fileSet.webvtt,
+ type: "Text",
+ format: "text/vtt",
+ label: {
+ en: ["Chapters"],
+ },
+ language: "none",
+ },
+ target: canvasId,
+ },
+ ],
+ };
+ annotationsToTagOnAtEnd.push(annotations);
+ }
+ });
+ }
+
+ /** Build out manifest descriptive properties */
+ manifest.addLabel(source.title, "none");
+ source.description.length > 0 &&
+ manifest.addSummary(source.description, "none");
+
+ /** Build metadata property */
+ metadataLabelFields(source).forEach((item) => {
+ if (item.value && item.value.length > 0) {
+ manifest.addMetadata({ none: [item.label] }, { none: item.value });
+ }
+ });
+
+ /** Add required statement */
+ let requiredStatement = [
+ "Courtesy of Northwestern University Libraries",
+ ];
+ manifest.setRequiredStatement({
+ label: { none: ["Attribution"] },
+ value: {
+ none: source.terms_of_use
+ ? requiredStatement.concat(source.terms_of_use)
+ : requiredStatement,
+ },
+ });
+
+ /** Add rights using rights statement */
+ source.rights_statement?.id &&
+ manifest.setRights(source.rights_statement.id);
+
+ /** Add thumbnail */
+ const thumbnail = {
+ id: source.thumbnail,
+ type: "Image",
+ width: 300,
+ height: 300,
+ format: "image/jpeg",
+ };
+ manifest.addThumbnail(thumbnail);
+
+ /** Add seeAlso reference for api_link */
+ const seeAlso = {
+ id: source.api_link,
+ type: "Dataset",
+ format: "application/json",
+ label: {
+ none: ["Northwestern University Libraries Digital Collections API"],
+ },
+ };
+ manifest.addSeeAlso(seeAlso);
+
+ /** Add homepage */
+ const homepage = {
+ id: `${dcUrl()}/items/${source.id}`,
+ type: "Text",
+ format: "text/html",
+ label: {
+ none: [
+ "Homepage at Northwestern University Libraries Digital Collections",
+ ],
+ },
+ };
+ manifest.setHomepage(homepage);
+
+ /** Add partOf */
+ const collectionEndpoint = `${dcApiEndpoint()}/collections/${
+ source.collection.id
+ }`;
+ manifest.setPartOf([
+ {
+ id: `${collectionEndpoint}?as=iiif`,
+ type: "Collection",
+ label: { none: [source.collection.title] },
+ ...(source.collection.description && {
+ summary: {
+ none: [source.collection.description],
+ },
+ }),
+
+ /**
+ * TODO: iiif-builder mangles this property, come back to it
+ */
+ // thumbnail: [
+ // {
+ // id: `${collectionEndpoint}/thumbnail`,
+ // type: "Image",
+ // width: 300,
+ // height: 300,
+ // format: "image/jpeg",
+ // },
+ // ],
+
+ /**
+ * TODO: iiif-builder cleanses this property and doesn't include it.
+ * Come back to it.
+ */
+ homepage: [
+ {
+ id: `${dcUrl()}/collections/${source.collection.id}`,
+ type: "Text",
+ format: "text/html",
+ label: {
+ none: [
+ "Homepage at Northwestern University Libraries Digital Collections",
+ ],
+ },
+ },
+ ],
+ },
+ ]);
+
+ /** Add logo */
+
+ /** Add provider */
+
+ /** Add items (Canvases) from a Work's Filesets */
+ source.file_sets
+ .filter((fileSet) => fileSet.role === "Access")
+ .forEach((fileSet, index) => {
+ buildCanvasFromFileSet(fileSet, index);
+ });
+
+ source.file_sets
+ .filter((fileSet) => fileSet.role === "Auxiliary")
+ .forEach((fileSet, index) => {
+ buildCanvasFromFileSet(fileSet, index, true);
+ });
+ }
+ );
+
+ const jsonManifest = builder.toPresentation3({
+ id: normalizedFlatManifestObj.id,
+ type: "Manifest",
+ });
+
+ /**
+ * Workaround to add webVTT annotations
+ * (iiif-builder package currently doesn't support it)
+ */
+
+ annotationsToTagOnAtEnd.forEach((a) => {
+ const matched = jsonManifest.items.find(
+ (canvas) => canvas.id === a.items[0].target
+ );
+
+ if (matched) {
+ matched.annotations = [a];
+ }
+ });
+
+ return {
+ statusCode: 200,
+ headers: {
+ "content-type": "application/json",
+ },
+ body: JSON.stringify({
+ ...jsonManifest,
+ }),
+ };
+ }
+ return transformError(response);
+}
+
+function transformError(response) {
+ const responseBody = {
+ status: response.statusCode,
+ error: "TODO",
+ };
+
+ return {
+ statusCode: response.statusCode,
+ body: JSON.stringify(responseBody),
+ };
+}
+
+module.exports = { transform };
diff --git a/src/api/response/iiif/presentation-api/items.js b/src/api/response/iiif/presentation-api/items.js
new file mode 100644
index 00000000..5c0b803c
--- /dev/null
+++ b/src/api/response/iiif/presentation-api/items.js
@@ -0,0 +1,58 @@
+/** */
+
+function annotationType(workType) {
+ return workType === "Audio" ? "Sound" : workType;
+}
+
+function buildAnnotationBody(fileSet, workType) {
+ const body = {
+ id: buildAnnotationBodyId(fileSet, workType),
+ type: annotationType(workType),
+ format: fileSet.mime_type,
+ height: fileSet.height || 100,
+ width: fileSet.width || 100,
+ };
+
+ if (isImage(workType))
+ body.service = buildImageService(fileSet.representative_image_url);
+ if (isAudioVideo(workType)) body.duration = fileSet.duration;
+ return body;
+}
+
+function buildAnnotationBodyId(fileSet, workType) {
+ return isAudioVideo(workType)
+ ? fileSet.streaming_url
+ : buildImageResourceId(fileSet.representative_image_url, "600,");
+}
+
+function buildImageResourceId(uri, size = "!300,300") {
+ return `${uri}/full/${size}/0/default.jpg`;
+}
+
+function buildImageService(representativeImageUrl) {
+ return [
+ {
+ id: representativeImageUrl,
+ profile: "http://iiif.io/api/image/2/level2.json",
+ type: "ImageService2",
+ },
+ ];
+}
+
+function isAudioVideo(workType) {
+ return ["Audio", "Video"].includes(workType);
+}
+
+function isImage(workType) {
+ return workType === "Image";
+}
+
+module.exports = {
+ annotationType,
+ buildAnnotationBody,
+ buildAnnotationBodyId,
+ buildImageResourceId,
+ buildImageService,
+ isAudioVideo,
+ isImage,
+};
diff --git a/src/api/response/iiif/presentation-api/metadata.js b/src/api/response/iiif/presentation-api/metadata.js
new file mode 100644
index 00000000..2d5c96b6
--- /dev/null
+++ b/src/api/response/iiif/presentation-api/metadata.js
@@ -0,0 +1,125 @@
+/** Build manifest metadata */
+function formatSingleValuedField(value) {
+ return value ? [value] : [];
+}
+
+function metadataLabelFields(source) {
+ return [
+ {
+ label: "Alternate Title",
+ value: source.alternate_title,
+ },
+ {
+ label: "Abstract",
+ value: source.abstract,
+ },
+ {
+ label: "Caption",
+ value: source.caption,
+ },
+ {
+ label: "Contributor",
+ value: source.contributor.map((item) => item.label_with_role),
+ },
+ {
+ label: "Creator",
+ value: source.creator.map((item) => item.label),
+ },
+ {
+ label: "Cultural Context",
+ value: source.cultural_context,
+ },
+ {
+ label: "Date",
+ value: source.date_created,
+ },
+ {
+ label: "Department",
+ value: formatSingleValuedField(source.library_unit),
+ },
+ {
+ label: "Dimensions",
+ value: source.physical_description_size,
+ },
+ {
+ label: "Genre",
+ value: source.genre.map((item) => item.label),
+ },
+ {
+ label: "Keyword",
+ value: source.keywords,
+ },
+ {
+ label: "Last Modified",
+ value: formatSingleValuedField(source.modified_date),
+ },
+ {
+ label: "Language",
+ value: source.language.map((item) => item.label),
+ },
+ {
+ label: "Location",
+ value: source.location?.map((item) => item.label),
+ },
+ {
+ label: "Materials",
+ value: source.physical_description_material,
+ },
+ {
+ label: "Notes",
+ value: source.notes.map((item) => `${item.note} (${item.type})`),
+ },
+ {
+ label: "Provenance",
+ value: source.provenance,
+ },
+ {
+ label: "Publisher",
+ value: source.publisher,
+ },
+ {
+ label: "Related Material",
+ value: source.related_material,
+ },
+ {
+ label: "Related URL",
+ value: source.related_url.map(
+ (item) => `${item.label}`
+ ),
+ },
+ {
+ label: "Rights Holder",
+ value: source.rights_holder,
+ },
+ {
+ label: "Scope and Contents",
+ value: source.scope_and_contents,
+ },
+ {
+ label: "Series",
+ value: source.series,
+ },
+ {
+ label: "Source",
+ value: source.source,
+ },
+ {
+ label: "Style Period",
+ value: source.style_period.map((item) => item.label),
+ },
+ {
+ label: "Subject",
+ value: source.subject.map((item) => item.label_with_role),
+ },
+ {
+ label: "Table of Contents",
+ value: source.table_of_contents,
+ },
+ {
+ label: "Technique",
+ value: source.technique.map((item) => item.label),
+ },
+ ];
+}
+
+module.exports = { formatSingleValuedField, metadataLabelFields };
diff --git a/src/api/response/opensearch/index.js b/src/api/response/opensearch/index.js
index 1379b88a..0320f7b1 100644
--- a/src/api/response/opensearch/index.js
+++ b/src/api/response/opensearch/index.js
@@ -1,29 +1,51 @@
-function transform(response) {
+async function transform(response, pager) {
if (response.statusCode === 200) {
const responseBody = JSON.parse(response.body);
- return responseBody?.hits?.hits
- ? transformMany(responseBody)
- : transformOne(responseBody);
+ return await (responseBody?.hits?.hits
+ ? transformMany(responseBody, pager)
+ : transformOne(responseBody));
}
return transformError(response);
}
-function transformOne(responseBody) {
+async function transformOne(responseBody) {
return {
statusCode: 200,
+ headers: {
+ "content-type": "application/json",
+ },
body: JSON.stringify({ data: responseBody._source, info: {} }),
};
}
-function transformMany(responseBody) {
+async function transformMany(responseBody, pager) {
return {
statusCode: 200,
- body: JSON.stringify({ data: extractSource(responseBody.hits.hits), pagination: {total: responseBody.hits.total.value}, info: {}, aggregations: responseBody.aggregations }),
+ headers: {
+ "content-type": "application/json",
+ },
+ body: JSON.stringify({
+ data: extractSource(responseBody.hits.hits),
+ pagination: await paginationInfo(responseBody, pager),
+ info: {},
+ aggregations: responseBody.aggregations,
+ }),
};
}
+async function paginationInfo(responseBody, pager) {
+ let { format, options, ...pageInfo } = await pager.pageInfo(
+ responseBody.hits.total.value
+ );
+
+ return pageInfo;
+}
+
function transformError(response) {
- const responseBody = { status: response.statusCode, error: "TODO" };
+ const responseBody = {
+ status: response.statusCode,
+ error: "TODO",
+ };
return {
statusCode: response.statusCode,
@@ -32,11 +54,11 @@ function transformError(response) {
}
function extractSource(hits) {
- return hits.map(hit => extractSingle(hit))
+ return hits.map((hit) => extractSingle(hit));
}
function extractSingle(hit) {
- return hit._source
+ return hit._source;
}
module.exports = { transform };
diff --git a/src/api/response/transformer.js b/src/api/response/transformer.js
new file mode 100644
index 00000000..b21fbde8
--- /dev/null
+++ b/src/api/response/transformer.js
@@ -0,0 +1,30 @@
+const iiifCollectionResponse = require("./iiif/collection.js");
+const opensearchResponse = require("./opensearch");
+
+async function transformSearchResult(response, pager) {
+ if (response.statusCode === 200) {
+ const responseBody = JSON.parse(response.body);
+ const pageInfo = await pager.pageInfo(responseBody.hits.total.value);
+
+ if (pageInfo.format === "iiif") {
+ return await iiifCollectionResponse.transform(response, pager);
+ }
+
+ return await opensearchResponse.transform(response, pager);
+ }
+ return transformError(response);
+}
+
+function transformError(response) {
+ const responseBody = {
+ status: response.statusCode,
+ error: "TODO",
+ };
+
+ return {
+ statusCode: response.statusCode,
+ body: JSON.stringify(responseBody),
+ };
+}
+
+module.exports = { transformSearchResult };
diff --git a/src/aws/environment.js b/src/aws/environment.js
index c38a864a..8abed3cf 100644
--- a/src/aws/environment.js
+++ b/src/aws/environment.js
@@ -1,7 +1,41 @@
+const jwt = require("jsonwebtoken");
+
+function apiToken() {
+ const token = {
+ displayName: ["Digital Collection API v2"],
+ iat: Math.floor(Number(new Date()) / 1000),
+ };
+
+ return jwt.sign(token, process.env.API_TOKEN_SECRET);
+}
+
+function dcApiEndpoint() {
+ return process.env.DC_API_ENDPOINT;
+}
+
+function dcUrl() {
+ return process.env.DC_URL;
+}
+
+function elasticsearchEndpoint() {
+ return process.env.ELASTICSEARCH_ENDPOINT;
+}
+
function prefix(value) {
- return [process.env.ENV_PREFIX, value]
- .filter((val) => { return (val !== "") && !!val })
- .join("-");
-};
+ const envPrefix =
+ process.env.ENV_PREFIX === "" ? undefined : process.env.ENV_PREFIX;
+ return [envPrefix, value].filter((val) => !!val).join("-");
+}
-module.exports = { prefix }
\ No newline at end of file
+function region() {
+ return process.env.AWS_REGION || "us-east-1";
+}
+
+module.exports = {
+ apiToken,
+ dcApiEndpoint,
+ dcUrl,
+ elasticsearchEndpoint,
+ prefix,
+ region,
+};
diff --git a/src/aws/fetch.js b/src/aws/fetch.js
index 18223ce5..0251bf9c 100644
--- a/src/aws/fetch.js
+++ b/src/aws/fetch.js
@@ -1,45 +1,33 @@
-const AWS = require("aws-sdk");
+const { defaultProvider } = require("@aws-sdk/credential-provider-node");
+const { SignatureV4 } = require("@aws-sdk/signature-v4");
+const { NodeHttpHandler } = require("@aws-sdk/node-http-handler");
+const { Sha256 } = require("@aws-crypto/sha256-browser");
+const region = require("./environment").region();
-function awsFetch(request) {
- return new Promise((resolve, reject) => {
- signRequest(request).then((signedRequest) => {
- var client = new AWS.HttpClient();
- client.handleRequest(
- signedRequest,
- null,
- function (response) {
- let returnValue = {
- statusCode: response.statusCode,
- };
- let responseBody = "";
- response.on("data", function (chunk) {
- responseBody += chunk;
- });
- response.on("end", function (chunk) {
- resolve({ ...returnValue, body: responseBody });
- });
- },
- function (error) {
- console.error("Error: " + error);
- reject(error);
- }
- );
- });
+async function awsFetch(request) {
+ const signer = new SignatureV4({
+ credentials: defaultProvider(),
+ region: region,
+ service: "es",
+ sha256: Sha256,
});
-}
-function signRequest(request) {
- return new Promise((resolve, _reject) => {
- let chain = new AWS.CredentialProviderChain();
+ const signedRequest = await signer.sign(request);
+
+ const client = new NodeHttpHandler();
+ const { response } = await client.handle(signedRequest);
- chain.resolve((err, credentials) => {
- if (err) {
- console.error("Sending unsigned request: ", err);
- } else {
- var signer = new AWS.Signers.V4(request, "es");
- signer.addAuthorization(credentials, new Date());
- }
- resolve(request);
+ return await new Promise((resolve, _reject) => {
+ let returnValue = {
+ statusCode: response.statusCode,
+ };
+ let responseBody = "";
+
+ response.body.on("data", function (chunk) {
+ responseBody += chunk;
+ });
+ response.body.on("end", function (chunk) {
+ resolve({ ...returnValue, body: responseBody });
});
});
}
diff --git a/src/handlers/get-auth-callback.js b/src/handlers/get-auth-callback.js
new file mode 100644
index 00000000..492ec65a
--- /dev/null
+++ b/src/handlers/get-auth-callback.js
@@ -0,0 +1,91 @@
+const axios = require("axios").default;
+const cookie = require("cookie");
+const jwt = require("jsonwebtoken");
+const { processRequest, processResponse } = require("./middleware");
+
+const BAD_DIRECTORY_SEARCH_FAULT =
+ /Reason: ResponseCode 404 is treated as error/;
+
+/**
+ * NUSSO auth callback
+ */
+exports.handler = async (event) => {
+ event = processRequest(event);
+
+ const returnPath = Buffer.from(
+ decodeURIComponent(event.cookieObject.redirectUrl),
+ "base64"
+ ).toString("utf8");
+
+ const user = await redeemSsoToken(event);
+ let response;
+ if (user) {
+ const token = jwt.sign(user, process.env.API_TOKEN_SECRET);
+ response = {
+ statusCode: 302,
+ cookies: [
+ cookie.serialize("dcApiV2Token", token, {
+ domain: "library.northwestern.edu",
+ path: "/",
+ secure: true,
+ }),
+ ],
+ headers: {
+ location: returnPath,
+ },
+ };
+ }
+
+ return processResponse(event, response);
+};
+
+async function getNetIdFromToken(nusso) {
+ const response = await axios.get(
+ `${process.env.NUSSO_BASE_URL}validateWebSSOToken`,
+ {
+ headers: {
+ apikey: process.env.NUSSO_API_KEY,
+ webssotoken: nusso,
+ },
+ }
+ );
+ return response?.data?.netid;
+}
+
+async function redeemSsoToken(event) {
+ const nusso = event.cookieObject.nusso;
+ const netid = await getNetIdFromToken(nusso);
+ if (netid) {
+ try {
+ const response = await axios.get(
+ `${process.env.NUSSO_BASE_URL}validate-with-directory-search-response`,
+ {
+ headers: {
+ apikey: process.env.NUSSO_API_KEY,
+ webssotoken: nusso,
+ },
+ }
+ );
+ return { ...response.data.results[0], uid: netid };
+ } catch (err) {
+ if (
+ BAD_DIRECTORY_SEARCH_FAULT.test(err?.response?.data?.fault?.faultstring)
+ ) {
+ return redeemForNetIdOnly(netid);
+ }
+ console.error(err.response.data);
+ return null;
+ }
+ } else {
+ console.warn("NUSSO token could not be redeemed");
+ return null;
+ }
+}
+
+function redeemForNetIdOnly(netid) {
+ return {
+ uid: netid,
+ displayName: [netid],
+ mail: `${netid}@e.northwestern.edu`,
+ };
+}
diff --git a/src/handlers/get-auth-login.js b/src/handlers/get-auth-login.js
new file mode 100644
index 00000000..4f334df5
--- /dev/null
+++ b/src/handlers/get-auth-login.js
@@ -0,0 +1,54 @@
+const { dcApiEndpoint } = require("../aws/environment");
+const axios = require("axios").default;
+const cookie = require("cookie");
+const { processRequest, processResponse } = require("./middleware");
+
+/**
+ * Performs NUSSO login
+ */
+exports.handler = async (event) => {
+ event = processRequest(event);
+
+ const callbackUrl = `${dcApiEndpoint()}/auth/callback`;
+ const url = `${process.env.NUSSO_BASE_URL}get-ldap-redirect-url`;
+ const returnPath =
+ event.queryStringParameters?.goto || event.headers?.referer;
+
+ if (!returnPath) {
+ return {
+ statusCode: 400,
+ };
+ }
+
+ let resp;
+
+ await axios
+ .get(url, {
+ headers: {
+ apikey: process.env.NUSSO_API_KEY,
+ goto: callbackUrl,
+ },
+ })
+ .then((response) => {
+ resp = {
+ statusCode: 302,
+ cookies: [
+ cookie.serialize(
+ "redirectUrl",
+ Buffer.from(returnPath, "utf8").toString("base64")
+ ),
+ ],
+ headers: {
+ location: response.data.redirecturl,
+ },
+ };
+ })
+ .catch((error) => {
+ console.error("NUSSO request error", error);
+ resp = {
+ statusCode: 401,
+ };
+ });
+
+ return processResponse(event, resp);
+};
diff --git a/src/handlers/get-auth-logout.js b/src/handlers/get-auth-logout.js
new file mode 100644
index 00000000..5d23a2d3
--- /dev/null
+++ b/src/handlers/get-auth-logout.js
@@ -0,0 +1,39 @@
+const axios = require("axios").default;
+const cookie = require("cookie");
+const { processRequest, processResponse } = require("./middleware");
+
+/**
+ * Performs NUSSO logout
+ */
+exports.handler = async (event) => {
+ event = processRequest(event);
+ const url = `${process.env.NUSSO_BASE_URL}logout`;
+ let resp;
+
+ await axios
+ .get(url, { headers: { apikey: process.env.NUSSO_API_KEY } })
+ .then((response) => {
+ resp = {
+ statusCode: 302,
+ cookies: [
+ cookie.serialize("dcApiV2Token", null, {
+ expires: new Date(1),
+ domain: "library.northwestern.edu",
+ path: "/",
+ secure: true,
+ }),
+ ],
+ headers: {
+ location: response.data.url,
+ },
+ };
+ })
+ .catch((error) => {
+ console.error("NUSSO request error", error);
+ resp = {
+ statusCode: 401,
+ };
+ });
+
+ return processResponse(event, resp);
+};
diff --git a/src/handlers/get-auth-whoami.js b/src/handlers/get-auth-whoami.js
new file mode 100644
index 00000000..464f8bd3
--- /dev/null
+++ b/src/handlers/get-auth-whoami.js
@@ -0,0 +1,31 @@
+const jwt = require("jsonwebtoken");
+const { processRequest, processResponse } = require("./middleware");
+
+/**
+ * NUSSO whoami - validates JWT and returns user info
+ */
+exports.handler = async (event) => {
+ event = processRequest(event);
+
+ try {
+ const token = event.cookieObject.dcApiV2Token;
+ const user = jwt.verify(token, process.env.API_TOKEN_SECRET);
+
+ const response = {
+ statusCode: 200,
+ headers: {
+ "Access-Control-Allow-Origin": event.headers.origin,
+ "Access-Control-Allow-Headers": "*",
+ "Access-Control-Allow-Methods": "POST, GET, OPTIONS",
+ "Access-Control-Allow-Credentials": "true",
+ },
+ body: JSON.stringify(user),
+ };
+ return processResponse(event, response);
+ } catch (error) {
+ return {
+ statusCode: 401,
+ body: "Error verifying API token: " + error.message,
+ };
+ }
+};
diff --git a/src/handlers/get-collection-by-id.js b/src/handlers/get-collection-by-id.js
index fd120f46..dfc2b88b 100644
--- a/src/handlers/get-collection-by-id.js
+++ b/src/handlers/get-collection-by-id.js
@@ -1,11 +1,37 @@
+const { processRequest, processResponse } = require("./middleware");
const { getCollection } = require("../api/opensearch");
+const { doSearch } = require("./search-runner");
const opensearchResponse = require("../api/response/opensearch");
+const getCollectionById = async (event) => {
+ event = processRequest(event);
+ const id = event.pathParameters.id;
+ const esResponse = await getCollection(id);
+ const response = await opensearchResponse.transform(esResponse);
+ return processResponse(event, response);
+};
+
+const getIiifCollectionById = async (event) => {
+ const id = event.pathParameters.id;
+ const esResponse = await getCollection(id);
+ const collection = JSON.parse(esResponse.body)?._source;
+ if (!collection) return { statusCode: 404, body: "Not Found" };
+ const parameterOverrides = { ...event.queryStringParameters };
+
+ event.queryStringParameters.query = `collection.id:${id}`;
+ event.queryStringParameters.collectionLabel = collection?.title;
+ event.queryStringParameters.collectionSummary = collection?.description;
+ return await doSearch(event, {
+ includeToken: false,
+ parameterOverrides,
+ });
+};
+
/**
- * A simple function to get a Collection by id
+ * Get a colletion by id
*/
exports.handler = async (event) => {
- const id = event.pathParameters.id;
- let esResponse = await getCollection(id);
- return opensearchResponse.transform(esResponse);
+ return event.queryStringParameters?.as === "iiif"
+ ? getIiifCollectionById(event)
+ : getCollectionById(event);
};
diff --git a/src/handlers/get-collections.js b/src/handlers/get-collections.js
new file mode 100644
index 00000000..8ede301a
--- /dev/null
+++ b/src/handlers/get-collections.js
@@ -0,0 +1,12 @@
+const { doSearch } = require("./search-runner");
+const { processRequest } = require("./middleware");
+
+/**
+ * A simple function to get Collections
+ */
+exports.handler = async (event) => {
+ event = processRequest(event);
+ event.pathParameters.models = "collections";
+ event.body = { query: { match_all: {} } };
+ return doSearch(event, { includeToken: false });
+};
diff --git a/src/handlers/get-file-set-auth.js b/src/handlers/get-file-set-auth.js
new file mode 100644
index 00000000..e14a6aab
--- /dev/null
+++ b/src/handlers/get-file-set-auth.js
@@ -0,0 +1,66 @@
+const { processRequest, processResponse } = require("./middleware");
+const { getFileSet } = require("../api/opensearch");
+const { isFromReadingRoom } = require("../helpers");
+const isObject = require("lodash.isobject");
+const jwt = require("jsonwebtoken");
+
+const OPEN_DOCUMENT_NAMESPACE = /^0{8}-0{4}-0{4}-0{4}-0{9}[0-9A-Fa-f]{3}/;
+
+/**
+ * Authorizes a FileSet by id
+ */
+exports.handler = async (event) => {
+ event = processRequest(event);
+ const id = event.pathParameters.id;
+
+ // Special namespace for entities that aren't actual entities
+ // with indexed metadata (i.e., placeholder images)
+ if (OPEN_DOCUMENT_NAMESPACE.test(id)) return sendResponse(event, 204);
+
+ const osResponse = await getFileSet(id, {
+ allowPrivate: true,
+ allowUnpublished: true,
+ });
+
+ if (osResponse.statusCode != 200) {
+ return sendResponse(event, osResponse.statusCode, osResponse.statusCode);
+ }
+
+ const body = JSON.parse(osResponse.body);
+ const fileSet = body._source;
+ const token = event.cookieObject.dcApiV2Token;
+ const visibility = fileSet.visibility;
+ const published = fileSet.published;
+ const readingRoom = isFromReadingRoom(event);
+
+ if (isAllowedVisibility(token, visibility, readingRoom) && published) {
+ return sendResponse(event, 204);
+ } else {
+ return sendResponse(event, 403);
+ }
+};
+
+function sendResponse(event, statusCode) {
+ return processResponse(event, {
+ statusCode: statusCode,
+ });
+}
+
+function isAllowedVisibility(token, visibility, readingRoom) {
+ switch (visibility) {
+ case "Public":
+ return true;
+ case "Institution":
+ return isValidToken(token) || readingRoom;
+ case "Private":
+ return readingRoom;
+ default:
+ return false;
+ }
+}
+
+function isValidToken(token) {
+ if (!!token === false) return false;
+ const user = jwt.verify(token, process.env.API_TOKEN_SECRET);
+ return isObject(user);
+}
diff --git a/src/handlers/get-file-set-by-id.js b/src/handlers/get-file-set-by-id.js
index 9d1e759b..a59be9f6 100644
--- a/src/handlers/get-file-set-by-id.js
+++ b/src/handlers/get-file-set-by-id.js
@@ -1,11 +1,16 @@
+const { processRequest, processResponse } = require("./middleware");
const { getFileSet } = require("../api/opensearch");
+const { isFromReadingRoom } = require("../helpers");
const opensearchResponse = require("../api/response/opensearch");
/**
* A simple function to get a FileSet by id
*/
exports.handler = async (event) => {
+ event = processRequest(event);
const id = event.pathParameters.id;
- let esResponse = await getFileSet(id);
- return opensearchResponse.transform(esResponse);
+ const allowPrivate = isFromReadingRoom(event);
+ const esResponse = await getFileSet(id, { allowPrivate });
+ const response = await opensearchResponse.transform(esResponse);
+ return processResponse(event, response);
};
diff --git a/src/handlers/get-shared-link-by-id.js b/src/handlers/get-shared-link-by-id.js
new file mode 100644
index 00000000..4d40475f
--- /dev/null
+++ b/src/handlers/get-shared-link-by-id.js
@@ -0,0 +1,42 @@
+const { processRequest, processResponse } = require("./middleware");
+const { getSharedLink, getWork } = require("../api/opensearch");
+const opensearchResponse = require("../api/response/opensearch");
+
+/**
+ * Get a shared link document by id
+ */
+exports.handler = async (event) => {
+ event = processRequest(event);
+ const id = event.pathParameters.id;
+ const sharedLinkResponse = await getSharedLink(id);
+ const sharedLinkResponseBody = JSON.parse(sharedLinkResponse.body);
+ const expirationDate = new Date(sharedLinkResponseBody?._source?.expires);
+ const workId = sharedLinkResponseBody?._source?.target_id;
+
+ if (linkExpired(expirationDate) || !workId)
+ return invalidRequest("Not Found");
+
+ const workResponse = await getWork(workId, {
+ allowPrivate: true,
+ allowUnpublished: true,
+ });
+ if (workResponse.statusCode !== 200) return invalidRequest("Not Found");
+ const response = opensearchResponse.transform(workResponse);
+ return processResponse(event, response);
+};
+
+const invalidRequest = (message) => {
+ return {
+ statusCode: 404,
+ headers: { "content-type": "text/plain" },
+ body: JSON.stringify({ message: message }),
+ };
+};
+
+const linkExpired = (expirationDate) => {
+ return !isValid(expirationDate) || expirationDate <= new Date();
+};
+
+const isValid = (date) => {
+ return date instanceof Date && !isNaN(date.getTime());
+};
diff --git a/src/handlers/get-similar.js b/src/handlers/get-similar.js
new file mode 100644
index 00000000..f4517d4f
--- /dev/null
+++ b/src/handlers/get-similar.js
@@ -0,0 +1,37 @@
+const { doSearch } = require("./search-runner");
+const { modelsToTargets } = require("../api/request/models");
+
+/**
+ * Get similar works via 'More Like This' query
+ */
+exports.handler = async (event) => {
+ const id = event.pathParameters.id;
+ const models = ["works"];
+ const workIndex = modelsToTargets(models);
+
+ event.body = {
+ query: {
+ more_like_this: {
+ fields: [
+ "title",
+ "description",
+ "subject.label",
+ "genre.label",
+ "contributor.label",
+ "creator.label",
+ ],
+ like: [
+ {
+ _index: workIndex,
+ _id: id,
+ },
+ ],
+ max_query_terms: 10,
+ min_doc_freq: 1,
+ min_term_freq: 1,
+ },
+ },
+ };
+
+ return doSearch(event, { includeToken: false });
+};
diff --git a/src/handlers/get-thumbnail.js b/src/handlers/get-thumbnail.js
new file mode 100644
index 00000000..400b07be
--- /dev/null
+++ b/src/handlers/get-thumbnail.js
@@ -0,0 +1,113 @@
+const { apiToken } = require("../aws/environment");
+const axios = require("axios").default;
+const { getCollection, getWork } = require("../api/opensearch");
+const opensearchResponse = require("../api/response/opensearch");
+const { processRequest } = require("./middleware");
+
+function getAxiosResponse(url, config) {
+ return new Promise((resolve) => {
+ axios
+ .get(url, config)
+ .then((response) => resolve(response))
+ .catch((error) => resolve(error.response));
+ });
+}
+
+function validateRequest(event) {
+ const id = event.pathParameters.id;
+ const aspect = event?.queryStringParameters?.aspect || "full";
+ const sizeParam = event?.queryStringParameters?.size || 300;
+ const size = Number(sizeParam);
+
+ if (!["full", "square"].includes(aspect))
+ throw new Error(`Unknown aspect ratio: ${aspect}`);
+ if (isNaN(size)) throw new Error(`${sizeParam} is not a valid size`);
+ if (size > 300)
+ throw new Error(`Requested size of ${size}px exceeds maximum of 300px`);
+
+ return { id, aspect, size };
+}
+
+const getWorkThumbnail = async (id, aspect, size) => {
+ const esResponse = await getWork(id);
+ if (esResponse.statusCode != 200) {
+ return opensearchResponse.transform(esResponse);
+ }
+
+ const body = JSON.parse(esResponse.body);
+ const iiif_base = body?._source?.representative_file_set?.url;
+
+ if (!iiif_base) {
+ return {
+ statusCode: 404,
+ headers: { "content-type": "text/plain" },
+ body: "Not Found",
+ };
+ }
+
+ const thumbnail = `${iiif_base}/${aspect}/!${size},${size}/0/default.jpg`;
+
+ const { status, headers, data } = await getAxiosResponse(thumbnail, {
+ headers: { Authorization: `Bearer ${apiToken()}` },
+ responseType: "arraybuffer",
+ });
+
+ if (status != 200) {
+ return {
+ statusCode: status,
+ body: data.toString(),
+ headers: headers,
+ };
+ }
+
+ return {
+ statusCode: status,
+ isBase64Encoded: true,
+ body: data.toString("base64"),
+ headers: {
+ "content-type": headers["content-type"],
+ },
+ };
+};
+
+const getParameters = async (event) => {
+ const { id, aspect, size } = validateRequest(processRequest(event));
+ if (event.rawPath.match(/\/collections\//)) {
+ const esResponse = await getCollection(id);
+ if (esResponse.statusCode != 200) {
+ return { error: opensearchResponse.transform(esResponse) };
+ }
+
+ const body = JSON.parse(esResponse.body);
+ const workId = body?._source?.representative_image?.work_id;
+ return { id: workId, aspect, size };
+ } else {
+ return { id, aspect, size };
+ }
+};
+
+/**
+ * A simple function to proxy a Collection or Work thumbnail from the IIIF server
+ */
+exports.handler = async (event) => {
+ try {
+ const { id, aspect, size, error } = await getParameters(event);
+ if (error) return error;
+
+ if (!id) {
+ return {
+ statusCode: 404,
+ headers: { "content-type": "text/plain" },
+ body: "Not Found",
+ };
+ }
+
+ return await getWorkThumbnail(id, aspect, size);
+ } catch (err) {
+ return {
+ statusCode: 400,
+ headers: { "content-type": "text/plain" },
+ body: err.message,
+ };
+ }
+};
diff --git a/src/handlers/get-work-by-id.js b/src/handlers/get-work-by-id.js
index 52230a39..a929c8a9 100644
--- a/src/handlers/get-work-by-id.js
+++ b/src/handlers/get-work-by-id.js
@@ -1,11 +1,28 @@
+const { processRequest, processResponse } = require("./middleware");
const { getWork } = require("../api/opensearch");
+const { isFromReadingRoom } = require("../helpers");
+
+const manifestResponse = require("../api/response/iiif/manifest");
const opensearchResponse = require("../api/response/opensearch");
/**
* A simple function to get a Work by id
*/
exports.handler = async (event) => {
+ event = processRequest(event);
const id = event.pathParameters.id;
- let esResponse = await getWork(id);
- return opensearchResponse.transform(esResponse);
+ const allowPrivate = isFromReadingRoom(event);
+ const esResponse = await getWork(id, { allowPrivate });
+
+ let response;
+ const as = event.queryStringParameters.as;
+
+ if (as && as === "iiif") {
+ // Make it IIIFy
+ response = manifestResponse.transform(esResponse);
+ } else {
+ response = await opensearchResponse.transform(esResponse);
+ }
+
+ return processResponse(event, response);
};
diff --git a/src/handlers/hello.js b/src/handlers/hello.js
deleted file mode 100644
index 08735e32..00000000
--- a/src/handlers/hello.js
+++ /dev/null
@@ -1,33 +0,0 @@
-// const axios = require('axios')
-// const url = 'http://checkip.amazonaws.com/';
-let response;
-
-/**
- *
- * Event doc: https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html#api-gateway-simple-proxy-for-lambda-input-format
- * @param {Object} event - API Gateway Lambda Proxy Input Format
- *
- * Context doc: https://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-context.html
- * @param {Object} context
- *
- * Return doc: https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html
- * @returns {Object} object - API Gateway Lambda Proxy Output Format
- *
- */
-exports.helloHandler = async (event, context) => {
- try {
- // const ret = await axios(url);
- response = {
- statusCode: 200,
- body: JSON.stringify({
- message: "hello world",
- // location: ret.data.trim()
- }),
- };
- } catch (err) {
- console.log(err);
- return err;
- }
-
- return response;
-};
diff --git a/src/handlers/middleware.js b/src/handlers/middleware.js
new file mode 100644
index 00000000..a9524f39
--- /dev/null
+++ b/src/handlers/middleware.js
@@ -0,0 +1,26 @@
+const {
+ addCorsHeaders,
+ decodeEventBody,
+ ensureCharacterEncoding,
+ normalizeHeaders,
+ objectifyCookies,
+ stubEventMembers,
+} = require("../helpers");
+
+const processRequest = function (event) {
+ if (event._processRequest) return event;
+ let result = stubEventMembers(event);
+ result = normalizeHeaders(event);
+ result = objectifyCookies(result);
+ result = decodeEventBody(result);
+ result._processRequest = true;
+ return result;
+};
+
+const processResponse = function (event, response) {
+ let result = addCorsHeaders(event, response);
+ result = ensureCharacterEncoding(result, "UTF-8");
+ return result;
+};
+
+module.exports = { processRequest, processResponse };
diff --git a/src/handlers/options-request.js b/src/handlers/options-request.js
new file mode 100644
index 00000000..5794471a
--- /dev/null
+++ b/src/handlers/options-request.js
@@ -0,0 +1,6 @@
+const { processRequest, processResponse } = require("./middleware");
+
+module.exports.handler = async (event) => {
+ event = processRequest(event);
+ return processResponse(event, { statusCode: 200 });
+};
diff --git a/src/handlers/search-runner.js b/src/handlers/search-runner.js
new file mode 100644
index 00000000..2434cfc8
--- /dev/null
+++ b/src/handlers/search-runner.js
@@ -0,0 +1,157 @@
+const { baseUrl, effectivePath } = require("../helpers");
+const { processRequest, processResponse } = require("./middleware");
+const {
+ extractRequestedModels,
+ modelsToTargets,
+ validModels,
+} = require("../api/request/models");
+const { search } = require("../api/opensearch");
+const responseTransformer = require("../api/response/transformer");
+const { decodeSearchToken, Paginator } = require("../api/pagination");
+const RequestPipeline = require("../api/request/pipeline");
+
+/**
+ * Function to wrap search requests and transform responses
+ */
+const doSearch = async (event, searchParams = {}) => {
+ event = processRequest(event);
+ const models = extractRequestedModels(event.pathParameters?.models);
+ const format = await responseFormat(event);
+
+ let searchContext;
+ try {
+ searchContext = await constructSearchContext(event);
+ } catch (error) {
+ return invalidRequest(error.message);
+ }
+
+ if (!validModels(models, format)) {
+ return invalidRequest(`Invalid models requested: ${models}`);
+ }
+
+ const base = new URL(baseUrl(event));
+ const path = effectivePath(event);
+
+ const pager = new Paginator(
+ base.toString(),
+ path,
+ models,
+ searchContext,
+ format,
+ {
+ ...searchParams,
+ queryStringParameters: event.queryStringParameters,
+ }
+ );
+ const filteredSearchContext = new RequestPipeline(searchContext)
+ .authFilter(event)
+ .toJson();
+
+ const esResponse = await search(
+ modelsToTargets(models),
+ filteredSearchContext
+ );
+
+ const response = await responseTransformer.transformSearchResult(
+ esResponse,
+ pager
+ );
+ return processResponse(event, response);
+};
+
+const invalidRequest = (message) => {
+ return {
+ statusCode: 400,
+ body: JSON.stringify({ message: message }),
+ };
+};
+
+const constructSearchContext = async (event) => {
+ let searchContext;
+
+ if (typeof event.body === "object") {
+ searchContext = event.body;
+ } else if (event.requestContext.http.method === "POST") {
+ searchContext = JSON.parse(event.body);
+ } else {
+ const token = event.queryStringParameters?.searchToken;
+ searchContext =
+ token === undefined || token === ""
+ ? fromQueryString(event)
+ : await fromToken(event);
+ }
+
+ const { queryStringParameters = {} } = event;
+
+ searchContext.size = queryStringParameters.size || searchContext.size || 10;
+ searchContext.from = queryStringParameters.from || searchContext.from || 0;
+
+ if (queryStringParameters?.sort || searchContext.sort)
+ searchContext.sort =
+ parseSortParameter(queryStringParameters) || searchContext.sort;
+
+ if (queryStringParameters.page) {
+ const page = Number(queryStringParameters.page || 1);
+ searchContext.from = (page - 1) * searchContext.size;
+ }
+
+ return searchContext;
+};
+
+const fromQueryString = ({ queryStringParameters, _requestContext }) => {
+ let request = {
+ query: {
+ query_string: {
+ query: queryStringParameters?.query || "*",
+ },
+ },
+ };
+ return request;
+};
+
+const parseSortParameter = ({ sort: sortString }) => {
+ if (sortString == undefined) return null;
+ let values = [];
+
+ for (const el of sortString.split(",")) {
+ let obj = {};
+ const [key, value] = el.split(":");
+ obj[key] = value;
+ values.push(obj);
+ }
+
+ return values;
+};
+
+const responseFormat = async (event) => {
+ if (event.queryStringParameters?.as) {
+ return event.queryStringParameters?.as;
+ } else {
+ if (event.queryStringParameters?.searchToken === undefined)
+ return "default";
+ const token = event.queryStringParameters.searchToken;
+
+ try {
+ request = await decodeSearchToken(token);
+ } catch (err) {
+ return invalidRequest("searchToken is invalid");
+ }
+ return request.format;
+ }
+};
+
+const fromToken = async (event) => {
+ const token = event.queryStringParameters.searchToken;
+
+ let request;
+
+ try {
+ request = await decodeSearchToken(token);
+ } catch (err) {
+ throw new Error("searchToken is invalid");
+ }
+
+ return request.body;
+};
+
+module.exports = { doSearch };
diff --git a/src/handlers/search.js b/src/handlers/search.js
index 21f04b19..9ff38d5d 100644
--- a/src/handlers/search.js
+++ b/src/handlers/search.js
@@ -1,49 +1,10 @@
-const { prefix } = require("../aws/environment");
-const { search } = require("../api/opensearch");
-const opensearchResponse = require("../api/response/opensearch");
-const RequestPipeline = require("../api/request/pipeline.js");
+const { doSearch } = require("./search-runner");
-/**
- * Function to wrap search requests and transform responses
- */
-exports.handler = async (event) => {
- const eventBody = event.body;
-
- const requestedModels =
- event.pathParameters?.models == null
- ? ["works"]
- : event.pathParameters.models.split(",");
-
- if (!validModels(requestedModels)) {
- return {
- statusCode: 400,
- body: JSON.stringify({
- message: `Invalid models requested: ${requestedModels}`,
- }),
- };
- }
-
- const filteredBody = new RequestPipeline(eventBody).authFilter().toJson();
- let esResponse = await search(modelsToTargets(requestedModels), filteredBody);
- let transformedResponse = opensearchResponse.transform(esResponse);
- return transformedResponse;
+const getSearch = async (event) => {
+ const includeToken = !!event.queryStringParameters?.searchToken;
+ return await doSearch(event, { includeToken });
};
-function validModels(models) {
- const validModels = models.filter((model) => isAllowed(model));
- return validModels.length > 0;
-}
-
-function isAllowed(model) {
- allowedModels = ["works", "file-sets", "collections"];
- return allowedModels.includes(model);
-}
+const postSearch = async (event) => await doSearch(event);
-function modelsToTargets(models) {
- const mapTargets = {
- works: "dc-v2-work",
- "file-sets": "dc-v2-file-set",
- collections: "dc-v2-collection",
- };
- return String(models.map((model) => prefix(mapTargets[model])));
-}
+module.exports = { postSearch, getSearch };
diff --git a/src/helpers.js b/src/helpers.js
new file mode 100644
index 00000000..e8af9005
--- /dev/null
+++ b/src/helpers.js
@@ -0,0 +1,144 @@
+const parseHeader = require("parse-http-header");
+const path = require("path");
+const gatewayRe = /execute-api.[a-z]+-[a-z]+-\d+.amazonaws.com/;
+
+function addCorsHeaders(event, response) {
+ const allowOrigin = event?.headers?.origin || "*";
+ const corsHeaders = {
+ "Access-Control-Allow-Origin": allowOrigin,
+ "Access-Control-Allow-Headers": "*",
+ "Access-Control-Allow-Methods": "POST, GET, OPTIONS",
+ "Access-Control-Allow-Credentials": "true",
+ "Access-Control-Max-Age": "600",
+ };
+ if (!response.headers) response.headers = {};
+ Object.assign(response.headers, corsHeaders);
+ return response;
+}
+
+function ensureCharacterEncoding(response, defaultEncoding = "UTF-8") {
+ response.headers ||= {};
+ response.headers["Content-Type"] ||= "application/json; charset=UTF-8";
+ const contentTypeHeader = Object.keys(response.headers).find(
+ (name) => name.toLocaleLowerCase() == "content-type"
+ );
+ if (!parseHeader(response.headers[contentTypeHeader]).charset) {
+ response.headers[contentTypeHeader] += `; charset=${defaultEncoding}`;
+ }
+ return response;
+}
+
+function decodeEventBody(event) {
+ if (!event.isBase64Encoded) return event;
+ event.body = Buffer.from(event.body, "base64").toString("utf8");
+ event.isBase64Encoded = false;
+ return event;
+}
+
+function isApiGateway(event) {
+ return gatewayRe.test(event.requestContext.domainName);
+}
+
+function isDefaultRoute(event) {
+ return event.routeKey.match(/\$default$/);
+}
+
+function isLocal(event) {
+ return event.requestContext.domainName === "localhost";
+}
+
+function normalizeHeaders(event) {
+ if (event.normalizedHeaders) return event;
+
+ const headers = { ...event.headers };
+
+ for (const header in headers) {
+ const lowerHeader = header.toLowerCase();
+ if (header != lowerHeader) {
+ const value = headers[header];
+ delete headers[header];
+ headers[lowerHeader] = value;
+ }
+ }
+
+ event.headers = headers;
+ event.normalizedHeaders = true;
+ return event;
+}
+
+function baseUrl(event) {
+ event = normalizeHeaders(event);
+ const scheme = event.headers["x-forwarded-proto"];
+
+ // The localhost check only matters in dev mode, but it's
+ // really inconvenient not to have it
+ const host = isLocal(event)
+ ? event.headers["host"].split(/:/)[0]
+ : event.requestContext.domainName;
+ const port = event.headers["x-forwarded-port"];
+
+ let result = new URL(`${scheme}://${host}:${port}`);
+
+ let stem;
+ if (isApiGateway(event) && !isDefaultRoute(event)) {
+ const routeKey = event.routeKey.split(" ")[1];
+ const routeRe = new RegExp(
+ "^(.*)" + routeKey.replace(/\{.+?\}/g, ".+?") + "$"
+ );
+ stem = routeRe.exec(event.rawPath)[1];
+ } else if (!isLocal(event) && event?.stageVariables?.basePath) {
+ stem = event.stageVariables.basePath;
+ } else {
+ stem = "";
+ }
+
+ result = new URL(`${stem}/`, result);
+ return result.toString();
+}
+
+function effectivePath(event) {
+ const root = path.join("/", event.requestContext.stage);
+ const absolute = event.requestContext.http.path;
+ return path.relative(root, absolute);
+}
+
+function objectifyCookies(event) {
+ event.cookieObject = {};
+ if (!event.cookies) return event;
+ const cookieRe = /^(?.+?)=(?.+)$/;
+ for (const cookie of event.cookies) {
+ const match = cookieRe.exec(cookie);
+ if (match) {
+ const { name, value } = match.groups;
+ event.cookieObject[name] = value;
+ }
+ }
+ return event;
+}
+
+function isFromReadingRoom(event) {
+ const AllowedIPs = (process.env.READING_ROOM_IPS || "").split(/\s*,\s*/);
+ const sourceIp = event?.requestContext?.http?.sourceIp;
+ return AllowedIPs.includes(sourceIp);
+}
+
+function stubEventMembers(event) {
+ event.headers ||= {};
+ event.pathParameters ||= {};
+ event.queryStringParameters ||= {};
+ event.stageVariables ||= {};
+ event.cookies ||= [];
+ return event;
+}
+
+module.exports = {
+ addCorsHeaders,
+ baseUrl,
+ decodeEventBody,
+ effectivePath,
+ ensureCharacterEncoding,
+ isFromReadingRoom,
+ normalizeHeaders,
+ objectifyCookies,
+ stubEventMembers,
+};
diff --git a/src/package-lock.json b/src/package-lock.json
new file mode 100644
index 00000000..1015f252
--- /dev/null
+++ b/src/package-lock.json
@@ -0,0 +1,2768 @@
+{
+ "name": "dc-api",
+ "version": "2.0.0pre",
+ "lockfileVersion": 2,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "dc-api",
+ "version": "2.0.0pre",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-crypto/sha256-browser": "^2.0.1",
+ "@aws-sdk/credential-provider-node": "^3.142.0",
+ "@aws-sdk/node-http-handler": "^3.127.0",
+ "@aws-sdk/protocol-http": "^3.127.0",
+ "@aws-sdk/signature-v4": "^3.130.0",
+ "axios": ">=0.21.1",
+ "cookie": "^0.5.0",
+ "iiif-builder": "^1.0.6",
+ "jsonwebtoken": "^8.5.1",
+ "lodash.isobject": "^3.0.2",
+ "lz-string": "^1.4.4",
+ "parse-http-header": "^1.0.1",
+ "sort-json": "^2.0.1"
+ }
+ },
+ "node_modules/@aws-crypto/ie11-detection": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-2.0.0.tgz",
+ "integrity": "sha512-pkVXf/dq6PITJ0jzYZ69VhL8VFOFoPZLZqtU/12SGnzYuJOOGNfF41q9GxdI1yqC8R13Rq3jOLKDFpUJFT5eTA==",
+ "dependencies": {
+ "tslib": "^1.11.1"
+ }
+ },
+ "node_modules/@aws-crypto/sha256-browser": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-2.0.1.tgz",
+ "integrity": "sha512-P4Af7E2iJqZN2HYMdWINEg++OC2CtP1ygTx6WQCzZISQA+i3Q+K3E8S8t/PSYqUnvtfh5XVjbFT9uA+4IT8C2w==",
+ "dependencies": {
+ "@aws-crypto/ie11-detection": "^2.0.0",
+ "@aws-crypto/sha256-js": "^2.0.1",
+ "@aws-crypto/supports-web-crypto": "^2.0.0",
+ "@aws-crypto/util": "^2.0.1",
+ "@aws-sdk/types": "^3.1.0",
+ "@aws-sdk/util-locate-window": "^3.0.0",
+ "@aws-sdk/util-utf8-browser": "^3.0.0",
+ "tslib": "^1.11.1"
+ }
+ },
+ "node_modules/@aws-crypto/sha256-js": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-2.0.1.tgz",
+ "integrity": "sha512-mbHTBSPBvg6o/mN/c18Z/zifM05eJrapj5ggoOIeHIWckvkv5VgGi7r/wYpt+QAO2ySKXLNvH2d8L7bne4xrMQ==",
+ "dependencies": {
+ "@aws-crypto/util": "^2.0.1",
+ "@aws-sdk/types": "^3.1.0",
+ "tslib": "^1.11.1"
+ }
+ },
+ "node_modules/@aws-crypto/supports-web-crypto": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-2.0.0.tgz",
+ "integrity": "sha512-Ge7WQ3E0OC7FHYprsZV3h0QIcpdyJLvIeg+uTuHqRYm8D6qCFJoiC+edSzSyFiHtZf+NOQDJ1q46qxjtzIY2nA==",
+ "dependencies": {
+ "tslib": "^1.11.1"
+ }
+ },
+ "node_modules/@aws-crypto/util": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-2.0.1.tgz",
+ "integrity": "sha512-JJmFFwvbm08lULw4Nm5QOLg8+lAQeC8aCXK5xrtxntYzYXCGfHwUJ4Is3770Q7HmICsXthGQ+ZsDL7C2uH3yBQ==",
+ "dependencies": {
+ "@aws-sdk/types": "^3.1.0",
+ "@aws-sdk/util-utf8-browser": "^3.0.0",
+ "tslib": "^1.11.1"
+ }
+ },
+ "node_modules/@aws-sdk/abort-controller": {
+ "version": "3.162.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.162.0.tgz",
+ "integrity": "sha512-8j1f/g+pNny3HkOojl+6phwd1yQE0FmM6EdssRJPA/IpR+SE0qTva2psKfZA9DivAg+/iTBozVCQU5GUJY1F2A==",
+ "dependencies": {
+ "@aws-sdk/types": "3.162.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/abort-controller/node_modules/tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ },
+ "node_modules/@aws-sdk/client-sso": {
+ "version": "3.165.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.165.0.tgz",
+ "integrity": "sha512-Cizf03z6UFgHWOIQYOjZdNwUhoh6yhT5B2dH+mh1q+Naq1zsLmD2PUvx7SM+0fZsN9MhOICLyBSE/nSSE7E8Kg==",
+ "dependencies": {
+ "@aws-crypto/sha256-browser": "2.0.0",
+ "@aws-crypto/sha256-js": "2.0.0",
+ "@aws-sdk/config-resolver": "3.163.0",
+ "@aws-sdk/fetch-http-handler": "3.162.0",
+ "@aws-sdk/hash-node": "3.162.0",
+ "@aws-sdk/invalid-dependency": "3.162.0",
+ "@aws-sdk/middleware-content-length": "3.162.0",
+ "@aws-sdk/middleware-host-header": "3.162.0",
+ "@aws-sdk/middleware-logger": "3.162.0",
+ "@aws-sdk/middleware-recursion-detection": "3.162.0",
+ "@aws-sdk/middleware-retry": "3.162.0",
+ "@aws-sdk/middleware-serde": "3.162.0",
+ "@aws-sdk/middleware-stack": "3.162.0",
+ "@aws-sdk/middleware-user-agent": "3.162.0",
+ "@aws-sdk/node-config-provider": "3.162.0",
+ "@aws-sdk/node-http-handler": "3.162.0",
+ "@aws-sdk/protocol-http": "3.162.0",
+ "@aws-sdk/smithy-client": "3.162.0",
+ "@aws-sdk/types": "3.162.0",
+ "@aws-sdk/url-parser": "3.162.0",
+ "@aws-sdk/util-base64-browser": "3.109.0",
+ "@aws-sdk/util-base64-node": "3.55.0",
+ "@aws-sdk/util-body-length-browser": "3.154.0",
+ "@aws-sdk/util-body-length-node": "3.55.0",
+ "@aws-sdk/util-defaults-mode-browser": "3.162.0",
+ "@aws-sdk/util-defaults-mode-node": "3.163.0",
+ "@aws-sdk/util-user-agent-browser": "3.162.0",
+ "@aws-sdk/util-user-agent-node": "3.162.0",
+ "@aws-sdk/util-utf8-browser": "3.109.0",
+ "@aws-sdk/util-utf8-node": "3.109.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-sso/node_modules/@aws-crypto/sha256-browser": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-2.0.0.tgz",
+ "integrity": "sha512-rYXOQ8BFOaqMEHJrLHul/25ckWH6GTJtdLSajhlqGMx0PmSueAuvboCuZCTqEKlxR8CQOwRarxYMZZSYlhRA1A==",
+ "dependencies": {
+ "@aws-crypto/ie11-detection": "^2.0.0",
+ "@aws-crypto/sha256-js": "^2.0.0",
+ "@aws-crypto/supports-web-crypto": "^2.0.0",
+ "@aws-crypto/util": "^2.0.0",
+ "@aws-sdk/types": "^3.1.0",
+ "@aws-sdk/util-locate-window": "^3.0.0",
+ "@aws-sdk/util-utf8-browser": "^3.0.0",
+ "tslib": "^1.11.1"
+ }
+ },
+ "node_modules/@aws-sdk/client-sso/node_modules/@aws-crypto/sha256-browser/node_modules/tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
+ },
+ "node_modules/@aws-sdk/client-sso/node_modules/@aws-crypto/sha256-js": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-2.0.0.tgz",
+ "integrity": "sha512-VZY+mCY4Nmrs5WGfitmNqXzaE873fcIZDu54cbaDaaamsaTOP1DBImV9F4pICc3EHjQXujyE8jig+PFCaew9ig==",
+ "dependencies": {
+ "@aws-crypto/util": "^2.0.0",
+ "@aws-sdk/types": "^3.1.0",
+ "tslib": "^1.11.1"
+ }
+ },
+ "node_modules/@aws-sdk/client-sso/node_modules/@aws-crypto/sha256-js/node_modules/tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
+ },
+ "node_modules/@aws-sdk/client-sso/node_modules/tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ },
+ "node_modules/@aws-sdk/config-resolver": {
+ "version": "3.163.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.163.0.tgz",
+ "integrity": "sha512-iBl5Zc3+VRGJy6n+aMcg++7tzYi4G1bHia6v/eF93SvdKxtRv40M9QnqoNfaNUuw9U2ltwKOHepw7J3bkOA8cQ==",
+ "dependencies": {
+ "@aws-sdk/signature-v4": "3.163.0",
+ "@aws-sdk/types": "3.162.0",
+ "@aws-sdk/util-config-provider": "3.109.0",
+ "@aws-sdk/util-middleware": "3.162.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/config-resolver/node_modules/tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ },
+ "node_modules/@aws-sdk/credential-provider-env": {
+ "version": "3.162.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.162.0.tgz",
+ "integrity": "sha512-yzCJXiAAbZZHB4iThi4I+rs+gTYwBSetdU4Z1D89a2xjcOjCa8IhdQKm3GO/uJMScy4VtW3EEFG4/zZ7dVQPOw==",
+ "dependencies": {
+ "@aws-sdk/property-provider": "3.162.0",
+ "@aws-sdk/types": "3.162.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/credential-provider-env/node_modules/tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ },
+ "node_modules/@aws-sdk/credential-provider-imds": {
+ "version": "3.162.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.162.0.tgz",
+ "integrity": "sha512-ohrHMIu2MNauPjbE8mEMKtlEQH/VZdpNswPigaEejUGVumz0NSft9PlIn2X79sNX5Y+uXopynMQF4MZj773hTw==",
+ "dependencies": {
+ "@aws-sdk/node-config-provider": "3.162.0",
+ "@aws-sdk/property-provider": "3.162.0",
+ "@aws-sdk/types": "3.162.0",
+ "@aws-sdk/url-parser": "3.162.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/credential-provider-imds/node_modules/tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ },
+ "node_modules/@aws-sdk/credential-provider-ini": {
+ "version": "3.165.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.165.0.tgz",
+ "integrity": "sha512-NrLe29bdhmpNPsEsYxUxb0hTxNMXCmz5pH2l/T9COT6SMxom1wpbB/aKwf9897Z1xvhoFi6flDQjmu//599BZw==",
+ "dependencies": {
+ "@aws-sdk/credential-provider-env": "3.162.0",
+ "@aws-sdk/credential-provider-imds": "3.162.0",
+ "@aws-sdk/credential-provider-sso": "3.165.0",
+ "@aws-sdk/credential-provider-web-identity": "3.162.0",
+ "@aws-sdk/property-provider": "3.162.0",
+ "@aws-sdk/shared-ini-file-loader": "3.162.0",
+ "@aws-sdk/types": "3.162.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/credential-provider-ini/node_modules/tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ },
+ "node_modules/@aws-sdk/credential-provider-node": {
+ "version": "3.165.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.165.0.tgz",
+ "integrity": "sha512-emUd3kqAvV8Qydn5pJ+YKo47UJ+B5RXNyQXMasNQsw1jxrB60j8QAIL9JGM019SzZBnHZuW3DrHClA17OVC+xQ==",
+ "dependencies": {
+ "@aws-sdk/credential-provider-env": "3.162.0",
+ "@aws-sdk/credential-provider-imds": "3.162.0",
+ "@aws-sdk/credential-provider-ini": "3.165.0",
+ "@aws-sdk/credential-provider-process": "3.162.0",
+ "@aws-sdk/credential-provider-sso": "3.165.0",
+ "@aws-sdk/credential-provider-web-identity": "3.162.0",
+ "@aws-sdk/property-provider": "3.162.0",
+ "@aws-sdk/shared-ini-file-loader": "3.162.0",
+ "@aws-sdk/types": "3.162.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/credential-provider-node/node_modules/tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ },
+ "node_modules/@aws-sdk/credential-provider-process": {
+ "version": "3.162.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.162.0.tgz",
+ "integrity": "sha512-KtmYjlCMAa0XF3IJo4dxSF+OWmRoHbrdEHGEZw+j6iCZ3Nz6Y6xCsdxun5rAKdom1QRNMDR4wX0hRAdPYobW2w==",
+ "dependencies": {
+ "@aws-sdk/property-provider": "3.162.0",
+ "@aws-sdk/shared-ini-file-loader": "3.162.0",
+ "@aws-sdk/types": "3.162.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/credential-provider-process/node_modules/tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ },
+ "node_modules/@aws-sdk/credential-provider-sso": {
+ "version": "3.165.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.165.0.tgz",
+ "integrity": "sha512-b2BuYyUSmnfChhz5ZbnqOaLSAsnzYcwpEPEUbQUdNGPSE3QcMd0SPl3woH82095WYlXTFjwgxlOPn5ad5hdBpA==",
+ "dependencies": {
+ "@aws-sdk/client-sso": "3.165.0",
+ "@aws-sdk/property-provider": "3.162.0",
+ "@aws-sdk/shared-ini-file-loader": "3.162.0",
+ "@aws-sdk/types": "3.162.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/credential-provider-sso/node_modules/tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ },
+ "node_modules/@aws-sdk/credential-provider-web-identity": {
+ "version": "3.162.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.162.0.tgz",
+ "integrity": "sha512-vy86OS5/h+Vfk1bxvWjbayyUtFNdwU+mfALin3zxJbFqneSxRBydNBomt/guJjapZE+h865lkteyOsqsYMskzQ==",
+ "dependencies": {
+ "@aws-sdk/property-provider": "3.162.0",
+ "@aws-sdk/types": "3.162.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ },
+ "node_modules/@aws-sdk/fetch-http-handler": {
+ "version": "3.162.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.162.0.tgz",
+ "integrity": "sha512-DZLxxEqSMXqKteYohO4w6uoORabpETWso6wBdIFMul1BbEseqLjub1594D5RA18cqkcM2dV4ttw+boPPzOjSAw==",
+ "dependencies": {
+ "@aws-sdk/protocol-http": "3.162.0",
+ "@aws-sdk/querystring-builder": "3.162.0",
+ "@aws-sdk/types": "3.162.0",
+ "@aws-sdk/util-base64-browser": "3.109.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "node_modules/@aws-sdk/fetch-http-handler/node_modules/tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ },
+ "node_modules/@aws-sdk/hash-node": {
+ "version": "3.162.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.162.0.tgz",
+ "integrity": "sha512-lfyyAb0Cd084QnUNLTkYowD8RW3L5Tb9lNnIMH6HY7uSE/obw1j/OnLUPqpey628WJ5DPyyvNBah3Vu+JVZ5Mw==",
+ "dependencies": {
+ "@aws-sdk/types": "3.162.0",
+ "@aws-sdk/util-buffer-from": "3.55.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/hash-node/node_modules/tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ },
+ "node_modules/@aws-sdk/invalid-dependency": {
+ "version": "3.162.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.162.0.tgz",
+ "integrity": "sha512-ENZ7Jf2EcxMMdAX9/sRrt/1rzeA2WwqAKrjIacKGT9KEGQNU+omWF/h+8stLCu0Uxcg0XswFXgQCXcI1IQuZjg==",
+ "dependencies": {
+ "@aws-sdk/types": "3.162.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "node_modules/@aws-sdk/invalid-dependency/node_modules/tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ },
+ "node_modules/@aws-sdk/is-array-buffer": {
+ "version": "3.55.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.55.0.tgz",
+ "integrity": "sha512-NbiPHVYuPxdqdFd6FxzzN3H1BQn/iWA3ri3Ry7AyLeP/tGs1yzEWMwf8BN8TSMALI0GXT6Sh0GDWy3Ok5xB6DA==",
+ "dependencies": {
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/is-array-buffer/node_modules/tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ },
+ "node_modules/@aws-sdk/middleware-content-length": {
+ "version": "3.162.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.162.0.tgz",
+ "integrity": "sha512-gwuxHPBNNkr9Ah9gTNHqJ3uIp3zeY+VC2H810+RqkG5QrxU1bGAN/zezIIbcAlXjMM9vTSfO0rxGI04nhTx0BQ==",
+ "dependencies": {
+ "@aws-sdk/protocol-http": "3.162.0",
+ "@aws-sdk/types": "3.162.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/middleware-content-length/node_modules/tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ },
+ "node_modules/@aws-sdk/middleware-host-header": {
+ "version": "3.162.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.162.0.tgz",
+ "integrity": "sha512-gw5xe22P62N9yZPvrVXewM2vp70w9mLRWC1vh6pRDs0hEudAlsbXoWjB/z6jpG6ucA4Y1IOuXy5yGr9lND+zhg==",
+ "dependencies": {
+ "@aws-sdk/protocol-http": "3.162.0",
+ "@aws-sdk/types": "3.162.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/middleware-host-header/node_modules/tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ },
+ "node_modules/@aws-sdk/middleware-logger": {
+ "version": "3.162.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.162.0.tgz",
+ "integrity": "sha512-3YysLwpTZdfZkve2ytKFIwEc/WqDkxoI5kUXQq2hjsHAjLW7pEhUV00o+LJbgKjNxh38eSmmKeFlr5jnIjXHiQ==",
+ "dependencies": {
+ "@aws-sdk/types": "3.162.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/middleware-logger/node_modules/tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ },
+ "node_modules/@aws-sdk/middleware-recursion-detection": {
+ "version": "3.162.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.162.0.tgz",
+ "integrity": "sha512-AqoTnSX0JgoFuKPyWy0S+WUJqgfkVz6Os50azi32snjHmluEgLOmfeF0ixfxGFUVGxZp8WDuu/JVhwgTRKVuUA==",
+ "dependencies": {
+ "@aws-sdk/protocol-http": "3.162.0",
+ "@aws-sdk/types": "3.162.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/middleware-recursion-detection/node_modules/tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ },
+ "node_modules/@aws-sdk/middleware-retry": {
+ "version": "3.162.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.162.0.tgz",
+ "integrity": "sha512-9ZuTim8tnTgP7wNgj+RIdYzGhNgou6QBBX85qMIvngksRUgsd1CGR17HQTyYDZTKlZs7GvLt/L5FaJcOlpPUxA==",
+ "dependencies": {
+ "@aws-sdk/protocol-http": "3.162.0",
+ "@aws-sdk/service-error-classification": "3.162.0",
+ "@aws-sdk/types": "3.162.0",
+ "@aws-sdk/util-middleware": "3.162.0",
+ "tslib": "^2.3.1",
+ "uuid": "^8.3.2"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/middleware-retry/node_modules/tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ },
+ "node_modules/@aws-sdk/middleware-serde": {
+ "version": "3.162.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.162.0.tgz",
+ "integrity": "sha512-Vdgxbl7/o99CjeljQx3mTpY4cX7rc8YQykD49L2S61D6+Gkk9Zc4DMvaJDcxvR7ZUzRwjMTcMHlxbopcp1+UBA==",
+ "dependencies": {
+ "@aws-sdk/types": "3.162.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/middleware-serde/node_modules/tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ },
+ "node_modules/@aws-sdk/middleware-stack": {
+ "version": "3.162.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.162.0.tgz",
+ "integrity": "sha512-e/by4QvDl9qMQHdBnLz6n8PRglswPb3eS23qT2Wt32KVLUehMUGAf1cdns6YmYSHATK/ivFmT2QHHEnNIc+n5w==",
+ "dependencies": {
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/middleware-stack/node_modules/tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ },
+ "node_modules/@aws-sdk/middleware-user-agent": {
+ "version": "3.162.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.162.0.tgz",
+ "integrity": "sha512-aSCQk+oQbMPVHdncuend4jmd4MguLWjvi67OwKqdZjIKsSQfObCO8vwlfDM+ED3HcOfA0LwSxsFeSfQxC+WHxA==",
+ "dependencies": {
+ "@aws-sdk/protocol-http": "3.162.0",
+ "@aws-sdk/types": "3.162.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/middleware-user-agent/node_modules/tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ },
+ "node_modules/@aws-sdk/node-config-provider": {
+ "version": "3.162.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.162.0.tgz",
+ "integrity": "sha512-PgaekXCCyz/gKkbukt9zYLBJDEVgmCm0l78q5J84yJbu0FhcZY4LaAgCHdzhsgEYWTX497hokzNc3rgLdVu46A==",
+ "dependencies": {
+ "@aws-sdk/property-provider": "3.162.0",
+ "@aws-sdk/shared-ini-file-loader": "3.162.0",
+ "@aws-sdk/types": "3.162.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/node-config-provider/node_modules/tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ },
+ "node_modules/@aws-sdk/node-http-handler": {
+ "version": "3.162.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.162.0.tgz",
+ "integrity": "sha512-9jNk9SU3nNLZ1OW+fd6zHGdByUDm0FEO3Hy+J62DvbFe16x09TnVnPAoHfZ69kjz5ZNS7Gg0wmdKjUHi9T3lJQ==",
+ "dependencies": {
+ "@aws-sdk/abort-controller": "3.162.0",
+ "@aws-sdk/protocol-http": "3.162.0",
+ "@aws-sdk/querystring-builder": "3.162.0",
+ "@aws-sdk/types": "3.162.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/node-http-handler/node_modules/tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ },
+ "node_modules/@aws-sdk/property-provider": {
+ "version": "3.162.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.162.0.tgz",
+ "integrity": "sha512-kQLpibZRIrF58axcKY4Pr17YGoVBKBOWKol8jI8vlDhbFJqn14pVLohv4wZ8TzG2kKhWCF+t25YQCefWz2/lkg==",
+ "dependencies": {
+ "@aws-sdk/types": "3.162.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/property-provider/node_modules/tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ },
+ "node_modules/@aws-sdk/protocol-http": {
+ "version": "3.162.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.162.0.tgz",
+ "integrity": "sha512-xMFFxwcO+x5QoQX/LRGb3BpLCIBWC9cBOULm34rYGBySd/zQqebVJOhiKTPzaRL02WZTDNxsEEQHg97Lpe8CNw==",
+ "dependencies": {
+ "@aws-sdk/types": "3.162.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/protocol-http/node_modules/tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ },
+ "node_modules/@aws-sdk/querystring-builder": {
+ "version": "3.162.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.162.0.tgz",
+ "integrity": "sha512-3urwxCEpnQwa1B6fKmcr8R2Qmzr8VDttRSay5CgD/stbZ4XUzNsA6G1V36+EL1Vq4vMr1aZhriARioLDlhcz+g==",
+ "dependencies": {
+ "@aws-sdk/types": "3.162.0",
+ "@aws-sdk/util-uri-escape": "3.55.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/querystring-builder/node_modules/tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ },
+ "node_modules/@aws-sdk/querystring-parser": {
+ "version": "3.162.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.162.0.tgz",
+ "integrity": "sha512-0ccaGsR1O7e3BsprdYBMwGf8gmycTv1Dfz2EB5R6MiTqzcuQJ/lxpIcRh3jhUJaD1TPlUziyrBEAxtLka3HDDQ==",
+ "dependencies": {
+ "@aws-sdk/types": "3.162.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/querystring-parser/node_modules/tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ },
+ "node_modules/@aws-sdk/service-error-classification": {
+ "version": "3.162.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.162.0.tgz",
+ "integrity": "sha512-AD9XL3CHFzwVWNEzdTo9aRnJl1ImqrRLlJ5zR/5ihTIJ68ZTYEiYP4vNKSCV6UfQ+vaaRNgLwiAx7JXzY54awg==",
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/shared-ini-file-loader": {
+ "version": "3.162.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.162.0.tgz",
+ "integrity": "sha512-AGxISXns+1o6Pw+SPizFJDTw4Lwm+JSwhycCNhFU3JfdLsKfLY08JV4JHlcc+TyY4a8HhnGvE3r5t2f2dPLIsA==",
+ "dependencies": {
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/shared-ini-file-loader/node_modules/tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ },
+ "node_modules/@aws-sdk/signature-v4": {
+ "version": "3.163.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.163.0.tgz",
+ "integrity": "sha512-1iein+7iAHKcRIXaZhl/lG6JrOR/Qmk27zMqfARzxDF7o/W5arSs3DHIKytO1sOEn9zV6Mqm21dRAumD21VCCg==",
+ "dependencies": {
+ "@aws-sdk/is-array-buffer": "3.55.0",
+ "@aws-sdk/types": "3.162.0",
+ "@aws-sdk/util-hex-encoding": "3.109.0",
+ "@aws-sdk/util-middleware": "3.162.0",
+ "@aws-sdk/util-uri-escape": "3.55.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/signature-v4/node_modules/tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ },
+ "node_modules/@aws-sdk/smithy-client": {
+ "version": "3.162.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.162.0.tgz",
+ "integrity": "sha512-o7CwdhPvzYMvHY5dTzL2kqN8Zsl2D8pZ1mG2dPdQW9hYnutLOFK1HVv5dIzoSkp3jUwVGh6AXd1i4ZSb2d0LrA==",
+ "dependencies": {
+ "@aws-sdk/middleware-stack": "3.162.0",
+ "@aws-sdk/types": "3.162.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/smithy-client/node_modules/tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ },
+ "node_modules/@aws-sdk/types": {
+ "version": "3.162.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.162.0.tgz",
+ "integrity": "sha512-NBmuwVujH8fURDMvBHkHrYu/JAfG6Js/Bu0mC4o2Kdo5mRa3fD/N9kK0dEAxU1Rxp4wY2E++V9j2ZCw1KBGrSg==",
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/url-parser": {
+ "version": "3.162.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.162.0.tgz",
+ "integrity": "sha512-aJQ2awXYDceLAzPMQETpvI1XQd8oYuqH1EriFzXHqoJTNmYnHb7awtKSqwaS8pq48x1rS/eVtJAi85BG93fXyw==",
+ "dependencies": {
+ "@aws-sdk/querystring-parser": "3.162.0",
+ "@aws-sdk/types": "3.162.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "node_modules/@aws-sdk/url-parser/node_modules/tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ },
+ "node_modules/@aws-sdk/util-base64-browser": {
+ "version": "3.109.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64-browser/-/util-base64-browser-3.109.0.tgz",
+ "integrity": "sha512-lAZ6fyDGiRLaIsKT9qh7P9FGuNyZ4gAbr1YOSQk/5mHtaTuUvxlPptZuInNM/0MPQm6lpcot00D8IWTucn4PbA==",
+ "dependencies": {
+ "tslib": "^2.3.1"
+ }
+ },
+ "node_modules/@aws-sdk/util-base64-browser/node_modules/tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ },
+ "node_modules/@aws-sdk/util-base64-node": {
+ "version": "3.55.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64-node/-/util-base64-node-3.55.0.tgz",
+ "integrity": "sha512-UQ/ZuNoAc8CFMpSiRYmevaTsuRKzLwulZTnM8LNlIt9Wx1tpNvqp80cfvVj7yySKROtEi20wq29h31dZf1eYNQ==",
+ "dependencies": {
+ "@aws-sdk/util-buffer-from": "3.55.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/util-base64-node/node_modules/tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ },
+ "node_modules/@aws-sdk/util-body-length-browser": {
+ "version": "3.154.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.154.0.tgz",
+ "integrity": "sha512-TUuy7paVkBRQrB/XFCsL8iTW6g/ma0S3N8dYOiIMJdeTqTFryeyOGkBpYBgYFQL6zRMZpyu0jOM7GYEffGFOXw==",
+ "dependencies": {
+ "tslib": "^2.3.1"
+ }
+ },
+ "node_modules/@aws-sdk/util-body-length-browser/node_modules/tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ },
+ "node_modules/@aws-sdk/util-body-length-node": {
+ "version": "3.55.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-node/-/util-body-length-node-3.55.0.tgz",
+ "integrity": "sha512-lU1d4I+9wJwydduXs0SxSfd+mHKjxeyd39VwOv6i2KSwWkPbji9UQqpflKLKw+r45jL7+xU/zfeTUg5Tt/3Gew==",
+ "dependencies": {
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/util-body-length-node/node_modules/tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ },
+ "node_modules/@aws-sdk/util-buffer-from": {
+ "version": "3.55.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-3.55.0.tgz",
+ "integrity": "sha512-uVzKG1UgvnV7XX2FPTylBujYMKBPBaq/qFBxfl0LVNfrty7YjpfieQxAe6yRLD+T0Kir/WDQwGvYC+tOYG3IGA==",
+ "dependencies": {
+ "@aws-sdk/is-array-buffer": "3.55.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/util-buffer-from/node_modules/tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ },
+ "node_modules/@aws-sdk/util-config-provider": {
+ "version": "3.109.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-config-provider/-/util-config-provider-3.109.0.tgz",
+ "integrity": "sha512-GrAZl/aBv0A28LkyNyq8SPJ5fmViCwz80fWLMeWx/6q5AbivuILogjlWwEZSvZ9zrlHOcFC0+AnCa5pQrjaslw==",
+ "dependencies": {
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/util-config-provider/node_modules/tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ },
+ "node_modules/@aws-sdk/util-defaults-mode-browser": {
+ "version": "3.162.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.162.0.tgz",
+ "integrity": "sha512-BjhuriainNy0ezFqCK//380Wc4xsJJOnq1tmPlHScQxp3g8ucfClvjOUi96XQaTrEf8c8EsYp77+JNsvrHytmw==",
+ "dependencies": {
+ "@aws-sdk/property-provider": "3.162.0",
+ "@aws-sdk/types": "3.162.0",
+ "bowser": "^2.11.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/util-defaults-mode-browser/node_modules/tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ },
+ "node_modules/@aws-sdk/util-defaults-mode-node": {
+ "version": "3.163.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.163.0.tgz",
+ "integrity": "sha512-IM5BVeUXzLpb9m8qBSpUc2iO+topP1F7Ojq1GNrl5G/b22f7b1FCL5qkTem/UIXkkgI+efI7jr05xPRGiU73Hg==",
+ "dependencies": {
+ "@aws-sdk/config-resolver": "3.163.0",
+ "@aws-sdk/credential-provider-imds": "3.162.0",
+ "@aws-sdk/node-config-provider": "3.162.0",
+ "@aws-sdk/property-provider": "3.162.0",
+ "@aws-sdk/types": "3.162.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/util-defaults-mode-node/node_modules/tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ },
+ "node_modules/@aws-sdk/util-hex-encoding": {
+ "version": "3.109.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.109.0.tgz",
+ "integrity": "sha512-s8CgTNrn3cLkrdiohfxLuOYPCanzvHn/aH5RW6DaMoeQiG5Hl9QUiP/WtdQ9QQx3xvpQFpmvxIaSBwSgFNLQxA==",
+ "dependencies": {
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/util-hex-encoding/node_modules/tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ },
+ "node_modules/@aws-sdk/util-locate-window": {
+ "version": "3.55.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.55.0.tgz",
+ "integrity": "sha512-0sPmK2JaJE2BbTcnvybzob/VrFKCXKfN4CUKcvn0yGg/me7Bz+vtzQRB3Xp+YSx+7OtWxzv63wsvHoAnXvgxgg==",
+ "dependencies": {
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/util-locate-window/node_modules/tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ },
+ "node_modules/@aws-sdk/util-middleware": {
+ "version": "3.162.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.162.0.tgz",
+ "integrity": "sha512-jDqZZ5nst+NtzvAPIQBdQqGY14Z3HeGANGm5NUoxWp8IlHnEV7GhTFDjFgubf8mgTBCzHnvbuBY1bfkzAeXWBA==",
+ "dependencies": {
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/util-middleware/node_modules/tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ },
+ "node_modules/@aws-sdk/util-uri-escape": {
+ "version": "3.55.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-3.55.0.tgz",
+ "integrity": "sha512-mmdDLUpFCN2nkfwlLdOM54lTD528GiGSPN1qb8XtGLgZsJUmg3uJSFIN2lPeSbEwJB3NFjVas/rnQC48i7mV8w==",
+ "dependencies": {
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/util-uri-escape/node_modules/tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ },
+ "node_modules/@aws-sdk/util-user-agent-browser": {
+ "version": "3.162.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.162.0.tgz",
+ "integrity": "sha512-FNmC2ywy1u3tbUSVCSkCwLvcbjIvj5EzAtF6I2wrMTI5PfaxVIQapKn2EecoVQgf4lsZqvGjyTxbl7SYvf9fxw==",
+ "dependencies": {
+ "@aws-sdk/types": "3.162.0",
+ "bowser": "^2.11.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "node_modules/@aws-sdk/util-user-agent-browser/node_modules/tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ },
+ "node_modules/@aws-sdk/util-user-agent-node": {
+ "version": "3.162.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.162.0.tgz",
+ "integrity": "sha512-OIbZlccBFwITDQJoymU0V+yqqyPEbJUExJzeiP9bxJ58h7Jxj/da24cxCMaVDYvjhP/PoflOmC5Xblonaeg+oQ==",
+ "dependencies": {
+ "@aws-sdk/node-config-provider": "3.162.0",
+ "@aws-sdk/types": "3.162.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "peerDependencies": {
+ "aws-crt": ">=1.0.0"
+ },
+ "peerDependenciesMeta": {
+ "aws-crt": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@aws-sdk/util-user-agent-node/node_modules/tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ },
+ "node_modules/@aws-sdk/util-utf8-browser": {
+ "version": "3.109.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.109.0.tgz",
+ "integrity": "sha512-FmcGSz0v7Bqpl1SE8G1Gc0CtDpug+rvqNCG/szn86JApD/f5x8oByjbEiAyTU2ZH2VevUntx6EW68ulHyH+x+w==",
+ "dependencies": {
+ "tslib": "^2.3.1"
+ }
+ },
+ "node_modules/@aws-sdk/util-utf8-browser/node_modules/tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ },
+ "node_modules/@aws-sdk/util-utf8-node": {
+ "version": "3.109.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-node/-/util-utf8-node-3.109.0.tgz",
+ "integrity": "sha512-Ti/ZBdvz2eSTElsucjzNmzpyg2MwfD1rXmxD0hZuIF8bPON/0+sZYnWd5CbDw9kgmhy28dmKue086tbZ1G0iLQ==",
+ "dependencies": {
+ "@aws-sdk/util-buffer-from": "3.55.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/util-utf8-node/node_modules/tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ },
+ "node_modules/@babel/runtime": {
+ "version": "7.19.4",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.4.tgz",
+ "integrity": "sha512-EXpLCrk55f+cYqmHsSR+yD/0gAIMxxA9QK9lnQWzhMCvt+YmoBN7Zx94s++Kv0+unHk39vxNO8t+CMA2WSS3wA==",
+ "dependencies": {
+ "regenerator-runtime": "^0.13.4"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@iiif/parser": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@iiif/parser/-/parser-1.1.0.tgz",
+ "integrity": "sha512-p2pqngR/L+ML+LS8Ah70CTITgW192fmWXxOovSapQnI5rKN6daYrbjl5UuIK9R+n0lFFlJwjW5+tA96E+V39hw==",
+ "dependencies": {
+ "@iiif/presentation-2": "^1.0.4",
+ "@iiif/presentation-3": "^1.1.3",
+ "@types/geojson": "^7946.0.8"
+ }
+ },
+ "node_modules/@iiif/presentation-2": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/@iiif/presentation-2/-/presentation-2-1.0.4.tgz",
+ "integrity": "sha512-hJakpq62VBajesLJrYPtFm6hcn6c/HkKP7CmKZ5atuzu40m0nifWYsqigR1l9sZGvhhHb/DRshPmiW/0GNrJoA==",
+ "peerDependencies": {
+ "@iiif/presentation-3": "*"
+ }
+ },
+ "node_modules/@iiif/presentation-3": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/@iiif/presentation-3/-/presentation-3-1.1.3.tgz",
+ "integrity": "sha512-Ek+25nkQouo0pXAqCsWYbAeS4jLDEBQA7iul2jzgnvoJrucxDQN2lXyNLgOUDRqpTdSqJ69iz5lm6DLaxil+Nw==",
+ "dependencies": {
+ "@types/geojson": "^7946.0.7"
+ }
+ },
+ "node_modules/@iiif/vault": {
+ "version": "0.9.19",
+ "resolved": "https://registry.npmjs.org/@iiif/vault/-/vault-0.9.19.tgz",
+ "integrity": "sha512-YoRp4waV1mGMOJaaTpzn/YnZKRnHZdbXwCt2LbCA89CZhtlTh6QUhs04KWNrGxrxnk/Wtt67/U4SyZgD10g0NQ==",
+ "dependencies": {
+ "@iiif/parser": "1.*",
+ "@iiif/presentation-2": "1.*",
+ "@iiif/presentation-3": "1.*",
+ "mitt": "^3.0.0",
+ "node-fetch": "^3.1.1",
+ "redux": "^4.1.2",
+ "tiny-invariant": "^1.2.0",
+ "typesafe-actions": "^5.1.0"
+ }
+ },
+ "node_modules/@types/geojson": {
+ "version": "7946.0.10",
+ "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.10.tgz",
+ "integrity": "sha512-Nmh0K3iWQJzniTuPRcJn5hxXkfB1T1pgB89SBig5PlJQU5yocazeu4jATJlaA0GYFKWMqDdvYemoSnF2pXgLVA=="
+ },
+ "node_modules/asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
+ },
+ "node_modules/axios": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz",
+ "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==",
+ "dependencies": {
+ "follow-redirects": "^1.14.9",
+ "form-data": "^4.0.0"
+ }
+ },
+ "node_modules/bowser": {
+ "version": "2.11.0",
+ "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz",
+ "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA=="
+ },
+ "node_modules/buffer-equal-constant-time": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
+ "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA=="
+ },
+ "node_modules/combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "dependencies": {
+ "delayed-stream": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/cookie": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
+ "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/data-uri-to-buffer": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz",
+ "integrity": "sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA==",
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/detect-indent": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz",
+ "integrity": "sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/detect-newline": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz",
+ "integrity": "sha512-CwffZFvlJffUg9zZA0uqrjQayUTC8ob94pnr5sFwaVv3IOmkfUHcWH+jXaQK3askE51Cqe8/9Ql/0uXNwqZ8Zg==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ecdsa-sig-formatter": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
+ "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
+ "dependencies": {
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/fetch-blob": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz",
+ "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/jimmywarting"
+ },
+ {
+ "type": "paypal",
+ "url": "https://paypal.me/jimmywarting"
+ }
+ ],
+ "dependencies": {
+ "node-domexception": "^1.0.0",
+ "web-streams-polyfill": "^3.0.3"
+ },
+ "engines": {
+ "node": "^12.20 || >= 14.13"
+ }
+ },
+ "node_modules/follow-redirects": {
+ "version": "1.15.1",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz",
+ "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/RubenVerborgh"
+ }
+ ],
+ "engines": {
+ "node": ">=4.0"
+ },
+ "peerDependenciesMeta": {
+ "debug": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/form-data": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
+ "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/formdata-polyfill": {
+ "version": "4.0.10",
+ "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz",
+ "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==",
+ "dependencies": {
+ "fetch-blob": "^3.1.2"
+ },
+ "engines": {
+ "node": ">=12.20.0"
+ }
+ },
+ "node_modules/iiif-builder": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/iiif-builder/-/iiif-builder-1.0.6.tgz",
+ "integrity": "sha512-nNmDDBmbH97Z3HxJ969OBsDaUXgM0cYDZa4/7mH6D8LdzuFHy/4cDzmRQKYdg5BztCD+Ec5fNPDgfvKekwJ/vw==",
+ "dependencies": {
+ "@iiif/parser": "1.x",
+ "@iiif/presentation-3": "1.x",
+ "@iiif/vault": "0.9.x || 1.x"
+ }
+ },
+ "node_modules/jsonwebtoken": {
+ "version": "8.5.1",
+ "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz",
+ "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==",
+ "dependencies": {
+ "jws": "^3.2.2",
+ "lodash.includes": "^4.3.0",
+ "lodash.isboolean": "^3.0.3",
+ "lodash.isinteger": "^4.0.4",
+ "lodash.isnumber": "^3.0.3",
+ "lodash.isplainobject": "^4.0.6",
+ "lodash.isstring": "^4.0.1",
+ "lodash.once": "^4.0.0",
+ "ms": "^2.1.1",
+ "semver": "^5.6.0"
+ },
+ "engines": {
+ "node": ">=4",
+ "npm": ">=1.4.28"
+ }
+ },
+ "node_modules/jwa": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz",
+ "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==",
+ "dependencies": {
+ "buffer-equal-constant-time": "1.0.1",
+ "ecdsa-sig-formatter": "1.0.11",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/jws": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz",
+ "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==",
+ "dependencies": {
+ "jwa": "^1.4.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/lodash.includes": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
+ "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w=="
+ },
+ "node_modules/lodash.isboolean": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
+ "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg=="
+ },
+ "node_modules/lodash.isinteger": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz",
+ "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA=="
+ },
+ "node_modules/lodash.isnumber": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz",
+ "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw=="
+ },
+ "node_modules/lodash.isobject": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-3.0.2.tgz",
+ "integrity": "sha512-3/Qptq2vr7WeJbB4KHUSKlq8Pl7ASXi3UG6CMbBm8WRtXi8+GHm7mKaU3urfpSEzWe2wCIChs6/sdocUsTKJiA=="
+ },
+ "node_modules/lodash.isplainobject": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
+ "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA=="
+ },
+ "node_modules/lodash.isstring": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
+ "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw=="
+ },
+ "node_modules/lodash.once": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
+ "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg=="
+ },
+ "node_modules/lz-string": {
+ "version": "1.4.4",
+ "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.4.4.tgz",
+ "integrity": "sha512-0ckx7ZHRPqb0oUm8zNr+90mtf9DQB60H1wMCjBtfi62Kl3a7JbHob6gA2bC+xRvZoOL+1hzUK8jeuEIQE8svEQ==",
+ "bin": {
+ "lz-string": "bin/bin.js"
+ }
+ },
+ "node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/minimist": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz",
+ "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/mitt": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.0.tgz",
+ "integrity": "sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ=="
+ },
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
+ },
+ "node_modules/node-domexception": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz",
+ "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/jimmywarting"
+ },
+ {
+ "type": "github",
+ "url": "https://paypal.me/jimmywarting"
+ }
+ ],
+ "engines": {
+ "node": ">=10.5.0"
+ }
+ },
+ "node_modules/node-fetch": {
+ "version": "3.2.10",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.2.10.tgz",
+ "integrity": "sha512-MhuzNwdURnZ1Cp4XTazr69K0BTizsBroX7Zx3UgDSVcZYKF/6p0CBe4EUb/hLqmzVhl0UpYfgRljQ4yxE+iCxA==",
+ "dependencies": {
+ "data-uri-to-buffer": "^4.0.0",
+ "fetch-blob": "^3.1.4",
+ "formdata-polyfill": "^4.0.10"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/node-fetch"
+ }
+ },
+ "node_modules/parse-http-header": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parse-http-header/-/parse-http-header-1.0.1.tgz",
+ "integrity": "sha512-xOoH7vzokDoenX4e3c+4ik8lf30kq9Pawq20TH5uq3RURsIJquqFTE0gS7OAEE6nvMQzuP5OXxubYuN7YLsTiw=="
+ },
+ "node_modules/redux": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.0.tgz",
+ "integrity": "sha512-oSBmcKKIuIR4ME29/AeNUnl5L+hvBq7OaJWzaptTQJAntaPvxIJqfnjbaEiCzzaIz+XmVILfqAM3Ob0aXLPfjA==",
+ "dependencies": {
+ "@babel/runtime": "^7.9.2"
+ }
+ },
+ "node_modules/regenerator-runtime": {
+ "version": "0.13.10",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz",
+ "integrity": "sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw=="
+ },
+ "node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/sort-json": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/sort-json/-/sort-json-2.0.1.tgz",
+ "integrity": "sha512-s8cs2bcsQCzo/P2T/uoU6Js4dS/jnX8+4xunziNoq9qmSpZNCrRIAIvp4avsz0ST18HycV4z/7myJ7jsHWB2XQ==",
+ "dependencies": {
+ "detect-indent": "^5.0.0",
+ "detect-newline": "^2.1.0",
+ "minimist": "^1.2.0"
+ },
+ "bin": {
+ "sort-json": "app/cmd.js"
+ }
+ },
+ "node_modules/tiny-invariant": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz",
+ "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw=="
+ },
+ "node_modules/tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
+ },
+ "node_modules/typesafe-actions": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/typesafe-actions/-/typesafe-actions-5.1.0.tgz",
+ "integrity": "sha512-bna6Yi1pRznoo6Bz1cE6btB/Yy8Xywytyfrzu/wc+NFW3ZF0I+2iCGImhBsoYYCOWuICtRO4yHcnDlzgo1AdNg==",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/uuid": {
+ "version": "8.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
+ "node_modules/web-streams-polyfill": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz",
+ "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==",
+ "engines": {
+ "node": ">= 8"
+ }
+ }
+ },
+ "dependencies": {
+ "@aws-crypto/ie11-detection": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-2.0.0.tgz",
+ "integrity": "sha512-pkVXf/dq6PITJ0jzYZ69VhL8VFOFoPZLZqtU/12SGnzYuJOOGNfF41q9GxdI1yqC8R13Rq3jOLKDFpUJFT5eTA==",
+ "requires": {
+ "tslib": "^1.11.1"
+ }
+ },
+ "@aws-crypto/sha256-browser": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-2.0.1.tgz",
+ "integrity": "sha512-P4Af7E2iJqZN2HYMdWINEg++OC2CtP1ygTx6WQCzZISQA+i3Q+K3E8S8t/PSYqUnvtfh5XVjbFT9uA+4IT8C2w==",
+ "requires": {
+ "@aws-crypto/ie11-detection": "^2.0.0",
+ "@aws-crypto/sha256-js": "^2.0.1",
+ "@aws-crypto/supports-web-crypto": "^2.0.0",
+ "@aws-crypto/util": "^2.0.1",
+ "@aws-sdk/types": "^3.1.0",
+ "@aws-sdk/util-locate-window": "^3.0.0",
+ "@aws-sdk/util-utf8-browser": "^3.0.0",
+ "tslib": "^1.11.1"
+ }
+ },
+ "@aws-crypto/sha256-js": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-2.0.1.tgz",
+ "integrity": "sha512-mbHTBSPBvg6o/mN/c18Z/zifM05eJrapj5ggoOIeHIWckvkv5VgGi7r/wYpt+QAO2ySKXLNvH2d8L7bne4xrMQ==",
+ "requires": {
+ "@aws-crypto/util": "^2.0.1",
+ "@aws-sdk/types": "^3.1.0",
+ "tslib": "^1.11.1"
+ }
+ },
+ "@aws-crypto/supports-web-crypto": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-2.0.0.tgz",
+ "integrity": "sha512-Ge7WQ3E0OC7FHYprsZV3h0QIcpdyJLvIeg+uTuHqRYm8D6qCFJoiC+edSzSyFiHtZf+NOQDJ1q46qxjtzIY2nA==",
+ "requires": {
+ "tslib": "^1.11.1"
+ }
+ },
+ "@aws-crypto/util": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-2.0.1.tgz",
+ "integrity": "sha512-JJmFFwvbm08lULw4Nm5QOLg8+lAQeC8aCXK5xrtxntYzYXCGfHwUJ4Is3770Q7HmICsXthGQ+ZsDL7C2uH3yBQ==",
+ "requires": {
+ "@aws-sdk/types": "^3.1.0",
+ "@aws-sdk/util-utf8-browser": "^3.0.0",
+ "tslib": "^1.11.1"
+ }
+ },
+ "@aws-sdk/abort-controller": {
+ "version": "3.162.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.162.0.tgz",
+ "integrity": "sha512-8j1f/g+pNny3HkOojl+6phwd1yQE0FmM6EdssRJPA/IpR+SE0qTva2psKfZA9DivAg+/iTBozVCQU5GUJY1F2A==",
+ "requires": {
+ "@aws-sdk/types": "3.162.0",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ }
+ }
+ },
+ "@aws-sdk/client-sso": {
+ "version": "3.165.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.165.0.tgz",
+ "integrity": "sha512-Cizf03z6UFgHWOIQYOjZdNwUhoh6yhT5B2dH+mh1q+Naq1zsLmD2PUvx7SM+0fZsN9MhOICLyBSE/nSSE7E8Kg==",
+ "requires": {
+ "@aws-crypto/sha256-browser": "2.0.0",
+ "@aws-crypto/sha256-js": "2.0.0",
+ "@aws-sdk/config-resolver": "3.163.0",
+ "@aws-sdk/fetch-http-handler": "3.162.0",
+ "@aws-sdk/hash-node": "3.162.0",
+ "@aws-sdk/invalid-dependency": "3.162.0",
+ "@aws-sdk/middleware-content-length": "3.162.0",
+ "@aws-sdk/middleware-host-header": "3.162.0",
+ "@aws-sdk/middleware-logger": "3.162.0",
+ "@aws-sdk/middleware-recursion-detection": "3.162.0",
+ "@aws-sdk/middleware-retry": "3.162.0",
+ "@aws-sdk/middleware-serde": "3.162.0",
+ "@aws-sdk/middleware-stack": "3.162.0",
+ "@aws-sdk/middleware-user-agent": "3.162.0",
+ "@aws-sdk/node-config-provider": "3.162.0",
+ "@aws-sdk/node-http-handler": "3.162.0",
+ "@aws-sdk/protocol-http": "3.162.0",
+ "@aws-sdk/smithy-client": "3.162.0",
+ "@aws-sdk/types": "3.162.0",
+ "@aws-sdk/url-parser": "3.162.0",
+ "@aws-sdk/util-base64-browser": "3.109.0",
+ "@aws-sdk/util-base64-node": "3.55.0",
+ "@aws-sdk/util-body-length-browser": "3.154.0",
+ "@aws-sdk/util-body-length-node": "3.55.0",
+ "@aws-sdk/util-defaults-mode-browser": "3.162.0",
+ "@aws-sdk/util-defaults-mode-node": "3.163.0",
+ "@aws-sdk/util-user-agent-browser": "3.162.0",
+ "@aws-sdk/util-user-agent-node": "3.162.0",
+ "@aws-sdk/util-utf8-browser": "3.109.0",
+ "@aws-sdk/util-utf8-node": "3.109.0",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "@aws-crypto/sha256-browser": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-2.0.0.tgz",
+ "integrity": "sha512-rYXOQ8BFOaqMEHJrLHul/25ckWH6GTJtdLSajhlqGMx0PmSueAuvboCuZCTqEKlxR8CQOwRarxYMZZSYlhRA1A==",
+ "requires": {
+ "@aws-crypto/ie11-detection": "^2.0.0",
+ "@aws-crypto/sha256-js": "^2.0.0",
+ "@aws-crypto/supports-web-crypto": "^2.0.0",
+ "@aws-crypto/util": "^2.0.0",
+ "@aws-sdk/types": "^3.1.0",
+ "@aws-sdk/util-locate-window": "^3.0.0",
+ "@aws-sdk/util-utf8-browser": "^3.0.0",
+ "tslib": "^1.11.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
+ }
+ }
+ },
+ "@aws-crypto/sha256-js": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-2.0.0.tgz",
+ "integrity": "sha512-VZY+mCY4Nmrs5WGfitmNqXzaE873fcIZDu54cbaDaaamsaTOP1DBImV9F4pICc3EHjQXujyE8jig+PFCaew9ig==",
+ "requires": {
+ "@aws-crypto/util": "^2.0.0",
+ "@aws-sdk/types": "^3.1.0",
+ "tslib": "^1.11.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
+ }
+ }
+ },
+ "tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ }
+ }
+ },
+ "@aws-sdk/config-resolver": {
+ "version": "3.163.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.163.0.tgz",
+ "integrity": "sha512-iBl5Zc3+VRGJy6n+aMcg++7tzYi4G1bHia6v/eF93SvdKxtRv40M9QnqoNfaNUuw9U2ltwKOHepw7J3bkOA8cQ==",
+ "requires": {
+ "@aws-sdk/signature-v4": "3.163.0",
+ "@aws-sdk/types": "3.162.0",
+ "@aws-sdk/util-config-provider": "3.109.0",
+ "@aws-sdk/util-middleware": "3.162.0",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ }
+ }
+ },
+ "@aws-sdk/credential-provider-env": {
+ "version": "3.162.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.162.0.tgz",
+ "integrity": "sha512-yzCJXiAAbZZHB4iThi4I+rs+gTYwBSetdU4Z1D89a2xjcOjCa8IhdQKm3GO/uJMScy4VtW3EEFG4/zZ7dVQPOw==",
+ "requires": {
+ "@aws-sdk/property-provider": "3.162.0",
+ "@aws-sdk/types": "3.162.0",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ }
+ }
+ },
+ "@aws-sdk/credential-provider-imds": {
+ "version": "3.162.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.162.0.tgz",
+ "integrity": "sha512-ohrHMIu2MNauPjbE8mEMKtlEQH/VZdpNswPigaEejUGVumz0NSft9PlIn2X79sNX5Y+uXopynMQF4MZj773hTw==",
+ "requires": {
+ "@aws-sdk/node-config-provider": "3.162.0",
+ "@aws-sdk/property-provider": "3.162.0",
+ "@aws-sdk/types": "3.162.0",
+ "@aws-sdk/url-parser": "3.162.0",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ }
+ }
+ },
+ "@aws-sdk/credential-provider-ini": {
+ "version": "3.165.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.165.0.tgz",
+ "integrity": "sha512-NrLe29bdhmpNPsEsYxUxb0hTxNMXCmz5pH2l/T9COT6SMxom1wpbB/aKwf9897Z1xvhoFi6flDQjmu//599BZw==",
+ "requires": {
+ "@aws-sdk/credential-provider-env": "3.162.0",
+ "@aws-sdk/credential-provider-imds": "3.162.0",
+ "@aws-sdk/credential-provider-sso": "3.165.0",
+ "@aws-sdk/credential-provider-web-identity": "3.162.0",
+ "@aws-sdk/property-provider": "3.162.0",
+ "@aws-sdk/shared-ini-file-loader": "3.162.0",
+ "@aws-sdk/types": "3.162.0",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ }
+ }
+ },
+ "@aws-sdk/credential-provider-node": {
+ "version": "3.165.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.165.0.tgz",
+ "integrity": "sha512-emUd3kqAvV8Qydn5pJ+YKo47UJ+B5RXNyQXMasNQsw1jxrB60j8QAIL9JGM019SzZBnHZuW3DrHClA17OVC+xQ==",
+ "requires": {
+ "@aws-sdk/credential-provider-env": "3.162.0",
+ "@aws-sdk/credential-provider-imds": "3.162.0",
+ "@aws-sdk/credential-provider-ini": "3.165.0",
+ "@aws-sdk/credential-provider-process": "3.162.0",
+ "@aws-sdk/credential-provider-sso": "3.165.0",
+ "@aws-sdk/credential-provider-web-identity": "3.162.0",
+ "@aws-sdk/property-provider": "3.162.0",
+ "@aws-sdk/shared-ini-file-loader": "3.162.0",
+ "@aws-sdk/types": "3.162.0",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ }
+ }
+ },
+ "@aws-sdk/credential-provider-process": {
+ "version": "3.162.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.162.0.tgz",
+ "integrity": "sha512-KtmYjlCMAa0XF3IJo4dxSF+OWmRoHbrdEHGEZw+j6iCZ3Nz6Y6xCsdxun5rAKdom1QRNMDR4wX0hRAdPYobW2w==",
+ "requires": {
+ "@aws-sdk/property-provider": "3.162.0",
+ "@aws-sdk/shared-ini-file-loader": "3.162.0",
+ "@aws-sdk/types": "3.162.0",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ }
+ }
+ },
+ "@aws-sdk/credential-provider-sso": {
+ "version": "3.165.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.165.0.tgz",
+ "integrity": "sha512-b2BuYyUSmnfChhz5ZbnqOaLSAsnzYcwpEPEUbQUdNGPSE3QcMd0SPl3woH82095WYlXTFjwgxlOPn5ad5hdBpA==",
+ "requires": {
+ "@aws-sdk/client-sso": "3.165.0",
+ "@aws-sdk/property-provider": "3.162.0",
+ "@aws-sdk/shared-ini-file-loader": "3.162.0",
+ "@aws-sdk/types": "3.162.0",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ }
+ }
+ },
+ "@aws-sdk/credential-provider-web-identity": {
+ "version": "3.162.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.162.0.tgz",
+ "integrity": "sha512-vy86OS5/h+Vfk1bxvWjbayyUtFNdwU+mfALin3zxJbFqneSxRBydNBomt/guJjapZE+h865lkteyOsqsYMskzQ==",
+ "requires": {
+ "@aws-sdk/property-provider": "3.162.0",
+ "@aws-sdk/types": "3.162.0",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ }
+ }
+ },
+ "@aws-sdk/fetch-http-handler": {
+ "version": "3.162.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.162.0.tgz",
+ "integrity": "sha512-DZLxxEqSMXqKteYohO4w6uoORabpETWso6wBdIFMul1BbEseqLjub1594D5RA18cqkcM2dV4ttw+boPPzOjSAw==",
+ "requires": {
+ "@aws-sdk/protocol-http": "3.162.0",
+ "@aws-sdk/querystring-builder": "3.162.0",
+ "@aws-sdk/types": "3.162.0",
+ "@aws-sdk/util-base64-browser": "3.109.0",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ }
+ }
+ },
+ "@aws-sdk/hash-node": {
+ "version": "3.162.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.162.0.tgz",
+ "integrity": "sha512-lfyyAb0Cd084QnUNLTkYowD8RW3L5Tb9lNnIMH6HY7uSE/obw1j/OnLUPqpey628WJ5DPyyvNBah3Vu+JVZ5Mw==",
+ "requires": {
+ "@aws-sdk/types": "3.162.0",
+ "@aws-sdk/util-buffer-from": "3.55.0",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ }
+ }
+ },
+ "@aws-sdk/invalid-dependency": {
+ "version": "3.162.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.162.0.tgz",
+ "integrity": "sha512-ENZ7Jf2EcxMMdAX9/sRrt/1rzeA2WwqAKrjIacKGT9KEGQNU+omWF/h+8stLCu0Uxcg0XswFXgQCXcI1IQuZjg==",
+ "requires": {
+ "@aws-sdk/types": "3.162.0",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ }
+ }
+ },
+ "@aws-sdk/is-array-buffer": {
+ "version": "3.55.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.55.0.tgz",
+ "integrity": "sha512-NbiPHVYuPxdqdFd6FxzzN3H1BQn/iWA3ri3Ry7AyLeP/tGs1yzEWMwf8BN8TSMALI0GXT6Sh0GDWy3Ok5xB6DA==",
+ "requires": {
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ }
+ }
+ },
+ "@aws-sdk/middleware-content-length": {
+ "version": "3.162.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.162.0.tgz",
+ "integrity": "sha512-gwuxHPBNNkr9Ah9gTNHqJ3uIp3zeY+VC2H810+RqkG5QrxU1bGAN/zezIIbcAlXjMM9vTSfO0rxGI04nhTx0BQ==",
+ "requires": {
+ "@aws-sdk/protocol-http": "3.162.0",
+ "@aws-sdk/types": "3.162.0",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ }
+ }
+ },
+ "@aws-sdk/middleware-host-header": {
+ "version": "3.162.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.162.0.tgz",
+ "integrity": "sha512-gw5xe22P62N9yZPvrVXewM2vp70w9mLRWC1vh6pRDs0hEudAlsbXoWjB/z6jpG6ucA4Y1IOuXy5yGr9lND+zhg==",
+ "requires": {
+ "@aws-sdk/protocol-http": "3.162.0",
+ "@aws-sdk/types": "3.162.0",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ }
+ }
+ },
+ "@aws-sdk/middleware-logger": {
+ "version": "3.162.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.162.0.tgz",
+ "integrity": "sha512-3YysLwpTZdfZkve2ytKFIwEc/WqDkxoI5kUXQq2hjsHAjLW7pEhUV00o+LJbgKjNxh38eSmmKeFlr5jnIjXHiQ==",
+ "requires": {
+ "@aws-sdk/types": "3.162.0",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ }
+ }
+ },
+ "@aws-sdk/middleware-recursion-detection": {
+ "version": "3.162.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.162.0.tgz",
+ "integrity": "sha512-AqoTnSX0JgoFuKPyWy0S+WUJqgfkVz6Os50azi32snjHmluEgLOmfeF0ixfxGFUVGxZp8WDuu/JVhwgTRKVuUA==",
+ "requires": {
+ "@aws-sdk/protocol-http": "3.162.0",
+ "@aws-sdk/types": "3.162.0",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ }
+ }
+ },
+ "@aws-sdk/middleware-retry": {
+ "version": "3.162.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.162.0.tgz",
+ "integrity": "sha512-9ZuTim8tnTgP7wNgj+RIdYzGhNgou6QBBX85qMIvngksRUgsd1CGR17HQTyYDZTKlZs7GvLt/L5FaJcOlpPUxA==",
+ "requires": {
+ "@aws-sdk/protocol-http": "3.162.0",
+ "@aws-sdk/service-error-classification": "3.162.0",
+ "@aws-sdk/types": "3.162.0",
+ "@aws-sdk/util-middleware": "3.162.0",
+ "tslib": "^2.3.1",
+ "uuid": "^8.3.2"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ }
+ }
+ },
+ "@aws-sdk/middleware-serde": {
+ "version": "3.162.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.162.0.tgz",
+ "integrity": "sha512-Vdgxbl7/o99CjeljQx3mTpY4cX7rc8YQykD49L2S61D6+Gkk9Zc4DMvaJDcxvR7ZUzRwjMTcMHlxbopcp1+UBA==",
+ "requires": {
+ "@aws-sdk/types": "3.162.0",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ }
+ }
+ },
+ "@aws-sdk/middleware-stack": {
+ "version": "3.162.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.162.0.tgz",
+ "integrity": "sha512-e/by4QvDl9qMQHdBnLz6n8PRglswPb3eS23qT2Wt32KVLUehMUGAf1cdns6YmYSHATK/ivFmT2QHHEnNIc+n5w==",
+ "requires": {
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ }
+ }
+ },
+ "@aws-sdk/middleware-user-agent": {
+ "version": "3.162.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.162.0.tgz",
+ "integrity": "sha512-aSCQk+oQbMPVHdncuend4jmd4MguLWjvi67OwKqdZjIKsSQfObCO8vwlfDM+ED3HcOfA0LwSxsFeSfQxC+WHxA==",
+ "requires": {
+ "@aws-sdk/protocol-http": "3.162.0",
+ "@aws-sdk/types": "3.162.0",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ }
+ }
+ },
+ "@aws-sdk/node-config-provider": {
+ "version": "3.162.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.162.0.tgz",
+ "integrity": "sha512-PgaekXCCyz/gKkbukt9zYLBJDEVgmCm0l78q5J84yJbu0FhcZY4LaAgCHdzhsgEYWTX497hokzNc3rgLdVu46A==",
+ "requires": {
+ "@aws-sdk/property-provider": "3.162.0",
+ "@aws-sdk/shared-ini-file-loader": "3.162.0",
+ "@aws-sdk/types": "3.162.0",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ }
+ }
+ },
+ "@aws-sdk/node-http-handler": {
+ "version": "3.162.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.162.0.tgz",
+ "integrity": "sha512-9jNk9SU3nNLZ1OW+fd6zHGdByUDm0FEO3Hy+J62DvbFe16x09TnVnPAoHfZ69kjz5ZNS7Gg0wmdKjUHi9T3lJQ==",
+ "requires": {
+ "@aws-sdk/abort-controller": "3.162.0",
+ "@aws-sdk/protocol-http": "3.162.0",
+ "@aws-sdk/querystring-builder": "3.162.0",
+ "@aws-sdk/types": "3.162.0",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ }
+ }
+ },
+ "@aws-sdk/property-provider": {
+ "version": "3.162.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.162.0.tgz",
+ "integrity": "sha512-kQLpibZRIrF58axcKY4Pr17YGoVBKBOWKol8jI8vlDhbFJqn14pVLohv4wZ8TzG2kKhWCF+t25YQCefWz2/lkg==",
+ "requires": {
+ "@aws-sdk/types": "3.162.0",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ }
+ }
+ },
+ "@aws-sdk/protocol-http": {
+ "version": "3.162.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.162.0.tgz",
+ "integrity": "sha512-xMFFxwcO+x5QoQX/LRGb3BpLCIBWC9cBOULm34rYGBySd/zQqebVJOhiKTPzaRL02WZTDNxsEEQHg97Lpe8CNw==",
+ "requires": {
+ "@aws-sdk/types": "3.162.0",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ }
+ }
+ },
+ "@aws-sdk/querystring-builder": {
+ "version": "3.162.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.162.0.tgz",
+ "integrity": "sha512-3urwxCEpnQwa1B6fKmcr8R2Qmzr8VDttRSay5CgD/stbZ4XUzNsA6G1V36+EL1Vq4vMr1aZhriARioLDlhcz+g==",
+ "requires": {
+ "@aws-sdk/types": "3.162.0",
+ "@aws-sdk/util-uri-escape": "3.55.0",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ }
+ }
+ },
+ "@aws-sdk/querystring-parser": {
+ "version": "3.162.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.162.0.tgz",
+ "integrity": "sha512-0ccaGsR1O7e3BsprdYBMwGf8gmycTv1Dfz2EB5R6MiTqzcuQJ/lxpIcRh3jhUJaD1TPlUziyrBEAxtLka3HDDQ==",
+ "requires": {
+ "@aws-sdk/types": "3.162.0",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ }
+ }
+ },
+ "@aws-sdk/service-error-classification": {
+ "version": "3.162.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.162.0.tgz",
+ "integrity": "sha512-AD9XL3CHFzwVWNEzdTo9aRnJl1ImqrRLlJ5zR/5ihTIJ68ZTYEiYP4vNKSCV6UfQ+vaaRNgLwiAx7JXzY54awg=="
+ },
+ "@aws-sdk/shared-ini-file-loader": {
+ "version": "3.162.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.162.0.tgz",
+ "integrity": "sha512-AGxISXns+1o6Pw+SPizFJDTw4Lwm+JSwhycCNhFU3JfdLsKfLY08JV4JHlcc+TyY4a8HhnGvE3r5t2f2dPLIsA==",
+ "requires": {
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ }
+ }
+ },
+ "@aws-sdk/signature-v4": {
+ "version": "3.163.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.163.0.tgz",
+ "integrity": "sha512-1iein+7iAHKcRIXaZhl/lG6JrOR/Qmk27zMqfARzxDF7o/W5arSs3DHIKytO1sOEn9zV6Mqm21dRAumD21VCCg==",
+ "requires": {
+ "@aws-sdk/is-array-buffer": "3.55.0",
+ "@aws-sdk/types": "3.162.0",
+ "@aws-sdk/util-hex-encoding": "3.109.0",
+ "@aws-sdk/util-middleware": "3.162.0",
+ "@aws-sdk/util-uri-escape": "3.55.0",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ }
+ }
+ },
+ "@aws-sdk/smithy-client": {
+ "version": "3.162.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.162.0.tgz",
+ "integrity": "sha512-o7CwdhPvzYMvHY5dTzL2kqN8Zsl2D8pZ1mG2dPdQW9hYnutLOFK1HVv5dIzoSkp3jUwVGh6AXd1i4ZSb2d0LrA==",
+ "requires": {
+ "@aws-sdk/middleware-stack": "3.162.0",
+ "@aws-sdk/types": "3.162.0",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ }
+ }
+ },
+ "@aws-sdk/types": {
+ "version": "3.162.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.162.0.tgz",
+ "integrity": "sha512-NBmuwVujH8fURDMvBHkHrYu/JAfG6Js/Bu0mC4o2Kdo5mRa3fD/N9kK0dEAxU1Rxp4wY2E++V9j2ZCw1KBGrSg=="
+ },
+ "@aws-sdk/url-parser": {
+ "version": "3.162.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.162.0.tgz",
+ "integrity": "sha512-aJQ2awXYDceLAzPMQETpvI1XQd8oYuqH1EriFzXHqoJTNmYnHb7awtKSqwaS8pq48x1rS/eVtJAi85BG93fXyw==",
+ "requires": {
+ "@aws-sdk/querystring-parser": "3.162.0",
+ "@aws-sdk/types": "3.162.0",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ }
+ }
+ },
+ "@aws-sdk/util-base64-browser": {
+ "version": "3.109.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64-browser/-/util-base64-browser-3.109.0.tgz",
+ "integrity": "sha512-lAZ6fyDGiRLaIsKT9qh7P9FGuNyZ4gAbr1YOSQk/5mHtaTuUvxlPptZuInNM/0MPQm6lpcot00D8IWTucn4PbA==",
+ "requires": {
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ }
+ }
+ },
+ "@aws-sdk/util-base64-node": {
+ "version": "3.55.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64-node/-/util-base64-node-3.55.0.tgz",
+ "integrity": "sha512-UQ/ZuNoAc8CFMpSiRYmevaTsuRKzLwulZTnM8LNlIt9Wx1tpNvqp80cfvVj7yySKROtEi20wq29h31dZf1eYNQ==",
+ "requires": {
+ "@aws-sdk/util-buffer-from": "3.55.0",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ }
+ }
+ },
+ "@aws-sdk/util-body-length-browser": {
+ "version": "3.154.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.154.0.tgz",
+ "integrity": "sha512-TUuy7paVkBRQrB/XFCsL8iTW6g/ma0S3N8dYOiIMJdeTqTFryeyOGkBpYBgYFQL6zRMZpyu0jOM7GYEffGFOXw==",
+ "requires": {
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ }
+ }
+ },
+ "@aws-sdk/util-body-length-node": {
+ "version": "3.55.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-node/-/util-body-length-node-3.55.0.tgz",
+ "integrity": "sha512-lU1d4I+9wJwydduXs0SxSfd+mHKjxeyd39VwOv6i2KSwWkPbji9UQqpflKLKw+r45jL7+xU/zfeTUg5Tt/3Gew==",
+ "requires": {
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ }
+ }
+ },
+ "@aws-sdk/util-buffer-from": {
+ "version": "3.55.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-3.55.0.tgz",
+ "integrity": "sha512-uVzKG1UgvnV7XX2FPTylBujYMKBPBaq/qFBxfl0LVNfrty7YjpfieQxAe6yRLD+T0Kir/WDQwGvYC+tOYG3IGA==",
+ "requires": {
+ "@aws-sdk/is-array-buffer": "3.55.0",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ }
+ }
+ },
+ "@aws-sdk/util-config-provider": {
+ "version": "3.109.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-config-provider/-/util-config-provider-3.109.0.tgz",
+ "integrity": "sha512-GrAZl/aBv0A28LkyNyq8SPJ5fmViCwz80fWLMeWx/6q5AbivuILogjlWwEZSvZ9zrlHOcFC0+AnCa5pQrjaslw==",
+ "requires": {
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ }
+ }
+ },
+ "@aws-sdk/util-defaults-mode-browser": {
+ "version": "3.162.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.162.0.tgz",
+ "integrity": "sha512-BjhuriainNy0ezFqCK//380Wc4xsJJOnq1tmPlHScQxp3g8ucfClvjOUi96XQaTrEf8c8EsYp77+JNsvrHytmw==",
+ "requires": {
+ "@aws-sdk/property-provider": "3.162.0",
+ "@aws-sdk/types": "3.162.0",
+ "bowser": "^2.11.0",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ }
+ }
+ },
+ "@aws-sdk/util-defaults-mode-node": {
+ "version": "3.163.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.163.0.tgz",
+ "integrity": "sha512-IM5BVeUXzLpb9m8qBSpUc2iO+topP1F7Ojq1GNrl5G/b22f7b1FCL5qkTem/UIXkkgI+efI7jr05xPRGiU73Hg==",
+ "requires": {
+ "@aws-sdk/config-resolver": "3.163.0",
+ "@aws-sdk/credential-provider-imds": "3.162.0",
+ "@aws-sdk/node-config-provider": "3.162.0",
+ "@aws-sdk/property-provider": "3.162.0",
+ "@aws-sdk/types": "3.162.0",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ }
+ }
+ },
+ "@aws-sdk/util-hex-encoding": {
+ "version": "3.109.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.109.0.tgz",
+ "integrity": "sha512-s8CgTNrn3cLkrdiohfxLuOYPCanzvHn/aH5RW6DaMoeQiG5Hl9QUiP/WtdQ9QQx3xvpQFpmvxIaSBwSgFNLQxA==",
+ "requires": {
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ }
+ }
+ },
+ "@aws-sdk/util-locate-window": {
+ "version": "3.55.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.55.0.tgz",
+ "integrity": "sha512-0sPmK2JaJE2BbTcnvybzob/VrFKCXKfN4CUKcvn0yGg/me7Bz+vtzQRB3Xp+YSx+7OtWxzv63wsvHoAnXvgxgg==",
+ "requires": {
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ }
+ }
+ },
+ "@aws-sdk/util-middleware": {
+ "version": "3.162.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.162.0.tgz",
+ "integrity": "sha512-jDqZZ5nst+NtzvAPIQBdQqGY14Z3HeGANGm5NUoxWp8IlHnEV7GhTFDjFgubf8mgTBCzHnvbuBY1bfkzAeXWBA==",
+ "requires": {
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ }
+ }
+ },
+ "@aws-sdk/util-uri-escape": {
+ "version": "3.55.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-3.55.0.tgz",
+ "integrity": "sha512-mmdDLUpFCN2nkfwlLdOM54lTD528GiGSPN1qb8XtGLgZsJUmg3uJSFIN2lPeSbEwJB3NFjVas/rnQC48i7mV8w==",
+ "requires": {
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ }
+ }
+ },
+ "@aws-sdk/util-user-agent-browser": {
+ "version": "3.162.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.162.0.tgz",
+ "integrity": "sha512-FNmC2ywy1u3tbUSVCSkCwLvcbjIvj5EzAtF6I2wrMTI5PfaxVIQapKn2EecoVQgf4lsZqvGjyTxbl7SYvf9fxw==",
+ "requires": {
+ "@aws-sdk/types": "3.162.0",
+ "bowser": "^2.11.0",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ }
+ }
+ },
+ "@aws-sdk/util-user-agent-node": {
+ "version": "3.162.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.162.0.tgz",
+ "integrity": "sha512-OIbZlccBFwITDQJoymU0V+yqqyPEbJUExJzeiP9bxJ58h7Jxj/da24cxCMaVDYvjhP/PoflOmC5Xblonaeg+oQ==",
+ "requires": {
+ "@aws-sdk/node-config-provider": "3.162.0",
+ "@aws-sdk/types": "3.162.0",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ }
+ }
+ },
+ "@aws-sdk/util-utf8-browser": {
+ "version": "3.109.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.109.0.tgz",
+ "integrity": "sha512-FmcGSz0v7Bqpl1SE8G1Gc0CtDpug+rvqNCG/szn86JApD/f5x8oByjbEiAyTU2ZH2VevUntx6EW68ulHyH+x+w==",
+ "requires": {
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ }
+ }
+ },
+ "@aws-sdk/util-utf8-node": {
+ "version": "3.109.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-node/-/util-utf8-node-3.109.0.tgz",
+ "integrity": "sha512-Ti/ZBdvz2eSTElsucjzNmzpyg2MwfD1rXmxD0hZuIF8bPON/0+sZYnWd5CbDw9kgmhy28dmKue086tbZ1G0iLQ==",
+ "requires": {
+ "@aws-sdk/util-buffer-from": "3.55.0",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ }
+ }
+ },
+ "@babel/runtime": {
+ "version": "7.19.4",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.4.tgz",
+ "integrity": "sha512-EXpLCrk55f+cYqmHsSR+yD/0gAIMxxA9QK9lnQWzhMCvt+YmoBN7Zx94s++Kv0+unHk39vxNO8t+CMA2WSS3wA==",
+ "requires": {
+ "regenerator-runtime": "^0.13.4"
+ }
+ },
+ "@iiif/parser": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@iiif/parser/-/parser-1.1.0.tgz",
+ "integrity": "sha512-p2pqngR/L+ML+LS8Ah70CTITgW192fmWXxOovSapQnI5rKN6daYrbjl5UuIK9R+n0lFFlJwjW5+tA96E+V39hw==",
+ "requires": {
+ "@iiif/presentation-2": "^1.0.4",
+ "@iiif/presentation-3": "^1.1.3",
+ "@types/geojson": "^7946.0.8"
+ }
+ },
+ "@iiif/presentation-2": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/@iiif/presentation-2/-/presentation-2-1.0.4.tgz",
+ "integrity": "sha512-hJakpq62VBajesLJrYPtFm6hcn6c/HkKP7CmKZ5atuzu40m0nifWYsqigR1l9sZGvhhHb/DRshPmiW/0GNrJoA==",
+ "requires": {}
+ },
+ "@iiif/presentation-3": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/@iiif/presentation-3/-/presentation-3-1.1.3.tgz",
+ "integrity": "sha512-Ek+25nkQouo0pXAqCsWYbAeS4jLDEBQA7iul2jzgnvoJrucxDQN2lXyNLgOUDRqpTdSqJ69iz5lm6DLaxil+Nw==",
+ "requires": {
+ "@types/geojson": "^7946.0.7"
+ }
+ },
+ "@iiif/vault": {
+ "version": "0.9.19",
+ "resolved": "https://registry.npmjs.org/@iiif/vault/-/vault-0.9.19.tgz",
+ "integrity": "sha512-YoRp4waV1mGMOJaaTpzn/YnZKRnHZdbXwCt2LbCA89CZhtlTh6QUhs04KWNrGxrxnk/Wtt67/U4SyZgD10g0NQ==",
+ "requires": {
+ "@iiif/parser": "1.*",
+ "@iiif/presentation-2": "1.*",
+ "@iiif/presentation-3": "1.*",
+ "mitt": "^3.0.0",
+ "node-fetch": "^3.1.1",
+ "redux": "^4.1.2",
+ "tiny-invariant": "^1.2.0",
+ "typesafe-actions": "^5.1.0"
+ }
+ },
+ "@types/geojson": {
+ "version": "7946.0.10",
+ "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.10.tgz",
+ "integrity": "sha512-Nmh0K3iWQJzniTuPRcJn5hxXkfB1T1pgB89SBig5PlJQU5yocazeu4jATJlaA0GYFKWMqDdvYemoSnF2pXgLVA=="
+ },
+ "asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
+ },
+ "axios": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz",
+ "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==",
+ "requires": {
+ "follow-redirects": "^1.14.9",
+ "form-data": "^4.0.0"
+ }
+ },
+ "bowser": {
+ "version": "2.11.0",
+ "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz",
+ "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA=="
+ },
+ "buffer-equal-constant-time": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
+ "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA=="
+ },
+ "combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "requires": {
+ "delayed-stream": "~1.0.0"
+ }
+ },
+ "cookie": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
+ "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw=="
+ },
+ "data-uri-to-buffer": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz",
+ "integrity": "sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA=="
+ },
+ "delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="
+ },
+ "detect-indent": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz",
+ "integrity": "sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g=="
+ },
+ "detect-newline": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz",
+ "integrity": "sha512-CwffZFvlJffUg9zZA0uqrjQayUTC8ob94pnr5sFwaVv3IOmkfUHcWH+jXaQK3askE51Cqe8/9Ql/0uXNwqZ8Zg=="
+ },
+ "ecdsa-sig-formatter": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
+ "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
+ "requires": {
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "fetch-blob": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz",
+ "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==",
+ "requires": {
+ "node-domexception": "^1.0.0",
+ "web-streams-polyfill": "^3.0.3"
+ }
+ },
+ "follow-redirects": {
+ "version": "1.15.1",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz",
+ "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA=="
+ },
+ "form-data": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
+ "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
+ "requires": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "mime-types": "^2.1.12"
+ }
+ },
+ "formdata-polyfill": {
+ "version": "4.0.10",
+ "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz",
+ "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==",
+ "requires": {
+ "fetch-blob": "^3.1.2"
+ }
+ },
+ "iiif-builder": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/iiif-builder/-/iiif-builder-1.0.6.tgz",
+ "integrity": "sha512-nNmDDBmbH97Z3HxJ969OBsDaUXgM0cYDZa4/7mH6D8LdzuFHy/4cDzmRQKYdg5BztCD+Ec5fNPDgfvKekwJ/vw==",
+ "requires": {
+ "@iiif/parser": "1.x",
+ "@iiif/presentation-3": "1.x",
+ "@iiif/vault": "0.9.x || 1.x"
+ }
+ },
+ "jsonwebtoken": {
+ "version": "8.5.1",
+ "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz",
+ "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==",
+ "requires": {
+ "jws": "^3.2.2",
+ "lodash.includes": "^4.3.0",
+ "lodash.isboolean": "^3.0.3",
+ "lodash.isinteger": "^4.0.4",
+ "lodash.isnumber": "^3.0.3",
+ "lodash.isplainobject": "^4.0.6",
+ "lodash.isstring": "^4.0.1",
+ "lodash.once": "^4.0.0",
+ "ms": "^2.1.1",
+ "semver": "^5.6.0"
+ }
+ },
+ "jwa": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz",
+ "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==",
+ "requires": {
+ "buffer-equal-constant-time": "1.0.1",
+ "ecdsa-sig-formatter": "1.0.11",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "jws": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz",
+ "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==",
+ "requires": {
+ "jwa": "^1.4.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "lodash.includes": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
+ "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w=="
+ },
+ "lodash.isboolean": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
+ "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg=="
+ },
+ "lodash.isinteger": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz",
+ "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA=="
+ },
+ "lodash.isnumber": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz",
+ "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw=="
+ },
+ "lodash.isobject": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-3.0.2.tgz",
+ "integrity": "sha512-3/Qptq2vr7WeJbB4KHUSKlq8Pl7ASXi3UG6CMbBm8WRtXi8+GHm7mKaU3urfpSEzWe2wCIChs6/sdocUsTKJiA=="
+ },
+ "lodash.isplainobject": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
+ "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA=="
+ },
+ "lodash.isstring": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
+ "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw=="
+ },
+ "lodash.once": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
+ "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg=="
+ },
+ "lz-string": {
+ "version": "1.4.4",
+ "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.4.4.tgz",
+ "integrity": "sha512-0ckx7ZHRPqb0oUm8zNr+90mtf9DQB60H1wMCjBtfi62Kl3a7JbHob6gA2bC+xRvZoOL+1hzUK8jeuEIQE8svEQ=="
+ },
+ "mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="
+ },
+ "mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "requires": {
+ "mime-db": "1.52.0"
+ }
+ },
+ "minimist": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz",
+ "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g=="
+ },
+ "mitt": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.0.tgz",
+ "integrity": "sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ=="
+ },
+ "ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
+ },
+ "node-domexception": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz",
+ "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ=="
+ },
+ "node-fetch": {
+ "version": "3.2.10",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.2.10.tgz",
+ "integrity": "sha512-MhuzNwdURnZ1Cp4XTazr69K0BTizsBroX7Zx3UgDSVcZYKF/6p0CBe4EUb/hLqmzVhl0UpYfgRljQ4yxE+iCxA==",
+ "requires": {
+ "data-uri-to-buffer": "^4.0.0",
+ "fetch-blob": "^3.1.4",
+ "formdata-polyfill": "^4.0.10"
+ }
+ },
+ "parse-http-header": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parse-http-header/-/parse-http-header-1.0.1.tgz",
+ "integrity": "sha512-xOoH7vzokDoenX4e3c+4ik8lf30kq9Pawq20TH5uq3RURsIJquqFTE0gS7OAEE6nvMQzuP5OXxubYuN7YLsTiw=="
+ },
+ "redux": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.0.tgz",
+ "integrity": "sha512-oSBmcKKIuIR4ME29/AeNUnl5L+hvBq7OaJWzaptTQJAntaPvxIJqfnjbaEiCzzaIz+XmVILfqAM3Ob0aXLPfjA==",
+ "requires": {
+ "@babel/runtime": "^7.9.2"
+ }
+ },
+ "regenerator-runtime": {
+ "version": "0.13.10",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz",
+ "integrity": "sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw=="
+ },
+ "safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
+ },
+ "semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
+ },
+ "sort-json": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/sort-json/-/sort-json-2.0.1.tgz",
+ "integrity": "sha512-s8cs2bcsQCzo/P2T/uoU6Js4dS/jnX8+4xunziNoq9qmSpZNCrRIAIvp4avsz0ST18HycV4z/7myJ7jsHWB2XQ==",
+ "requires": {
+ "detect-indent": "^5.0.0",
+ "detect-newline": "^2.1.0",
+ "minimist": "^1.2.0"
+ }
+ },
+ "tiny-invariant": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz",
+ "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw=="
+ },
+ "tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
+ },
+ "typesafe-actions": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/typesafe-actions/-/typesafe-actions-5.1.0.tgz",
+ "integrity": "sha512-bna6Yi1pRznoo6Bz1cE6btB/Yy8Xywytyfrzu/wc+NFW3ZF0I+2iCGImhBsoYYCOWuICtRO4yHcnDlzgo1AdNg=="
+ },
+ "uuid": {
+ "version": "8.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="
+ },
+ "web-streams-polyfill": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz",
+ "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q=="
+ }
+ }
+}
diff --git a/src/package.json b/src/package.json
new file mode 100644
index 00000000..cf745ba1
--- /dev/null
+++ b/src/package.json
@@ -0,0 +1,23 @@
+{
+ "name": "dc-api",
+ "version": "2.0.0pre",
+ "description": "NUL Digital Collections API",
+ "repository": "https://github.com/nulib/dc-api-v2",
+ "author": "nulib",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-crypto/sha256-browser": "^2.0.1",
+ "@aws-sdk/credential-provider-node": "^3.142.0",
+ "@aws-sdk/node-http-handler": "^3.127.0",
+ "@aws-sdk/protocol-http": "^3.127.0",
+ "@aws-sdk/signature-v4": "^3.130.0",
+ "axios": ">=0.21.1",
+ "cookie": "^0.5.0",
+ "iiif-builder": "^1.0.6",
+ "jsonwebtoken": "^8.5.1",
+ "lodash.isobject": "^3.0.2",
+ "lz-string": "^1.4.4",
+ "parse-http-header": "^1.0.1",
+ "sort-json": "^2.0.1"
+ }
+}
diff --git a/template.yaml b/template.yaml
index 3a0a6475..5e16f219 100644
--- a/template.yaml
+++ b/template.yaml
@@ -4,13 +4,41 @@ Description: >
dc-api-v2
Sample SAM Template for dc-api-v2
-
# More info about Globals: https://github.com/awslabs/serverless-application-model/blob/master/docs/globals.rst
Globals:
Function:
+ CodeUri: ./src
+ Runtime: nodejs16.x
+ Architectures:
+ - x86_64
+ MemorySize: 128
Timeout: 3
-
+ Environment:
+ Variables:
+ DC_API_ENDPOINT: !Ref DcApiEndpoint
+ DC_URL: !Ref DcUrl
+ ELASTICSEARCH_ENDPOINT: !Ref ElasticsearchEndpoint
+ ENV_PREFIX: !Ref EnvironmentPrefix
+ READING_ROOM_IPS: !Ref ReadingRoomIPs
Parameters:
+ ApiSecret:
+ Type: String
+ Description: Secret Key for Encrypting JWTs (must match IIIF server)
+ CustomDomainCertificateArn:
+ Type: String
+ Description: SSL Certificate for the Custom Domain Name
+ CustomDomainZone:
+ Type: String
+ Description: Hosted Zone Name for Custom Domain
+ CustomDomainHost:
+ Type: String
+ Description: Hostname within ApiDomainName for Custom Domain
+ DcApiEndpoint:
+ Type: String
+ Description: URL for DC API
+ DcUrl:
+ Type: String
+ Description: URL of Digital Collections website
ElasticsearchEndpoint:
Type: String
Description: Elasticsearch url
@@ -18,32 +46,114 @@ Parameters:
Type: String
Description: Index Prefix
Default: ""
+ NussoApiKey:
+ Type: String
+ Description: API key for auth server
+ NussoBaseUrl:
+ Type: String
+ Description: Auth server URL
+ ReadingRoomIPs:
+ Type: String
+ Description: Comma-delimited list of IP addresses to serve private resources to
+ V1ApiId:
+ Type: String
+ Description: ID of the v1 API to mount on /api/v1
+ V1ApiStage:
+ Type: String
+ Description: Stage name of the v1 API to mount on /api/v1
+ Default: latest
Resources:
- helloWorldFunction:
+ # V2 API
+ getAuthCallbackFunction:
+ Type: AWS::Serverless::Function
+ Properties:
+ Handler: handlers/get-auth-callback.handler
+ Description: NUSSO callback function.
+ Environment:
+ Variables:
+ API_TOKEN_SECRET: !Ref ApiSecret
+ NUSSO_API_KEY: !Ref NussoApiKey
+ NUSSO_BASE_URL: !Ref NussoBaseUrl
+ Events:
+ Api:
+ Type: HttpApi
+ Properties:
+ ApiId: !Ref dcApi
+ Path: /auth/callback
+ Method: GET
+ getAuthLoginFunction:
Type: AWS::Serverless::Function
Properties:
- Handler: src/handlers/hello.helloHandler
- Runtime: nodejs16.x
- Architectures:
- - x86_64
- MemorySize: 128
- Description: Says hello.
+ Handler: handlers/get-auth-login.handler
+ Description: Performs NUSSO login.
+ Environment:
+ Variables:
+ NUSSO_API_KEY: !Ref NussoApiKey
+ NUSSO_BASE_URL: !Ref NussoBaseUrl
Events:
Api:
- Type: Api
+ Type: HttpApi
Properties:
- RestApiId: !Ref dcApi
- Path: /hello
+ ApiId: !Ref dcApi
+ Path: /auth/login
+ Method: GET
+ getAuthLogoutFunction:
+ Type: AWS::Serverless::Function
+ Properties:
+ Handler: handlers/get-auth-logout.handler
+ Description: Performs NUSSO logout.
+ Environment:
+ Variables:
+ NUSSO_API_KEY: !Ref NussoApiKey
+ NUSSO_BASE_URL: !Ref NussoBaseUrl
+ Events:
+ Api:
+ Type: HttpApi
+ Properties:
+ ApiId: !Ref dcApi
+ Path: /auth/logout
+ Method: GET
+ getAuthWhoAmIFunction:
+ Type: AWS::Serverless::Function
+ Properties:
+ Handler: handlers/get-auth-whoami.handler
+ Description: Exchanges valid JWT token for user information.
+ Environment:
+ Variables:
+ API_TOKEN_SECRET: !Ref ApiSecret
+ NUSSO_API_KEY: !Ref NussoApiKey
+ NUSSO_BASE_URL: !Ref NussoBaseUrl
+ Events:
+ Api:
+ Type: HttpApi
+ Properties:
+ ApiId: !Ref dcApi
+ Path: /auth/whoami
+ Method: GET
+ getCollectionsFunction:
+ Type: AWS::Serverless::Function
+ Properties:
+ Handler: handlers/get-collections.handler
+ Description: Gets Collections.
+ Policies:
+ Version: 2012-10-17
+ Statement:
+ - Sid: ESHTTPPolicy
+ Effect: Allow
+ Action:
+ - es:ESHttp*
+ Resource: "*"
+ Events:
+ Api:
+ Type: HttpApi
+ Properties:
+ ApiId: !Ref dcApi
+ Path: /collections
Method: GET
getCollectionByIdFunction:
Type: AWS::Serverless::Function
Properties:
- Handler: src/handlers/get-collection-by-id.handler
- Runtime: nodejs16.x
- Architectures:
- - x86_64
- MemorySize: 128
- Timeout: 100
+ Handler: handlers/get-collection-by-id.handler
Description: Gets a Collection by id.
Policies:
Version: 2012-10-17
@@ -53,27 +163,38 @@ Resources:
Action:
- es:ESHttp*
Resource: "*"
- Environment:
- Variables:
- ENV_PREFIX: !Ref EnvironmentPrefix
- ELASTICSEARCH_ENDPOINT: !Ref ElasticsearchEndpoint
Events:
Api:
- Type: Api
+ Type: HttpApi
Properties:
- RestApiId: !Ref dcApi
+ ApiId: !Ref dcApi
Path: /collections/{id}
Method: GET
getFileSetByIdFunction:
Type: AWS::Serverless::Function
Properties:
- Handler: src/handlers/get-file-set-by-id.handler
- Runtime: nodejs16.x
- Architectures:
- - x86_64
- MemorySize: 128
- Timeout: 100
+ Handler: handlers/get-file-set-by-id.handler
Description: Gets a FileSet by id.
+ Policies:
+ Version: 2012-10-17
+ Statement:
+ - Sid: ESHTTPPolicy
+ Effect: Allow
+ Action:
+ - es:ESHttp*
+ Resource: "*"
+ Events:
+ Api:
+ Type: HttpApi
+ Properties:
+ ApiId: !Ref dcApi
+ Path: /file-sets/{id}
+ Method: GET
+ getFileSetAuthFunction:
+ Type: AWS::Serverless::Function
+ Properties:
+ Handler: handlers/get-file-set-auth.handler
+ Description: Authorizes access to a file set.
Policies:
Version: 2012-10-17
Statement:
@@ -84,24 +205,18 @@ Resources:
Resource: "*"
Environment:
Variables:
- ENV_PREFIX: !Ref EnvironmentPrefix
- ELASTICSEARCH_ENDPOINT: !Ref ElasticsearchEndpoint
+ API_TOKEN_SECRET: !Ref ApiSecret
Events:
Api:
- Type: Api
+ Type: HttpApi
Properties:
- RestApiId: !Ref dcApi
- Path: /file-sets/{id}
+ ApiId: !Ref dcApi
+ Path: /file-sets/{id}/authorization
Method: GET
getWorkByIdFunction:
Type: AWS::Serverless::Function
Properties:
- Handler: src/handlers/get-work-by-id.handler
- Runtime: nodejs16.x
- Architectures:
- - x86_64
- MemorySize: 128
- Timeout: 100
+ Handler: handlers/get-work-by-id.handler
Description: Gets a Work by id.
Policies:
Version: 2012-10-17
@@ -111,27 +226,18 @@ Resources:
Action:
- es:ESHttp*
Resource: "*"
- Environment:
- Variables:
- ENV_PREFIX: !Ref EnvironmentPrefix
- ELASTICSEARCH_ENDPOINT: !Ref ElasticsearchEndpoint
Events:
Api:
- Type: Api
+ Type: HttpApi
Properties:
- RestApiId: !Ref dcApi
+ ApiId: !Ref dcApi
Path: /works/{id}
Method: GET
- searchFunction:
+ getThumbnailFunction:
Type: AWS::Serverless::Function
Properties:
- Handler: src/handlers/search.handler
- Runtime: nodejs16.x
- Architectures:
- - x86_64
- MemorySize: 128
- Timeout: 100
- Description: Handles OpenSearch search requests, Works only by default.
+ Handler: handlers/get-thumbnail.handler
+ Description: Gets a Work's representative thumbnail.
Policies:
Version: 2012-10-17
Statement:
@@ -142,24 +248,213 @@ Resources:
Resource: "*"
Environment:
Variables:
- ENV_PREFIX: !Ref EnvironmentPrefix
- ELASTICSEARCH_ENDPOINT: !Ref ElasticsearchEndpoint
+ API_TOKEN_SECRET: !Ref ApiSecret
+ Events:
+ CollectionApi:
+ Type: HttpApi
+ Properties:
+ ApiId: !Ref dcApi
+ Path: /collections/{id}/thumbnail
+ Method: GET
+ WorkApi:
+ Type: HttpApi
+ Properties:
+ ApiId: !Ref dcApi
+ Path: /works/{id}/thumbnail
+ Method: GET
+ getSimilarFunction:
+ Type: AWS::Serverless::Function
+ Properties:
+ Handler: handlers/get-similar.handler
+ Timeout: 100
+ Description: Gets works similar to a specific work.
+ Policies:
+ Version: 2012-10-17
+ Statement:
+ - Sid: ESHTTPPolicy
+ Effect: Allow
+ Action:
+ - es:ESHttp*
+ Resource: "*"
+ Events:
+ WorkApi:
+ Type: HttpApi
+ Properties:
+ ApiId: !Ref dcApi
+ Path: /works/{id}/similar
+ Method: GET
+ searchPostFunction:
+ Type: AWS::Serverless::Function
+ Properties:
+ Handler: handlers/search.postSearch
+ Description: Handles OpenSearch search requests, Works only by default.
+ Policies:
+ Version: 2012-10-17
+ Statement:
+ - Sid: ESHTTPPolicy
+ Effect: Allow
+ Action:
+ - es:ESHttp*
+ Resource: "*"
Events:
SearchApi:
- Type: Api
+ Type: HttpApi
Properties:
- RestApiId: !Ref dcApi
+ ApiId: !Ref dcApi
Path: /search
Method: POST
SearchWithModelsApi:
- Type: Api
+ Type: HttpApi
Properties:
- RestApiId: !Ref dcApi
+ ApiId: !Ref dcApi
Path: /search/{models}
Method: POST
+ searchGetFunction:
+ Type: AWS::Serverless::Function
+ Properties:
+ Handler: handlers/search.getSearch
+ Description: Handles paging requests
+ Policies:
+ Version: 2012-10-17
+ Statement:
+ - Sid: ESHTTPPolicy
+ Effect: Allow
+ Action:
+ - es:ESHttp*
+ Resource: "*"
+ Events:
+ SearchApi:
+ Type: HttpApi
+ Properties:
+ ApiId: !Ref dcApi
+ Path: /search
+ Method: GET
+ SearchWithModelsApi:
+ Type: HttpApi
+ Properties:
+ ApiId: !Ref dcApi
+ Path: /search/{models}
+ Method: GET
+ optionsFunction:
+ Type: AWS::Serverless::Function
+ Properties:
+ Handler: handlers/options-request.handler
+ Timeout: 3
+ Description: Handles all OPTIONS requests
+ Events:
+ Everything:
+ Type: HttpApi
+ Properties:
+ ApiId: !Ref dcApi
+ Path: /{proxy+}
+ Method: OPTIONS
+ getSharedLinkByIdFunction:
+ Type: AWS::Serverless::Function
+ Properties:
+ Handler: handlers/get-shared-link-by-id.handler
+ Description: Gets a shared link document by id.
+ Policies:
+ Version: 2012-10-17
+ Statement:
+ - Sid: ESHTTPPolicy
+ Effect: Allow
+ Action:
+ - es:ESHttp*
+ Resource: "*"
+ Events:
+ Api:
+ Type: HttpApi
+ Properties:
+ ApiId: !Ref dcApi
+ Path: /shared-links/{id}
+ Method: GET
dcApi:
- Type: AWS::Serverless::Api
+ Type: AWS::Serverless::HttpApi
Properties:
- EndpointConfiguration:
- Type: REGIONAL
StageName: v2
+ StageVariables:
+ basePath: api/v2
+ Domain:
+ DomainName: !Sub "${CustomDomainHost}.${CustomDomainZone}"
+ BasePath: api/v2
+ CertificateArn: !Ref CustomDomainCertificateArn
+ Route53:
+ HostedZoneName: !Sub "${CustomDomainZone}."
+
+ # v1 API Mapping
+ v1Mapping:
+ Type: AWS::ApiGatewayV2::ApiMapping
+ Properties:
+ ApiMappingKey: api/v1
+ DomainName: !Sub "${CustomDomainHost}.${CustomDomainZone}"
+ ApiId: !Ref V1ApiId
+ Stage: !Ref V1ApiStage
+ DependsOn: dcApi
+
+ # root API
+ rootApi:
+ Type: AWS::Serverless::HttpApi
+ Properties:
+ StageName: latest
+ rootRedirect:
+ Type: AWS::Serverless::Function
+ Properties:
+ CodeUri: ./redirect
+ Handler: index.handler
+ Timeout: 1
+ Description: Redirects to latest version of docs
+ Environment:
+ Variables:
+ REDIRECT_TO: /docs/v2/index.html
+ Events:
+ RedirectApi:
+ Type: HttpApi
+ Properties:
+ ApiId: !Ref rootApi
+ Path: /
+ Method: GET
+
+ # Documentation
+ docsMapping:
+ Type: AWS::ApiGatewayV2::ApiMapping
+ Properties:
+ DomainName: !Sub "${CustomDomainHost}.${CustomDomainZone}"
+ ApiId: !Ref rootApi
+ Stage: !Ref rootApilatestStage
+ DependsOn: dcApi
+ docsBucket:
+ Type: AWS::S3::Bucket
+ Properties:
+ BucketName: !Sub "dcapi-docs.${CustomDomainZone}"
+ AccessControl: PublicRead
+ WebsiteConfiguration:
+ IndexDocument: index.html
+ ErrorDocument: index.html
+ docsBucketPolicy:
+ Type: AWS::S3::BucketPolicy
+ Properties:
+ PolicyDocument:
+ Id: MyPolicy
+ Version: 2012-10-17
+ Statement:
+ - Sid: PublicReadForGetBucketObjects
+ Effect: Allow
+ Principal: "*"
+ Action: "s3:GetObject"
+ Resource: !Sub "arn:aws:s3:::${docsBucket}/*"
+ Bucket: !Ref docsBucket
+ docsIntegration:
+ Type: AWS::ApiGatewayV2::Integration
+ Properties:
+ ApiId: !Ref rootApi
+ IntegrationMethod: GET
+ IntegrationType: HTTP_PROXY
+ IntegrationUri: !Sub "http://${docsBucket}.s3-website-us-east-1.amazonaws.com/{proxy}"
+ PayloadFormatVersion: "1.0"
+ docsRoute:
+ Type: AWS::ApiGatewayV2::Route
+ Properties:
+ ApiId: !Ref rootApi
+ AuthorizationType: NONE
+ RouteKey: GET /docs/v2/{proxy+}
+ Target: !Sub "integrations/${docsIntegration}"
diff --git a/test/fixtures/mocks/collection-1234-no-thumbnail.json b/test/fixtures/mocks/collection-1234-no-thumbnail.json
new file mode 100644
index 00000000..6bfe3e0e
--- /dev/null
+++ b/test/fixtures/mocks/collection-1234-no-thumbnail.json
@@ -0,0 +1,13 @@
+{
+ "_index": "dev-dc-v2-collection",
+ "_type": "_doc",
+ "_id": "1234",
+ "_version": 1,
+ "found": true,
+ "_source": {
+ "id": "1234",
+ "api_model": "Collection",
+ "published": true,
+ "representative_image": {}
+ }
+}
diff --git a/test/fixtures/mocks/collection-1234.json b/test/fixtures/mocks/collection-1234.json
new file mode 100644
index 00000000..f29db15d
--- /dev/null
+++ b/test/fixtures/mocks/collection-1234.json
@@ -0,0 +1,16 @@
+{
+ "_index": "dev-dc-v2-collection",
+ "_type": "_doc",
+ "_id": "1234",
+ "_version": 1,
+ "found": true,
+ "_source": {
+ "id": "1234",
+ "title": "Collection Title",
+ "api_model": "Collection",
+ "published": true,
+ "representative_image": {
+ "work_id": "1234"
+ }
+ }
+}
diff --git a/test/fixtures/mocks/collections.json b/test/fixtures/mocks/collections.json
new file mode 100644
index 00000000..e1d31029
--- /dev/null
+++ b/test/fixtures/mocks/collections.json
@@ -0,0 +1,1625 @@
+{
+ "took": 4,
+ "timed_out": false,
+ "_shards": {
+ "total": 5,
+ "successful": 5,
+ "skipped": 0,
+ "failed": 0
+ },
+ "hits": {
+ "total": {
+ "value": 68,
+ "relation": "eq"
+ },
+ "max_score": 1.0809127,
+ "hits": [
+ {
+ "_index": "dc-v2-collection-1658438321581379",
+ "_type": "_doc",
+ "_id": "1e0b26c9-3e0b-4318-8e19-3663ffaf5d9f",
+ "_score": 1.0809127,
+ "_source": {
+ "featured": false,
+ "keywords": [""],
+ "visibility": "Public",
+ "description": "A collection of 74 photographic images, most 3¼ x 5½ inches, a few smaller. Mixed processes; some black & white, a few sepia tones. Some may be contact prints. Images selectively depicting the construction period of the Panama Canal, 1904–1914. Fifty photographs in the collection document major engineering projects: building of the locks, test transits, Culebra Cut digging, dredging operations, etc. In addition, images of iconic Canal Zone buildings during construction: Administration Building, Tivoli Hotel, Canal Zone towns, etc. The remaining 24 photographs show views of Panama City, Portobelo historical ruins, Taboga Island, bullfighting ring, etc. Social norms of the period are documented in a few images, such as, a sign reading “These Paths for Gold Employees Only” (paths for white employees only.) The collection’s metadata description is provided in English and Spanish thanks to a collaboration between Northwestern University Transportation Library staff and Panama Canal Authority Roberto F. Chiari Library former Library Director Mr. Rolando Cochez and Mr. Isaac E. Carranza, Library Technician.\n\n\nUna colección de 74 imágenes fotográficas, la mayoría de 3¼ x 5½ pulgadas, algunas mas pequeñas. Procesos mixtos; la mayoría en blanco y negro, pocas en tonos sepia. Algunas pueden ser impresiones de contacto. Imágenes presentan el periodo de la construcción del Canal de Panamá, 1904-1914. En esta colección, 50 fotografías documentan grandes proyectos de ingeniería: construcción de las esclusas, tránsitos de prueba, excavación del Corte Culebra, operaciones de dragado, etc. Además, imágenes de icónicos edificios de la Zona del Canal durante su construcción: el Edificio de la Administración, el Hotel Tivoli, pueblos de la Zona del Canal. Las otras 24 fotografías muestran vistas de la Ciudad de Panamá, ruinas históricas de Portobelo, la Isla de Taboga, la plaza de toros, etc. Las normas sociales de la época están documentadas en algunas imágenes por ejemplo: un cartel lee “Estos Caminos Únicamente para Empleados Blancos” (“These Paths for Gold Employees Only.” La descripción de metadatos en esta colección es presentada en Español e Ingles gracias a una colaboración entre la Biblioteca de Transporte de la Universidad de Northwestern y los Sres. Rolando Cochez, pasado Administrador Biblitecario, e Isaac E. Carranza, Técnico Biblitecario, de la Biblioteca Roberto F. Chiari de la Autoridad del Canal de Panamá. ",
+ "published": true,
+ "title": "The Panama Canal Construction Photograph Collection",
+ "modified_date": "2021-09-28T22:09:31.604431Z",
+ "admin_email": null,
+ "indexed_at": "2022-08-24T17:29:14.586293",
+ "api_model": "Collection",
+ "finding_aid_url": "https://findingaids.library.northwestern.edu/repositories/5/resources/1565",
+ "api_link": "[PLACEHOLDER]/1e0b26c9-3e0b-4318-8e19-3663ffaf5d9f",
+ "id": "1e0b26c9-3e0b-4318-8e19-3663ffaf5d9f",
+ "representative_image": {},
+ "create_date": "2021-03-12T02:11:32.309567Z"
+ }
+ },
+ {
+ "_index": "dc-v2-collection-1658438321581379",
+ "_type": "_doc",
+ "_id": "67ce0602-e1b4-4d5b-9028-1d772f2c7917",
+ "_score": 1.0809127,
+ "_source": {
+ "featured": false,
+ "keywords": [""],
+ "visibility": "Public",
+ "description": "The Elizabeth Augusta Wrightson Collection consists of 135 arias and other songs chiefly from Italian operas of the bel canto style. Approximately 100 contain detailed performance markings including ornamentation, expression marks and cadenzas.",
+ "published": true,
+ "title": "Elizabeth Augusta Wrightson Collection of Annotated Bel Canto Vocal Music",
+ "modified_date": "2021-08-12T13:29:43.193496Z",
+ "admin_email": null,
+ "indexed_at": "2022-08-24T17:29:14.587322",
+ "api_model": "Collection",
+ "finding_aid_url": "https://findingaids.library.northwestern.edu/repositories/3/resources/1356",
+ "api_link": "[PLACEHOLDER]/67ce0602-e1b4-4d5b-9028-1d772f2c7917",
+ "id": "67ce0602-e1b4-4d5b-9028-1d772f2c7917",
+ "representative_image": {},
+ "create_date": "2021-04-28T13:22:55.818169Z"
+ }
+ },
+ {
+ "_index": "dc-v2-collection-1658438321581379",
+ "_type": "_doc",
+ "_id": "e4075581-b388-4f2c-afc5-4860e172ba24",
+ "_score": 1.0809127,
+ "_source": {
+ "featured": false,
+ "keywords": [""],
+ "visibility": "Public",
+ "description": " Architectural Drawings from the collections of Northwestern University Libraries.",
+ "published": true,
+ "title": "Architectural Drawings",
+ "modified_date": "2021-06-28T15:12:00.641129Z",
+ "admin_email": null,
+ "indexed_at": "2022-08-24T17:29:14.682023",
+ "api_model": "Collection",
+ "finding_aid_url": null,
+ "api_link": "[PLACEHOLDER]/e4075581-b388-4f2c-afc5-4860e172ba24",
+ "id": "e4075581-b388-4f2c-afc5-4860e172ba24",
+ "representative_image": {},
+ "create_date": "2021-04-22T17:09:20.594040Z"
+ }
+ },
+ {
+ "_index": "dc-v2-collection-1658438321581379",
+ "_type": "_doc",
+ "_id": "29354d03-c3db-443e-a18d-9a15f04558b6",
+ "_score": 1.0809127,
+ "_source": {
+ "featured": null,
+ "keywords": [],
+ "visibility": "Public",
+ "description": "This collection was from the Study Photographs Collection which was once in the Visual Media Center under the Department of Art History at Northwestern University. ",
+ "published": true,
+ "title": "Department of Art History || Study Photographs Collection",
+ "modified_date": "2021-03-17T20:18:35.644274Z",
+ "admin_email": null,
+ "indexed_at": "2022-08-24T17:29:14.682772",
+ "api_model": "Collection",
+ "finding_aid_url": null,
+ "api_link": "[PLACEHOLDER]/29354d03-c3db-443e-a18d-9a15f04558b6",
+ "id": "29354d03-c3db-443e-a18d-9a15f04558b6",
+ "representative_image": {},
+ "create_date": "2021-03-12T02:11:32.420485Z"
+ }
+ },
+ {
+ "_index": "dc-v2-collection-1658438321581379",
+ "_type": "_doc",
+ "_id": "1f9fe6a4-9059-4e1d-9a1f-178892beaf13",
+ "_score": 1.0809127,
+ "_source": {
+ "featured": null,
+ "keywords": [],
+ "visibility": "Public",
+ "description": "La Caricature was a satirical weekly published French periodical that was distributed in Paris between 1830 and 1843 during the July Monarchy. This collection contains works from when Charles Philipon (1800–61) was director and main author. The complete volumes of La Caricature can be found in HathiTrust Digital Library. These are individual plates only. Related URL connects to the complete volume. ",
+ "published": true,
+ "title": "La Caricature (1830-1835; Charles Philipon, founding editor)",
+ "modified_date": "2021-03-17T20:18:35.644274Z",
+ "admin_email": null,
+ "indexed_at": "2022-08-24T17:29:14.683613",
+ "api_model": "Collection",
+ "finding_aid_url": null,
+ "api_link": "[PLACEHOLDER]/1f9fe6a4-9059-4e1d-9a1f-178892beaf13",
+ "id": "1f9fe6a4-9059-4e1d-9a1f-178892beaf13",
+ "representative_image": {},
+ "create_date": "2021-03-12T02:11:32.400123Z"
+ }
+ },
+ {
+ "_index": "dc-v2-collection-1658438321581379",
+ "_type": "_doc",
+ "_id": "58432865-db82-4b05-8910-453fe1df5972",
+ "_score": 1.0809127,
+ "_source": {
+ "featured": false,
+ "keywords": [""],
+ "visibility": "Public",
+ "description": "Audio recordings of Kongo Langlois Roshi, one of the first American Zen Buddhist priests.",
+ "published": true,
+ "title": "The Dharma Talks of Kongo Langlois Roshi",
+ "modified_date": "2022-02-03T23:00:08.248263Z",
+ "admin_email": null,
+ "indexed_at": "2022-08-24T17:29:14.683888",
+ "api_model": "Collection",
+ "finding_aid_url": null,
+ "api_link": "[PLACEHOLDER]/58432865-db82-4b05-8910-453fe1df5972",
+ "id": "58432865-db82-4b05-8910-453fe1df5972",
+ "representative_image": {},
+ "create_date": "2022-01-21T06:46:05.977859Z"
+ }
+ },
+ {
+ "_index": "dc-v2-collection-1658438321581379",
+ "_type": "_doc",
+ "_id": "5a3744f2-5cbc-4edc-bb16-1bad7265e41c",
+ "_score": 1.0809127,
+ "_source": {
+ "featured": false,
+ "keywords": [""],
+ "visibility": "Public",
+ "description": "The Charles Deering McCormick of Special Collections contains a collection of about 8,000 items relating to the Siege and Commune of Paris of 1870-1871. This collection is the largest held on this subject in the United States, and one of the largest in the world. This diverse and visually exciting array includes original photographs, caricatures, posters, etchings, lithographs, books, newspapers, manuscripts and realia created during and in reaction to l'année terrible: the epoch-changing year that witnessed France's defeat in the Franco-Prussian War, the downfall of the Second Empire, the hardship and suffering of the four-month siege of Paris, and the bloody civil war that snuffed out the Commune uprising.\n\nThe nucleus of the collection was acquired in 1971, the centenary year of end of the Commune, when astute Northwestern University librarians purchased almost en bloc the catalogue offerings of a prominent French book dealer. Since that time it has been augmented by many successive acquisitions. Along with the American Civil War and the Crimean War, the Franco-Prussian War was one of the first to be documented photographically. Photographs of the war and of the ruined Paris landscape it and the struggle with the Communards caused abound, as well as some of the earliest examples of manipulated fake photographs created for propaganda purposes. ",
+ "published": true,
+ "title": "The Siege and Commune of Paris, 1870-1871",
+ "modified_date": "2022-01-31T19:08:45.445939Z",
+ "admin_email": null,
+ "indexed_at": "2022-08-24T17:29:14.684028",
+ "api_model": "Collection",
+ "finding_aid_url": "https://libguides.northwestern.edu/c.php?g=115015&p=749162",
+ "api_link": "[PLACEHOLDER]/5a3744f2-5cbc-4edc-bb16-1bad7265e41c",
+ "id": "5a3744f2-5cbc-4edc-bb16-1bad7265e41c",
+ "representative_image": {},
+ "create_date": "2021-03-12T02:11:32.480650Z"
+ }
+ },
+ {
+ "_index": "dc-v2-collection-1658438321581379",
+ "_type": "_doc",
+ "_id": "87099ea1-eef0-42d2-a3d2-7b203dc3774c",
+ "_score": 1.0809127,
+ "_source": {
+ "featured": false,
+ "keywords": ["poster"],
+ "visibility": "Public",
+ "description": "These posters represent a sampling (approximately 2200) of our growing collection of over 5000 Africana posters housed at the Melville J. Herskovits Library of African Studies. The subjects covered here include politics, health, religion, liberation struggles, art exhibitions, and social issues.",
+ "published": true,
+ "title": "Posters from the Herskovits Library",
+ "modified_date": "2021-10-13T16:18:06.405769Z",
+ "admin_email": null,
+ "indexed_at": "2022-08-24T17:29:14.764162",
+ "api_model": "Collection",
+ "finding_aid_url": null,
+ "api_link": "[PLACEHOLDER]/87099ea1-eef0-42d2-a3d2-7b203dc3774c",
+ "id": "87099ea1-eef0-42d2-a3d2-7b203dc3774c",
+ "representative_image": {},
+ "create_date": "2021-03-12T02:11:32.443176Z"
+ }
+ },
+ {
+ "_index": "dc-v2-collection-1658438321581379",
+ "_type": "_doc",
+ "_id": "ce1916b7-9fb8-44b5-80a1-5459ca97190c",
+ "_score": 1.0809127,
+ "_source": {
+ "featured": null,
+ "keywords": ["photography"],
+ "visibility": "Public",
+ "description": "U.S. Army Base Hospital # 12 (Chicago Unit), frequently referred to as the Northwestern University Base Hospital, was organized in July 1916 to assist the medical needs of the Allied forces in Europe during WWI. Records of the United States Army Base Hospital Number 12 World War I and II are located at the Northwestern University Archives and include clippings, programs, poems, newsletters, journals, published articles, memorabilia, correspondence, photographs, and a scrapbook. Support for this project provided by the Pritzker Military Museum & Library.",
+ "published": true,
+ "title": "United States Army Base Hospital Number 12 World War I and II Records",
+ "modified_date": "2022-02-24T23:51:16.506259Z",
+ "admin_email": null,
+ "indexed_at": "2022-08-24T17:29:14.845491",
+ "api_model": "Collection",
+ "finding_aid_url": null,
+ "api_link": "[PLACEHOLDER]/ce1916b7-9fb8-44b5-80a1-5459ca97190c",
+ "id": "ce1916b7-9fb8-44b5-80a1-5459ca97190c",
+ "representative_image": {
+ "url": "https://iiif.stack.rdc-staging.library.northwestern.edu/iiif/2/79d55f3c-d74a-4710-8fee-5b29280398af",
+ "workId": "f2b8af41-f4ea-4ab3-8ae2-9f6a5d5e1caf"
+ },
+ "create_date": "2021-03-12T02:11:32.402606Z"
+ }
+ },
+ {
+ "_index": "dc-v2-collection-1658438321581379",
+ "_type": "_doc",
+ "_id": "55ff2504-dd53-4943-b2cb-aeea46e77bc3",
+ "_score": 1.0068047,
+ "_source": {
+ "featured": false,
+ "keywords": [""],
+ "visibility": "Public",
+ "description": "Edward Sheriff Curtis published The North American Indian between 1907 and 1930 with the intent to record traditional Native American cultures. The work comprises twenty volumes of narrative text and photogravure images. Each volume is accompanied by a portfolio of large photogravure plates. Search tip: shortcut to a list of just the text volumes by searching \"illustrated books\" in the search bar.\n\nCultural Context: Content on this site is drawn from a historical source which includes materials that may contain offensive images or language reflecting the nature of Settler Colonialism in America. Such materials should be viewed in the context of the time and place in which they were created. The images and text in this site are presented as specific, original artifacts recording the attitudes, perspectives and beliefs of a different era. Northwestern University does not endorse the views expressed in this collection which may contain images and text offensive to some researchers.",
+ "published": true,
+ "title": "Edward S. Curtis's The North American Indian",
+ "modified_date": "2021-11-01T16:37:01.894554Z",
+ "admin_email": null,
+ "indexed_at": "2022-08-24T17:29:14.585594",
+ "api_model": "Collection",
+ "finding_aid_url": null,
+ "api_link": "[PLACEHOLDER]/55ff2504-dd53-4943-b2cb-aeea46e77bc3",
+ "id": "55ff2504-dd53-4943-b2cb-aeea46e77bc3",
+ "representative_image": {},
+ "create_date": "2021-04-09T15:49:10.195808Z"
+ }
+ },
+ {
+ "_index": "dc-v2-collection-1658438321581379",
+ "_type": "_doc",
+ "_id": "f359687a-e496-404b-8708-9bbe490521dd",
+ "_score": 1.0068047,
+ "_source": {
+ "featured": false,
+ "keywords": [""],
+ "visibility": "Public",
+ "description": "The Project Survival Teach-out focused on the battle to defend the environment. The Teach-out features an assembly of environmental authorities and politically knowledgeable speakers.",
+ "published": true,
+ "title": "Project Survival Films, 1970",
+ "modified_date": "2022-02-08T17:36:51.114921Z",
+ "admin_email": null,
+ "indexed_at": "2022-08-24T17:29:14.585730",
+ "api_model": "Collection",
+ "finding_aid_url": null,
+ "api_link": "[PLACEHOLDER]/f359687a-e496-404b-8708-9bbe490521dd",
+ "id": "f359687a-e496-404b-8708-9bbe490521dd",
+ "representative_image": {},
+ "create_date": "2022-01-21T06:46:05.947509Z"
+ }
+ },
+ {
+ "_index": "dc-v2-collection-1658438321581379",
+ "_type": "_doc",
+ "_id": "070e81e2-f176-42d7-8b21-55c16b3a5378",
+ "_score": 1.0068047,
+ "_source": {
+ "featured": false,
+ "keywords": [""],
+ "visibility": "Public",
+ "description": "Musical Scores from the collections of Northwestern University Libraries.",
+ "published": true,
+ "title": "Musical Scores",
+ "modified_date": "2021-09-16T21:42:10.035361Z",
+ "admin_email": null,
+ "indexed_at": "2022-08-24T17:29:14.586139",
+ "api_model": "Collection",
+ "finding_aid_url": null,
+ "api_link": "[PLACEHOLDER]/070e81e2-f176-42d7-8b21-55c16b3a5378",
+ "id": "070e81e2-f176-42d7-8b21-55c16b3a5378",
+ "representative_image": {},
+ "create_date": "2021-04-21T14:02:35.341785Z"
+ }
+ },
+ {
+ "_index": "dc-v2-collection-1658438321581379",
+ "_type": "_doc",
+ "_id": "cf5faa52-b2ff-4edf-932b-ab07e0cdb7a7",
+ "_score": 1.0068047,
+ "_source": {
+ "featured": null,
+ "keywords": [],
+ "visibility": "Public",
+ "description": "This collection was from the Study Photographs Collection which was once under the Department of Theatre at Northwestern University. ",
+ "published": true,
+ "title": "Department of Theatre || Study Photographs Collection",
+ "modified_date": "2022-02-24T23:51:15.863394Z",
+ "admin_email": null,
+ "indexed_at": "2022-08-24T17:29:14.682155",
+ "api_model": "Collection",
+ "finding_aid_url": null,
+ "api_link": "[PLACEHOLDER]/cf5faa52-b2ff-4edf-932b-ab07e0cdb7a7",
+ "id": "cf5faa52-b2ff-4edf-932b-ab07e0cdb7a7",
+ "representative_image": {
+ "url": "https://iiif.stack.rdc-staging.library.northwestern.edu/iiif/2/35d06946-da0a-4c1d-906f-877cf64f03c3",
+ "workId": "eb83430b-12ae-4afd-80b7-03a6607d981f"
+ },
+ "create_date": "2021-03-12T02:11:32.355892Z"
+ }
+ },
+ {
+ "_index": "dc-v2-collection-1658438321581379",
+ "_type": "_doc",
+ "_id": "c373ecd2-2c45-45f2-9f9e-52dc244870bd",
+ "_score": 1.0068047,
+ "_source": {
+ "featured": null,
+ "keywords": [],
+ "visibility": "Public",
+ "description": "The Commedia dell'Arte, the famous improvisational theatre style born in Renaissance Italy, remains a major influence in today's theatre. Antonio Fava is an actor, comedian, author, director, musician, mask maker and Internationally renowned Maestro of Commedia dell'Arte. The masks in this collection are all stored in the Charles Deering McCormick Library of Special Collections. Fava's book The Comic Mask in the Commedia dell'Arte is published by Northwestern University Press.",
+ "published": true,
+ "title": "Commedia dell'Arte: The Masks of Antonio Fava",
+ "modified_date": "2021-03-17T20:18:35.644274Z",
+ "admin_email": null,
+ "indexed_at": "2022-08-24T17:29:14.683644",
+ "api_model": "Collection",
+ "finding_aid_url": null,
+ "api_link": "[PLACEHOLDER]/c373ecd2-2c45-45f2-9f9e-52dc244870bd",
+ "id": "c373ecd2-2c45-45f2-9f9e-52dc244870bd",
+ "representative_image": {},
+ "create_date": "2021-03-12T02:11:32.451164Z"
+ }
+ },
+ {
+ "_index": "dc-v2-collection-1658438321581379",
+ "_type": "_doc",
+ "_id": "aab3574c-e17d-43f2-93ab-fb6298bc0fc5",
+ "_score": 1.0068047,
+ "_source": {
+ "featured": false,
+ "keywords": [""],
+ "visibility": "Public",
+ "description": "Transportation Library Audiovisual Collection",
+ "published": true,
+ "title": "Transportation Library Audiovisual Collection",
+ "modified_date": "2022-02-15T19:23:24.115203Z",
+ "admin_email": null,
+ "indexed_at": "2022-08-24T17:29:14.684335",
+ "api_model": "Collection",
+ "finding_aid_url": null,
+ "api_link": "[PLACEHOLDER]/aab3574c-e17d-43f2-93ab-fb6298bc0fc5",
+ "id": "aab3574c-e17d-43f2-93ab-fb6298bc0fc5",
+ "representative_image": {},
+ "create_date": "2022-01-21T06:46:05.982410Z"
+ }
+ },
+ {
+ "_index": "dc-v2-collection-1658438321581379",
+ "_type": "_doc",
+ "_id": "51d4475f-5a0a-42a4-8901-bde73a1fae99",
+ "_score": 1.0068047,
+ "_source": {
+ "featured": null,
+ "keywords": ["Evanston"],
+ "visibility": "Public",
+ "description": "James (Jim) Roberts earned his bachelor’s degree from Northwestern University, master’s and Ph.D. degrees from the University of Iowa, and an M.B.A. from Duke’s Fuqua School of Business. Until recently he served as the Executive Vice Provost for Finance and Administration at Duke University, where he was also Adjunct Professor in the Department of History. The James Roberts photographs range in date from 1968-1972, the years when Roberts was a student at Northwestern. Although Roberts was a history major, his primary passion was photography, and he considers its practice a substantial part of his education. Roberts arrived at Northwestern in 1968. He quickly became acquainted with the photography community in Evanston, and in 1969 joined the staff of the Syllabus yearbook. During 1969-1972, Roberts documented Northwestern life intensively, and made occasional forays into the surrounding Evanston and Chicago environs. He also spent a quarter studying abroad in Cuernavaca, Mexico at the Centro Intercultural de Documentation, an important site of Catholic social activism in Mexico. The late 1960s and early 1970s were remarkable years at Northwestern, in Chicago, and around the world. The photos Roberts took, many published in the ’70, ’71, and ’72 editions of the Syllabus, artfully documented both the mundane (i.e. Evanston street scenes, football games, dining hall kitchen staff) and the extraordinary (i.e., the March on Washington, Vietnam War protests, student clashes with police, and street life in Mexico).",
+ "published": true,
+ "title": "Jim Roberts Photographs, 1968-1972",
+ "modified_date": "2022-02-24T23:51:16.606088Z",
+ "admin_email": null,
+ "indexed_at": "2022-08-24T17:29:15.613829",
+ "api_model": "Collection",
+ "finding_aid_url": null,
+ "api_link": "[PLACEHOLDER]/51d4475f-5a0a-42a4-8901-bde73a1fae99",
+ "id": "51d4475f-5a0a-42a4-8901-bde73a1fae99",
+ "representative_image": {
+ "url": "https://iiif.stack.rdc-staging.library.northwestern.edu/iiif/2/de8cabf7-990a-4cf5-8801-1a6753ede5d4",
+ "workId": "fea61a1f-0473-4cef-adcb-728f0b5b2cc4"
+ },
+ "create_date": "2021-03-12T02:11:32.418085Z"
+ }
+ },
+ {
+ "_index": "dc-v2-collection-1658438321581379",
+ "_type": "_doc",
+ "_id": "30d59215-8f2b-470d-967b-5a721fa366b7",
+ "_score": 1.0068047,
+ "_source": {
+ "featured": null,
+ "keywords": ["photography"],
+ "visibility": "Public",
+ "description": "Ann C. Gunter is an art historian and Bertha and Max Dressler Professor in the Humanities at Northwestern University. Her work addresses the visual and material cultural of the ancient Near East and its Eastern Mediterranean neighbors. These images are from her personal slide collection.",
+ "published": true,
+ "title": "Ann C. Gunter Slide Collection",
+ "modified_date": "2022-02-24T23:51:17.186411Z",
+ "admin_email": null,
+ "indexed_at": "2022-08-24T17:29:15.614113",
+ "api_model": "Collection",
+ "finding_aid_url": null,
+ "api_link": "[PLACEHOLDER]/30d59215-8f2b-470d-967b-5a721fa366b7",
+ "id": "30d59215-8f2b-470d-967b-5a721fa366b7",
+ "representative_image": {
+ "url": "https://iiif.stack.rdc-staging.library.northwestern.edu/iiif/2/fcf13c01-70f0-4f99-9b30-6a25b9a23b54",
+ "workId": "99df692f-4408-46d8-966a-c80cf662f5b7"
+ },
+ "create_date": "2021-03-12T02:11:32.358572Z"
+ }
+ },
+ {
+ "_index": "dc-v2-collection-1658438321581379",
+ "_type": "_doc",
+ "_id": "10fcd5dc-7550-4e5f-87ba-44cc778b1bbe",
+ "_score": 1.0068047,
+ "_source": {
+ "featured": false,
+ "keywords": [""],
+ "visibility": "Public",
+ "description": null,
+ "published": true,
+ "title": "Sample Public A/V Collection",
+ "modified_date": "2022-03-14T14:48:39.218179Z",
+ "admin_email": null,
+ "indexed_at": "2022-08-24T17:29:15.614799",
+ "api_model": "Collection",
+ "finding_aid_url": null,
+ "api_link": "[PLACEHOLDER]/10fcd5dc-7550-4e5f-87ba-44cc778b1bbe",
+ "id": "10fcd5dc-7550-4e5f-87ba-44cc778b1bbe",
+ "representative_image": {},
+ "create_date": "2022-03-14T14:48:39.218179Z"
+ }
+ },
+ {
+ "_index": "dc-v2-collection-1658438321581379",
+ "_type": "_doc",
+ "_id": "740d080c-2a49-4abc-acb9-b8af362a2910",
+ "_score": 0.65805584,
+ "_source": {
+ "featured": false,
+ "keywords": [""],
+ "visibility": "Public",
+ "description": "Materials showcasing typography and graphic art from the collections of Northwestern University Libraries.",
+ "published": true,
+ "title": "Typography and Graphic Art",
+ "modified_date": "2021-06-28T18:00:23.490474Z",
+ "admin_email": null,
+ "indexed_at": "2022-08-24T17:29:14.585532",
+ "api_model": "Collection",
+ "finding_aid_url": null,
+ "api_link": "[PLACEHOLDER]/740d080c-2a49-4abc-acb9-b8af362a2910",
+ "id": "740d080c-2a49-4abc-acb9-b8af362a2910",
+ "representative_image": {},
+ "create_date": "2021-04-08T21:06:23.368736Z"
+ }
+ },
+ {
+ "_index": "dc-v2-collection-1658438321581379",
+ "_type": "_doc",
+ "_id": "d3a8e587-cc58-4cb0-aea2-65465d42ec3e",
+ "_score": 0.65805584,
+ "_source": {
+ "featured": true,
+ "keywords": ["featured"],
+ "visibility": "Public",
+ "description": "The Ira Silverman Railroad Menu Collection consists of 238 items: 227 menus and eleven pamphlets. 35 United States and Canadian railroads are represented in the collection. All menus were issued by their respective railroad.\n",
+ "published": true,
+ "title": "Ira Silverman Railroad Menu Collection",
+ "modified_date": "2021-03-17T20:18:35.644274Z",
+ "admin_email": null,
+ "indexed_at": "2022-08-24T17:29:14.586630",
+ "api_model": "Collection",
+ "finding_aid_url": null,
+ "api_link": "[PLACEHOLDER]/d3a8e587-cc58-4cb0-aea2-65465d42ec3e",
+ "id": "d3a8e587-cc58-4cb0-aea2-65465d42ec3e",
+ "representative_image": {},
+ "create_date": "2021-03-12T02:11:32.413134Z"
+ }
+ },
+ {
+ "_index": "dc-v2-collection-1658438321581379",
+ "_type": "_doc",
+ "_id": "eaa3047f-685b-4a52-8e38-e11e4792faba",
+ "_score": 0.65805584,
+ "_source": {
+ "featured": false,
+ "keywords": [""],
+ "visibility": "Public",
+ "description": "Ray Still Master Class Audio Archives",
+ "published": true,
+ "title": "Ray Still Master Class Audio Archives",
+ "modified_date": "2022-02-02T18:23:24.814103Z",
+ "admin_email": null,
+ "indexed_at": "2022-08-24T17:29:14.586722",
+ "api_model": "Collection",
+ "finding_aid_url": null,
+ "api_link": "[PLACEHOLDER]/eaa3047f-685b-4a52-8e38-e11e4792faba",
+ "id": "eaa3047f-685b-4a52-8e38-e11e4792faba",
+ "representative_image": {},
+ "create_date": "2022-01-21T06:46:05.952918Z"
+ }
+ },
+ {
+ "_index": "dc-v2-collection-1658438321581379",
+ "_type": "_doc",
+ "_id": "8bdddde5-39a2-4179-baf0-cb7e1cfc1e9f",
+ "_score": 0.65805584,
+ "_source": {
+ "featured": false,
+ "keywords": [""],
+ "visibility": "Public",
+ "description": "The Moldenhauer Collection is comprised of music manuscripts, sketches and quotations, correspondence, photographs, newspaper clippings, printed programs, manuscript texts and other materials which document composers and musicians active between 1683 and 1973. This collection is a selection of items that were digitized for a researcher from Box 3, Folder 28.",
+ "published": true,
+ "title": "Moldenhauer Collection ",
+ "modified_date": "2022-02-18T17:14:30.706129Z",
+ "admin_email": null,
+ "indexed_at": "2022-08-24T17:29:14.587187",
+ "api_model": "Collection",
+ "finding_aid_url": "https://findingaids.library.northwestern.edu/repositories/3/resources/1167",
+ "api_link": "[PLACEHOLDER]/8bdddde5-39a2-4179-baf0-cb7e1cfc1e9f",
+ "id": "8bdddde5-39a2-4179-baf0-cb7e1cfc1e9f",
+ "representative_image": {},
+ "create_date": "2021-10-13T14:41:59.841972Z"
+ }
+ },
+ {
+ "_index": "dc-v2-collection-1658438321581379",
+ "_type": "_doc",
+ "_id": "4ed2338d-c715-4a86-8ac6-6b4030a42be5",
+ "_score": 0.65805584,
+ "_source": {
+ "featured": false,
+ "keywords": ["poster"],
+ "visibility": "Public",
+ "description": "Hamid Naficy Middle Eastern Movie Posters Collection contains 249 posters, which have been digitized and cataloged individually. These posters document the social history of film in Iran and offer a unique visual representation of the political and social climate there between 1966 and 2014.",
+ "published": true,
+ "title": "Hamid Naficy Iranian and Middle Eastern Movie Posters Collection",
+ "modified_date": "2021-11-03T19:04:23.758063Z",
+ "admin_email": null,
+ "indexed_at": "2022-08-24T17:29:14.587445",
+ "api_model": "Collection",
+ "finding_aid_url": null,
+ "api_link": "[PLACEHOLDER]/4ed2338d-c715-4a86-8ac6-6b4030a42be5",
+ "id": "4ed2338d-c715-4a86-8ac6-6b4030a42be5",
+ "representative_image": {},
+ "create_date": "2021-03-12T02:11:32.440684Z"
+ }
+ },
+ {
+ "_index": "dc-v2-collection-1658438321581379",
+ "_type": "_doc",
+ "_id": "fbe609ee-0fab-472d-bc98-51dce3077167",
+ "_score": 0.65805584,
+ "_source": {
+ "featured": false,
+ "keywords": [""],
+ "visibility": "Public",
+ "description": "51 master class audio recordings of Arnold Jacobs (low brass) from the 1970s - early 80s. ",
+ "published": true,
+ "title": "Arnold Jacobs Master Class Audio Archives",
+ "modified_date": "2022-02-03T17:13:50.372422Z",
+ "admin_email": null,
+ "indexed_at": "2022-08-24T17:29:14.682491",
+ "api_model": "Collection",
+ "finding_aid_url": null,
+ "api_link": "[PLACEHOLDER]/fbe609ee-0fab-472d-bc98-51dce3077167",
+ "id": "fbe609ee-0fab-472d-bc98-51dce3077167",
+ "representative_image": {},
+ "create_date": "2022-01-21T06:46:05.803754Z"
+ }
+ },
+ {
+ "_index": "dc-v2-collection-1658438321581379",
+ "_type": "_doc",
+ "_id": "c2a8a3e0-af0f-4e04-8721-91698fc14574",
+ "_score": 0.65805584,
+ "_source": {
+ "featured": null,
+ "keywords": ["Evanston"],
+ "visibility": "Public",
+ "description": "Series 31/6/155, Photographs: Folder 4 - The following images are from the events of the May 3, 1968 Bursar’s Office Takeover, the first student protest at Northwestern University. On April 22, 1968, members of Black student organizations, For Members Only (FMO) and African American Student Union (AASU), presented a list of demands to the Northwestern University administration regarding discriminatory campus policies and practices. When the demands were not met, on May 3, 1968, approximately 120 African American students occupied the Bursar’s Office, Northwestern University’s business office. The demonstration lasted for 38 hours when members of FMO and AASU and the administration ultimately reached a compromise on May 4, 1968. This effort successfully led to the “May 4th agreement” in which the University promised enhanced support for African American students regarding admission, financial aid, housing, curriculum, and counseling, as well as an official statement by the administration admitting to the existence of institutional racism at the University. Notably, it also prompted the creation of the Department of African American Studies and a social space for Black students on campus, known as the Black House.",
+ "published": true,
+ "title": "Records of the Bursar’s Office Takeover, May 1968",
+ "modified_date": "2021-03-17T20:18:35.644274Z",
+ "admin_email": null,
+ "indexed_at": "2022-08-24T17:29:14.683203",
+ "api_model": "Collection",
+ "finding_aid_url": null,
+ "api_link": "[PLACEHOLDER]/c2a8a3e0-af0f-4e04-8721-91698fc14574",
+ "id": "c2a8a3e0-af0f-4e04-8721-91698fc14574",
+ "representative_image": {},
+ "create_date": "2021-03-12T02:11:32.448212Z"
+ }
+ },
+ {
+ "_index": "dc-v2-collection-1658438321581379",
+ "_type": "_doc",
+ "_id": "442cc5c7-2c72-481c-a84f-eca6ef976505",
+ "_score": 0.65805584,
+ "_source": {
+ "featured": false,
+ "keywords": [""],
+ "visibility": "Public",
+ "description": "Leigh Bienen Videos",
+ "published": true,
+ "title": "Leigh Bienen Videos",
+ "modified_date": "2022-02-04T15:02:57.438602Z",
+ "admin_email": "lbbienen@law.northwestern.edu",
+ "indexed_at": "2022-08-24T17:29:14.683425",
+ "api_model": "Collection",
+ "finding_aid_url": null,
+ "api_link": "[PLACEHOLDER]/442cc5c7-2c72-481c-a84f-eca6ef976505",
+ "id": "442cc5c7-2c72-481c-a84f-eca6ef976505",
+ "representative_image": {},
+ "create_date": "2022-01-21T06:46:05.876787Z"
+ }
+ },
+ {
+ "_index": "dc-v2-collection-1658438321581379",
+ "_type": "_doc",
+ "_id": "65209b41-8f6a-4aee-8666-9676bafbf8f7",
+ "_score": 0.65805584,
+ "_source": {
+ "featured": false,
+ "keywords": [""],
+ "visibility": "Public",
+ "description": "University Archives Film Collection",
+ "published": true,
+ "title": "University Archives Film Collection",
+ "modified_date": "2022-02-18T13:34:03.654220Z",
+ "admin_email": null,
+ "indexed_at": "2022-08-24T17:29:14.684410",
+ "api_model": "Collection",
+ "finding_aid_url": null,
+ "api_link": "[PLACEHOLDER]/65209b41-8f6a-4aee-8666-9676bafbf8f7",
+ "id": "65209b41-8f6a-4aee-8666-9676bafbf8f7",
+ "representative_image": {},
+ "create_date": "2022-02-17T21:10:21.239254Z"
+ }
+ },
+ {
+ "_index": "dc-v2-collection-1658438321581379",
+ "_type": "_doc",
+ "_id": "8cdf83c9-3831-4211-acd7-122bca9b89da",
+ "_score": 0.65805584,
+ "_source": {
+ "featured": false,
+ "keywords": [""],
+ "visibility": "Public",
+ "description": "This collection of Northwestern University football films dates between 1929 and 1984 with a gap for the period 1932–1934. The films record actual intercollegiate games although for many seasons not all contests are represented. The films are most complete for football seasons from the 1950s through the 1980s; beginning in the late 1950s, practice, junior varsity, and freshman team game films often are included. Northwestern team and Big Ten Conference football highlight films are scattered across the collection from the 1930s through the 1970s.",
+ "published": true,
+ "title": "Athletic Department Football Films",
+ "modified_date": "2022-02-18T14:58:48.206131Z",
+ "admin_email": null,
+ "indexed_at": "2022-08-24T17:29:14.684527",
+ "api_model": "Collection",
+ "finding_aid_url": "https://findingaids.library.northwestern.edu/repositories/6/resources/772",
+ "api_link": "[PLACEHOLDER]/8cdf83c9-3831-4211-acd7-122bca9b89da",
+ "id": "8cdf83c9-3831-4211-acd7-122bca9b89da",
+ "representative_image": {},
+ "create_date": "2022-01-21T06:46:05.894184Z"
+ }
+ },
+ {
+ "_index": "dc-v2-collection-1658438321581379",
+ "_type": "_doc",
+ "_id": "5f6e9e67-7f2d-4208-b3bd-b1aedcdf7e35",
+ "_score": 0.65805584,
+ "_source": {
+ "featured": false,
+ "keywords": [""],
+ "visibility": "Public",
+ "description": "Poetry and Poetics Colloquium",
+ "published": true,
+ "title": "Poetry and Poetics Colloquium",
+ "modified_date": "2022-02-04T17:55:03.098667Z",
+ "admin_email": null,
+ "indexed_at": "2022-08-24T17:29:14.764217",
+ "api_model": "Collection",
+ "finding_aid_url": null,
+ "api_link": "[PLACEHOLDER]/5f6e9e67-7f2d-4208-b3bd-b1aedcdf7e35",
+ "id": "5f6e9e67-7f2d-4208-b3bd-b1aedcdf7e35",
+ "representative_image": {},
+ "create_date": "2022-01-21T06:46:05.943123Z"
+ }
+ },
+ {
+ "_index": "dc-v2-collection-1658438321581379",
+ "_type": "_doc",
+ "_id": "c4f30015-88b5-4291-b3a6-8ac9b7c7069c",
+ "_score": 0.65805584,
+ "_source": {
+ "featured": false,
+ "keywords": ["Evanston"],
+ "visibility": "Public",
+ "description": "Over 150 photographic prints (mostly 4x6 cabinet size, mounted on cardstock) taken by noted Evanston photographer Alexander Hesler, dating circa 1870-1887 and depicting Northwestern University faculty, students, and buildings. Includes 2 copies of published volume \"Photographic Views of Picturesque Evanston\" (1887).",
+ "published": true,
+ "title": "Alexander Hesler Photograph Collection",
+ "modified_date": "2022-02-24T23:51:16.277400Z",
+ "admin_email": null,
+ "indexed_at": "2022-08-24T17:29:14.845377",
+ "api_model": "Collection",
+ "finding_aid_url": "https://findingaids.library.northwestern.edu/repositories/6/resources/546",
+ "api_link": "[PLACEHOLDER]/c4f30015-88b5-4291-b3a6-8ac9b7c7069c",
+ "id": "c4f30015-88b5-4291-b3a6-8ac9b7c7069c",
+ "representative_image": {
+ "url": "https://iiif.stack.rdc-staging.library.northwestern.edu/iiif/2/d9736e00-a675-4e60-a35a-9e48c09e5340",
+ "workId": "4f5f0e6f-a32d-4ecf-b960-937506b2f22a"
+ },
+ "create_date": "2021-03-12T02:11:32.433108Z"
+ }
+ },
+ {
+ "_index": "dc-v2-collection-1658438321581379",
+ "_type": "_doc",
+ "_id": "d4671cda-6ed8-48b9-8031-88b5940d572e",
+ "_score": 0.65805584,
+ "_source": {
+ "featured": true,
+ "keywords": ["featured"],
+ "visibility": "Public",
+ "description": "This collection of airline, railroad and cruise ship menus began as a gift from Northwestern alumnus George M. Foster, who donated his extensive menu collection to the Transportation Library in 1997, where it has since been expanded from other sources.",
+ "published": true,
+ "title": "Transportation Library Menu Collection",
+ "modified_date": "2022-02-24T23:51:16.283849Z",
+ "admin_email": null,
+ "indexed_at": "2022-08-24T17:29:14.845411",
+ "api_model": "Collection",
+ "finding_aid_url": "https://findingaids.library.northwestern.edu/repositories/5/resources/1230",
+ "api_link": "[PLACEHOLDER]/d4671cda-6ed8-48b9-8031-88b5940d572e",
+ "id": "d4671cda-6ed8-48b9-8031-88b5940d572e",
+ "representative_image": {
+ "url": "https://iiif.stack.rdc-staging.library.northwestern.edu/iiif/2/e93a7c4a-1228-463d-8569-6dece7748486",
+ "workId": "9ad49656-a88b-468b-aafd-00152814a8fc"
+ },
+ "create_date": "2021-03-12T02:11:32.381243Z"
+ }
+ },
+ {
+ "_index": "dc-v2-collection-1658438321581379",
+ "_type": "_doc",
+ "_id": "faf4f60e-78e0-4fbf-96ce-4ca8b4df597a",
+ "_score": 0.65805584,
+ "_source": {
+ "featured": null,
+ "keywords": ["poster"],
+ "visibility": "Public",
+ "description": "View more than 300 World War II-era posters issued by various U.S. government agencies. They represent the government's effort, through art, illustration and photographs, to unite the American people in a time of adversity.",
+ "published": true,
+ "title": "World War II Poster Collection",
+ "modified_date": "2022-02-24T23:51:16.558814Z",
+ "admin_email": null,
+ "indexed_at": "2022-08-24T17:29:15.613720",
+ "api_model": "Collection",
+ "finding_aid_url": null,
+ "api_link": "[PLACEHOLDER]/faf4f60e-78e0-4fbf-96ce-4ca8b4df597a",
+ "id": "faf4f60e-78e0-4fbf-96ce-4ca8b4df597a",
+ "representative_image": {
+ "url": "https://iiif.stack.rdc-staging.library.northwestern.edu/iiif/2/eb6499c9-3b01-4457-823b-32b2d6063316",
+ "workId": "c4a32218-22f2-49cd-8a67-949cd00c22d3"
+ },
+ "create_date": "2021-03-12T02:11:32.445651Z"
+ }
+ },
+ {
+ "_index": "dc-v2-collection-1658438321581379",
+ "_type": "_doc",
+ "_id": "1fb2f5bc-780e-4abb-b61e-fe6d715d13e8",
+ "_score": 0.48835278,
+ "_source": {
+ "featured": false,
+ "keywords": [""],
+ "visibility": "Public",
+ "description": null,
+ "published": true,
+ "title": "ABC.456.TEST",
+ "modified_date": "2022-03-04T15:56:28.566313Z",
+ "admin_email": null,
+ "indexed_at": "2022-08-24T17:29:14.586234",
+ "api_model": "Collection",
+ "finding_aid_url": null,
+ "api_link": "[PLACEHOLDER]/1fb2f5bc-780e-4abb-b61e-fe6d715d13e8",
+ "id": "1fb2f5bc-780e-4abb-b61e-fe6d715d13e8",
+ "representative_image": {},
+ "create_date": "2022-03-04T15:55:40.703986Z"
+ }
+ },
+ {
+ "_index": "dc-v2-collection-1658438321581379",
+ "_type": "_doc",
+ "_id": "690b42c7-4e7d-40ba-a864-dd300e53a331",
+ "_score": 0.48835278,
+ "_source": {
+ "featured": false,
+ "keywords": [""],
+ "visibility": "Public",
+ "description": null,
+ "published": true,
+ "title": "ABC.123.TEST",
+ "modified_date": "2022-03-14T20:10:08.622664Z",
+ "admin_email": null,
+ "indexed_at": "2022-08-24T17:29:14.586270",
+ "api_model": "Collection",
+ "finding_aid_url": null,
+ "api_link": "[PLACEHOLDER]/690b42c7-4e7d-40ba-a864-dd300e53a331",
+ "id": "690b42c7-4e7d-40ba-a864-dd300e53a331",
+ "representative_image": {},
+ "create_date": "2022-03-04T15:04:45.999466Z"
+ }
+ },
+ {
+ "_index": "dc-v2-collection-1658438321581379",
+ "_type": "_doc",
+ "_id": "d389d9ca-27e3-44fc-a12f-3a5a4208a6c8",
+ "_score": 0.48835278,
+ "_source": {
+ "featured": false,
+ "keywords": [""],
+ "visibility": "Public",
+ "description": "Imagination without Borders introduces the work of Japanese visual artist TOMIYAMA Taeko and, to a lesser extent, the paintings and prints of MARUKI Toshi & MARUKI Iri and Eleanor RUBIN. All four think of themselves as political artists and see their work as a protest against social injustice and the suffering such injustice causes. All four were deeply affected by World War II and their art reflects their shared belief that war is a disaster for everyone.",
+ "published": true,
+ "title": "Imagination without Borders",
+ "modified_date": "2022-02-03T14:48:23.707445Z",
+ "admin_email": null,
+ "indexed_at": "2022-08-24T17:29:14.586925",
+ "api_model": "Collection",
+ "finding_aid_url": null,
+ "api_link": "[PLACEHOLDER]/d389d9ca-27e3-44fc-a12f-3a5a4208a6c8",
+ "id": "d389d9ca-27e3-44fc-a12f-3a5a4208a6c8",
+ "representative_image": {},
+ "create_date": "2022-01-21T06:46:05.860151Z"
+ }
+ },
+ {
+ "_index": "dc-v2-collection-1658438321581379",
+ "_type": "_doc",
+ "_id": "2c9a427b-de57-4bff-98c8-a5082bc82285",
+ "_score": 0.48835278,
+ "_source": {
+ "featured": false,
+ "keywords": [""],
+ "visibility": "Public",
+ "description": "Materials in this collection of 45 documents pertain to the institution of slavery in the Americas. The documents include correspondence on the slave trade, assignments on chain gangs, bills of sale, manumission papers, and wills and bequests. They also include letters providing character references for free Black people, reports on a school in an African American religious community in Baltimore, Maryland, and an indenture agreement between a printer and an apprentice.",
+ "published": false,
+ "title": "Slavery, Enslaved Persons, and Free Blacks in the Americas Collection",
+ "modified_date": "2022-02-09T22:18:54.045438Z",
+ "admin_email": null,
+ "indexed_at": "2022-08-24T17:29:14.587297",
+ "api_model": "Collection",
+ "finding_aid_url": "https://findingaids.library.northwestern.edu/repositories/7/resources/1188",
+ "api_link": "[PLACEHOLDER]/2c9a427b-de57-4bff-98c8-a5082bc82285",
+ "id": "2c9a427b-de57-4bff-98c8-a5082bc82285",
+ "representative_image": {},
+ "create_date": "2022-01-20T15:27:16.810205Z"
+ }
+ },
+ {
+ "_index": "dc-v2-collection-1658438321581379",
+ "_type": "_doc",
+ "_id": "b315b92d-4757-44f5-b311-b59eac4fa03e",
+ "_score": 0.48835278,
+ "_source": {
+ "featured": false,
+ "keywords": [""],
+ "visibility": "Public",
+ "description": "Frederick Douglass (c. 1817-1895) was an abolitionist, orator, and writer. In 1838, Douglass escaped from his Maryland enslaver, and over time became one of the most celebrated abolitionists and social reformers of the 19th century. This collection of 11 original documents and 6 copies contains Frederick Douglass’ bill of sale, correspondence, newspaper clippings, and additional copies of correspondence.",
+ "published": false,
+ "title": "Frederick Douglass Collection ",
+ "modified_date": "2022-02-09T22:17:17.249236Z",
+ "admin_email": null,
+ "indexed_at": "2022-08-24T17:29:14.682281",
+ "api_model": "Collection",
+ "finding_aid_url": "https://findingaids.library.northwestern.edu/repositories/7/resources/1738",
+ "api_link": "[PLACEHOLDER]/b315b92d-4757-44f5-b311-b59eac4fa03e",
+ "id": "b315b92d-4757-44f5-b311-b59eac4fa03e",
+ "representative_image": {},
+ "create_date": "2022-01-20T15:27:36.381059Z"
+ }
+ },
+ {
+ "_index": "dc-v2-collection-1658438321581379",
+ "_type": "_doc",
+ "_id": "cd92fb8d-76a7-4e72-be0f-78a5839caa89",
+ "_score": 0.48835278,
+ "_source": {
+ "featured": false,
+ "keywords": [""],
+ "visibility": "Public",
+ "description": "This collection contains lavishly illustrated early U.S. bicycle and bicycle parts manufacturers’ catalogs covering the period from 1890 through 1932, with the great majority published between 1890 and 1902. The 71 items in this collection represent over 40 manufacturers, roughly geographically distributed in equal parts between the Chicago area, the East Coast, and the Midwest.",
+ "published": true,
+ "title": "Late 19th - Early 20th Century Bicycle and Bicycle Parts Catalogs",
+ "modified_date": "2021-07-15T20:33:46.985909Z",
+ "admin_email": null,
+ "indexed_at": "2022-08-24T17:29:14.682585",
+ "api_model": "Collection",
+ "finding_aid_url": null,
+ "api_link": "[PLACEHOLDER]/cd92fb8d-76a7-4e72-be0f-78a5839caa89",
+ "id": "cd92fb8d-76a7-4e72-be0f-78a5839caa89",
+ "representative_image": {},
+ "create_date": "2021-04-21T19:42:43.255698Z"
+ }
+ },
+ {
+ "_index": "dc-v2-collection-1658438321581379",
+ "_type": "_doc",
+ "_id": "48cefdba-c111-4a6a-8d40-98ba7986e2d6",
+ "_score": 0.48835278,
+ "_source": {
+ "featured": false,
+ "keywords": [""],
+ "visibility": "Public",
+ "description": "Robert Marcellus Master Class Audio Archives",
+ "published": true,
+ "title": "Robert Marcellus Master Class Audio Archives",
+ "modified_date": "2022-02-03T21:45:31.271729Z",
+ "admin_email": null,
+ "indexed_at": "2022-08-24T17:29:14.682689",
+ "api_model": "Collection",
+ "finding_aid_url": null,
+ "api_link": "[PLACEHOLDER]/48cefdba-c111-4a6a-8d40-98ba7986e2d6",
+ "id": "48cefdba-c111-4a6a-8d40-98ba7986e2d6",
+ "representative_image": {},
+ "create_date": "2022-01-21T06:46:05.967937Z"
+ }
+ },
+ {
+ "_index": "dc-v2-collection-1658438321581379",
+ "_type": "_doc",
+ "_id": "1c2e2200-c12d-4c7f-8b87-a935c349898a",
+ "_score": 0.48835278,
+ "_source": {
+ "featured": null,
+ "keywords": [],
+ "visibility": "Public",
+ "description": "This collection features digital copies of 113 antique maps of Africa and accompanying text dating from the mid-16th Century to the early 20th Century. All scanned maps are authentic and originally collected by the Melville J. Herskovits Library of African Studies. Melville J. Herskovits established Northwestern University's Program of African Studies in 1948 (the first of its kind at a major research university in the United States). The Herskovits Library, formally created as a separate library in 1954, has since its inception collected maps that describe Africa from their earliest appearance to the most current. Map area coverage includes the continent, regions (particularly North Africa and Algeria), islands (particularly Madagascar), and a few city plans. All of these maps are loose items, though many have been excised from published atlases. Some of the highlights of the digital collection are: a series of Ptolemic maps of North Africa by Ruscelli, ca. 1565; Forlani: Africa , 1562; Mercator: Africa, 1595; Blaeu: Æthiopia ca. 1650 (a Prester John map); Carey: Africa, 1795 (first map of Africa published in the United States), Arrowsmith: Africa, 1802 (notable for its large dimensions, 124 x 145 cm.), a series of Algerian maps published by the French government in the mid-1800's, and maps by other notable cartographers, such as Hondius, Jansson, de Jode, de L'Isle, Ortelius, Sanson, and de Wit. The original maps are kept and maintained in the map collection in the Government & Geographic Information Collection. We welcome questions, comments, and suggestions concerning any aspect of this digital collection, particularly with regards to provenance. Other antique maps from the Herskovits Library which were not included in this digital collection are either duplicate copies or other editions, such as French government sets covering Algeria.",
+ "published": true,
+ "title": "16th-Early 20th Century Maps of Africa",
+ "modified_date": "2021-03-17T20:18:35.644274Z",
+ "admin_email": null,
+ "indexed_at": "2022-08-24T17:29:14.682738",
+ "api_model": "Collection",
+ "finding_aid_url": null,
+ "api_link": "[PLACEHOLDER]/1c2e2200-c12d-4c7f-8b87-a935c349898a",
+ "id": "1c2e2200-c12d-4c7f-8b87-a935c349898a",
+ "representative_image": {},
+ "create_date": "2021-03-12T02:11:32.395086Z"
+ }
+ },
+ {
+ "_index": "dc-v2-collection-1658438321581379",
+ "_type": "_doc",
+ "_id": "0af7b1f5-9aee-4ddc-b3b8-ede6eac027c7",
+ "_score": 0.48835278,
+ "_source": {
+ "featured": null,
+ "keywords": [],
+ "visibility": "Public",
+ "description": "Scrapbooks from the collections of Northwestern University Libraries.",
+ "published": true,
+ "title": "Scrapbooks",
+ "modified_date": "2021-03-17T20:18:35.644274Z",
+ "admin_email": null,
+ "indexed_at": "2022-08-24T17:29:14.683179",
+ "api_model": "Collection",
+ "finding_aid_url": null,
+ "api_link": "[PLACEHOLDER]/0af7b1f5-9aee-4ddc-b3b8-ede6eac027c7",
+ "id": "0af7b1f5-9aee-4ddc-b3b8-ede6eac027c7",
+ "representative_image": {},
+ "create_date": "2021-03-12T02:11:32.370858Z"
+ }
+ },
+ {
+ "_index": "dc-v2-collection-1658438321581379",
+ "_type": "_doc",
+ "_id": "db98ed75-1810-46d3-a838-176c0685cd01",
+ "_score": 0.48835278,
+ "_source": {
+ "featured": false,
+ "keywords": [""],
+ "visibility": "Public",
+ "description": "The James E. \"Jimmy\" Johnson Scrapbooks collection consists mainly of two scrapbooks. The first, bearing the title “Football Note,” contains numerous newspaper articles detailing Johnson’s football career and social engagements during the years he spent at Northwestern University. About half of the scrapbook chronicles activities associated with the Carlisle Indian Industrial School. Included are numerous photographs and halftone pictures depicting the school and its students. Scattered throughout the scrapbook are printed items and ephemera pertaining to school ceremonies and events. Additionally there are pages with business and personal information cards documenting Johnson’s friends and associates.\n\nThe second scrapbook is smaller and only contains newspaper clippings pertaining to Johnson’s football career at Carlisle.\n\nSupplementing the scrapbooks are additional photographs and biographical information, including Johnson's death notice.",
+ "published": true,
+ "title": "James E. \"Jimmy\" Johnson (1879-1942) Scrapbooks and Miscellanea",
+ "modified_date": "2021-09-28T22:18:28.037587Z",
+ "admin_email": null,
+ "indexed_at": "2022-08-24T17:29:14.684644",
+ "api_model": "Collection",
+ "finding_aid_url": "https://findingaids.library.northwestern.edu/repositories/6/resources/587",
+ "api_link": "[PLACEHOLDER]/db98ed75-1810-46d3-a838-176c0685cd01",
+ "id": "db98ed75-1810-46d3-a838-176c0685cd01",
+ "representative_image": {},
+ "create_date": "2021-03-12T02:11:32.460047Z"
+ }
+ },
+ {
+ "_index": "dc-v2-collection-1658438321581379",
+ "_type": "_doc",
+ "_id": "5c9eaad8-afb8-4224-ae1a-cffddc731109",
+ "_score": 0.48835278,
+ "_source": {
+ "featured": false,
+ "keywords": [""],
+ "visibility": "Public",
+ "description": "Vincent Cichowicz Master Class Audio Archives",
+ "published": true,
+ "title": "Vincent Cichowicz Master Class Audio Archives",
+ "modified_date": "2022-02-04T21:08:02.399142Z",
+ "admin_email": null,
+ "indexed_at": "2022-08-24T17:29:14.684921",
+ "api_model": "Collection",
+ "finding_aid_url": null,
+ "api_link": "[PLACEHOLDER]/5c9eaad8-afb8-4224-ae1a-cffddc731109",
+ "id": "5c9eaad8-afb8-4224-ae1a-cffddc731109",
+ "representative_image": {},
+ "create_date": "2022-01-21T06:46:05.992073Z"
+ }
+ },
+ {
+ "_index": "dc-v2-collection-1658438321581379",
+ "_type": "_doc",
+ "_id": "c708f479-db91-4585-8267-874c5e7da73f",
+ "_score": 0.48835278,
+ "_source": {
+ "featured": null,
+ "keywords": ["photography"],
+ "visibility": "Public",
+ "description": "Images taken from: Narrative report, July 1935 to April 1936. Illinois: Works Progress Administration, Illinois, Women and Professional Division, 1936.",
+ "published": true,
+ "title": "WPA Digital Collection, 1935-1943",
+ "modified_date": "2021-03-17T20:18:35.644274Z",
+ "admin_email": null,
+ "indexed_at": "2022-08-24T17:29:14.764090",
+ "api_model": "Collection",
+ "finding_aid_url": null,
+ "api_link": "[PLACEHOLDER]/c708f479-db91-4585-8267-874c5e7da73f",
+ "id": "c708f479-db91-4585-8267-874c5e7da73f",
+ "representative_image": {},
+ "create_date": "2021-03-12T02:11:32.410084Z"
+ }
+ },
+ {
+ "_index": "dc-v2-collection-1658438321581379",
+ "_type": "_doc",
+ "_id": "85af945f-1396-4b88-9087-c4f2fa64d21c",
+ "_score": 0.48835278,
+ "_source": {
+ "featured": null,
+ "keywords": ["photography"],
+ "visibility": "Public",
+ "description": "Rob Linrothe is an Associate Professor in the Department of Art History at Northwestern University. Here he shares his images of Tibetan, Chinese, and Indian monuments, field photography, and architecture. The collection has a strong focus on Tibetan sites, particularly petroglyphs, stupas, and monasteries in the Ladakh and Zangskar regions. Linrothe has also photographed the architecture and sculpture of monuments such as Borobudur in Indonesia and Sanchi in India. Rob Linrothe specializes in Buddhist art of the Himalayas. His recent fieldwork has focused on pre-modern mural painting in the Ladakh and Zangskar regions of Western Tibet (northwest India), as well as the contemporary revival of monastic painting in the Amdo province of Eastern Tibet (China).",
+ "published": true,
+ "title": "Rob Linrothe Image Collection",
+ "modified_date": "2022-02-24T23:51:15.805348Z",
+ "admin_email": null,
+ "indexed_at": "2022-08-24T17:29:14.764292",
+ "api_model": "Collection",
+ "finding_aid_url": null,
+ "api_link": "[PLACEHOLDER]/85af945f-1396-4b88-9087-c4f2fa64d21c",
+ "id": "85af945f-1396-4b88-9087-c4f2fa64d21c",
+ "representative_image": {
+ "url": "https://iiif.stack.rdc-staging.library.northwestern.edu/iiif/2/4c1c9ab6-72ed-42fa-b273-6acd0cf946dc",
+ "workId": "f292521f-4114-4d89-b477-403a697df2f8"
+ },
+ "create_date": "2021-03-12T02:11:32.427741Z"
+ }
+ },
+ {
+ "_index": "dc-v2-collection-1658438321581379",
+ "_type": "_doc",
+ "_id": "35c3a71a-ce83-4410-82ec-640e01da86eb",
+ "_score": 0.3395071,
+ "_source": {
+ "featured": false,
+ "keywords": [""],
+ "visibility": "Public",
+ "description": "Press cutting books from the Dublin Gate Theatre",
+ "published": false,
+ "title": "Dublin Gate Theatre Archive",
+ "modified_date": "2021-06-28T18:06:19.151525Z",
+ "admin_email": null,
+ "indexed_at": "2022-08-24T17:29:14.586211",
+ "api_model": "Collection",
+ "finding_aid_url": "https://findingaids.library.northwestern.edu/repositories/7/resources/1410",
+ "api_link": "[PLACEHOLDER]/35c3a71a-ce83-4410-82ec-640e01da86eb",
+ "id": "35c3a71a-ce83-4410-82ec-640e01da86eb",
+ "representative_image": {},
+ "create_date": "2021-06-22T20:53:44.226666Z"
+ }
+ },
+ {
+ "_index": "dc-v2-collection-1658438321581379",
+ "_type": "_doc",
+ "_id": "267bed1b-f808-4c51-acb1-0288378819d2",
+ "_score": 0.3395071,
+ "_source": {
+ "featured": null,
+ "keywords": [],
+ "visibility": "Public",
+ "description": "Northwestern University Libraries’ Map & Atlas Collection allows access to an ever-growing selection of our cartographic resources in high resolution.",
+ "published": true,
+ "title": "Map and Atlas Collection",
+ "modified_date": "2021-03-17T20:18:35.644274Z",
+ "admin_email": null,
+ "indexed_at": "2022-08-24T17:29:14.586396",
+ "api_model": "Collection",
+ "finding_aid_url": null,
+ "api_link": "[PLACEHOLDER]/267bed1b-f808-4c51-acb1-0288378819d2",
+ "id": "267bed1b-f808-4c51-acb1-0288378819d2",
+ "representative_image": {},
+ "create_date": "2021-03-12T02:11:32.386638Z"
+ }
+ },
+ {
+ "_index": "dc-v2-collection-1658438321581379",
+ "_type": "_doc",
+ "_id": "ba35820a-525a-4cfa-8f23-4891c9f798c4",
+ "_score": 0.3395071,
+ "_source": {
+ "featured": null,
+ "keywords": [],
+ "visibility": "Public",
+ "description": "Gift of the Deering Family. These sketches by Catalan artist Ramón Casas (1866-1932) document the work of an under-represented artist who was influential in modernist art circles in Barcelona and Paris along with his peers John Singer Sargent, Henri de Toulouse-Lautrec, and the young Pablo Picasso. Three bound hardcover volumes of sketches came to the Northwestern University Libraries in 1998 as part of a donation of books that had belonged to NU benefactor Charles Deering (1852-1927). Deering and Casas met in 1904 and established a lifelong friendship. At some point before the donation, a few hundred loose Casas drawings, postcards, and illustrated letters dating from 1891 to 1912 were bound into their current form. There were at least five volumes in the set; two remain in private collections.",
+ "published": true,
+ "title": "Ramón Casas Sketchbooks",
+ "modified_date": "2021-03-17T20:18:35.644274Z",
+ "admin_email": null,
+ "indexed_at": "2022-08-24T17:29:14.586574",
+ "api_model": "Collection",
+ "finding_aid_url": null,
+ "api_link": "[PLACEHOLDER]/ba35820a-525a-4cfa-8f23-4891c9f798c4",
+ "id": "ba35820a-525a-4cfa-8f23-4891c9f798c4",
+ "representative_image": {},
+ "create_date": "2021-03-12T02:11:32.438228Z"
+ }
+ },
+ {
+ "_index": "dc-v2-collection-1658438321581379",
+ "_type": "_doc",
+ "_id": "8fdc5942-12a0-4abd-8f43-5d19b37ece75",
+ "_score": 0.3395071,
+ "_source": {
+ "featured": false,
+ "keywords": [""],
+ "visibility": "Public",
+ "description": "McCormick Library of Special Collections Audiovisual Collection",
+ "published": true,
+ "title": "McCormick Library of Special Collections Audiovisual Collection",
+ "modified_date": "2022-02-17T16:47:28.717491Z",
+ "admin_email": null,
+ "indexed_at": "2022-08-24T17:29:14.586824",
+ "api_model": "Collection",
+ "finding_aid_url": null,
+ "api_link": "[PLACEHOLDER]/8fdc5942-12a0-4abd-8f43-5d19b37ece75",
+ "id": "8fdc5942-12a0-4abd-8f43-5d19b37ece75",
+ "representative_image": {},
+ "create_date": "2022-01-21T06:46:05.884163Z"
+ }
+ },
+ {
+ "_index": "dc-v2-collection-1658438321581379",
+ "_type": "_doc",
+ "_id": "450b857e-2e74-491e-9ef1-2c73e49f0c16",
+ "_score": 0.3395071,
+ "_source": {
+ "featured": false,
+ "keywords": ["photography"],
+ "visibility": "Public",
+ "description": "The photographs of George S. Duntley fill 8 boxes and cover the years from approximately 1899-1918. The collection consists of dry plate negatives and record Duntley’s years in Chicago and Evanston while he was attending Northwestern University Medical School. Also included are photographs taken in Bushnell, Illinois, his home town and surrounding areas.",
+ "published": true,
+ "title": "George Silas Duntley (1879-1957) Photographs, circa 1899-1918",
+ "modified_date": "2021-11-10T22:56:44.250402Z",
+ "admin_email": null,
+ "indexed_at": "2022-08-24T17:29:14.587475",
+ "api_model": "Collection",
+ "finding_aid_url": "https://findingaids.library.northwestern.edu/repositories/6/resources/1245",
+ "api_link": "[PLACEHOLDER]/450b857e-2e74-491e-9ef1-2c73e49f0c16",
+ "id": "450b857e-2e74-491e-9ef1-2c73e49f0c16",
+ "representative_image": {},
+ "create_date": "2021-03-12T02:11:32.415488Z"
+ }
+ },
+ {
+ "_index": "dc-v2-collection-1658438321581379",
+ "_type": "_doc",
+ "_id": "f65b3ae2-e4a9-40b7-b0a0-b48416eae767",
+ "_score": 0.3395071,
+ "_source": {
+ "featured": false,
+ "keywords": [""],
+ "visibility": "Public",
+ "description": "The Asher Golden Collection contains 29 audiocassette recordings and a small amount of paper documents from Northwestern University’s 1995-1997 football seasons. A sports reporter for Northwestern’s WNUR radio station, Golden covered Wildcat football between 1995 and the January 1, 1997 Citrus Bowl.",
+ "published": true,
+ "title": "Asher Golden Collection",
+ "modified_date": "2022-02-03T21:50:55.433680Z",
+ "admin_email": null,
+ "indexed_at": "2022-08-24T17:29:14.682714",
+ "api_model": "Collection",
+ "finding_aid_url": "https://findingaids.library.northwestern.edu/repositories/6/resources/1355",
+ "api_link": "[PLACEHOLDER]/f65b3ae2-e4a9-40b7-b0a0-b48416eae767",
+ "id": "f65b3ae2-e4a9-40b7-b0a0-b48416eae767",
+ "representative_image": {},
+ "create_date": "2022-01-21T06:46:05.808241Z"
+ }
+ },
+ {
+ "_index": "dc-v2-collection-1658438321581379",
+ "_type": "_doc",
+ "_id": "fe6ff1c4-5eb9-4a9d-b897-ac50a1fbcb24",
+ "_score": 0.3395071,
+ "_source": {
+ "featured": null,
+ "keywords": [],
+ "visibility": "Public",
+ "description": "Photo Albums from the collections of Northwestern University Libraries.",
+ "published": true,
+ "title": "Photo Albums",
+ "modified_date": "2021-03-17T20:18:35.644274Z",
+ "admin_email": null,
+ "indexed_at": "2022-08-24T17:29:14.683802",
+ "api_model": "Collection",
+ "finding_aid_url": null,
+ "api_link": "[PLACEHOLDER]/fe6ff1c4-5eb9-4a9d-b897-ac50a1fbcb24",
+ "id": "fe6ff1c4-5eb9-4a9d-b897-ac50a1fbcb24",
+ "representative_image": {},
+ "create_date": "2021-03-12T02:11:32.373705Z"
+ }
+ },
+ {
+ "_index": "dc-v2-collection-1658438321581379",
+ "_type": "_doc",
+ "_id": "d6b795f8-cc01-4373-b2ae-3b7fb8327b9e",
+ "_score": 0.3395071,
+ "_source": {
+ "featured": false,
+ "keywords": [""],
+ "visibility": "Public",
+ "description": "This collection includes 300 audio recordings of notable WNUR broadcasts. The topics of the recordings range from general aspects of Northwestern University life, student activities and performances, to various social and political speeches and meetings.",
+ "published": true,
+ "title": "WNUR Audiotape Recordings",
+ "modified_date": "2022-02-17T22:40:28.178167Z",
+ "admin_email": null,
+ "indexed_at": "2022-08-24T17:29:14.683858",
+ "api_model": "Collection",
+ "finding_aid_url": "https://findingaids.library.northwestern.edu/repositories/6/archival_objects/509358",
+ "api_link": "[PLACEHOLDER]/d6b795f8-cc01-4373-b2ae-3b7fb8327b9e",
+ "id": "d6b795f8-cc01-4373-b2ae-3b7fb8327b9e",
+ "representative_image": {},
+ "create_date": "2022-02-17T20:55:32.416231Z"
+ }
+ },
+ {
+ "_index": "dc-v2-collection-1658438321581379",
+ "_type": "_doc",
+ "_id": "2933302a-a629-4e3b-81ed-db7a54b33a8c",
+ "_score": 0.3395071,
+ "_source": {
+ "featured": false,
+ "keywords": [""],
+ "visibility": "Public",
+ "description": "Audio recordings of Chicago Chamber Musicians concerts and performances. ",
+ "published": true,
+ "title": "Chicago Chamber Musicians Archive, 1989-2010",
+ "modified_date": "2022-02-07T17:43:00.487626Z",
+ "admin_email": null,
+ "indexed_at": "2022-08-24T17:29:14.683945",
+ "api_model": "Collection",
+ "finding_aid_url": null,
+ "api_link": "[PLACEHOLDER]/2933302a-a629-4e3b-81ed-db7a54b33a8c",
+ "id": "2933302a-a629-4e3b-81ed-db7a54b33a8c",
+ "representative_image": {},
+ "create_date": "2022-01-21T06:46:05.824524Z"
+ }
+ },
+ {
+ "_index": "dc-v2-collection-1658438321581379",
+ "_type": "_doc",
+ "_id": "6ab4d374-ba2b-4ad3-bc8a-e6613d54c168",
+ "_score": 0.3395071,
+ "_source": {
+ "featured": null,
+ "keywords": [],
+ "visibility": "Public",
+ "description": "Manuscripts from the collections of Northwestern University Libraries.",
+ "published": true,
+ "title": "Manuscripts",
+ "modified_date": "2021-03-17T20:18:35.644274Z",
+ "admin_email": null,
+ "indexed_at": "2022-08-24T17:29:14.684387",
+ "api_model": "Collection",
+ "finding_aid_url": null,
+ "api_link": "[PLACEHOLDER]/6ab4d374-ba2b-4ad3-bc8a-e6613d54c168",
+ "id": "6ab4d374-ba2b-4ad3-bc8a-e6613d54c168",
+ "representative_image": {},
+ "create_date": "2021-03-12T02:11:32.376376Z"
+ }
+ },
+ {
+ "_index": "dc-v2-collection-1658438321581379",
+ "_type": "_doc",
+ "_id": "c3ced30c-3e7c-4762-99bf-52809483885f",
+ "_score": 0.3395071,
+ "_source": {
+ "featured": false,
+ "keywords": [""],
+ "visibility": "Public",
+ "description": "University Archives Audiovisual Collection",
+ "published": true,
+ "title": "University Archives Audiovisual Collection",
+ "modified_date": "2022-02-18T13:23:30.621596Z",
+ "admin_email": null,
+ "indexed_at": "2022-08-24T17:29:14.684578",
+ "api_model": "Collection",
+ "finding_aid_url": null,
+ "api_link": "[PLACEHOLDER]/c3ced30c-3e7c-4762-99bf-52809483885f",
+ "id": "c3ced30c-3e7c-4762-99bf-52809483885f",
+ "representative_image": {},
+ "create_date": "2022-01-21T06:46:05.987430Z"
+ }
+ },
+ {
+ "_index": "dc-v2-collection-1658438321581379",
+ "_type": "_doc",
+ "_id": "073ad358-d5e9-495b-8cb5-58bd5ec4c189",
+ "_score": 0.3395071,
+ "_source": {
+ "featured": null,
+ "keywords": [],
+ "visibility": "Public",
+ "description": "Black and white photographs mounted in album from the Herskovits Library of African Studies. ",
+ "published": true,
+ "title": "Photographs of Zanzibar",
+ "modified_date": "2021-03-17T20:18:35.644274Z",
+ "admin_email": null,
+ "indexed_at": "2022-08-24T17:29:14.684859",
+ "api_model": "Collection",
+ "finding_aid_url": null,
+ "api_link": "[PLACEHOLDER]/073ad358-d5e9-495b-8cb5-58bd5ec4c189",
+ "id": "073ad358-d5e9-495b-8cb5-58bd5ec4c189",
+ "representative_image": {},
+ "create_date": "2021-03-12T02:11:32.407822Z"
+ }
+ },
+ {
+ "_index": "dc-v2-collection-1658438321581379",
+ "_type": "_doc",
+ "_id": "d2ae687b-d180-4600-8b1a-886c0cf35e79",
+ "_score": 0.3395071,
+ "_source": {
+ "featured": false,
+ "keywords": [""],
+ "visibility": "Public",
+ "description": "NU Libraries",
+ "published": true,
+ "title": "NU Libraries",
+ "modified_date": "2022-02-04T18:42:54.078963Z",
+ "admin_email": null,
+ "indexed_at": "2022-08-24T17:29:14.684888",
+ "api_model": "Collection",
+ "finding_aid_url": null,
+ "api_link": "[PLACEHOLDER]/d2ae687b-d180-4600-8b1a-886c0cf35e79",
+ "id": "d2ae687b-d180-4600-8b1a-886c0cf35e79",
+ "representative_image": {},
+ "create_date": "2022-01-21T06:46:05.921501Z"
+ }
+ },
+ {
+ "_index": "dc-v2-collection-1658438321581379",
+ "_type": "_doc",
+ "_id": "c70bcbd0-85c2-41b4-aa44-f184d2521db8",
+ "_score": 0.3395071,
+ "_source": {
+ "featured": false,
+ "keywords": [""],
+ "visibility": "Public",
+ "description": "Catherine Wolfe Donohue, who contracted radium poisoning while an employee of the Radium Dial Company in Ottawa, Illinois, was part of the class action suit against the company. Damages were awarded to the women in 1938 by the Illinois Industrial Commission. This collection consists of a scrapbook created by the Donohue family with newspaper clippings about the plight of the women and their efforts to get treatment and compensation, some family photographs, publications from Argonne National Laboratory, articles about the case, and a letter from Donohue's cousin, Mary Carroll Cassidy.",
+ "published": true,
+ "title": "Catherine Wolfe Donohue Collection on the Radium Dial Company",
+ "modified_date": "2021-09-28T22:13:35.953690Z",
+ "admin_email": null,
+ "indexed_at": "2022-08-24T17:29:14.684967",
+ "api_model": "Collection",
+ "finding_aid_url": "https://findingaids.library.northwestern.edu/repositories/7/resources/804",
+ "api_link": "[PLACEHOLDER]/c70bcbd0-85c2-41b4-aa44-f184d2521db8",
+ "id": "c70bcbd0-85c2-41b4-aa44-f184d2521db8",
+ "representative_image": {},
+ "create_date": "2021-03-12T02:11:32.346053Z"
+ }
+ },
+ {
+ "_index": "dc-v2-collection-1658438321581379",
+ "_type": "_doc",
+ "_id": "8172a9ef-d6df-44a3-ba98-7005af23e230",
+ "_score": 0.3395071,
+ "_source": {
+ "featured": false,
+ "keywords": [""],
+ "visibility": "Public",
+ "description": "The Early Automobile Companies Ephemera Collection contains materials dating between 1910 and 1932, and consists of published advertising and marketing brochures, maps, guides and general information about automobiles. As a whole, the collection gives a view of the many automobile companies that thrived at the beginning of the 20th century, as well as a burgeoning travel industry. Primarily centering upon the Midwest and Great Lakes regions, the collection also includes maps and travel guides to the Western and Southern states.",
+ "published": true,
+ "title": "Early Automobile Companies Ephemera Collection, 1910-1932",
+ "modified_date": "2021-09-28T22:15:19.973138Z",
+ "admin_email": null,
+ "indexed_at": "2022-08-24T17:29:14.684994",
+ "api_model": "Collection",
+ "finding_aid_url": "https://findingaids.library.northwestern.edu/repositories/5/resources/1262",
+ "api_link": "[PLACEHOLDER]/8172a9ef-d6df-44a3-ba98-7005af23e230",
+ "id": "8172a9ef-d6df-44a3-ba98-7005af23e230",
+ "representative_image": {},
+ "create_date": "2021-03-12T02:11:32.315559Z"
+ }
+ },
+ {
+ "_index": "dc-v2-collection-1658438321581379",
+ "_type": "_doc",
+ "_id": "5753e30c-608e-4795-b9b2-57e4b1bb27fa",
+ "_score": 0.3395071,
+ "_source": {
+ "featured": null,
+ "keywords": [],
+ "visibility": "Public",
+ "description": "Visual materials from a regimental history of the 33rd Division which was made up of soldiers from Illinois and was published by the Illinois State Historical Society. The history addresses the organization and training of this Division and where it served in Europe during the 1st World War.",
+ "published": true,
+ "title": "The History of the 33rd Division",
+ "modified_date": "2021-03-17T20:18:35.644274Z",
+ "admin_email": null,
+ "indexed_at": "2022-08-24T17:29:14.685199",
+ "api_model": "Collection",
+ "finding_aid_url": null,
+ "api_link": "[PLACEHOLDER]/5753e30c-608e-4795-b9b2-57e4b1bb27fa",
+ "id": "5753e30c-608e-4795-b9b2-57e4b1bb27fa",
+ "representative_image": {},
+ "create_date": "2021-03-12T02:11:32.368277Z"
+ }
+ },
+ {
+ "_index": "dc-v2-collection-1658438321581379",
+ "_type": "_doc",
+ "_id": "bd90de9e-8e1e-43c4-8009-dd13a916a2ac",
+ "_score": 0.3395071,
+ "_source": {
+ "featured": null,
+ "keywords": ["Evanston"],
+ "visibility": "Public",
+ "description": "Postcards with views of Evanston.",
+ "published": true,
+ "title": "University Archives Postcards",
+ "modified_date": "2022-02-24T23:51:15.767070Z",
+ "admin_email": null,
+ "indexed_at": "2022-08-24T17:29:14.764240",
+ "api_model": "Collection",
+ "finding_aid_url": null,
+ "api_link": "[PLACEHOLDER]/bd90de9e-8e1e-43c4-8009-dd13a916a2ac",
+ "id": "bd90de9e-8e1e-43c4-8009-dd13a916a2ac",
+ "representative_image": {
+ "url": "https://iiif.stack.rdc-staging.library.northwestern.edu/iiif/2/f661aea6-2d6e-4d30-8dc1-45ebc184d99a",
+ "workId": "8700cad1-8e5e-4734-a86b-071cc7bf39ba"
+ },
+ "create_date": "2021-03-12T02:11:32.435870Z"
+ }
+ },
+ {
+ "_index": "dc-v2-collection-1658438321581379",
+ "_type": "_doc",
+ "_id": "6f58c85f-f1fc-43c1-be52-678867659ff6",
+ "_score": 0.3395071,
+ "_source": {
+ "featured": null,
+ "keywords": [],
+ "visibility": "Public",
+ "description": "The collection depicts the breadth of African experience; documents African life; European life in Africa in all its manifestations; and the African landscape, in particular as it changed over time. Included are photographs showing the building of East Africa’s railways, the growth of its urban centers and the development of European colonial administration. There are outstanding examples of portraiture. The collection provides an unsurpassed resource for the study of the history of photography in East Africa. \n\nCultural Context: Content on this site is drawn from a broad range of historical sources including materials that may contain offensive images or language reflecting the nature of European colonialism in Africa. Such materials should be viewed in the context of the time and place in which they were created. The images and text in this site are presented as specific, original artifacts recording the attitudes, perspectives and beliefs of a different era. Northwestern University does not endorse the views expressed in this collection which may contain images and text offensive to some researchers.",
+ "published": true,
+ "title": "The Humphrey Winterton Collection of East African Photographs: 1860-1960",
+ "modified_date": "2022-02-24T23:51:15.813860Z",
+ "admin_email": null,
+ "indexed_at": "2022-08-24T17:29:14.764325",
+ "api_model": "Collection",
+ "finding_aid_url": null,
+ "api_link": "[PLACEHOLDER]/6f58c85f-f1fc-43c1-be52-678867659ff6",
+ "id": "6f58c85f-f1fc-43c1-be52-678867659ff6",
+ "representative_image": {
+ "url": "https://iiif.stack.rdc-staging.library.northwestern.edu/iiif/2/72f0bed1-8222-4671-b3cd-7c491ba0c195",
+ "workId": "aacb5c5e-76f9-4c23-9f31-10455873d96f"
+ },
+ "create_date": "2021-03-12T02:11:32.362616Z"
+ }
+ },
+ {
+ "_index": "dc-v2-collection-1658438321581379",
+ "_type": "_doc",
+ "_id": "1d849df1-eb32-43f4-b7b9-e435cff18f7c",
+ "_score": 0.3395071,
+ "_source": {
+ "featured": false,
+ "keywords": ["photography"],
+ "visibility": "Public",
+ "description": "These images of African daily life date from the mid-20th century. Photographs come from the following countries and territories: Basutoland, Belgian Congo, Dahomey, French Equatorial Africa, French Guinea, French Togoland, Ghana, Ivory Coast, Kenya, Liberia, Mauritania, Niger (French), Nigeria, Northern Rhodesia, Ruanda-Urundi, Senegal, Sierra Leone, South Africa, Southern Rhodesia, Southwest Africa, Tanganyika, and Tunisia.",
+ "published": true,
+ "title": "Vernon McKay Photographs",
+ "modified_date": "2022-02-24T23:51:16.488587Z",
+ "admin_email": null,
+ "indexed_at": "2022-08-24T17:29:14.845465",
+ "api_model": "Collection",
+ "finding_aid_url": "https://findingaids.library.northwestern.edu/repositories/4/resources/296",
+ "api_link": "[PLACEHOLDER]/1d849df1-eb32-43f4-b7b9-e435cff18f7c",
+ "id": "1d849df1-eb32-43f4-b7b9-e435cff18f7c",
+ "representative_image": {
+ "url": "https://iiif.stack.rdc-staging.library.northwestern.edu/iiif/2/a70f184d-3229-4200-9140-d5c74c85c30d",
+ "workId": "a44ead3a-a622-4a7b-aecb-496a41481896"
+ },
+ "create_date": "2021-03-12T02:11:32.429905Z"
+ }
+ },
+ {
+ "_index": "dc-v2-collection-1658438321581379",
+ "_type": "_doc",
+ "_id": "c0c279a9-c2a9-4f9f-a111-a2d4e2f78658",
+ "_score": 0.3395071,
+ "_source": {
+ "featured": null,
+ "keywords": [],
+ "visibility": "Public",
+ "description": "Images from the publication : Une cité moderne : dessins / de Rob Mallet-Stevens ; preface de Frantz Jourdain. Author: Mallet-Stevens, Robert, 1886-1945. Format: 1 portfolio (3, 32 leaves of plates : chiefly col. ill.) ; 34 cm.. Language: French; English Notes: Text in French; captions in French and English.",
+ "published": true,
+ "title": "Une cité moderne : dessins, by Rob Mallet-Stevens",
+ "modified_date": "2022-02-24T23:51:16.520330Z",
+ "admin_email": null,
+ "indexed_at": "2022-08-24T17:29:14.845518",
+ "api_model": "Collection",
+ "finding_aid_url": null,
+ "api_link": "[PLACEHOLDER]/c0c279a9-c2a9-4f9f-a111-a2d4e2f78658",
+ "id": "c0c279a9-c2a9-4f9f-a111-a2d4e2f78658",
+ "representative_image": {
+ "url": "https://iiif.stack.rdc-staging.library.northwestern.edu/iiif/2/b515c075-3769-4245-b678-a26867f2123e",
+ "workId": "a0ba6462-197e-4e91-8d04-50617a3d11f1"
+ },
+ "create_date": "2021-03-12T02:11:32.425485Z"
+ }
+ },
+ {
+ "_index": "dc-v2-collection-1658438321581379",
+ "_type": "_doc",
+ "_id": "4e9ed062-fc73-40ba-9514-2537eeae4c38",
+ "_score": 0.3395071,
+ "_source": {
+ "featured": null,
+ "keywords": [],
+ "visibility": "Public",
+ "description": "La Caricature was a satirical weekly published French periodical that was distributed in Paris between 1830 and 1843 during the July Monarchy. This collection contains works from when Auguste Audibert was editor. The complete volumes of La Caricature can be found in HathiTrust Digital Library. These are individual plates only. Related URL connects to the complete volume. ",
+ "published": true,
+ "title": "La Caricature (1880-1893, 1899; Albert Robida, founding editor)",
+ "modified_date": "2022-02-24T23:51:16.545159Z",
+ "admin_email": null,
+ "indexed_at": "2022-08-24T17:29:15.613663",
+ "api_model": "Collection",
+ "finding_aid_url": null,
+ "api_link": "[PLACEHOLDER]/4e9ed062-fc73-40ba-9514-2537eeae4c38",
+ "id": "4e9ed062-fc73-40ba-9514-2537eeae4c38",
+ "representative_image": {
+ "url": "https://iiif.stack.rdc-staging.library.northwestern.edu/iiif/2/941d3942-4afe-481b-86ed-56b631076b70",
+ "workId": "e67a3f10-b1b9-414a-91df-0e7d8aff9253"
+ },
+ "create_date": "2021-03-12T02:11:32.397582Z"
+ }
+ },
+ {
+ "_index": "dc-v2-collection-1658438321581379",
+ "_type": "_doc",
+ "_id": "0ba3a256-4952-44ea-b0d9-0772835ff137",
+ "_score": 0.3395071,
+ "_source": {
+ "featured": false,
+ "keywords": [""],
+ "visibility": "Public",
+ "description": "The Ronald J. Sullivan Photograph Collection is an extensive collection of photographs and slides of public and commercial buses and public transit and commuter trains, dating from 1946-2000. The bulk of the collection comprises photographs taken by Ronald J. Sullivan, an amateur photographer and rail and bus enthusiast; also included are historic images of Chicago-area transit that were part of Sullivan’s personal collection, and which supplement the photographer’s original material. The majority of the photographs were taken in Chicago, Illinois and the surrounding area, with a few in other cities and international locations. Sullivan documented nearly all of the photographs and slides in this collection in detail with bus or train numbers, route numbers, street intersections or stations, and dates. For the sake of consistency and ease of searching for specific items the City of Chicago Street Guide abbreviations and a list of common abbreviations found in the collection will be used. ",
+ "published": true,
+ "title": "Ronald J. Sullivan Photograph Collection",
+ "modified_date": "2022-02-24T23:51:16.574977Z",
+ "admin_email": null,
+ "indexed_at": "2022-08-24T17:29:15.613770",
+ "api_model": "Collection",
+ "finding_aid_url": "https://findingaids.library.northwestern.edu/repositories/5/resources/1290",
+ "api_link": "[PLACEHOLDER]/0ba3a256-4952-44ea-b0d9-0772835ff137",
+ "id": "0ba3a256-4952-44ea-b0d9-0772835ff137",
+ "representative_image": {
+ "url": "https://iiif.stack.rdc-staging.library.northwestern.edu/iiif/2/5f8f3ecb-d8fc-4b75-80a3-08efc047a9c7",
+ "workId": "ef5f341f-50cc-4ff3-a84c-7f13ac0d1afa"
+ },
+ "create_date": "2021-03-12T02:11:32.365146Z"
+ }
+ },
+ {
+ "_index": "dc-v2-collection-1658438321581379",
+ "_type": "_doc",
+ "_id": "18ec4c6b-192a-4ab8-9903-ea0f393c35f7",
+ "_score": 0.3395071,
+ "_source": {
+ "featured": true,
+ "keywords": ["featured"],
+ "visibility": "Public",
+ "description": "The Berkeley Folk Music Festival Archive consists of roughly 33,500 items, including photographs of folk artists and groups, posters, flyers, press clippings, correspondence, publicity information, audio, video, and more about the Festival and the folk music revival as a whole. Audio recordings from the Archive can be found by copying and pasting http://libraries.nu/FolkFestivalAudio into your browser. A digital exhibit, The Berkeley Folk Music Festival & the Folk Revival on the US West Coast—An Introduction, can be found at https://sites.northwestern.edu/bfmf. We welcome your input and comments to help us continue to improve the accuracy of this rich, wide-ranging collection of materials at https://sites.northwestern.edu/bfmf/contact-us/.",
+ "published": true,
+ "title": "Berkeley Folk Music Festival",
+ "modified_date": "2022-07-12T21:14:30.429839Z",
+ "admin_email": null,
+ "indexed_at": "2022-08-24T17:29:15.615008",
+ "api_model": "Collection",
+ "finding_aid_url": null,
+ "api_link": "[PLACEHOLDER]/18ec4c6b-192a-4ab8-9903-ea0f393c35f7",
+ "id": "18ec4c6b-192a-4ab8-9903-ea0f393c35f7",
+ "representative_image": {},
+ "create_date": "2021-03-12T02:11:32.456787Z"
+ }
+ }
+ ]
+ }
+}
diff --git a/test/fixtures/mocks/expired-shared-link-9101112.json b/test/fixtures/mocks/expired-shared-link-9101112.json
new file mode 100644
index 00000000..27fd1219
--- /dev/null
+++ b/test/fixtures/mocks/expired-shared-link-9101112.json
@@ -0,0 +1,13 @@
+{
+ "_index": "dev-shared_links",
+ "_type": "_doc",
+ "_id": "1234",
+ "_version": 1,
+ "found": true,
+ "_source": {
+ "target_index": "meadow",
+ "target_id": "23255308-53f4-4c96-a268-aefa596d9d21",
+ "shared_link_id": "b47a0a1c-ca52-424f-877f-a2ab9f1c0735",
+ "expires": "2021-10-26T16:47:06Z"
+ }
+}
diff --git a/test/fixtures/mocks/fileset-1234.json b/test/fixtures/mocks/fileset-1234.json
new file mode 100644
index 00000000..0c8eb41d
--- /dev/null
+++ b/test/fixtures/mocks/fileset-1234.json
@@ -0,0 +1,13 @@
+{
+ "_index": "dev-dc-v2-file-set",
+ "_type": "_doc",
+ "_id": "1234",
+ "_version": 1,
+ "found": true,
+ "_source": {
+ "id": "1234",
+ "api_model": "FileSet",
+ "visibility": "Public",
+ "published": true
+ }
+}
diff --git a/test/fixtures/mocks/fileset-baddata-1234.json b/test/fixtures/mocks/fileset-baddata-1234.json
new file mode 100644
index 00000000..7512aac1
--- /dev/null
+++ b/test/fixtures/mocks/fileset-baddata-1234.json
@@ -0,0 +1,13 @@
+{
+ "_index": "dev-dc-v2-file-set",
+ "_type": "_doc",
+ "_id": "1234",
+ "_version": 1,
+ "found": true,
+ "_source": {
+ "id": "1234",
+ "api_model": "FileSet",
+ "visibility": "Restricted",
+ "published": true
+ }
+}
diff --git a/test/fixtures/mocks/fileset-netid-1234.json b/test/fixtures/mocks/fileset-netid-1234.json
new file mode 100644
index 00000000..59aee72b
--- /dev/null
+++ b/test/fixtures/mocks/fileset-netid-1234.json
@@ -0,0 +1,13 @@
+{
+ "_index": "dev-dc-v2-file-set",
+ "_type": "_doc",
+ "_id": "1234",
+ "_version": 1,
+ "found": true,
+ "_source": {
+ "id": "1234",
+ "api_model": "FileSet",
+ "visibility": "Institution",
+ "published": true
+ }
+}
diff --git a/test/fixtures/mocks/fileset-restricted-1234.json b/test/fixtures/mocks/fileset-restricted-1234.json
new file mode 100644
index 00000000..017c32ab
--- /dev/null
+++ b/test/fixtures/mocks/fileset-restricted-1234.json
@@ -0,0 +1,13 @@
+{
+ "_index": "dev-dc-v2-file-set",
+ "_type": "_doc",
+ "_id": "1234",
+ "_version": 1,
+ "found": true,
+ "_source": {
+ "id": "1234",
+ "api_model": "FileSet",
+ "visibility": "Private",
+ "published": true
+ }
+}
diff --git a/test/fixtures/mocks/fileset-restricted-unpublished-1234.json b/test/fixtures/mocks/fileset-restricted-unpublished-1234.json
new file mode 100644
index 00000000..5d559c47
--- /dev/null
+++ b/test/fixtures/mocks/fileset-restricted-unpublished-1234.json
@@ -0,0 +1,13 @@
+{
+ "_index": "dev-dc-v2-file-set",
+ "_type": "_doc",
+ "_id": "1234",
+ "_version": 1,
+ "found": true,
+ "_source": {
+ "id": "1234",
+ "api_model": "FileSet",
+ "visibility": "Private",
+ "published": false
+ }
+}
diff --git a/test/fixtures/mocks/fileset-unpublished-1234.json b/test/fixtures/mocks/fileset-unpublished-1234.json
new file mode 100644
index 00000000..50ee994b
--- /dev/null
+++ b/test/fixtures/mocks/fileset-unpublished-1234.json
@@ -0,0 +1,13 @@
+{
+ "_index": "dev-dc-v2-file-set",
+ "_type": "_doc",
+ "_id": "1234",
+ "_version": 1,
+ "found": true,
+ "_source": {
+ "id": "1234",
+ "api_model": "FileSet",
+ "visibility": "Public",
+ "published": false
+ }
+}
diff --git a/test/fixtures/mocks/missing-collection-1234.json b/test/fixtures/mocks/missing-collection-1234.json
new file mode 100644
index 00000000..6e65c59f
--- /dev/null
+++ b/test/fixtures/mocks/missing-collection-1234.json
@@ -0,0 +1,6 @@
+{
+ "_index": "dev-dc-v2-collection",
+ "_type": "_doc",
+ "_id": "1234",
+ "found": false
+}
diff --git a/test/fixtures/mocks/missing-fileset-1234.json b/test/fixtures/mocks/missing-fileset-1234.json
new file mode 100644
index 00000000..4db6424d
--- /dev/null
+++ b/test/fixtures/mocks/missing-fileset-1234.json
@@ -0,0 +1,6 @@
+{
+ "_index": "dev-dc-v2-file-set",
+ "_type": "_doc",
+ "_id": "1234",
+ "found": false
+}
diff --git a/test/fixtures/mocks/missing-index.json b/test/fixtures/mocks/missing-index.json
new file mode 100644
index 00000000..5320801b
--- /dev/null
+++ b/test/fixtures/mocks/missing-index.json
@@ -0,0 +1,21 @@
+{
+ "error": {
+ "root_cause": [
+ {
+ "type": "index_not_found_exception",
+ "reason": "no such index [non-existent-index]",
+ "index": "non-existent-index",
+ "resource.id": "non-existent-index",
+ "resource.type": "index_or_alias",
+ "index_uuid": "_na_"
+ }
+ ],
+ "type": "index_not_found_exception",
+ "reason": "no such index [non-existent-index]",
+ "index": "non-existent-index",
+ "resource.id": "non-existent-index",
+ "resource.type": "index_or_alias",
+ "index_uuid": "_na_"
+ },
+ "status": 404
+}
diff --git a/test/fixtures/mocks/missing-shared-link-5678.json b/test/fixtures/mocks/missing-shared-link-5678.json
new file mode 100644
index 00000000..f6bf85fb
--- /dev/null
+++ b/test/fixtures/mocks/missing-shared-link-5678.json
@@ -0,0 +1,6 @@
+{
+ "_index": "dev-shared_links",
+ "_type": "_doc",
+ "_id": "1234",
+ "found": false
+}
diff --git a/test/fixtures/mocks/missing-work-1234.json b/test/fixtures/mocks/missing-work-1234.json
new file mode 100644
index 00000000..c968e85b
--- /dev/null
+++ b/test/fixtures/mocks/missing-work-1234.json
@@ -0,0 +1,6 @@
+{
+ "_index": "dev-dc-v2-work",
+ "_type": "_doc",
+ "_id": "1234",
+ "found": false
+}
diff --git a/test/fixtures/mocks/private-unpublished-work-1234.json b/test/fixtures/mocks/private-unpublished-work-1234.json
new file mode 100644
index 00000000..5909da2a
--- /dev/null
+++ b/test/fixtures/mocks/private-unpublished-work-1234.json
@@ -0,0 +1,13 @@
+{
+ "_index": "dev-dc-v2-work",
+ "_type": "_doc",
+ "_id": "1234",
+ "_version": 1,
+ "found": true,
+ "_source": {
+ "id": "1234",
+ "api_model": "Work",
+ "published": false,
+ "visibility": "Private"
+ }
+}
diff --git a/test/fixtures/mocks/private-work-1234.json b/test/fixtures/mocks/private-work-1234.json
new file mode 100644
index 00000000..05573d3e
--- /dev/null
+++ b/test/fixtures/mocks/private-work-1234.json
@@ -0,0 +1,13 @@
+{
+ "_index": "dev-dc-v2-work",
+ "_type": "_doc",
+ "_id": "1234",
+ "_version": 1,
+ "found": true,
+ "_source": {
+ "id": "1234",
+ "api_model": "Work",
+ "published": true,
+ "visibility": "Private"
+ }
+}
diff --git a/test/fixtures/mocks/real-search-event.json b/test/fixtures/mocks/real-search-event.json
new file mode 100644
index 00000000..d934f89b
--- /dev/null
+++ b/test/fixtures/mocks/real-search-event.json
@@ -0,0 +1,43 @@
+{
+ "version": "2.0",
+ "routeKey": "GET /search/{models}",
+ "rawPath": "/v2/search/collections",
+ "rawQueryString": "",
+ "cookies": [],
+ "headers": {
+ "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
+ "accept-encoding": "gzip, deflate, br",
+ "accept-language": "en-US,en;q=0.9",
+ "content-length": "0",
+ "host": "api.test.library.northwestern.edu",
+ "user-agent": "Mocha Test",
+ "x-forwarded-for": "10.9.8.7",
+ "x-forwarded-port": "443",
+ "x-forwarded-proto": "https"
+ },
+ "requestContext": {
+ "accountId": "625046682746",
+ "apiId": "pewpewpew",
+ "domainName": "api.test.library.northwestern.edu",
+ "domainPrefix": "dcapi",
+ "http": {
+ "method": "GET",
+ "path": "/v2/search/collections",
+ "protocol": "HTTP/1.1",
+ "sourceIp": "10.9.8.7",
+ "userAgent": "Mocha Test"
+ },
+ "requestId": "aVmRZjmGoAMEVuw=",
+ "routeKey": "GET /search/{models}",
+ "stage": "v2",
+ "time": "21/Oct/2022:04:18:42 +0000",
+ "timeEpoch": 1666325922398
+ },
+ "pathParameters": {
+ "models": "collections"
+ },
+ "stageVariables": {
+ "basePath": "api/v2"
+ },
+ "isBase64Encoded": false
+}
diff --git a/test/fixtures/mocks/search-multiple-targets.json b/test/fixtures/mocks/search-multiple-targets.json
new file mode 100644
index 00000000..596b9776
--- /dev/null
+++ b/test/fixtures/mocks/search-multiple-targets.json
@@ -0,0 +1,249 @@
+{
+ "took": 3,
+ "timed_out": false,
+ "_shards": {
+ "total": 10,
+ "successful": 10,
+ "skipped": 0,
+ "failed": 0
+ },
+ "hits": {
+ "total": {
+ "value": 4331,
+ "relation": "eq"
+ },
+ "max_score": 1.0,
+ "hits": [
+ {
+ "_index": "dc-v2-collection-1658438321581379",
+ "_type": "_doc",
+ "_id": "5abdce5f-6168-4e73-8bf4-d89c2790ee4c",
+ "_score": 1.0,
+ "_source": {
+ "featured": false,
+ "keywords": [""],
+ "visibility": "Private",
+ "description": "This collection is a work in progress. The images are being cataloged and added to the Rob Linrothe Image Collection by Jen as of December 2021.",
+ "published": false,
+ "title": "Rob Linrothe Image Collection 2020",
+ "modified_date": "2021-12-03T16:55:40.945621Z",
+ "admin_email": null,
+ "indexed_at": "2022-07-28T15:43:05.103197",
+ "api_model": "Collection",
+ "finding_aid_url": null,
+ "api_link": "[PLACEHOLDER]/5abdce5f-6168-4e73-8bf4-d89c2790ee4c",
+ "id": "5abdce5f-6168-4e73-8bf4-d89c2790ee4c",
+ "representative_image": {},
+ "create_date": "2021-04-01T21:58:56.333389Z"
+ }
+ },
+ {
+ "_index": "dc-v2-collection-1658438321581379",
+ "_type": "_doc",
+ "_id": "35c3a71a-ce83-4410-82ec-640e01da86eb",
+ "_score": 1.0,
+ "_source": {
+ "featured": false,
+ "keywords": [""],
+ "visibility": "Public",
+ "description": "Press cutting books from the Dublin Gate Theatre",
+ "published": false,
+ "title": "Dublin Gate Theatre Archive",
+ "modified_date": "2021-06-28T18:06:19.151525Z",
+ "admin_email": null,
+ "indexed_at": "2022-07-28T15:43:05.103729",
+ "api_model": "Collection",
+ "finding_aid_url": "https://findingaids.test.library.northwestern.edu/repositories/7/resources/1410",
+ "api_link": "[PLACEHOLDER]/35c3a71a-ce83-4410-82ec-640e01da86eb",
+ "id": "35c3a71a-ce83-4410-82ec-640e01da86eb",
+ "representative_image": {},
+ "create_date": "2021-06-22T20:53:44.226666Z"
+ }
+ },
+ {
+ "_index": "dc-v2-collection-1658438321581379",
+ "_type": "_doc",
+ "_id": "267bed1b-f808-4c51-acb1-0288378819d2",
+ "_score": 1.0,
+ "_source": {
+ "featured": null,
+ "keywords": [],
+ "visibility": "Public",
+ "description": "Northwestern University Libraries’ Map & Atlas Collection allows access to an ever-growing selection of our cartographic resources in high resolution.",
+ "published": true,
+ "title": "Map and Atlas Collection",
+ "modified_date": "2021-03-17T20:18:35.644274Z",
+ "admin_email": null,
+ "indexed_at": "2022-07-28T15:43:05.103987",
+ "api_model": "Collection",
+ "finding_aid_url": null,
+ "api_link": "[PLACEHOLDER]/267bed1b-f808-4c51-acb1-0288378819d2",
+ "id": "267bed1b-f808-4c51-acb1-0288378819d2",
+ "representative_image": {},
+ "create_date": "2021-03-12T02:11:32.386638Z"
+ }
+ },
+ {
+ "_index": "dc-v2-collection-1658438321581379",
+ "_type": "_doc",
+ "_id": "ba35820a-525a-4cfa-8f23-4891c9f798c4",
+ "_score": 1.0,
+ "_source": {
+ "featured": null,
+ "keywords": [],
+ "visibility": "Public",
+ "description": "Gift of the Deering Family. These sketches by Catalan artist Ramón Casas (1866-1932) document the work of an under-represented artist who was influential in modernist art circles in Barcelona and Paris along with his peers John Singer Sargent, Henri de Toulouse-Lautrec, and the young Pablo Picasso. Three bound hardcover volumes of sketches came to the Northwestern University Libraries in 1998 as part of a donation of books that had belonged to NU benefactor Charles Deering (1852-1927). Deering and Casas met in 1904 and established a lifelong friendship. At some point before the donation, a few hundred loose Casas drawings, postcards, and illustrated letters dating from 1891 to 1912 were bound into their current form. There were at least five volumes in the set; two remain in private collections.",
+ "published": true,
+ "title": "Ramón Casas Sketchbooks",
+ "modified_date": "2021-03-17T20:18:35.644274Z",
+ "admin_email": null,
+ "indexed_at": "2022-07-28T15:43:05.104202",
+ "api_model": "Collection",
+ "finding_aid_url": null,
+ "api_link": "[PLACEHOLDER]/ba35820a-525a-4cfa-8f23-4891c9f798c4",
+ "id": "ba35820a-525a-4cfa-8f23-4891c9f798c4",
+ "representative_image": {},
+ "create_date": "2021-03-12T02:11:32.438228Z"
+ }
+ },
+ {
+ "_index": "dc-v2-collection-1658438321581379",
+ "_type": "_doc",
+ "_id": "8fdc5942-12a0-4abd-8f43-5d19b37ece75",
+ "_score": 1.0,
+ "_source": {
+ "featured": false,
+ "keywords": [""],
+ "visibility": "Public",
+ "description": "McCormick Library of Special Collections Audiovisual Collection",
+ "published": true,
+ "title": "McCormick Library of Special Collections Audiovisual Collection",
+ "modified_date": "2022-02-17T16:47:28.717491Z",
+ "admin_email": null,
+ "indexed_at": "2022-07-28T15:43:05.104517",
+ "api_model": "Collection",
+ "finding_aid_url": null,
+ "api_link": "[PLACEHOLDER]/8fdc5942-12a0-4abd-8f43-5d19b37ece75",
+ "id": "8fdc5942-12a0-4abd-8f43-5d19b37ece75",
+ "representative_image": {},
+ "create_date": "2022-01-21T06:46:05.884163Z"
+ }
+ },
+ {
+ "_index": "dc-v2-collection-1658438321581379",
+ "_type": "_doc",
+ "_id": "5e782839-d76a-4ee7-8931-79baa88770a8",
+ "_score": 1.0,
+ "_source": {
+ "featured": false,
+ "keywords": [""],
+ "visibility": "Private",
+ "description": "Sculpture from the collections of Northwestern University Libraries.",
+ "published": false,
+ "title": "Sculpture",
+ "modified_date": "2022-02-18T13:19:05.233977Z",
+ "admin_email": null,
+ "indexed_at": "2022-07-28T15:43:05.104553",
+ "api_model": "Collection",
+ "finding_aid_url": null,
+ "api_link": "[PLACEHOLDER]/5e782839-d76a-4ee7-8931-79baa88770a8",
+ "id": "5e782839-d76a-4ee7-8931-79baa88770a8",
+ "representative_image": {},
+ "create_date": "2021-04-22T16:46:43.668615Z"
+ }
+ },
+ {
+ "_index": "dc-v2-collection-1658438321581379",
+ "_type": "_doc",
+ "_id": "ec153e6d-a543-4b50-a7dc-ae5e98a27129",
+ "_score": 1.0,
+ "_source": {
+ "featured": false,
+ "keywords": [""],
+ "visibility": "Private",
+ "description": "Robert Greenfield Collection",
+ "published": true,
+ "title": "Robert Greenfield Collection",
+ "modified_date": "2022-02-07T19:24:30.395199Z",
+ "admin_email": null,
+ "indexed_at": "2022-07-28T15:43:05.105084",
+ "api_model": "Collection",
+ "finding_aid_url": "https://findingaids.test.library.northwestern.edu/repositories/7/resources/1786",
+ "api_link": "[PLACEHOLDER]/ec153e6d-a543-4b50-a7dc-ae5e98a27129",
+ "id": "ec153e6d-a543-4b50-a7dc-ae5e98a27129",
+ "representative_image": {},
+ "create_date": "2022-01-21T06:46:05.957137Z"
+ }
+ },
+ {
+ "_index": "dc-v2-collection-1658438321581379",
+ "_type": "_doc",
+ "_id": "450b857e-2e74-491e-9ef1-2c73e49f0c16",
+ "_score": 1.0,
+ "_source": {
+ "featured": false,
+ "keywords": ["photography"],
+ "visibility": "Public",
+ "description": "The photographs of George S. Duntley fill 8 boxes and cover the years from approximately 1899-1918. The collection consists of dry plate negatives and record Duntley’s years in Chicago and Evanston while he was attending Northwestern University Medical School. Also included are photographs taken in Bushnell, Illinois, his home town and surrounding areas.",
+ "published": true,
+ "title": "George Silas Duntley (1879-1957) Photographs, circa 1899-1918",
+ "modified_date": "2021-11-10T22:56:44.250402Z",
+ "admin_email": null,
+ "indexed_at": "2022-07-28T15:43:05.105157",
+ "api_model": "Collection",
+ "finding_aid_url": "https://findingaids.test.library.northwestern.edu/repositories/6/resources/1245",
+ "api_link": "[PLACEHOLDER]/450b857e-2e74-491e-9ef1-2c73e49f0c16",
+ "id": "450b857e-2e74-491e-9ef1-2c73e49f0c16",
+ "representative_image": {},
+ "create_date": "2021-03-12T02:11:32.415488Z"
+ }
+ },
+ {
+ "_index": "dc-v2-collection-1658438321581379",
+ "_type": "_doc",
+ "_id": "3121f8ee-5265-4b19-bae3-59f96e9ac01a",
+ "_score": 1.0,
+ "_source": {
+ "featured": false,
+ "keywords": [""],
+ "visibility": "Private",
+ "description": "The Aldridge Collection consists of materials relating to 19th century African-American tragedian Ira Frederick Aldridge (1807-1967) and his children, mainly his daughter Amanda Christina Elizabeth Aldridge (known as Amanda Ira Aldridge, who composed under the pseudonym Montague Ring; 1866-1956).",
+ "published": true,
+ "title": "Aldridge Collection",
+ "modified_date": "2021-09-30T20:34:02.946609Z",
+ "admin_email": null,
+ "indexed_at": "2022-07-28T15:43:05.141902",
+ "api_model": "Collection",
+ "finding_aid_url": "https://findingaids.test.library.northwestern.edu/repositories/7/resources/1207",
+ "api_link": "[PLACEHOLDER]/3121f8ee-5265-4b19-bae3-59f96e9ac01a",
+ "id": "3121f8ee-5265-4b19-bae3-59f96e9ac01a",
+ "representative_image": {},
+ "create_date": "2021-03-12T02:11:32.470273Z"
+ }
+ },
+ {
+ "_index": "dc-v2-collection-1658438321581379",
+ "_type": "_doc",
+ "_id": "dc70f756-8e30-4724-b50d-591843db2537",
+ "_score": 1.0,
+ "_source": {
+ "featured": false,
+ "keywords": [""],
+ "visibility": "Institution",
+ "description": "The posters within the collection relate to events held on campus, including music and dance performances, film screenings, talks, seminars, panels, book talks, auditions, career fairs, job opportunities, research studies and course openings, among others. Some events reoccur across time.",
+ "published": true,
+ "title": "Northwestern University Posters Collection",
+ "modified_date": "2021-10-13T21:04:45.100396Z",
+ "admin_email": null,
+ "indexed_at": "2022-07-28T15:43:05.142115",
+ "api_model": "Collection",
+ "finding_aid_url": "https://findingaids.test.library.northwestern.edu/repositories/6/resources/1412",
+ "api_link": "[PLACEHOLDER]/dc70f756-8e30-4724-b50d-591843db2537",
+ "id": "dc70f756-8e30-4724-b50d-591843db2537",
+ "representative_image": {},
+ "create_date": "2021-03-25T14:31:56.858368Z"
+ }
+ }
+ ]
+ }
+}
diff --git a/test/fixtures/mocks/search.json b/test/fixtures/mocks/search.json
new file mode 100644
index 00000000..ea651f4c
--- /dev/null
+++ b/test/fixtures/mocks/search.json
@@ -0,0 +1,1411 @@
+{
+ "took": 7,
+ "timed_out": false,
+ "_shards": {
+ "total": 5,
+ "successful": 5,
+ "skipped": 0,
+ "failed": 0
+ },
+ "hits": {
+ "total": {
+ "value": 4199,
+ "relation": "eq"
+ },
+ "max_score": 1.0,
+ "hits": [
+ {
+ "_index": "dc-v2-work-1658438320350940",
+ "_type": "_doc",
+ "_id": "9a2a8af3-4d04-4bae-ad0a-711c5504be84",
+ "_score": 1.0,
+ "_source": {
+ "keywords": [],
+ "caption": [],
+ "source": [],
+ "terms_of_use": null,
+ "library_unit": "",
+ "indexed_at": "2022-07-28T19:35:03.977639",
+ "rights_statement": null,
+ "id": "9a2a8af3-4d04-4bae-ad0a-711c5504be84",
+ "create_date": "2022-07-28T19:33:13.059045Z",
+ "identifier": [],
+ "box_number": [],
+ "thumbnail": null,
+ "visibility": "Private",
+ "iiif_manifest": "https://assets.test.library.northwestern.edu.edu/public/iiif3/9a/2a/8a/f3/-4/d0/4-/4b/ae/-a/d0/a-/71/1c/55/04/be/84-manifest.json",
+ "work_type": "Audio",
+ "collection": {},
+ "published": false,
+ "modified_date": "2022-07-28T19:33:13.466249Z",
+ "accession_number": "tests124124124",
+ "license": null,
+ "physical_description_size": [],
+ "publisher": [],
+ "file_sets": [],
+ "status": "",
+ "folder_numbers": [],
+ "box_name": [],
+ "catalog_key": [],
+ "title": "test zip",
+ "legacy_identifier": [],
+ "provenance": [],
+ "api_link": "[PLACEHOLDER]/9a2a8af3-4d04-4bae-ad0a-711c5504be84",
+ "ark": "ark:/99999/fk4m05nh8w",
+ "alternate_title": [],
+ "related_material": [],
+ "folder_names": [],
+ "abstract": [],
+ "representative_file_set": {},
+ "api_model": "Work",
+ "physical_description_material": [],
+ "series": [],
+ "rights_holder": [],
+ "scope_and_contents": [],
+ "table_of_contents": [],
+ "preservation_level": ""
+ }
+ },
+ {
+ "_index": "dc-v2-work-1658438320350940",
+ "_type": "_doc",
+ "_id": "5ae1b239-309d-4e36-9e04-05606e27d637",
+ "_score": 1.0,
+ "_source": {
+ "keywords": [],
+ "caption": [],
+ "source": [],
+ "terms_of_use": null,
+ "library_unit": "",
+ "indexed_at": "2022-07-28T15:45:31.353774",
+ "rights_statement": null,
+ "id": "5ae1b239-309d-4e36-9e04-05606e27d637",
+ "create_date": "2022-02-25T17:21:01.402160Z",
+ "identifier": [],
+ "box_number": [],
+ "thumbnail": null,
+ "visibility": "Private",
+ "iiif_manifest": "https://assets.test.library.northwestern.edu.edu/public/iiif3/5a/e1/b2/39/-3/09/d-/4e/36/-9/e0/4-/05/60/6e/27/d6/37-manifest.json",
+ "work_type": "Video",
+ "collection": {},
+ "published": false,
+ "modified_date": "2022-06-13T15:43:06.701558Z",
+ "accession_number": "P000_ReseedingFeb22_001",
+ "license": null,
+ "physical_description_size": [],
+ "publisher": [],
+ "file_sets": [
+ {
+ "role": "Supplemental",
+ "streaming_url": null,
+ "mime_type": "application/gzip",
+ "rank": 1879048192,
+ "id": "ef98eb8a-842e-4055-9dd1-a6a6bbf0a536",
+ "label": "Qctools files",
+ "representative_image_url": null,
+ "poster_offset": null
+ },
+ {
+ "role": "Access",
+ "streaming_url": "https://assets.test.library.northwestern.edu.edu/aa/5c/8b/63/-2/95/8-/48/e8/-8/92/a-/32/93/ea/17/a2/04/aa5c8b63-2958-48e8-892a-3293ea17a204.m3u8",
+ "mime_type": "video/x-m4v",
+ "rank": 1073741824,
+ "id": "aa5c8b63-2958-48e8-892a-3293ea17a204",
+ "label": "adfkjasld;kfjal;ks",
+ "representative_image_url": "https://assets.test.library.northwestern.edu.edu/iiif/2/posters/aa5c8b63-2958-48e8-892a-3293ea17a204",
+ "poster_offset": 5572
+ },
+ {
+ "role": "Access",
+ "streaming_url": "https://assets.test.library.northwestern.edu.edu/fd/e2/e7/0c/-b/98/4-/47/27/-8/5d/b-/a9/62/d2/ad/5a/ba/fde2e70c-b984-4727-85db-a962d2ad5aba.m3u8",
+ "mime_type": "video/mp4",
+ "rank": 0,
+ "id": "fde2e70c-b984-4727-85db-a962d2ad5aba",
+ "label": "mp4",
+ "representative_image_url": "https://assets.test.library.northwestern.edu.edu/iiif/2/posters/fde2e70c-b984-4727-85db-a962d2ad5aba",
+ "poster_offset": 96371
+ },
+ {
+ "role": "Supplemental",
+ "streaming_url": null,
+ "mime_type": "application/octet-stream",
+ "rank": 1610612736,
+ "id": "03b93a59-f526-45bd-9017-82fd48bd0192",
+ "label": "MD5",
+ "representative_image_url": null,
+ "poster_offset": null
+ },
+ {
+ "role": "Supplemental",
+ "streaming_url": null,
+ "mime_type": "application/json",
+ "rank": 0,
+ "id": "71d50f4c-2ff6-4b77-ad5d-ca288285b4c0",
+ "label": "JSON",
+ "representative_image_url": null,
+ "poster_offset": null
+ },
+ {
+ "role": "Supplemental",
+ "streaming_url": null,
+ "mime_type": "application/octet-stream",
+ "rank": 1073741824,
+ "id": "288ad349-b363-4cc5-a114-00873f293ac9",
+ "label": "FRAME MD5",
+ "representative_image_url": null,
+ "poster_offset": null
+ },
+ {
+ "role": "Preservation",
+ "streaming_url": null,
+ "mime_type": null,
+ "rank": 0,
+ "id": "db2cdcde-4216-4d9e-9a0c-f7c03d966444",
+ "label": "MKV file",
+ "representative_image_url": null,
+ "poster_offset": null
+ }
+ ],
+ "status": "",
+ "folder_numbers": [],
+ "box_name": [],
+ "catalog_key": [],
+ "title": "Reseed Title",
+ "legacy_identifier": [],
+ "provenance": [],
+ "api_link": "[PLACEHOLDER]/5ae1b239-309d-4e36-9e04-05606e27d637",
+ "ark": "ark:/99999/fk4572wp3s",
+ "alternate_title": [],
+ "related_material": [],
+ "folder_names": [],
+ "abstract": [],
+ "representative_file_set": {},
+ "api_model": "Work",
+ "physical_description_material": [],
+ "series": [],
+ "rights_holder": [],
+ "scope_and_contents": [],
+ "table_of_contents": [],
+ "preservation_level": ""
+ }
+ },
+ {
+ "_index": "dc-v2-work-1658438320350940",
+ "_type": "_doc",
+ "_id": "0081d3de-60c0-41f8-80fb-9e57fa23e920",
+ "_score": 1.0,
+ "_source": {
+ "keywords": [],
+ "caption": [],
+ "source": [],
+ "terms_of_use": null,
+ "library_unit": "",
+ "indexed_at": "2022-07-28T15:45:31.354660",
+ "rights_statement": null,
+ "id": "0081d3de-60c0-41f8-80fb-9e57fa23e920",
+ "create_date": "2022-02-25T17:21:02.183739Z",
+ "identifier": [],
+ "box_number": [],
+ "thumbnail": null,
+ "visibility": "Private",
+ "iiif_manifest": "https://assets.test.library.northwestern.edu.edu/public/iiif3/00/81/d3/de/-6/0c/0-/41/f8/-8/0f/b-/9e/57/fa/23/e9/20-manifest.json",
+ "work_type": "Video",
+ "collection": {},
+ "published": false,
+ "modified_date": "2022-02-25T17:21:02.333024Z",
+ "accession_number": "P000_ReseedingFeb22_002",
+ "license": null,
+ "physical_description_size": [],
+ "publisher": [],
+ "file_sets": [
+ {
+ "role": "Access",
+ "streaming_url": "https://assets.test.library.northwestern.edu.edu/df/53/6c/a3/-c/55/8-/4c/0d/-9/6f/9-/b9/1a/6f/8a/32/5c/df536ca3-c558-4c0d-96f9-b91a6f8a325c.m3u8",
+ "mime_type": "video/quicktime",
+ "rank": 1073741824,
+ "id": "df536ca3-c558-4c0d-96f9-b91a6f8a325c",
+ "label": "mov",
+ "representative_image_url": null,
+ "poster_offset": null
+ },
+ {
+ "role": "Preservation",
+ "streaming_url": null,
+ "mime_type": null,
+ "rank": 0,
+ "id": "168254b5-9a7e-42f5-b6a3-ae83210506c0",
+ "label": "mkv",
+ "representative_image_url": null,
+ "poster_offset": null
+ },
+ {
+ "role": "Access",
+ "streaming_url": "https://assets.test.library.northwestern.edu.edu/76/bb/80/04/-2/45/5-/4a/16/-9/b1/9-/12/93/8d/20/48/38/76bb8004-2455-4a16-9b19-12938d204838.m3u8",
+ "mime_type": "video/mp4",
+ "rank": 0,
+ "id": "76bb8004-2455-4a16-9b19-12938d204838",
+ "label": "mp4",
+ "representative_image_url": null,
+ "poster_offset": null
+ }
+ ],
+ "status": "",
+ "folder_numbers": [],
+ "box_name": [],
+ "catalog_key": [],
+ "title": null,
+ "legacy_identifier": [],
+ "provenance": [],
+ "api_link": "[PLACEHOLDER]/0081d3de-60c0-41f8-80fb-9e57fa23e920",
+ "ark": "ark:/99999/fk41g25v6m",
+ "alternate_title": [],
+ "related_material": [],
+ "folder_names": [],
+ "abstract": [],
+ "representative_file_set": {},
+ "api_model": "Work",
+ "physical_description_material": [],
+ "series": [],
+ "rights_holder": [],
+ "scope_and_contents": [],
+ "table_of_contents": [],
+ "preservation_level": ""
+ }
+ },
+ {
+ "_index": "dc-v2-work-1658438320350940",
+ "_type": "_doc",
+ "_id": "25a1b800-cab0-4200-abbb-9015842a7b29",
+ "_score": 1.0,
+ "_source": {
+ "keywords": [],
+ "caption": [],
+ "source": [],
+ "terms_of_use": null,
+ "library_unit": "",
+ "indexed_at": "2022-07-28T15:45:31.473035",
+ "rights_statement": null,
+ "id": "25a1b800-cab0-4200-abbb-9015842a7b29",
+ "create_date": "2022-02-25T17:21:03.522406Z",
+ "identifier": [],
+ "box_number": [],
+ "thumbnail": null,
+ "visibility": "Private",
+ "iiif_manifest": "https://assets.test.library.northwestern.edu.edu/public/iiif3/25/a1/b8/00/-c/ab/0-/42/00/-a/bb/b-/90/15/84/2a/7b/29-manifest.json",
+ "work_type": "Video",
+ "collection": {},
+ "published": false,
+ "modified_date": "2022-02-25T17:21:03.740709Z",
+ "accession_number": "P000_ReseedingFeb22_007",
+ "license": null,
+ "physical_description_size": [],
+ "publisher": [],
+ "file_sets": [
+ {
+ "role": "Access",
+ "streaming_url": "https://assets.test.library.northwestern.edu.edu/a2/b2/28/c7/-6/8f/8-/45/0d/-9/e2/c-/21/f3/96/86/47/63/a2b228c7-68f8-450d-9e2c-21f396864763.m3u8",
+ "mime_type": "video/mp4",
+ "rank": 0,
+ "id": "a2b228c7-68f8-450d-9e2c-21f396864763",
+ "label": "Mp4",
+ "representative_image_url": null,
+ "poster_offset": null
+ }
+ ],
+ "status": "",
+ "folder_numbers": [],
+ "box_name": [],
+ "catalog_key": [],
+ "title": null,
+ "legacy_identifier": [],
+ "provenance": [],
+ "api_link": "[PLACEHOLDER]/25a1b800-cab0-4200-abbb-9015842a7b29",
+ "ark": "ark:/99999/fk4cr79d2m",
+ "alternate_title": [],
+ "related_material": [],
+ "folder_names": [],
+ "abstract": [],
+ "representative_file_set": {},
+ "api_model": "Work",
+ "physical_description_material": [],
+ "series": [],
+ "rights_holder": [],
+ "scope_and_contents": [],
+ "table_of_contents": [],
+ "preservation_level": ""
+ }
+ },
+ {
+ "_index": "dc-v2-work-1658438320350940",
+ "_type": "_doc",
+ "_id": "2d839343-b459-4b27-83be-0bc4032588de",
+ "_score": 1.0,
+ "_source": {
+ "keywords": [],
+ "caption": [],
+ "source": [],
+ "terms_of_use": null,
+ "library_unit": "",
+ "indexed_at": "2022-07-28T15:45:31.475179",
+ "rights_statement": null,
+ "id": "2d839343-b459-4b27-83be-0bc4032588de",
+ "create_date": "2022-06-27T21:14:37.734614Z",
+ "identifier": [],
+ "box_number": [],
+ "thumbnail": "https://assets.test.library.northwestern.edu.edu/iiif/2/f0591ed1-6a0a-4baf-a983-4b854800a702/full/!300,300/0/default.jpg",
+ "visibility": "Private",
+ "iiif_manifest": "https://assets.test.library.northwestern.edu.edu/public/2d/83/93/43/-b/45/9-/4b/27/-8/3b/e-/0b/c4/03/25/88/de-manifest.json",
+ "work_type": "Image",
+ "collection": {},
+ "published": false,
+ "modified_date": "2022-06-27T21:14:37.900026Z",
+ "accession_number": "6-27_test_work_519",
+ "license": null,
+ "physical_description_size": [],
+ "publisher": [],
+ "file_sets": [
+ {
+ "role": "Access",
+ "streaming_url": null,
+ "mime_type": "image/tiff",
+ "rank": 0,
+ "id": "f0591ed1-6a0a-4baf-a983-4b854800a702",
+ "label": "label",
+ "representative_image_url": "https://assets.test.library.northwestern.edu.edu/iiif/2/f0591ed1-6a0a-4baf-a983-4b854800a702",
+ "poster_offset": null
+ },
+ {
+ "role": "Preservation",
+ "streaming_url": null,
+ "mime_type": "image/tiff",
+ "rank": 0,
+ "id": "b3ced9b2-8c7e-4ec9-9099-a931ecbfd956",
+ "label": "label",
+ "representative_image_url": null,
+ "poster_offset": null
+ }
+ ],
+ "status": "",
+ "folder_numbers": [],
+ "box_name": [],
+ "catalog_key": [],
+ "title": null,
+ "legacy_identifier": [],
+ "provenance": [],
+ "api_link": "[PLACEHOLDER]/2d839343-b459-4b27-83be-0bc4032588de",
+ "ark": "ark:/99999/fk4fb6kj4w",
+ "alternate_title": [],
+ "related_material": [],
+ "folder_names": [],
+ "abstract": [],
+ "representative_file_set": {
+ "fileSetId": "f0591ed1-6a0a-4baf-a983-4b854800a702",
+ "url": "https://assets.test.library.northwestern.edu.edu/iiif/2/f0591ed1-6a0a-4baf-a983-4b854800a702"
+ },
+ "api_model": "Work",
+ "physical_description_material": [],
+ "series": [],
+ "rights_holder": [],
+ "scope_and_contents": [],
+ "table_of_contents": [],
+ "preservation_level": ""
+ }
+ },
+ {
+ "_index": "dc-v2-work-1658438320350940",
+ "_type": "_doc",
+ "_id": "ee592440-4401-445b-8b8d-2991b2817e57",
+ "_score": 1.0,
+ "_source": {
+ "keywords": [],
+ "caption": [],
+ "source": [],
+ "terms_of_use": null,
+ "library_unit": "Herskovits Library of African Studies",
+ "indexed_at": "2022-07-28T15:45:31.541738",
+ "rights_statement": null,
+ "id": "ee592440-4401-445b-8b8d-2991b2817e57",
+ "create_date": "2021-11-29T17:03:48.699230Z",
+ "identifier": [],
+ "box_number": ["Box 84"],
+ "thumbnail": "https://assets.test.library.northwestern.edu.edu/iiif/2/c6efe600-bc46-4b79-ab07-2a54014adc89/full/!300,300/0/default.jpg",
+ "visibility": "Private",
+ "iiif_manifest": "https://assets.test.library.northwestern.edu.edu/public/ee/59/24/40/-4/40/1-/44/5b/-8/b8/d-/29/91/b2/81/7e/57-manifest.json",
+ "work_type": "Image",
+ "collection": {
+ "id": "fd9927b0-6cd4-4aa7-bf86-ca84955980a6",
+ "title": "Vernon McKay (1912-1988) Papers"
+ },
+ "published": true,
+ "modified_date": "2022-06-13T16:06:44.052690Z",
+ "accession_number": "P0413_B84_F04_009",
+ "license": null,
+ "physical_description_size": [],
+ "publisher": [],
+ "file_sets": [
+ {
+ "role": "Access",
+ "streaming_url": null,
+ "mime_type": "image/tiff",
+ "rank": 1360072977,
+ "id": "6145c11d-868a-4974-acb3-c51ae059ea59",
+ "label": "P0413_B84_F04_009_09_02.tif",
+ "representative_image_url": "https://assets.test.library.northwestern.edu.edu/iiif/2/6145c11d-868a-4974-acb3-c51ae059ea59",
+ "poster_offset": null
+ },
+ {
+ "role": "Access",
+ "streaming_url": null,
+ "mime_type": "image/tiff",
+ "rank": -1216907400,
+ "id": "62418d3f-3777-424f-8a91-5030e78df746",
+ "label": "P0413_B84_F04_009_03_02.tif",
+ "representative_image_url": "https://assets.test.library.northwestern.edu.edu/iiif/2/62418d3f-3777-424f-8a91-5030e78df746",
+ "poster_offset": null
+ },
+ {
+ "role": "Access",
+ "streaming_url": null,
+ "mime_type": "image/tiff",
+ "rank": -787410671,
+ "id": "633b2e85-209e-48eb-b22d-5fbb061d0562",
+ "label": "P0413_B84_F04_009_05_02.tif",
+ "representative_image_url": "https://assets.test.library.northwestern.edu.edu/iiif/2/633b2e85-209e-48eb-b22d-5fbb061d0562",
+ "poster_offset": null
+ },
+ {
+ "role": "Access",
+ "streaming_url": null,
+ "mime_type": "image/tiff",
+ "rank": 572662306,
+ "id": "6e35c386-395c-4071-9fb5-54d6b130115f",
+ "label": "P0413_B84_F04_009_07_07.tif",
+ "representative_image_url": "https://assets.test.library.northwestern.edu.edu/iiif/2/6e35c386-395c-4071-9fb5-54d6b130115f",
+ "poster_offset": null
+ },
+ {
+ "role": "Access",
+ "streaming_url": null,
+ "mime_type": "image/tiff",
+ "rank": 1073741824,
+ "id": "78dc79de-cb76-44b5-8010-d993056fe9d2",
+ "label": "P0413_B84_F04_009_08_06.tif",
+ "representative_image_url": "https://assets.test.library.northwestern.edu.edu/iiif/2/78dc79de-cb76-44b5-8010-d993056fe9d2",
+ "poster_offset": null
+ },
+ {
+ "role": "Access",
+ "streaming_url": null,
+ "mime_type": "image/tiff",
+ "rank": 0,
+ "id": "797e081e-e798-48ee-bbc1-0ca6c619de97",
+ "label": "P0413_B84_F04_009_06_07.tif",
+ "representative_image_url": "https://assets.test.library.northwestern.edu.edu/iiif/2/797e081e-e798-48ee-bbc1-0ca6c619de97",
+ "poster_offset": null
+ },
+ {
+ "role": "Access",
+ "streaming_url": null,
+ "mime_type": "image/tiff",
+ "rank": 214748365,
+ "id": "820aa4ff-4c7e-49ba-8824-738a01106f14",
+ "label": "P0413_B84_F04_009_07_02.tif",
+ "representative_image_url": "https://assets.test.library.northwestern.edu.edu/iiif/2/820aa4ff-4c7e-49ba-8824-738a01106f14",
+ "poster_offset": null
+ },
+ {
+ "role": "Access",
+ "streaming_url": null,
+ "mime_type": "image/tiff",
+ "rank": 1216907400,
+ "id": "82b1761f-d709-454e-8fb0-2f0ad661cb7f",
+ "label": "P0413_B84_F04_009_08_08.tif",
+ "representative_image_url": "https://assets.test.library.northwestern.edu.edu/iiif/2/82b1761f-d709-454e-8fb0-2f0ad661cb7f",
+ "poster_offset": null
+ },
+ {
+ "role": "Access",
+ "streaming_url": null,
+ "mime_type": "image/tiff",
+ "rank": 1574821341,
+ "id": "8325efc6-8e3f-4b98-b979-99ceb05aa48f",
+ "label": "P0413_B84_F04_009_10_01.tif",
+ "representative_image_url": "https://assets.test.library.northwestern.edu.edu/iiif/2/8325efc6-8e3f-4b98-b979-99ceb05aa48f",
+ "poster_offset": null
+ },
+ {
+ "role": "Access",
+ "streaming_url": null,
+ "mime_type": "image/tiff",
+ "rank": 2004318071,
+ "id": "87b8da22-a06a-45c8-ad05-5eeb5732f5be",
+ "label": "P0413_B84_F04_009_10_07.tif",
+ "representative_image_url": "https://assets.test.library.northwestern.edu.edu/iiif/2/87b8da22-a06a-45c8-ad05-5eeb5732f5be",
+ "poster_offset": null
+ },
+ {
+ "role": "Access",
+ "streaming_url": null,
+ "mime_type": "image/tiff",
+ "rank": -1646404130,
+ "id": "88987e7a-3277-4ffd-8fce-bdbb61eccfdb",
+ "label": "P0413_B84_F04_009_02_06.tif",
+ "representative_image_url": "https://assets.test.library.northwestern.edu.edu/iiif/2/88987e7a-3277-4ffd-8fce-bdbb61eccfdb",
+ "poster_offset": null
+ },
+ {
+ "role": "Access",
+ "streaming_url": null,
+ "mime_type": "image/tiff",
+ "rank": 1789569706,
+ "id": "893523db-d478-4501-9651-149c90e943c5",
+ "label": "P0413_B84_F04_009_10_04.tif",
+ "representative_image_url": "https://assets.test.library.northwestern.edu.edu/iiif/2/893523db-d478-4501-9651-149c90e943c5",
+ "poster_offset": null
+ },
+ {
+ "role": "Access",
+ "streaming_url": null,
+ "mime_type": "image/tiff",
+ "rank": 1646404130,
+ "id": "8b5362e6-cfa9-4c4d-80ee-82978adf6977",
+ "label": "P0413_B84_F04_009_10_02.tif",
+ "representative_image_url": "https://assets.test.library.northwestern.edu.edu/iiif/2/8b5362e6-cfa9-4c4d-80ee-82978adf6977",
+ "poster_offset": null
+ },
+ {
+ "role": "Access",
+ "streaming_url": null,
+ "mime_type": "image/tiff",
+ "rank": -2004318071,
+ "id": "8ccde0c9-9749-45a6-b087-fe7369a2ae73",
+ "label": "P0413_B84_F04_009_02_01.tif",
+ "representative_image_url": "https://assets.test.library.northwestern.edu.edu/iiif/2/8ccde0c9-9749-45a6-b087-fe7369a2ae73",
+ "poster_offset": null
+ },
+ {
+ "role": "Access",
+ "streaming_url": null,
+ "mime_type": "image/tiff",
+ "rank": 286331153,
+ "id": "8f401490-5e19-4209-b18e-e701937f3acf",
+ "label": "P0413_B84_F04_009_07_03.tif",
+ "representative_image_url": "https://assets.test.library.northwestern.edu.edu/iiif/2/8f401490-5e19-4209-b18e-e701937f3acf",
+ "poster_offset": null
+ },
+ {
+ "role": "Access",
+ "streaming_url": null,
+ "mime_type": "image/tiff",
+ "rank": -1431655765,
+ "id": "95353321-bc0d-4ea1-b2b9-49f6e4ef6314",
+ "label": "P0413_B84_F04_009_02_09.tif",
+ "representative_image_url": "https://assets.test.library.northwestern.edu.edu/iiif/2/95353321-bc0d-4ea1-b2b9-49f6e4ef6314",
+ "poster_offset": null
+ },
+ {
+ "role": "Access",
+ "streaming_url": null,
+ "mime_type": "image/tiff",
+ "rank": 2138535799,
+ "id": "96024b01-28de-4ecd-9f7e-2dbb8dcb7dd4",
+ "label": "P0413_B84_F04_009_11_04.tif",
+ "representative_image_url": "https://assets.test.library.northwestern.edu.edu/iiif/2/96024b01-28de-4ecd-9f7e-2dbb8dcb7dd4",
+ "poster_offset": null
+ },
+ {
+ "role": "Access",
+ "streaming_url": null,
+ "mime_type": "image/tiff",
+ "rank": 71582788,
+ "id": "96259982-ac72-4ca8-bf54-cb2f5693965c",
+ "label": "P0413_B84_F04_009_06_08.tif",
+ "representative_image_url": "https://assets.test.library.northwestern.edu.edu/iiif/2/96259982-ac72-4ca8-bf54-cb2f5693965c",
+ "poster_offset": null
+ },
+ {
+ "role": "Access",
+ "streaming_url": null,
+ "mime_type": "image/tiff",
+ "rank": -1503238553,
+ "id": "96ba2a1e-ee22-48ee-bb3e-cc8ed7e76486",
+ "label": "P0413_B84_F04_009_02_08.tif",
+ "representative_image_url": "https://assets.test.library.northwestern.edu.edu/iiif/2/96ba2a1e-ee22-48ee-bb3e-cc8ed7e76486",
+ "poster_offset": null
+ },
+ {
+ "role": "Access",
+ "streaming_url": null,
+ "mime_type": "image/tiff",
+ "rank": -1145324612,
+ "id": "96d4f624-e268-49ee-bf43-e8ddd4ff617f",
+ "label": "P0413_B84_F04_009_03_03.tif",
+ "representative_image_url": "https://assets.test.library.northwestern.edu.edu/iiif/2/96d4f624-e268-49ee-bf43-e8ddd4ff617f",
+ "poster_offset": null
+ },
+ {
+ "role": "Access",
+ "streaming_url": null,
+ "mime_type": "image/tiff",
+ "rank": 1288490188,
+ "id": "9ae9ad83-38b7-4454-94ea-6d1d8a10bea4",
+ "label": "P0413_B84_F04_009_09_01.tif",
+ "representative_image_url": "https://assets.test.library.northwestern.edu.edu/iiif/2/9ae9ad83-38b7-4454-94ea-6d1d8a10bea4",
+ "poster_offset": null
+ },
+ {
+ "role": "Access",
+ "streaming_url": null,
+ "mime_type": "image/tiff",
+ "rank": 2075900859,
+ "id": "9b0f27f5-e564-4fcb-b8ef-710cca78fc6d",
+ "label": "P0413_B84_F04_009_11_01.tif",
+ "representative_image_url": "https://assets.test.library.northwestern.edu.edu/iiif/2/9b0f27f5-e564-4fcb-b8ef-710cca78fc6d",
+ "poster_offset": null
+ },
+ {
+ "role": "Access",
+ "streaming_url": null,
+ "mime_type": "image/tiff",
+ "rank": -572662306,
+ "id": "9bd7f275-08f7-40c0-8dbb-9f62ed7a4534",
+ "label": "P0413_B84_F04_009_05_05.tif",
+ "representative_image_url": "https://assets.test.library.northwestern.edu.edu/iiif/2/9bd7f275-08f7-40c0-8dbb-9f62ed7a4534",
+ "poster_offset": null
+ },
+ {
+ "role": "Access",
+ "streaming_url": null,
+ "mime_type": "image/tiff",
+ "rank": -286331153,
+ "id": "9c3153bf-9d49-47f8-97ad-d4a69856e20b",
+ "label": "P0413_B84_F04_009_06_03.tif",
+ "representative_image_url": "https://assets.test.library.northwestern.edu.edu/iiif/2/9c3153bf-9d49-47f8-97ad-d4a69856e20b",
+ "poster_offset": null
+ },
+ {
+ "role": "Access",
+ "streaming_url": null,
+ "mime_type": "image/tiff",
+ "rank": 501079518,
+ "id": "9ee3fe77-87e4-4ce5-86e8-a167f092e971",
+ "label": "P0413_B84_F04_009_07_06.tif",
+ "representative_image_url": "https://assets.test.library.northwestern.edu.edu/iiif/2/9ee3fe77-87e4-4ce5-86e8-a167f092e971",
+ "poster_offset": null
+ },
+ {
+ "role": "Access",
+ "streaming_url": null,
+ "mime_type": "image/tiff",
+ "rank": -1717986918,
+ "id": "9f1191b2-3c34-44c0-b33c-621a199f943b",
+ "label": "P0413_B84_F04_009_02_05.tif",
+ "representative_image_url": "https://assets.test.library.northwestern.edu.edu/iiif/2/9f1191b2-3c34-44c0-b33c-621a199f943b",
+ "poster_offset": null
+ },
+ {
+ "role": "Access",
+ "streaming_url": null,
+ "mime_type": "image/tiff",
+ "rank": -1360072977,
+ "id": "9f984b13-0746-44a7-9e61-f8b5f8f8a5e8",
+ "label": "P0413_B84_F04_009_02_10.tif",
+ "representative_image_url": "https://assets.test.library.northwestern.edu.edu/iiif/2/9f984b13-0746-44a7-9e61-f8b5f8f8a5e8",
+ "poster_offset": null
+ },
+ {
+ "role": "Access",
+ "streaming_url": null,
+ "mime_type": "image/tiff",
+ "rank": 787410671,
+ "id": "a3517a51-b000-4b68-acb7-bb27eade4f61",
+ "label": "P0413_B84_F04_009_08_02.tif",
+ "representative_image_url": "https://assets.test.library.northwestern.edu.edu/iiif/2/a3517a51-b000-4b68-acb7-bb27eade4f61",
+ "poster_offset": null
+ },
+ {
+ "role": "Access",
+ "streaming_url": null,
+ "mime_type": "image/tiff",
+ "rank": -1002159036,
+ "id": "a9676c51-43bb-4cbc-948f-3274d3d4ed5d",
+ "label": "P0413_B84_F04_009_04_01.tif",
+ "representative_image_url": "https://assets.test.library.northwestern.edu.edu/iiif/2/a9676c51-43bb-4cbc-948f-3274d3d4ed5d",
+ "poster_offset": null
+ },
+ {
+ "role": "Access",
+ "streaming_url": null,
+ "mime_type": "image/tiff",
+ "rank": -1932735283,
+ "id": "a9c8ef21-4482-4e12-961a-f2a41a0bb387",
+ "label": "P0413_B84_F04_009_02_02.tif",
+ "representative_image_url": "https://assets.test.library.northwestern.edu.edu/iiif/2/a9c8ef21-4482-4e12-961a-f2a41a0bb387",
+ "poster_offset": null
+ },
+ {
+ "role": "Access",
+ "streaming_url": null,
+ "mime_type": "image/tiff",
+ "rank": -2075900859,
+ "id": "c6efe600-bc46-4b79-ab07-2a54014adc89",
+ "label": "P0413_B84_F04_009_01.tif",
+ "representative_image_url": "https://assets.test.library.northwestern.edu.edu/iiif/2/c6efe600-bc46-4b79-ab07-2a54014adc89",
+ "poster_offset": null
+ },
+ {
+ "role": "Access",
+ "streaming_url": null,
+ "mime_type": "image/tiff",
+ "rank": -1574821342,
+ "id": "cc9e154e-bd38-4420-9a38-e17ccdcdce63",
+ "label": "P0413_B84_F04_009_02_07.tif",
+ "representative_image_url": "https://assets.test.library.northwestern.edu.edu/iiif/2/cc9e154e-bd38-4420-9a38-e17ccdcdce63",
+ "poster_offset": null
+ },
+ {
+ "role": "Access",
+ "streaming_url": null,
+ "mime_type": "image/tiff",
+ "rank": -930576247,
+ "id": "cd7f8d79-1f4d-4f43-b1de-0ef51a047ebd",
+ "label": "P0413_B84_F04_009_04_02.tif",
+ "representative_image_url": "https://assets.test.library.northwestern.edu.edu/iiif/2/cd7f8d79-1f4d-4f43-b1de-0ef51a047ebd",
+ "poster_offset": null
+ },
+ {
+ "role": "Access",
+ "streaming_url": null,
+ "mime_type": "image/tiff",
+ "rank": 1503238553,
+ "id": "d2cc2196-c0d4-42a9-8582-c106ff5dd199",
+ "label": "P0413_B84_F04_009_09_04.tif",
+ "representative_image_url": "https://assets.test.library.northwestern.edu.edu/iiif/2/d2cc2196-c0d4-42a9-8582-c106ff5dd199",
+ "poster_offset": null
+ },
+ {
+ "role": "Access",
+ "streaming_url": null,
+ "mime_type": "image/tiff",
+ "rank": -1073741824,
+ "id": "e0c8628f-40b9-4cf1-bb60-df4a026e4e67",
+ "label": "P0413_B84_F04_009_03_04.tif",
+ "representative_image_url": "https://assets.test.library.northwestern.edu.edu/iiif/2/e0c8628f-40b9-4cf1-bb60-df4a026e4e67",
+ "poster_offset": null
+ },
+ {
+ "role": "Access",
+ "streaming_url": null,
+ "mime_type": "image/tiff",
+ "rank": -214748365,
+ "id": "e2af7752-dc31-4d00-ac89-02f0aeae7977",
+ "label": "P0413_B84_F04_009_06_04.tif",
+ "representative_image_url": "https://assets.test.library.northwestern.edu.edu/iiif/2/e2af7752-dc31-4d00-ac89-02f0aeae7977",
+ "poster_offset": null
+ },
+ {
+ "role": "Access",
+ "streaming_url": null,
+ "mime_type": "image/tiff",
+ "rank": 1145324612,
+ "id": "e8ce307a-7f3b-473d-892b-c53f87f28dc8",
+ "label": "P0413_B84_F04_009_08_07.tif",
+ "representative_image_url": "https://assets.test.library.northwestern.edu.edu/iiif/2/e8ce307a-7f3b-473d-892b-c53f87f28dc8",
+ "poster_offset": null
+ },
+ {
+ "role": "Access",
+ "streaming_url": null,
+ "mime_type": "image/tiff",
+ "rank": 1002159035,
+ "id": "ed3290ea-36fe-48d6-a22b-b2919956ea4b",
+ "label": "P0413_B84_F04_009_08_05.tif",
+ "representative_image_url": "https://assets.test.library.northwestern.edu.edu/iiif/2/ed3290ea-36fe-48d6-a22b-b2919956ea4b",
+ "poster_offset": null
+ },
+ {
+ "role": "Access",
+ "streaming_url": null,
+ "mime_type": "image/tiff",
+ "rank": 1932735283,
+ "id": "f1090fcb-2d66-4aa7-8d78-86a0d659628b",
+ "label": "P0413_B84_F04_009_10_06.tif",
+ "representative_image_url": "https://assets.test.library.northwestern.edu.edu/iiif/2/f1090fcb-2d66-4aa7-8d78-86a0d659628b",
+ "poster_offset": null
+ },
+ {
+ "role": "Access",
+ "streaming_url": null,
+ "mime_type": "image/tiff",
+ "rank": -858993459,
+ "id": "f2e3be07-1e29-484b-8fae-b3075c7dbf05",
+ "label": "P0413_B84_F04_009_05_01.tif",
+ "representative_image_url": "https://assets.test.library.northwestern.edu.edu/iiif/2/f2e3be07-1e29-484b-8fae-b3075c7dbf05",
+ "poster_offset": null
+ },
+ {
+ "role": "Access",
+ "streaming_url": null,
+ "mime_type": "image/tiff",
+ "rank": -715827883,
+ "id": "fb2e193d-c625-4bea-8aaa-67696187d28e",
+ "label": "P0413_B84_F04_009_05_03.tif",
+ "representative_image_url": "https://assets.test.library.northwestern.edu.edu/iiif/2/fb2e193d-c625-4bea-8aaa-67696187d28e",
+ "poster_offset": null
+ },
+ {
+ "role": "Access",
+ "streaming_url": null,
+ "mime_type": "image/tiff",
+ "rank": 644245094,
+ "id": "fc9ff012-d5e2-49f6-aa8e-a713dee6ecb4",
+ "label": "P0413_B84_F04_009_07_08.tif",
+ "representative_image_url": "https://assets.test.library.northwestern.edu.edu/iiif/2/fc9ff012-d5e2-49f6-aa8e-a713dee6ecb4",
+ "poster_offset": null
+ },
+ {
+ "role": "Access",
+ "streaming_url": null,
+ "mime_type": "image/tiff",
+ "rank": 1861152494,
+ "id": "fee7fb28-57b5-4e39-ac24-ab1e6a5c8a9d",
+ "label": "P0413_B84_F04_009_10_05.tif",
+ "representative_image_url": "https://assets.test.library.northwestern.edu.edu/iiif/2/fee7fb28-57b5-4e39-ac24-ab1e6a5c8a9d",
+ "poster_offset": null
+ },
+ {
+ "role": "Access",
+ "streaming_url": null,
+ "mime_type": "image/tiff",
+ "rank": -1789569706,
+ "id": "b098b7fc-f922-404d-8361-3b173c23fed5",
+ "label": "P0413_B84_F04_009_02_04.tif",
+ "representative_image_url": "https://assets.test.library.northwestern.edu.edu/iiif/2/b098b7fc-f922-404d-8361-3b173c23fed5",
+ "poster_offset": null
+ },
+ {
+ "role": "Access",
+ "streaming_url": null,
+ "mime_type": "image/tiff",
+ "rank": -429496730,
+ "id": "03abcb63-8886-4e06-bda9-2d0316537405",
+ "label": "P0413_B84_F04_009_06_01.tif",
+ "representative_image_url": "https://assets.test.library.northwestern.edu.edu/iiif/2/03abcb63-8886-4e06-bda9-2d0316537405",
+ "poster_offset": null
+ },
+ {
+ "role": "Access",
+ "streaming_url": null,
+ "mime_type": "image/tiff",
+ "rank": -143165577,
+ "id": "049050a9-e77d-4782-b97d-c6df3d7e0e45",
+ "label": "P0413_B84_F04_009_06_05.tif",
+ "representative_image_url": "https://assets.test.library.northwestern.edu.edu/iiif/2/049050a9-e77d-4782-b97d-c6df3d7e0e45",
+ "poster_offset": null
+ },
+ {
+ "role": "Access",
+ "streaming_url": null,
+ "mime_type": "image/tiff",
+ "rank": 715827882,
+ "id": "0b514433-ce5e-4bf8-8e9c-f74f9bc666c7",
+ "label": "P0413_B84_F04_009_08_01.tif",
+ "representative_image_url": "https://assets.test.library.northwestern.edu.edu/iiif/2/0b514433-ce5e-4bf8-8e9c-f74f9bc666c7",
+ "poster_offset": null
+ },
+ {
+ "role": "Access",
+ "streaming_url": null,
+ "mime_type": "image/tiff",
+ "rank": -644245094,
+ "id": "0e691e0b-85e0-4c64-b47f-8dc8aa65249c",
+ "label": "P0413_B84_F04_009_05_04.tif",
+ "representative_image_url": "https://assets.test.library.northwestern.edu.edu/iiif/2/0e691e0b-85e0-4c64-b47f-8dc8aa65249c",
+ "poster_offset": null
+ },
+ {
+ "role": "Access",
+ "streaming_url": null,
+ "mime_type": "image/tiff",
+ "rank": -1288490189,
+ "id": "0eadcacd-43cc-4789-a751-549e6d4161dd",
+ "label": "P0413_B84_F04_009_03_01.tif",
+ "representative_image_url": "https://assets.test.library.northwestern.edu.edu/iiif/2/0eadcacd-43cc-4789-a751-549e6d4161dd",
+ "poster_offset": null
+ },
+ {
+ "role": "Access",
+ "streaming_url": null,
+ "mime_type": "image/tiff",
+ "rank": 858993459,
+ "id": "12e1a575-7578-4215-a786-a6716f08117c",
+ "label": "P0413_B84_F04_009_08_03.tif",
+ "representative_image_url": "https://assets.test.library.northwestern.edu.edu/iiif/2/12e1a575-7578-4215-a786-a6716f08117c",
+ "poster_offset": null
+ },
+ {
+ "role": "Access",
+ "streaming_url": null,
+ "mime_type": "image/tiff",
+ "rank": 1717986918,
+ "id": "179ba4ce-2b21-4842-bc25-b96a4492be50",
+ "label": "P0413_B84_F04_009_10_03.tif",
+ "representative_image_url": "https://assets.test.library.northwestern.edu.edu/iiif/2/179ba4ce-2b21-4842-bc25-b96a4492be50",
+ "poster_offset": null
+ },
+ {
+ "role": "Access",
+ "streaming_url": null,
+ "mime_type": "image/tiff",
+ "rank": -357913941,
+ "id": "198c0b2a-1fb6-4488-b448-96c065aad25e",
+ "label": "P0413_B84_F04_009_06_02.tif",
+ "representative_image_url": "https://assets.test.library.northwestern.edu.edu/iiif/2/198c0b2a-1fb6-4488-b448-96c065aad25e",
+ "poster_offset": null
+ },
+ {
+ "role": "Access",
+ "streaming_url": null,
+ "mime_type": "image/tiff",
+ "rank": 930576247,
+ "id": "1fd583bb-f1d5-481b-ab29-97b21425560b",
+ "label": "P0413_B84_F04_009_08_04.tif",
+ "representative_image_url": "https://assets.test.library.northwestern.edu.edu/iiif/2/1fd583bb-f1d5-481b-ab29-97b21425560b",
+ "poster_offset": null
+ },
+ {
+ "role": "Access",
+ "streaming_url": null,
+ "mime_type": "image/tiff",
+ "rank": 1431655765,
+ "id": "20739142-0e37-420e-81b4-e6d9fcbdf6d6",
+ "label": "P0413_B84_F04_009_09_03.tif",
+ "representative_image_url": "https://assets.test.library.northwestern.edu.edu/iiif/2/20739142-0e37-420e-81b4-e6d9fcbdf6d6",
+ "poster_offset": null
+ },
+ {
+ "role": "Access",
+ "streaming_url": null,
+ "mime_type": "image/tiff",
+ "rank": 2111692253,
+ "id": "27b1e8ad-3453-40ce-bc95-4513a74dabfe",
+ "label": "P0413_B84_F04_009_11_02.tif",
+ "representative_image_url": "https://assets.test.library.northwestern.edu.edu/iiif/2/27b1e8ad-3453-40ce-bc95-4513a74dabfe",
+ "poster_offset": null
+ },
+ {
+ "role": "Access",
+ "streaming_url": null,
+ "mime_type": "image/tiff",
+ "rank": 143165576,
+ "id": "2b41a266-cd5c-4b9f-ba8c-c9731077ab84",
+ "label": "P0413_B84_F04_009_07_01.tif",
+ "representative_image_url": "https://assets.test.library.northwestern.edu.edu/iiif/2/2b41a266-cd5c-4b9f-ba8c-c9731077ab84",
+ "poster_offset": null
+ },
+ {
+ "role": "Access",
+ "streaming_url": null,
+ "mime_type": "image/tiff",
+ "rank": -501079518,
+ "id": "2df2e469-2a45-44d1-9d74-5b9324df8b14",
+ "label": "P0413_B84_F04_009_05_06.tif",
+ "representative_image_url": "https://assets.test.library.northwestern.edu.edu/iiif/2/2df2e469-2a45-44d1-9d74-5b9324df8b14",
+ "poster_offset": null
+ },
+ {
+ "role": "Access",
+ "streaming_url": null,
+ "mime_type": "image/tiff",
+ "rank": 2129587950,
+ "id": "2ec83ff3-56b4-4105-ac36-8da8b4dd23a6",
+ "label": "P0413_B84_F04_009_11_03.tif",
+ "representative_image_url": "https://assets.test.library.northwestern.edu.edu/iiif/2/2ec83ff3-56b4-4105-ac36-8da8b4dd23a6",
+ "poster_offset": null
+ },
+ {
+ "role": "Access",
+ "streaming_url": null,
+ "mime_type": "image/tiff",
+ "rank": 429496729,
+ "id": "46cd43fe-5e01-4bec-9539-c38367a1e906",
+ "label": "P0413_B84_F04_009_07_05.tif",
+ "representative_image_url": "https://assets.test.library.northwestern.edu.edu/iiif/2/46cd43fe-5e01-4bec-9539-c38367a1e906",
+ "poster_offset": null
+ },
+ {
+ "role": "Access",
+ "streaming_url": null,
+ "mime_type": "image/tiff",
+ "rank": -1861152495,
+ "id": "4dd19cf4-8224-490d-8a67-3e72a183cb26",
+ "label": "P0413_B84_F04_009_02_03.tif",
+ "representative_image_url": "https://assets.test.library.northwestern.edu.edu/iiif/2/4dd19cf4-8224-490d-8a67-3e72a183cb26",
+ "poster_offset": null
+ },
+ {
+ "role": "Access",
+ "streaming_url": null,
+ "mime_type": "image/tiff",
+ "rank": 357913941,
+ "id": "56c1d785-7144-496d-8b07-c6366161fbe6",
+ "label": "P0413_B84_F04_009_07_04.tif",
+ "representative_image_url": "https://assets.test.library.northwestern.edu.edu/iiif/2/56c1d785-7144-496d-8b07-c6366161fbe6",
+ "poster_offset": null
+ },
+ {
+ "role": "Access",
+ "streaming_url": null,
+ "mime_type": "image/tiff",
+ "rank": -71582788,
+ "id": "59facd76-ac09-4eba-a558-0580ed1500f5",
+ "label": "P0413_B84_F04_009_06_06.tif",
+ "representative_image_url": "https://assets.test.library.northwestern.edu.edu/iiif/2/59facd76-ac09-4eba-a558-0580ed1500f5",
+ "poster_offset": null
+ }
+ ],
+ "status": "Not Started",
+ "folder_numbers": [],
+ "box_name": [],
+ "catalog_key": [],
+ "title": "Vernon McKay",
+ "legacy_identifier": [],
+ "provenance": [],
+ "api_link": "[PLACEHOLDER]/ee592440-4401-445b-8b8d-2991b2817e57",
+ "ark": "ark:/81985/n2pv6dq8q",
+ "alternate_title": [],
+ "related_material": [],
+ "folder_names": [],
+ "abstract": [],
+ "representative_file_set": {
+ "fileSetId": "c6efe600-bc46-4b79-ab07-2a54014adc89",
+ "url": "https://assets.test.library.northwestern.edu.edu/iiif/2/c6efe600-bc46-4b79-ab07-2a54014adc89"
+ },
+ "api_model": "Work",
+ "physical_description_material": [],
+ "series": [],
+ "rights_holder": [],
+ "scope_and_contents": [],
+ "table_of_contents": [],
+ "preservation_level": "Level 1"
+ }
+ },
+ {
+ "_index": "dc-v2-work-1658438320350940",
+ "_type": "_doc",
+ "_id": "ae1f46c8-466c-49d8-8cf9-af586969c4ce",
+ "_score": 1.0,
+ "_source": {
+ "keywords": [],
+ "caption": [],
+ "source": [],
+ "terms_of_use": null,
+ "library_unit": "",
+ "indexed_at": "2022-07-28T15:45:31.613518",
+ "rights_statement": null,
+ "id": "ae1f46c8-466c-49d8-8cf9-af586969c4ce",
+ "create_date": "2022-06-27T21:14:38.058837Z",
+ "identifier": [],
+ "box_number": [],
+ "thumbnail": "https://assets.test.library.northwestern.edu.edu/iiif/2/815972ba-ad41-4275-9897-77563412e82e/full/!300,300/0/default.jpg",
+ "visibility": "Private",
+ "iiif_manifest": "https://assets.test.library.northwestern.edu.edu/public/ae/1f/46/c8/-4/66/c-/49/d8/-8/cf/9-/af/58/69/69/c4/ce-manifest.json",
+ "work_type": "Image",
+ "collection": {},
+ "published": false,
+ "modified_date": "2022-06-27T21:14:38.211263Z",
+ "accession_number": "6-27_test_work_920",
+ "license": null,
+ "physical_description_size": [],
+ "publisher": [],
+ "file_sets": [
+ {
+ "role": "Access",
+ "streaming_url": null,
+ "mime_type": "image/tiff",
+ "rank": 0,
+ "id": "815972ba-ad41-4275-9897-77563412e82e",
+ "label": "label",
+ "representative_image_url": "https://assets.test.library.northwestern.edu.edu/iiif/2/815972ba-ad41-4275-9897-77563412e82e",
+ "poster_offset": null
+ }
+ ],
+ "status": "",
+ "folder_numbers": [],
+ "box_name": [],
+ "catalog_key": [],
+ "title": null,
+ "legacy_identifier": [],
+ "provenance": [],
+ "api_link": "[PLACEHOLDER]/ae1f46c8-466c-49d8-8cf9-af586969c4ce",
+ "ark": "ark:/99999/fk49k5vr1p",
+ "alternate_title": [],
+ "related_material": [],
+ "folder_names": [],
+ "abstract": [],
+ "representative_file_set": {
+ "fileSetId": "815972ba-ad41-4275-9897-77563412e82e",
+ "url": "https://assets.test.library.northwestern.edu.edu/iiif/2/815972ba-ad41-4275-9897-77563412e82e"
+ },
+ "api_model": "Work",
+ "physical_description_material": [],
+ "series": [],
+ "rights_holder": [],
+ "scope_and_contents": [],
+ "table_of_contents": [],
+ "preservation_level": ""
+ }
+ },
+ {
+ "_index": "dc-v2-work-1658438320350940",
+ "_type": "_doc",
+ "_id": "d5c73843-550d-47aa-8abb-cd8013ed32af",
+ "_score": 1.0,
+ "_source": {
+ "keywords": [],
+ "caption": [],
+ "source": [],
+ "terms_of_use": null,
+ "library_unit": "",
+ "indexed_at": "2022-07-28T15:45:31.694440",
+ "rights_statement": null,
+ "id": "d5c73843-550d-47aa-8abb-cd8013ed32af",
+ "create_date": "2022-06-27T21:13:53.700541Z",
+ "identifier": [],
+ "box_number": [],
+ "thumbnail": "https://assets.test.library.northwestern.edu.edu/iiif/2/01c3b28f-df15-4055-a947-b0f192e94d8e/full/!300,300/0/default.jpg",
+ "visibility": "Private",
+ "iiif_manifest": "https://assets.test.library.northwestern.edu.edu/public/d5/c7/38/43/-5/50/d-/47/aa/-8/ab/b-/cd/80/13/ed/32/af-manifest.json",
+ "work_type": "Image",
+ "collection": {},
+ "published": false,
+ "modified_date": "2022-06-27T21:13:53.861314Z",
+ "accession_number": "6-27_test_work_535",
+ "license": null,
+ "physical_description_size": [],
+ "publisher": [],
+ "file_sets": [
+ {
+ "role": "Preservation",
+ "streaming_url": null,
+ "mime_type": "image/tiff",
+ "rank": 0,
+ "id": "8de19e63-a166-40cf-9196-dc605191d7dd",
+ "label": "label",
+ "representative_image_url": null,
+ "poster_offset": null
+ },
+ {
+ "role": "Access",
+ "streaming_url": null,
+ "mime_type": "image/tiff",
+ "rank": 0,
+ "id": "01c3b28f-df15-4055-a947-b0f192e94d8e",
+ "label": "label",
+ "representative_image_url": "https://assets.test.library.northwestern.edu.edu/iiif/2/01c3b28f-df15-4055-a947-b0f192e94d8e",
+ "poster_offset": null
+ }
+ ],
+ "status": "",
+ "folder_numbers": [],
+ "box_name": [],
+ "catalog_key": [],
+ "title": null,
+ "legacy_identifier": [],
+ "provenance": [],
+ "api_link": "[PLACEHOLDER]/d5c73843-550d-47aa-8abb-cd8013ed32af",
+ "ark": "ark:/99999/fk4892qp5c",
+ "alternate_title": [],
+ "related_material": [],
+ "folder_names": [],
+ "abstract": [],
+ "representative_file_set": {
+ "fileSetId": "01c3b28f-df15-4055-a947-b0f192e94d8e",
+ "url": "https://assets.test.library.northwestern.edu.edu/iiif/2/01c3b28f-df15-4055-a947-b0f192e94d8e"
+ },
+ "api_model": "Work",
+ "physical_description_material": [],
+ "series": [],
+ "rights_holder": [],
+ "scope_and_contents": [],
+ "table_of_contents": [],
+ "preservation_level": ""
+ }
+ },
+ {
+ "_index": "dc-v2-work-1658438320350940",
+ "_type": "_doc",
+ "_id": "ed9c7967-62ab-416c-a3af-492ce865549f",
+ "_score": 1.0,
+ "_source": {
+ "keywords": [],
+ "caption": [],
+ "source": [],
+ "terms_of_use": null,
+ "library_unit": "",
+ "indexed_at": "2022-07-28T15:45:31.706916",
+ "rights_statement": null,
+ "id": "ed9c7967-62ab-416c-a3af-492ce865549f",
+ "create_date": "2022-06-27T21:15:38.960884Z",
+ "identifier": [],
+ "box_number": [],
+ "thumbnail": "https://assets.test.library.northwestern.edu.edu/iiif/2/e17dd686-0749-4466-8983-27b5b62ff27b/full/!300,300/0/default.jpg",
+ "visibility": "Private",
+ "iiif_manifest": "https://assets.test.library.northwestern.edu.edu/public/ed/9c/79/67/-6/2a/b-/41/6c/-a/3a/f-/49/2c/e8/65/54/9f-manifest.json",
+ "work_type": "Image",
+ "collection": {},
+ "published": false,
+ "modified_date": "2022-06-27T21:15:39.123581Z",
+ "accession_number": "6-27_test_work_827",
+ "license": null,
+ "physical_description_size": [],
+ "publisher": [],
+ "file_sets": [
+ {
+ "role": "Access",
+ "streaming_url": null,
+ "mime_type": "image/tiff",
+ "rank": 0,
+ "id": "e17dd686-0749-4466-8983-27b5b62ff27b",
+ "label": "label",
+ "representative_image_url": "https://assets.test.library.northwestern.edu.edu/iiif/2/e17dd686-0749-4466-8983-27b5b62ff27b",
+ "poster_offset": null
+ },
+ {
+ "role": "Preservation",
+ "streaming_url": null,
+ "mime_type": "image/tiff",
+ "rank": 0,
+ "id": "0a5177bb-e75b-4492-b2af-342fd5022774",
+ "label": "label",
+ "representative_image_url": null,
+ "poster_offset": null
+ }
+ ],
+ "status": "",
+ "folder_numbers": [],
+ "box_name": [],
+ "catalog_key": [],
+ "title": null,
+ "legacy_identifier": [],
+ "provenance": [],
+ "api_link": "[PLACEHOLDER]/ed9c7967-62ab-416c-a3af-492ce865549f",
+ "ark": "ark:/99999/fk4st93v3f",
+ "alternate_title": [],
+ "related_material": [],
+ "folder_names": [],
+ "abstract": [],
+ "representative_file_set": {
+ "fileSetId": "e17dd686-0749-4466-8983-27b5b62ff27b",
+ "url": "https://assets.test.library.northwestern.edu.edu/iiif/2/e17dd686-0749-4466-8983-27b5b62ff27b"
+ },
+ "api_model": "Work",
+ "physical_description_material": [],
+ "series": [],
+ "rights_holder": [],
+ "scope_and_contents": [],
+ "table_of_contents": [],
+ "preservation_level": ""
+ }
+ },
+ {
+ "_index": "dc-v2-work-1658438320350940",
+ "_type": "_doc",
+ "_id": "8d710f86-ec54-43cf-9ec4-eb71b1c90c5d",
+ "_score": 1.0,
+ "_source": {
+ "keywords": [],
+ "subject": [
+ {
+ "role": "Topical",
+ "id": "http://id.loc.gov/authorities/names/n87130885",
+ "label": "Fariña, Mimi",
+ "label_with_role": "Fariña, Mimi (Topical)"
+ }
+ ],
+ "caption": [],
+ "source": [],
+ "terms_of_use": "The images on this web site are from material in the collections of the Charles Deering McCormick Library of Special Collections of Northwestern University Libraries, and are provided for use by its students, faculty and staff, and by other researchers visiting this site, for research consultation and scholarly purposes only. Further distribution and/or any commercial use of the images from this site is not permitted.",
+ "library_unit": "Charles Deering McCormick Library of Special Collections",
+ "indexed_at": "2022-07-28T15:45:31.784735",
+ "rights_statement": {
+ "id": "http://rightsstatements.org/vocab/InC/1.0/",
+ "label": "In Copyright"
+ },
+ "id": "8d710f86-ec54-43cf-9ec4-eb71b1c90c5d",
+ "create_date": "2021-03-16T05:58:30.479386Z",
+ "identifier": ["MS 63"],
+ "box_number": ["3"],
+ "thumbnail": "https://assets.test.library.northwestern.edu.edu/iiif/2/ac987e48-b6a5-4d34-b5e0-1d2006996a44/full/!300,300/0/default.jpg",
+ "visibility": "Public",
+ "iiif_manifest": "https://assets.test.library.northwestern.edu.edu/public/8d/71/0f/86/-e/c5/4-/43/cf/-9/ec/4-/eb/71/b1/c9/0c/5d-manifest.json",
+ "work_type": "Image",
+ "collection": {
+ "id": "18ec4c6b-192a-4ab8-9903-ea0f393c35f7",
+ "title": "Berkeley Folk Music Festival"
+ },
+ "published": true,
+ "modified_date": "2022-05-02T21:10:34.982567Z",
+ "accession_number": "BFMF_B03_F19_005_001n",
+ "license": null,
+ "physical_description_size": [],
+ "publisher": [],
+ "file_sets": [
+ {
+ "role": "Preservation",
+ "streaming_url": null,
+ "mime_type": "image/tiff",
+ "rank": 0,
+ "id": "9a1cd92a-fafc-4081-8213-cf6a8783a864",
+ "label": "Mimi Farina. Digital image scanned from black and white negative.",
+ "representative_image_url": null,
+ "poster_offset": null
+ },
+ {
+ "role": "Access",
+ "streaming_url": null,
+ "mime_type": "image/tiff",
+ "rank": 0,
+ "id": "ac987e48-b6a5-4d34-b5e0-1d2006996a44",
+ "label": "BFMF_B03_F19_005_001n_am.tif",
+ "representative_image_url": "https://assets.test.library.northwestern.edu.edu/iiif/2/ac987e48-b6a5-4d34-b5e0-1d2006996a44",
+ "poster_offset": null
+ }
+ ],
+ "status": "Done",
+ "folder_numbers": ["19"],
+ "box_name": [],
+ "catalog_key": [],
+ "title": "Mimi Farina",
+ "legacy_identifier": [],
+ "provenance": [],
+ "genre": [
+ {
+ "id": "http://vocab.getty.edu/aat/300128343",
+ "label": "black-and-white negatives"
+ }
+ ],
+ "api_link": "[PLACEHOLDER]/8d710f86-ec54-43cf-9ec4-eb71b1c90c5d",
+ "ark": "ark:/81985/n2h41k11r",
+ "alternate_title": [],
+ "related_material": [],
+ "folder_names": ["Farina, Mimi"],
+ "abstract": [],
+ "representative_file_set": {
+ "fileSetId": "ac987e48-b6a5-4d34-b5e0-1d2006996a44",
+ "url": "https://assets.test.library.northwestern.edu.edu/iiif/2/ac987e48-b6a5-4d34-b5e0-1d2006996a44"
+ },
+ "api_model": "Work",
+ "physical_description_material": [],
+ "series": [
+ "Berkeley Folk Music Festival Archive -- 1. Artists' Photo Archive"
+ ],
+ "rights_holder": [],
+ "scope_and_contents": [],
+ "table_of_contents": [],
+ "preservation_level": "Level 1"
+ }
+ }
+ ]
+ }
+}
diff --git a/test/fixtures/mocks/shared-link-1234.json b/test/fixtures/mocks/shared-link-1234.json
new file mode 100644
index 00000000..4af005a3
--- /dev/null
+++ b/test/fixtures/mocks/shared-link-1234.json
@@ -0,0 +1,13 @@
+{
+ "_index": "dev-shared_links",
+ "_type": "_doc",
+ "_id": "1234",
+ "_version": 1,
+ "found": true,
+ "_source": {
+ "target_index": "meadow",
+ "target_id": "1234",
+ "shared_link_id": "b47a0a1c-ca52-424f-877f-a2ab9f1c0735",
+ "expires": "2028-10-26T16:47:06Z"
+ }
+}
diff --git a/test/fixtures/mocks/similar.json b/test/fixtures/mocks/similar.json
new file mode 100644
index 00000000..da89cfa6
--- /dev/null
+++ b/test/fixtures/mocks/similar.json
@@ -0,0 +1,379 @@
+{
+ "took": 2,
+ "timed_out": false,
+ "_shards": {
+ "total": 1,
+ "successful": 1,
+ "skipped": 0,
+ "failed": 0
+ },
+ "hits": {
+ "total": {
+ "value": 9,
+ "relation": "eq"
+ },
+ "max_score": 0.52916515,
+ "hits": [
+ {
+ "_index": "bmq-dev-dc-v2-work-1665757331985",
+ "_type": "_doc",
+ "_id": "59c40013-4a18-4bdb-b910-af30dc57bd3e",
+ "_score": 0.52916515,
+ "_source": {
+ "accession_number": "6wYHF8CUMS",
+ "thumbnail": "https://dcapi.rdc-staging.library.northwestern.edu/works/59c40013-4a18-4bdb-b910-af30dc57bd3e/thumbnail",
+ "indexed_at": "2022-10-14T16:35:16.201826",
+ "iiif_manifest": "https://bmq-dev-pyramids.s3.amazonaws.com/public/59/c4/00/13/-4/a1/8-/4b/db/-b/91/0-/af/30/dc/57/bd/3e-manifest.json",
+ "folder_names": [],
+ "modified_date": "2022-10-14T16:35:15.877751Z",
+ "table_of_contents": [],
+ "source": [],
+ "provenance": [],
+ "batch_ids": [
+ "4426840e-11c9-4a95-b3ba-8d37ceaf4982",
+ "d31ec9b1-7110-4828-96c0-f6f4a4247dd1"
+ ],
+ "publisher": [],
+ "date_created": [],
+ "csv_metadata_update_jobs": [],
+ "keywords": [],
+ "box_name": [],
+ "id": "59c40013-4a18-4bdb-b910-af30dc57bd3e",
+ "caption": [],
+ "box_number": [],
+ "create_date": "2022-10-14T14:29:10.804337Z",
+ "terms_of_use": null,
+ "style_period": [],
+ "technique": [],
+ "api_model": "Work",
+ "genre": [],
+ "folder_numbers": [],
+ "preservation_level": null,
+ "creator": [],
+ "rights_holder": [],
+ "visibility": "Public",
+ "api_link": "https://dcapi.rdc-staging.library.northwestern.edu/works/59c40013-4a18-4bdb-b910-af30dc57bd3e",
+ "representative_file_set": {
+ "id": null,
+ "url": null
+ },
+ "abstract": [],
+ "subject": [],
+ "physical_description_material": [],
+ "published": true,
+ "alternate_title": [],
+ "collection": {},
+ "physical_description_size": [],
+ "notes": [],
+ "legacy_identifier": [],
+ "description": [
+ "This funky description contains the word funky twice in it!"
+ ],
+ "rights_statement": {},
+ "title": "Example work one",
+ "identifier": [],
+ "file_sets": [],
+ "ark": "ark:/99999/fk474661182",
+ "related_material": [],
+ "library_unit": null,
+ "work_type": "Image",
+ "contributor": [],
+ "license": null,
+ "series": [],
+ "catalog_key": [],
+ "status": null,
+ "scope_and_contents": [],
+ "related_url": []
+ }
+ },
+ {
+ "_index": "bmq-dev-dc-v2-work-1665757331985",
+ "_type": "_doc",
+ "_id": "6d17e419-f318-433e-9dd4-b9229aa4e860",
+ "_score": 0.52916515,
+ "_source": {
+ "accession_number": "5UcXW7p6Wr",
+ "thumbnail": "https://dcapi.rdc-staging.library.northwestern.edu/works/6d17e419-f318-433e-9dd4-b9229aa4e860/thumbnail",
+ "indexed_at": "2022-10-14T16:35:16.201941",
+ "iiif_manifest": "https://bmq-dev-pyramids.s3.amazonaws.com/public/6d/17/e4/19/-f/31/8-/43/3e/-9/dd/4-/b9/22/9a/a4/e8/60-manifest.json",
+ "folder_names": [],
+ "modified_date": "2022-10-14T16:35:15.877751Z",
+ "table_of_contents": [],
+ "source": [],
+ "provenance": [],
+ "batch_ids": [
+ "4426840e-11c9-4a95-b3ba-8d37ceaf4982",
+ "d31ec9b1-7110-4828-96c0-f6f4a4247dd1"
+ ],
+ "publisher": [],
+ "date_created": [],
+ "csv_metadata_update_jobs": [],
+ "keywords": [],
+ "box_name": [],
+ "id": "6d17e419-f318-433e-9dd4-b9229aa4e860",
+ "caption": [],
+ "box_number": [],
+ "create_date": "2022-10-14T14:36:16.319729Z",
+ "terms_of_use": null,
+ "style_period": [],
+ "technique": [],
+ "api_model": "Work",
+ "genre": [],
+ "folder_numbers": [],
+ "preservation_level": null,
+ "creator": [],
+ "rights_holder": [],
+ "visibility": "Public",
+ "api_link": "https://dcapi.rdc-staging.library.northwestern.edu/works/6d17e419-f318-433e-9dd4-b9229aa4e860",
+ "representative_file_set": {
+ "id": null,
+ "url": null
+ },
+ "abstract": [],
+ "subject": [],
+ "physical_description_material": [],
+ "published": true,
+ "alternate_title": [],
+ "collection": {},
+ "physical_description_size": [],
+ "notes": [],
+ "legacy_identifier": [],
+ "description": [
+ "This funky description contains the word funky twice in it!"
+ ],
+ "rights_statement": {},
+ "title": "Example work ten",
+ "identifier": [],
+ "file_sets": [],
+ "ark": "ark:/99999/fk460296587",
+ "related_material": [],
+ "library_unit": null,
+ "work_type": "Image",
+ "contributor": [],
+ "license": null,
+ "series": [],
+ "catalog_key": [],
+ "status": null,
+ "scope_and_contents": [],
+ "related_url": []
+ }
+ },
+ {
+ "_index": "bmq-dev-dc-v2-work-1665757331985",
+ "_type": "_doc",
+ "_id": "7aefc9f1-e796-4a5c-ab00-29444743fe19",
+ "_score": 0.52916515,
+ "_source": {
+ "accession_number": "S4cfHEOHtu",
+ "thumbnail": "https://dcapi.rdc-staging.library.northwestern.edu/works/7aefc9f1-e796-4a5c-ab00-29444743fe19/thumbnail",
+ "indexed_at": "2022-10-14T16:35:16.202029",
+ "iiif_manifest": "https://bmq-dev-pyramids.s3.amazonaws.com/public/7a/ef/c9/f1/-e/79/6-/4a/5c/-a/b0/0-/29/44/47/43/fe/19-manifest.json",
+ "folder_names": [],
+ "modified_date": "2022-10-14T16:35:15.877751Z",
+ "table_of_contents": [],
+ "source": [],
+ "provenance": [],
+ "batch_ids": [
+ "d31ec9b1-7110-4828-96c0-f6f4a4247dd1",
+ "4426840e-11c9-4a95-b3ba-8d37ceaf4982"
+ ],
+ "publisher": [],
+ "date_created": [],
+ "csv_metadata_update_jobs": [],
+ "keywords": [],
+ "box_name": [],
+ "id": "7aefc9f1-e796-4a5c-ab00-29444743fe19",
+ "caption": [],
+ "box_number": [],
+ "create_date": "2022-10-14T14:29:23.472711Z",
+ "terms_of_use": null,
+ "style_period": [],
+ "technique": [],
+ "api_model": "Work",
+ "genre": [],
+ "folder_numbers": [],
+ "preservation_level": null,
+ "creator": [],
+ "rights_holder": [],
+ "visibility": "Public",
+ "api_link": "https://dcapi.rdc-staging.library.northwestern.edu/works/7aefc9f1-e796-4a5c-ab00-29444743fe19",
+ "representative_file_set": {
+ "id": null,
+ "url": null
+ },
+ "abstract": [],
+ "subject": [],
+ "physical_description_material": [],
+ "published": true,
+ "alternate_title": [],
+ "collection": {},
+ "physical_description_size": [],
+ "notes": [],
+ "legacy_identifier": [],
+ "description": [
+ "This funky description contains the word funky twice in it!"
+ ],
+ "rights_statement": {},
+ "title": "Example work two",
+ "identifier": [],
+ "file_sets": [],
+ "ark": "ark:/99999/fk450285443",
+ "related_material": [],
+ "library_unit": null,
+ "work_type": "Image",
+ "contributor": [],
+ "license": null,
+ "series": [],
+ "catalog_key": [],
+ "status": null,
+ "scope_and_contents": [],
+ "related_url": []
+ }
+ },
+ {
+ "_index": "bmq-dev-dc-v2-work-1665757331985",
+ "_type": "_doc",
+ "_id": "5eede857-5752-48f8-b801-8597068cd6ac",
+ "_score": 0.52916515,
+ "_source": {
+ "accession_number": "2GdGfSapum",
+ "thumbnail": "https://dcapi.rdc-staging.library.northwestern.edu/works/5eede857-5752-48f8-b801-8597068cd6ac/thumbnail",
+ "indexed_at": "2022-10-14T16:35:16.202130",
+ "iiif_manifest": "https://bmq-dev-pyramids.s3.amazonaws.com/public/5e/ed/e8/57/-5/75/2-/48/f8/-b/80/1-/85/97/06/8c/d6/ac-manifest.json",
+ "folder_names": [],
+ "modified_date": "2022-10-14T16:35:15.877751Z",
+ "table_of_contents": [],
+ "source": [],
+ "provenance": [],
+ "batch_ids": [
+ "d31ec9b1-7110-4828-96c0-f6f4a4247dd1",
+ "4426840e-11c9-4a95-b3ba-8d37ceaf4982"
+ ],
+ "publisher": [],
+ "date_created": [],
+ "csv_metadata_update_jobs": [],
+ "keywords": [],
+ "box_name": [],
+ "id": "5eede857-5752-48f8-b801-8597068cd6ac",
+ "caption": [],
+ "box_number": [],
+ "create_date": "2022-10-14T14:29:37.259623Z",
+ "terms_of_use": null,
+ "style_period": [],
+ "technique": [],
+ "api_model": "Work",
+ "genre": [],
+ "folder_numbers": [],
+ "preservation_level": null,
+ "creator": [],
+ "rights_holder": [],
+ "visibility": "Public",
+ "api_link": "https://dcapi.rdc-staging.library.northwestern.edu/works/5eede857-5752-48f8-b801-8597068cd6ac",
+ "representative_file_set": {
+ "id": null,
+ "url": null
+ },
+ "abstract": [],
+ "subject": [],
+ "physical_description_material": [],
+ "published": true,
+ "alternate_title": [],
+ "collection": {},
+ "physical_description_size": [],
+ "notes": [],
+ "legacy_identifier": [],
+ "description": [
+ "This funky description contains the word funky twice in it!"
+ ],
+ "rights_statement": {},
+ "title": "Example work three",
+ "identifier": [],
+ "file_sets": [],
+ "ark": "ark:/99999/fk436474897",
+ "related_material": [],
+ "library_unit": null,
+ "work_type": "Image",
+ "contributor": [],
+ "license": null,
+ "series": [],
+ "catalog_key": [],
+ "status": null,
+ "scope_and_contents": [],
+ "related_url": []
+ }
+ },
+ {
+ "_index": "bmq-dev-dc-v2-work-1665757331985",
+ "_type": "_doc",
+ "_id": "4054f1f0-7e29-4cc8-9884-ae6a141f45d9",
+ "_score": 0.52916515,
+ "_source": {
+ "accession_number": "OVBr2gIugT",
+ "thumbnail": "https://dcapi.rdc-staging.library.northwestern.edu/works/4054f1f0-7e29-4cc8-9884-ae6a141f45d9/thumbnail",
+ "indexed_at": "2022-10-14T16:35:16.202201",
+ "iiif_manifest": "https://bmq-dev-pyramids.s3.amazonaws.com/public/40/54/f1/f0/-7/e2/9-/4c/c8/-9/88/4-/ae/6a/14/1f/45/d9-manifest.json",
+ "folder_names": [],
+ "modified_date": "2022-10-14T16:35:15.877751Z",
+ "table_of_contents": [],
+ "source": [],
+ "provenance": [],
+ "batch_ids": [
+ "d31ec9b1-7110-4828-96c0-f6f4a4247dd1",
+ "4426840e-11c9-4a95-b3ba-8d37ceaf4982"
+ ],
+ "publisher": [],
+ "date_created": [],
+ "csv_metadata_update_jobs": [],
+ "keywords": [],
+ "box_name": [],
+ "id": "4054f1f0-7e29-4cc8-9884-ae6a141f45d9",
+ "caption": [],
+ "box_number": [],
+ "create_date": "2022-10-14T14:29:52.416654Z",
+ "terms_of_use": null,
+ "style_period": [],
+ "technique": [],
+ "api_model": "Work",
+ "genre": [],
+ "folder_numbers": [],
+ "preservation_level": null,
+ "creator": [],
+ "rights_holder": [],
+ "visibility": "Public",
+ "api_link": "https://dcapi.rdc-staging.library.northwestern.edu/works/4054f1f0-7e29-4cc8-9884-ae6a141f45d9",
+ "representative_file_set": {
+ "id": null,
+ "url": null
+ },
+ "abstract": [],
+ "subject": [],
+ "physical_description_material": [],
+ "published": true,
+ "alternate_title": [],
+ "collection": {},
+ "physical_description_size": [],
+ "notes": [],
+ "legacy_identifier": [],
+ "description": [
+ "This funky description contains the word funky twice in it!"
+ ],
+ "rights_statement": {},
+ "title": "Example work four",
+ "identifier": [],
+ "file_sets": [],
+ "ark": "ark:/99999/fk463672939",
+ "related_material": [],
+ "library_unit": null,
+ "work_type": "Image",
+ "contributor": [],
+ "license": null,
+ "series": [],
+ "catalog_key": [],
+ "status": null,
+ "scope_and_contents": [],
+ "related_url": []
+ }
+ }
+ ]
+ }
+}
diff --git a/test/fixtures/mocks/thumbnail_full.jpg b/test/fixtures/mocks/thumbnail_full.jpg
new file mode 100644
index 00000000..44b71bdb
Binary files /dev/null and b/test/fixtures/mocks/thumbnail_full.jpg differ
diff --git a/test/fixtures/mocks/thumbnail_square.jpg b/test/fixtures/mocks/thumbnail_square.jpg
new file mode 100644
index 00000000..6150316c
Binary files /dev/null and b/test/fixtures/mocks/thumbnail_square.jpg differ
diff --git a/test/fixtures/mocks/unpublished-work-1234.json b/test/fixtures/mocks/unpublished-work-1234.json
new file mode 100644
index 00000000..6dd41a07
--- /dev/null
+++ b/test/fixtures/mocks/unpublished-work-1234.json
@@ -0,0 +1,13 @@
+{
+ "_index": "dev-dc-v2-work",
+ "_type": "_doc",
+ "_id": "1234",
+ "_version": 1,
+ "found": true,
+ "_source": {
+ "id": "1234",
+ "api_model": "Work",
+ "published": false,
+ "visibility": "Public"
+ }
+}
diff --git a/test/fixtures/mocks/work-1234-no-thumbnail.json b/test/fixtures/mocks/work-1234-no-thumbnail.json
new file mode 100644
index 00000000..f2ea0b6d
--- /dev/null
+++ b/test/fixtures/mocks/work-1234-no-thumbnail.json
@@ -0,0 +1,13 @@
+{
+ "_index": "dev-dc-v2-work",
+ "_type": "_doc",
+ "_id": "1234",
+ "_version": 1,
+ "found": true,
+ "_source": {
+ "id": "1234",
+ "api_model": "Work",
+ "published": true,
+ "visibility": "Public"
+ }
+}
diff --git a/test/fixtures/mocks/work-1234.json b/test/fixtures/mocks/work-1234.json
new file mode 100644
index 00000000..30ce940e
--- /dev/null
+++ b/test/fixtures/mocks/work-1234.json
@@ -0,0 +1,378 @@
+{
+ "_index": "dev-dc-v2-work",
+ "_type": "_doc",
+ "_id": "1234",
+ "_version": 1,
+ "_seq_no": 719,
+ "_primary_term": 1,
+ "found": true,
+ "_source": {
+ "provenance": [
+ "Artist; sold to Mr. Blank in 1955; sold to Lancelot in 2017; gifted to Northwestern University in 2019"
+ ],
+ "contributor": [
+ {
+ "facet": "http://id.loc.gov/authorities/names/n91114928|ctg|Metallica (Musical group) (Cartographer)",
+ "id": "http://id.loc.gov/authorities/names/n91114928",
+ "label": "Metallica (Musical group)",
+ "label_with_role": "Metallica (Musical group) (Cartographer)",
+ "role": "Cartographer",
+ "variants": []
+ },
+ {
+ "facet": "http://id.worldcat.org/fast/1204616|abr|South Africa (Abridger)",
+ "id": "http://id.worldcat.org/fast/1204616",
+ "label": "South Africa",
+ "label_with_role": "South Africa (Abridger)",
+ "role": "Abridger",
+ "variants": []
+ },
+ {
+ "facet": "http://id.worldcat.org/fast/1150166|app|Thistles (Applicant)",
+ "id": "http://id.worldcat.org/fast/1150166",
+ "label": "Thistles",
+ "label_with_role": "Thistles (Applicant)",
+ "role": "Applicant",
+ "variants": []
+ }
+ ],
+ "batch_ids": [
+ "a846a5f2-da57-49e6-a138-f5462d113a55",
+ "97aac3e3-389a-47ac-a7b3-5dd6ffffd558",
+ "e2529123-6a8c-4f6d-89d5-0257a1b947d4",
+ "b3d3462d-c03e-4cae-9219-4e38335a25fc",
+ "1591cc1e-009d-4b39-97a2-7d8743fb957b",
+ "80a15dc2-92d5-48a4-9aa4-73ecdcb1d130"
+ ],
+ "publisher": ["Northwestern University Press"],
+ "subject": [
+ {
+ "facet": "http://id.worldcat.org/fast/1902713|TOPICAL|Cats on postage stamps (Topical)",
+ "id": "http://id.worldcat.org/fast/1902713",
+ "label": "Cats on postage stamps",
+ "label_with_role": "Cats on postage stamps (Topical)",
+ "role": "Topical",
+ "variants": []
+ },
+ {
+ "facet": "info:nul/6cba23b5-a91a-4c13-8398-54967b329d48|TOPICAL|Test Record Canary (Topical)",
+ "id": "info:nul/6cba23b5-a91a-4c13-8398-54967b329d48",
+ "label": "Test Record Canary",
+ "label_with_role": "Test Record Canary (Topical)",
+ "role": "Topical",
+ "variants": []
+ },
+ {
+ "facet": "http://vocab.getty.edu/tgn/2000971|GEOGRAPHICAL|Leelanau (Geographical)",
+ "id": "http://vocab.getty.edu/tgn/2000971",
+ "label": "Leelanau",
+ "label_with_role": "Leelanau (Geographical)",
+ "role": "Geographical",
+ "variants": []
+ },
+ {
+ "facet": "http://id.worldcat.org/fast/1204587|GEOGRAPHICAL|Michigan--Ann Arbor (Geographical)",
+ "id": "http://id.worldcat.org/fast/1204587",
+ "label": "Michigan--Ann Arbor",
+ "label_with_role": "Michigan--Ann Arbor (Geographical)",
+ "role": "Geographical",
+ "variants": []
+ }
+ ],
+ "scope_and_contents": ["I promise there is scope and content"],
+ "notes": [
+ {
+ "note": "Here are some notes",
+ "type": "General Note"
+ },
+ {
+ "note": "Awards type",
+ "type": "Awards"
+ },
+ {
+ "note": "Biographical note",
+ "type": "Biographical/Historical Note"
+ },
+ {
+ "note": "creation production credits",
+ "type": "Creation/Production Credits"
+ },
+ {
+ "note": "Language note",
+ "type": "Language Note"
+ },
+ {
+ "note": "Local Note",
+ "type": "Local Note"
+ },
+ {
+ "note": "Performers",
+ "type": "Performers"
+ },
+ {
+ "note": "Statement of Responsibility",
+ "type": "Statement of Responsibility"
+ },
+ {
+ "note": "Venue/event date",
+ "type": "Venue/Event Date"
+ },
+ {
+ "note": "massive add to all pages/check",
+ "type": "General Note"
+ }
+ ],
+ "related_material": ["See Also: related material"],
+ "accession_number": "Canary_002",
+ "modified_date": "2022-10-13T20:56:31.249155Z",
+ "folder_names": ["Blue folder"],
+ "series": ["Canaries and How to Care for Them"],
+ "cultural_context": ["Test Context"],
+ "language": [
+ {
+ "facet": "http://id.loc.gov/vocabulary/languages/crh||Crimean Tatar",
+ "id": "http://id.loc.gov/vocabulary/languages/crh",
+ "label": "Crimean Tatar",
+ "variants": []
+ }
+ ],
+ "location": [
+ {
+ "facet": "https://sws.geonames.org/4999069/||Leland Township",
+ "id": "https://sws.geonames.org/4999069/",
+ "label": "Leland Township",
+ "variants": []
+ }
+ ],
+ "create_date": "2022-03-02T20:38:29.813494Z",
+ "thumbnail": "https://index.test.library.northwestern.edu/iiif/2/mbk-dev/5678/square/!300,300/0/default.jpg",
+ "id": "1234",
+ "collection": {
+ "id": "7c50096c-89eb-43e8-b357-5836a788ddeb",
+ "title": "TEST Canary Records",
+ "description": "This is the description of the collection"
+ },
+ "abstract": [],
+ "creator": [
+ {
+ "facet": "http://id.loc.gov/authorities/names/no2011059409||Dessa (Vocalist)",
+ "id": "http://id.loc.gov/authorities/names/no2011059409",
+ "label": "Dessa (Vocalist)",
+ "variants": [
+ "Dessa, 1981-",
+ "Wander, Dessa, 1981-",
+ "Dessa Darling",
+ "Wander, Margret"
+ ]
+ },
+ {
+ "facet": "http://id.worldcat.org/fast/1152763||Tornadoes",
+ "id": "http://id.worldcat.org/fast/1152763",
+ "label": "Tornadoes",
+ "variants": []
+ },
+ {
+ "facet": "http://vocab.getty.edu/aat/300443944||photo editors",
+ "id": "http://vocab.getty.edu/aat/300443944",
+ "label": "photo editors",
+ "variants": []
+ },
+ {
+ "facet": "http://id.worldcat.org/fast/1717972||Schober, Franz von, 1796-1882",
+ "id": "http://id.worldcat.org/fast/1717972",
+ "label": "Schober, Franz von, 1796-1882",
+ "variants": []
+ }
+ ],
+ "rights_holder": ["Artist"],
+ "box_number": ["88"],
+ "physical_description_size": ["16 x 24 inches"],
+ "description": [
+ "This is a private record for RepoDev testing on production"
+ ],
+ "keywords": ["leaves"],
+ "indexed_at": "2022-10-14T14:19:42.844994",
+ "folder_numbers": ["88"],
+ "genre": [
+ {
+ "facet": "http://id.worldcat.org/fast/1919896||Biographies",
+ "id": "http://id.worldcat.org/fast/1919896",
+ "label": "Biographies",
+ "variants": []
+ },
+ {
+ "facet": "http://id.worldcat.org/fast/1019337||Mice",
+ "id": "http://id.worldcat.org/fast/1019337",
+ "label": "Mice",
+ "variants": []
+ }
+ ],
+ "date_created": ["August 1906 to December 1910", "1958"],
+ "title": "Canary Record TEST 1",
+ "physical_description_material": ["Acrylic paint on cement block"],
+ "csv_metadata_update_jobs": [
+ "5753101a-42fa-4838-9b71-f1594a5b1d5f",
+ "6b46db60-6f6a-45e8-8b8d-ab0029a1e8fe",
+ "38988b3e-5778-41da-85a5-e16d13cb098a",
+ "21838181-8d12-4015-8b98-0874061adb98"
+ ],
+ "ark": "ark:/99999/fk47h32p0m",
+ "caption": ["Beebo"],
+ "status": "Done",
+ "style_period": [
+ {
+ "facet": "http://vocab.getty.edu/aat/300018478||Qing (dynastic styles and periods)",
+ "id": "http://vocab.getty.edu/aat/300018478",
+ "label": "Qing (dynastic styles and periods)",
+ "variants": []
+ }
+ ],
+ "api_model": "Work",
+ "catalog_key": ["MS-1984-1982-1989"],
+ "rights_statement": {
+ "id": "http://rightsstatements.org/vocab/InC-EDU/1.0/",
+ "label": "In Copyright - Educational Use Permitted"
+ },
+ "file_sets": [
+ {
+ "duration": null,
+ "height": 3024,
+ "id": "076dcbd8-8c57-40e8-bdf7-dc9153c87a36",
+ "label": "Access File - Tiff",
+ "mime_type": "image/tiff",
+ "original_filename": "Squirrel.tif",
+ "poster_offset": null,
+ "rank": 0,
+ "representative_image_url": "https://iiif.stack.rdc-staging.library.northwestern.edu/iiif/2/076dcbd8-8c57-40e8-bdf7-dc9153c87a36",
+ "role": "Access",
+ "streaming_url": null,
+ "webvtt": null,
+ "width": 4032
+ },
+ {
+ "duration": null,
+ "height": 3024,
+ "id": "d51cc0b6-562a-4a8f-8443-5e20221c308b",
+ "label": "Access File - Tiff",
+ "mime_type": "image/tiff",
+ "original_filename": "PXL_20211203_142315620.tif",
+ "poster_offset": null,
+ "rank": 1073741824,
+ "representative_image_url": "https://iiif.stack.rdc-staging.library.northwestern.edu/iiif/2/d51cc0b6-562a-4a8f-8443-5e20221c308b",
+ "role": "Supplemental",
+ "streaming_url": null,
+ "webvtt": null,
+ "width": 4032
+ },
+ {
+ "duration": null,
+ "height": 4032,
+ "id": "5a4ffcfb-e231-4a59-9e4d-92d1814604fb",
+ "label": "Preservation File - Tiff",
+ "mime_type": "image/tiff",
+ "original_filename": "distillery.tif",
+ "poster_offset": null,
+ "rank": 1073741824,
+ "representative_image_url": null,
+ "role": "Preservation",
+ "streaming_url": null,
+ "webvtt": null,
+ "width": 3024
+ },
+ {
+ "duration": null,
+ "height": null,
+ "id": "09617d98-9c67-414e-a0f7-4e69ca99546b",
+ "label": "Auxiliary File - PNG",
+ "mime_type": "image/jpeg",
+ "original_filename": "CoopersHawk.png",
+ "poster_offset": null,
+ "rank": 0,
+ "representative_image_url": "https://iiif.stack.rdc-staging.library.northwestern.edu/iiif/2/09617d98-9c67-414e-a0f7-4e69ca99546b",
+ "role": "Auxiliary",
+ "streaming_url": null,
+ "webvtt": null,
+ "width": null
+ },
+ {
+ "duration": null,
+ "height": null,
+ "id": "51862c1c-c024-45dc-ab26-694bd8ebc16c",
+ "label": "Access File - Jpeg",
+ "mime_type": "image/jpeg",
+ "original_filename": "Cassettetape.jpg",
+ "poster_offset": null,
+ "rank": 1610612736,
+ "representative_image_url": "https://iiif.stack.rdc-staging.library.northwestern.edu/iiif/2/51862c1c-c024-45dc-ab26-694bd8ebc16c",
+ "role": "Access",
+ "streaming_url": null,
+ "webvtt": null,
+ "width": null
+ },
+ {
+ "duration": null,
+ "height": null,
+ "id": "a10c1829-265c-44cf-996a-f8c59b16ba97",
+ "label": "Preservation File - Jpeg",
+ "mime_type": "image/jpeg",
+ "original_filename": "Cassettetape.jpg",
+ "poster_offset": null,
+ "rank": 0,
+ "representative_image_url": null,
+ "role": "Preservation",
+ "streaming_url": null,
+ "webvtt": null,
+ "width": null
+ }
+ ],
+ "library_unit": "Charles Deering McCormick Library of Special Collections",
+ "technique": [
+ {
+ "facet": "http://vocab.getty.edu/aat/300053228||drypoint (printing process)",
+ "id": "http://vocab.getty.edu/aat/300053228",
+ "label": "drypoint (printing process)",
+ "variants": []
+ }
+ ],
+ "table_of_contents": ["1. cats; 2. dogs"],
+ "representative_file_set": {
+ "fileSetId": "5678",
+ "url": "https://index.test.library.northwestern.edu/iiif/2/mbk-dev/5678"
+ },
+ "related_url": [
+ {
+ "label": "Finding Aid",
+ "url": "https://findingaids.library.northwestern.edu/"
+ },
+ {
+ "label": "Research Guide",
+ "url": "https://www.wbez.org/"
+ },
+ {
+ "label": "Related Information",
+ "url": "https://www.nationalgeographic.com/animals/mammals/facts/squirrels"
+ },
+ {
+ "label": "Hathi Trust Digital Library",
+ "url": "https://www.hathitrust.org/"
+ }
+ ],
+ "terms_of_use": "Terms ",
+ "visibility": "Public",
+ "license": {
+ "id": "http://www.europeana.eu/portal/rights/rr-r.html",
+ "label": "All rights reserved",
+ "scheme": "license"
+ },
+ "api_link": "https://dcapi.rdc-staging.library.northwestern.edu/api/v2/works/1234",
+ "alternate_title": ["This is an alternative title"],
+ "preservation_level": "Level 1",
+ "published": true,
+ "source": ["Mars"],
+ "iiif_manifest": "https://iiif.stack.rdc-staging.library.northwestern.edu/public/15/6a/8f/8e/-5/49/b-/49/82/-8/6c/c-/37/5b/f0/41/04/ff-manifest.json",
+ "legacy_identifier": ["555"],
+ "work_type": "Image",
+ "identifier": ["555"],
+ "box_name": ["The name of a box"]
+ }
+}
diff --git a/test/fixtures/mocks/work-video-5678.json b/test/fixtures/mocks/work-video-5678.json
new file mode 100644
index 00000000..6b88f17c
--- /dev/null
+++ b/test/fixtures/mocks/work-video-5678.json
@@ -0,0 +1,148 @@
+{
+ "_index": "kdid-dev-dc-v2-work-1666658122455",
+ "_type": "_doc",
+ "_id": "a3386c0e-e086-45ef-b3c5-9b45ea78211e",
+ "_version": 7,
+ "_seq_no": 31,
+ "_primary_term": 1,
+ "found": true,
+ "_source": {
+ "accession_number": "Video.Work.12342918",
+ "thumbnail": "https://dcapi.rdc-staging.library.northwestern.edu/works/a3386c0e-e086-45ef-b3c5-9b45ea78211e/thumbnail",
+ "indexed_at": "2022-10-25T18:22:37.800026",
+ "iiif_manifest": "https://kdid-dev-pyramids.s3.amazonaws.com/public/iiif3/a3/38/6c/0e/-e/08/6-/45/ef/-b/3c/5-/9b/45/ea/78/21/1e-manifest.json",
+ "folder_names": [],
+ "modified_date": "2022-10-25T18:22:13.531600Z",
+ "series": [],
+ "source": [],
+ "physical_description_size": [],
+ "batch_ids": [],
+ "publisher": [],
+ "date_created": ["circa 1990?", "August 1906 to December 1910"],
+ "csv_metadata_update_jobs": [],
+ "keywords": [],
+ "alternate_title": [],
+ "id": "a3386c0e-e086-45ef-b3c5-9b45ea78211e",
+ "box_number": [],
+ "box_name": [],
+ "create_date": "2022-10-25T00:36:58.251836Z",
+ "table_of_contents": [],
+ "project": {
+ "cycle": null,
+ "desc": null,
+ "manager": null,
+ "name": null,
+ "proposer": null,
+ "task_number": null
+ },
+ "style_period": [],
+ "technique": [],
+ "api_model": "Work",
+ "genre": [],
+ "folder_numbers": [],
+ "cultural_context": [],
+ "preservation_level": null,
+ "creator": [],
+ "related_url": [],
+ "visibility": "Public",
+ "api_link": "https://dcapi.rdc-staging.library.northwestern.edu/works/a3386c0e-e086-45ef-b3c5-9b45ea78211e",
+ "representative_file_set": {
+ "id": null,
+ "url": null
+ },
+ "subject": [],
+ "legacy_identifier": [],
+ "published": false,
+ "collection": {
+ "description": "This collection features digital copies of 113 antique maps of Africa and accompanying text dating from the mid-16th Century to the early 20th Century. All scanned maps are authentic and originally collected by the Melville J. Herskovits Library of African Studies. Melville J. Herskovits established Northwestern University's Program of African Studies in 1948 (the first of its kind at a major research university in the United States). The Herskovits Library, formally created as a separate library in 1954, has since its inception collected maps that describe Africa from their earliest appearance to the most current. Map area coverage includes the continent, regions (particularly North Africa and Algeria), islands (particularly Madagascar), and a few city plans. All of these maps are loose items, though many have been excised from published atlases. Some of the highlights of the digital collection are: a series of Ptolemic maps of North Africa by Ruscelli, ca. 1565; Forlani: Africa , 1562; Mercator: Africa, 1595; Blaeu: Æthiopia ca. 1650 (a Prester John map); Carey: Africa, 1795 (first map of Africa published in the United States), Arrowsmith: Africa, 1802 (notable for its large dimensions, 124 x 145 cm.), a series of Algerian maps published by the French government in the mid-1800's, and maps by other notable cartographers, such as Hondius, Jansson, de Jode, de L'Isle, Ortelius, Sanson, and de Wit. The original maps are kept and maintained in the map collection in the Government & Geographic Information Collection. We welcome questions, comments, and suggestions concerning any aspect of this digital collection, particularly with regards to provenance. Other antique maps from the Herskovits Library which were not included in this digital collection are either duplicate copies or other editions, such as French government sets covering Algeria.",
+ "id": "1c2e2200-c12d-4c7f-8b87-a935c349898a",
+ "title": "16th-Early 20th Century Maps of Africa"
+ },
+ "physical_description_material": [],
+ "notes": [],
+ "description": ["Yes!!!"],
+ "location": [],
+ "rights_statement": {},
+ "identifier": [],
+ "ingest_project": {},
+ "terms_of_use": null,
+ "abstract": [],
+ "file_sets": [
+ {
+ "duration": 5.599,
+ "height": 320,
+ "id": "5270faab-6575-4808-bad4-336523635a01",
+ "label": "This is the second file set",
+ "mime_type": "video/x-m4v",
+ "original_filename": "small.m4v",
+ "poster_offset": null,
+ "rank": 1073741824,
+ "representative_image_url": null,
+ "role": "Access",
+ "streaming_url": "https://kdid-dev-streaming.s3.amazonaws.com/52/70/fa/ab/-6/57/5-/48/08/-b/ad/4-/33/65/23/63/5a/01/5270faab-6575-4808-bad4-336523635a01.m4v",
+ "webvtt": null,
+ "width": 560
+ },
+ {
+ "duration": null,
+ "height": null,
+ "id": "92add7b5-95ff-410e-bac6-6de73dfefb56",
+ "label": "adasffasdfa",
+ "mime_type": "application/json",
+ "original_filename": "details.json",
+ "poster_offset": null,
+ "rank": 0,
+ "representative_image_url": null,
+ "role": "Supplemental",
+ "streaming_url": null,
+ "webvtt": null,
+ "width": null
+ },
+ {
+ "duration": null,
+ "height": 1024,
+ "id": "0a002b39-43c5-4807-9053-48be93fa67f6",
+ "label": "coffee!",
+ "mime_type": "image/tiff",
+ "original_filename": "coffee.tif",
+ "poster_offset": null,
+ "rank": 0,
+ "representative_image_url": "https://iiif.dev.rdc.library.northwestern.edu/iiif/2/kdid-dev/0a002b39-43c5-4807-9053-48be93fa67f6",
+ "role": "Auxiliary",
+ "streaming_url": null,
+ "webvtt": null,
+ "width": 1024
+ },
+ {
+ "duration": 5.599,
+ "height": 320,
+ "id": "7e10e4aa-2ecd-48ef-8424-124d893ff323",
+ "label": "Yes the is the label edited",
+ "mime_type": "video/x-m4v",
+ "original_filename": "small.m4v",
+ "poster_offset": 2868,
+ "rank": 0,
+ "representative_image_url": "https://iiif.dev.rdc.library.northwestern.edu/iiif/2/kdid-dev/posters/7e10e4aa-2ecd-48ef-8424-124d893ff323",
+ "role": "Access",
+ "streaming_url": "https://kdid-dev-streaming.s3.amazonaws.com/7e/10/e4/aa/-2/ec/d-/48/ef/-8/42/4-/12/4d/89/3f/f3/23/7e10e4aa-2ecd-48ef-8424-124d893ff323.m4v",
+ "webvtt": "https://kdid-dev-pyramids.s3.amazonaws.com/public/vtt/7e/10/e4/aa/-2/ec/d-/48/ef/-8/42/4-/12/4d/89/3f/f3/23/7e10e4aa-2ecd-48ef-8424-124d893ff323.vtt",
+ "width": 560
+ }
+ ],
+ "language": [],
+ "title": "The title of the video work",
+ "ingest_sheet": {},
+ "ark": "ark:/99999/fk498553735",
+ "catalog_key": [],
+ "provenance": [],
+ "library_unit": null,
+ "work_type": "Video",
+ "contributor": [],
+ "license": null,
+ "scope_and_contents": [],
+ "caption": [],
+ "status": null,
+ "rights_holder": [],
+ "related_material": []
+ }
+}
diff --git a/test/integration/get-auth-callback.test.js b/test/integration/get-auth-callback.test.js
new file mode 100644
index 00000000..1cdf8b54
--- /dev/null
+++ b/test/integration/get-auth-callback.test.js
@@ -0,0 +1,75 @@
+"use strict";
+
+const chai = require("chai");
+const cookie = require("cookie");
+const expect = chai.expect;
+const jwt = require("jsonwebtoken");
+const nock = require("nock");
+const getAuthCallbackHandler = require("../../src/handlers/get-auth-callback");
+
+describe("auth callback", function () {
+ helpers.saveEnvironment();
+
+ let event;
+ beforeEach(() => {
+ process.env.NUSSO_BASE_URL = "https://nusso-base.com/";
+ process.env.NUSSO_API_KEY = "abc123";
+ process.env.API_TOKEN_SECRET = "abc123";
+
+ event = helpers
+ .mockEvent("GET", "/auth/callback")
+ .headers({
+ Cookie: "nusso=bnVzc28=;redirectUrl=aHR0cHM6Ly9leGFtcGxlLmNvbQ==;",
+ })
+ .render();
+
+ nock(process.env.NUSSO_BASE_URL)
+ .get("/validateWebSSOToken")
+ .reply(200, { netid: "uid123" });
+ });
+
+ it("redeems the NUSSO token", async () => {
+ nock(process.env.NUSSO_BASE_URL)
+ .get("/validate-with-directory-search-response")
+ .reply(200, {
+ results: [{ displayName: ["Some User"] }],
+ });
+
+ const result = await getAuthCallbackHandler.handler(event);
+
+ expect(result.statusCode).to.eq(302);
+ expect(result.headers.location).to.eq("https://example.com");
+
+ const { dcApiV2Token } = cookie.parse(result.cookies[0]);
+ const token = jwt.verify(dcApiV2Token, process.env.API_TOKEN_SECRET);
+ expect(token).to.deep.include({
+ displayName: ["Some User"],
+ uid: "uid123",
+ });
+ });
+
+ it("assembles a user object from the netID if directory search fails", async () => {
+ nock(process.env.NUSSO_BASE_URL)
+ .get("/validate-with-directory-search-response")
+ .reply(500, {
+ fault: {
+ faultstring:
+ "Execution of ServiceCallout Call-WebSSO-API failed. Reason: ResponseCode 404 is treated as error",
+ detail: { errorcode: "steps.servicecallout.ExecutionFailed" },
+ },
+ });
+
+ const result = await getAuthCallbackHandler.handler(event);
+
+ expect(result.statusCode).to.eq(302);
+ expect(result.headers.location).to.eq("https://example.com");
+
+ const { dcApiV2Token } = cookie.parse(result.cookies[0]);
+ const token = jwt.verify(dcApiV2Token, process.env.API_TOKEN_SECRET);
+ expect(token).to.deep.include({
+ displayName: ["uid123"],
+ mail: "uid123@e.northwestern.edu",
+ uid: "uid123",
+ });
+ });
+});
diff --git a/test/integration/get-auth-login.test.js b/test/integration/get-auth-login.test.js
new file mode 100644
index 00000000..7bf38b09
--- /dev/null
+++ b/test/integration/get-auth-login.test.js
@@ -0,0 +1,29 @@
+"use strict";
+
+const chai = require("chai");
+const expect = chai.expect;
+const nock = require("nock");
+const getAuthLoginHandler = require("../../src/handlers/get-auth-login");
+
+describe("auth login", function () {
+ helpers.saveEnvironment();
+
+ it("redirects to the NUSSO url", async () => {
+ process.env.NUSSO_BASE_URL = "https://nusso-base.com/";
+ process.env.NUSSO_API_KEY = "abc123";
+
+ const _scope = nock(process.env.NUSSO_BASE_URL)
+ .get("/get-ldap-redirect-url")
+ .reply(200, {
+ data: { redirecturl: "https://test-redirect.com" },
+ });
+
+ const event = helpers
+ .mockEvent("GET", "/auth/login")
+ .queryParams({ goto: "https://test-goto.com" })
+ .render();
+
+ const result = await getAuthLoginHandler.handler(event);
+ expect(result.statusCode).to.eq(302);
+ });
+});
diff --git a/test/integration/get-auth-logout.test.js b/test/integration/get-auth-logout.test.js
new file mode 100644
index 00000000..5f4ac560
--- /dev/null
+++ b/test/integration/get-auth-logout.test.js
@@ -0,0 +1,29 @@
+"use strict";
+
+const chai = require("chai");
+const expect = chai.expect;
+const nock = require("nock");
+const getAuthLogoutHandler = require("../../src/handlers/get-auth-logout");
+
+describe("auth logout", function () {
+ helpers.saveEnvironment();
+
+ it("logs a user out of NU WebSSO and expires the dcApiV2Token", async () => {
+ process.env.NUSSO_BASE_URL = "https://nusso-base.com/";
+ process.env.NUSSO_API_KEY = "abc123";
+
+ const url = "https://test.com/northwestern#logout";
+ const _scope = nock(process.env.NUSSO_BASE_URL).get("/logout").reply(200, {
+ url: url,
+ });
+
+ const event = helpers.mockEvent("GET", "/auth/logout").render();
+
+ const result = await getAuthLogoutHandler.handler(event);
+ expect(result.statusCode).to.eq(302);
+ expect(result.headers.location).to.eq(url);
+ expect(result.cookies[0]).to.contain(
+ "Expires=Thu, 01 Jan 1970 00:00:00 GMT;"
+ );
+ });
+});
diff --git a/test/integration/get-auth-whoami.test.js b/test/integration/get-auth-whoami.test.js
new file mode 100644
index 00000000..75a03c41
--- /dev/null
+++ b/test/integration/get-auth-whoami.test.js
@@ -0,0 +1,37 @@
+"use strict";
+
+const chai = require("chai");
+const expect = chai.expect;
+const getAuthWhoamiHandler = require("../../src/handlers/get-auth-whoami");
+
+describe("auth whoami", function () {
+ helpers.saveEnvironment();
+
+ it("redeems a valid NUSSO token", async () => {
+ process.env.API_TOKEN_SECRET = "abc123";
+
+ const event = helpers
+ .mockEvent("GET", "/auth/whoami")
+ .headers({
+ Cookie:
+ "dcApiV2Token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkaXNwbGF5TmFtZSI6IlNvbWUgT25lIiwiaWF0IjoxNjY1NDE3NzYzfQ.Nwi8dJnc7w201ZtO5de5zYmU-F5gEalkmHZ5pR1VXms;",
+ })
+ .render();
+
+ const result = await getAuthWhoamiHandler.handler(event);
+ expect(result.statusCode).to.eq(200);
+ expect(JSON.parse(result.body)).to.contain({ displayName: "Some One" });
+ });
+
+ it("rejects an invalid or missing NUSSO token", async () => {
+ process.env.API_TOKEN_SECRET = "abc123";
+
+ const event = helpers.mockEvent("GET", "/auth/whoami").render();
+
+ const result = await getAuthWhoamiHandler.handler(event);
+ expect(result.statusCode).to.eq(401);
+ expect(result.body).to.eq(
+ "Error verifying API token: jwt must be provided"
+ );
+ });
+});
diff --git a/test/integration/get-collection-by-id.test.js b/test/integration/get-collection-by-id.test.js
new file mode 100644
index 00000000..67cc8f2b
--- /dev/null
+++ b/test/integration/get-collection-by-id.test.js
@@ -0,0 +1,79 @@
+"use strict";
+
+const chai = require("chai");
+const expect = chai.expect;
+const RequestPipeline = require("../../src/api/request/pipeline");
+chai.use(require("chai-http"));
+
+describe("Retrieve collection by id", () => {
+ helpers.saveEnvironment();
+ const mock = helpers.mockIndex();
+
+ describe("GET /collections/{id}", () => {
+ const { handler } = require("../../src/handlers/get-collection-by-id");
+
+ it("retrieves a single collection link document", async () => {
+ mock
+ .get("/dc-v2-collection/_doc/1234")
+ .reply(200, helpers.testFixture("mocks/collection-1234.json"));
+
+ const event = helpers
+ .mockEvent("GET", "/collections/{id}")
+ .pathParams({ id: 1234 })
+ .render();
+ const result = await handler(event);
+ expect(result.statusCode).to.eq(200);
+ expect(result).to.have.header(
+ "content-type",
+ /application\/json;.*charset=UTF-8/
+ );
+
+ const resultBody = JSON.parse(result.body);
+ expect(resultBody.data.id).to.eq("1234");
+ });
+
+ it("404s a missing collection", async () => {
+ mock
+ .get("/dc-v2-collection/_doc/1234")
+ .reply(200, helpers.testFixture("mocks/missing-collection-1234.json"));
+
+ const event = helpers
+ .mockEvent("GET", "/collections/{id}")
+ .pathParams({ id: 1234 })
+ .render();
+ const result = await handler(event);
+ expect(result.statusCode).to.eq(404);
+ });
+
+ it("returns a single collection as a IIIF collection", async () => {
+ const originalQuery = {
+ query: { query_string: { query: "collection.id:1234" } },
+ };
+ const authQuery = new RequestPipeline(originalQuery)
+ .authFilter()
+ .toJson();
+
+ mock
+ .get("/dc-v2-collection/_doc/1234")
+ .reply(200, helpers.testFixture("mocks/collection-1234.json"));
+ mock
+ .post("/dc-v2-work/_search", authQuery)
+ .reply(200, helpers.testFixture("mocks/search.json"));
+
+ const event = helpers
+ .mockEvent("GET", "/collections/{id}")
+ .pathParams({ id: 1234 })
+ .queryParams({ as: "iiif" })
+ .render();
+ const result = await handler(event);
+ expect(result.statusCode).to.eq(200);
+ expect(result).to.have.header(
+ "content-type",
+ /application\/json;.*charset=UTF-8/
+ );
+ const resultBody = JSON.parse(result.body);
+ expect(resultBody.type).to.eq("Collection");
+ expect(resultBody.label.none[0]).to.eq("Collection Title");
+ });
+ });
+});
diff --git a/test/integration/get-collections.test.js b/test/integration/get-collections.test.js
new file mode 100644
index 00000000..181ebddb
--- /dev/null
+++ b/test/integration/get-collections.test.js
@@ -0,0 +1,74 @@
+"use strict";
+
+const chai = require("chai");
+const expect = chai.expect;
+const getCollectionsHandler = require("../../src/handlers/get-collections");
+const RequestPipeline = require("../../src/api/request/pipeline");
+chai.use(require("chai-http"));
+
+describe("Collections route", () => {
+ helpers.saveEnvironment();
+ const mock = helpers.mockIndex();
+
+ describe("GET /collections", () => {
+ const handler = getCollectionsHandler.handler;
+ const baseEvent = helpers.mockEvent("GET", "/collections");
+ let event;
+ const makeQuery = (params) =>
+ new RequestPipeline({ query: { match_all: {} }, ...params })
+ .authFilter()
+ .toJson();
+
+ it("paginates results using default size and page number", async () => {
+ mock
+ .post("/dc-v2-collection/_search", makeQuery({ size: 10, from: 0 }))
+ .reply(200, helpers.testFixture("mocks/collections.json"));
+ event = baseEvent.render();
+ const result = await handler(event);
+ expect(result.statusCode).to.eq(200);
+ expect(result).to.have.header(
+ "content-type",
+ /application\/json;.*charset=UTF-8/
+ );
+ const {
+ pagination: { query_url },
+ } = JSON.parse(result.body);
+ const url = new URL(query_url);
+ expect(url.searchParams.has("searchToken")).to.be.false;
+ expect(url.searchParams.has("size")).to.be.false;
+ });
+
+ it("paginates results using provided size and page number", async () => {
+ mock
+ .post("/dc-v2-collection/_search", makeQuery({ size: 5, from: 10 }))
+ .reply(200, helpers.testFixture("mocks/collections.json"));
+ event = baseEvent.queryParams({ page: 3, size: 5 }).render();
+ const result = await handler(event);
+ expect(result.statusCode).to.eq(200);
+ expect(result).to.have.header(
+ "content-type",
+ /application\/json;.*charset=UTF-8/
+ );
+ const {
+ pagination: { query_url },
+ } = JSON.parse(result.body);
+ const url = new URL(query_url);
+ expect(url.searchParams.has("searchToken")).to.be.false;
+ expect(url.searchParams.get("size")).to.eq("5");
+ });
+
+ it("produces a correct query_url from a mounted API Gateway route", async () => {
+ mock
+ .post("/dc-v2-collection/_search", makeQuery({ size: 10, from: 0 }))
+ .reply(200, helpers.testFixture("mocks/collections.json"));
+ event = JSON.parse(helpers.testFixture("mocks/real-search-event.json"));
+ const result = await handler(event);
+ expect(result.statusCode).to.eq(200);
+ const {
+ pagination: { query_url },
+ } = JSON.parse(result.body);
+ const url = new URL(query_url);
+ expect(url.pathname).to.eq("/api/v2/search/collections");
+ });
+ });
+});
diff --git a/test/integration/get-doc.test.js b/test/integration/get-doc.test.js
new file mode 100644
index 00000000..7d048bf4
--- /dev/null
+++ b/test/integration/get-doc.test.js
@@ -0,0 +1,138 @@
+"use strict";
+
+const chai = require("chai");
+const expect = chai.expect;
+chai.use(require("chai-http"));
+
+describe("Doc retrieval routes", () => {
+ helpers.saveEnvironment();
+ const mock = helpers.mockIndex();
+
+ describe("GET /works/{id}", () => {
+ const { handler } = require("../../src/handlers/get-work-by-id");
+
+ it("retrieves a single work", async () => {
+ mock
+ .get("/dc-v2-work/_doc/1234")
+ .reply(200, helpers.testFixture("mocks/work-1234.json"));
+
+ const event = helpers
+ .mockEvent("GET", "/works/{id}")
+ .pathParams({ id: 1234 })
+ .render();
+ const result = await handler(event);
+ expect(result.statusCode).to.eq(200);
+ expect(result).to.have.header(
+ "content-type",
+ /application\/json;.*charset=UTF-8/
+ );
+
+ const resultBody = JSON.parse(result.body);
+ expect(resultBody.data.api_model).to.eq("Work");
+ expect(resultBody.data.id).to.eq("1234");
+ });
+
+ it("404s a missing work", async () => {
+ mock
+ .get("/dc-v2-work/_doc/1234")
+ .reply(200, helpers.testFixture("mocks/missing-work-1234.json"));
+
+ const event = helpers
+ .mockEvent("GET", "/works/{id}")
+ .pathParams({ id: 1234 })
+ .render();
+ const result = await handler(event);
+ expect(result.statusCode).to.eq(404);
+ });
+
+ it("404s an unpublished work", async () => {
+ mock
+ .get("/dc-v2-work/_doc/1234")
+ .reply(200, helpers.testFixture("mocks/unpublished-work-1234.json"));
+
+ const event = helpers
+ .mockEvent("GET", "/works/{id}")
+ .pathParams({ id: 1234 })
+ .render();
+ const result = await handler(event);
+ expect(result.statusCode).to.eq(404);
+ });
+
+ it("404s a private work by default", async () => {
+ mock
+ .get("/dc-v2-work/_doc/1234")
+ .reply(200, helpers.testFixture("mocks/private-work-1234.json"));
+
+ const event = helpers
+ .mockEvent("GET", "/works/{id}")
+ .pathParams({ id: 1234 })
+ .render();
+ const result = await handler(event);
+ expect(result.statusCode).to.eq(404);
+ });
+
+ it("returns a private work to allowed IPs", async () => {
+ process.env.READING_ROOM_IPS = "10.9.8.7";
+ mock
+ .get("/dc-v2-work/_doc/1234")
+ .reply(200, helpers.testFixture("mocks/private-work-1234.json"));
+
+ const event = helpers
+ .mockEvent("GET", "/works/{id}")
+ .pathParams({ id: 1234 })
+ .render();
+ const result = await handler(event);
+ expect(result.statusCode).to.eq(200);
+ });
+ });
+
+ describe("GET /collections/{id}", () => {
+ const { handler } = require("../../src/handlers/get-collection-by-id");
+
+ it("retrieves a single collection", async () => {
+ mock
+ .get("/dc-v2-collection/_doc/1234")
+ .reply(200, helpers.testFixture("mocks/collection-1234.json"));
+
+ const event = helpers
+ .mockEvent("GET", "/collections/{id}")
+ .pathParams({ id: 1234 })
+ .render();
+ const result = await handler(event);
+ expect(result.statusCode).to.eq(200);
+ expect(result).to.have.header(
+ "content-type",
+ /application\/json;.*charset=UTF-8/
+ );
+
+ const resultBody = JSON.parse(result.body);
+ expect(resultBody.data.api_model).to.eq("Collection");
+ expect(resultBody.data.id).to.eq("1234");
+ });
+ });
+
+ describe("GET /file-sets/{id}", () => {
+ const { handler } = require("../../src/handlers/get-file-set-by-id");
+
+ it("retrieves a single file-set", async () => {
+ mock
+ .get("/dc-v2-file-set/_doc/1234")
+ .reply(200, helpers.testFixture("mocks/fileset-1234.json"));
+
+ const event = helpers
+ .mockEvent("GET", "/file-sets/{id}")
+ .pathParams({ id: 1234 })
+ .render();
+ const result = await handler(event);
+ expect(result.statusCode).to.eq(200);
+ expect(result).to.have.header(
+ "content-type",
+ /application\/json;.*charset=UTF-8/
+ );
+
+ const resultBody = JSON.parse(result.body);
+ expect(resultBody.data.api_model).to.eq("FileSet");
+ expect(resultBody.data.id).to.eq("1234");
+ });
+ });
+});
diff --git a/test/integration/get-file-set-auth.test.js b/test/integration/get-file-set-auth.test.js
new file mode 100644
index 00000000..7620e5e3
--- /dev/null
+++ b/test/integration/get-file-set-auth.test.js
@@ -0,0 +1,161 @@
+"use strict";
+
+const chai = require("chai");
+const expect = chai.expect;
+const RequestPipeline = require("../../src/api/request/pipeline");
+chai.use(require("chai-http"));
+
+process.env.API_TOKEN_SECRET = "abc123";
+
+describe("Authorize a file set by id", () => {
+ helpers.saveEnvironment();
+ const mock = helpers.mockIndex();
+
+ describe("GET /file-sets/{id}/authorization", () => {
+ const { handler } = require("../../src/handlers/get-file-set-auth");
+
+ it("authorizes a public, published file set with no token", async () => {
+ mock
+ .get("/dc-v2-file-set/_doc/1234")
+ .reply(200, helpers.testFixture("mocks/fileset-1234.json"));
+
+ const event = helpers
+ .mockEvent("GET", "/file-sets/{id}/authorization")
+ .pathParams({ id: 1234 })
+ .render();
+ const result = await handler(event);
+ expect(result.statusCode).to.eq(204);
+ });
+
+ it("does not authorize a public, unpublished file set even with a valid token", async () => {
+ mock
+ .get("/dc-v2-file-set/_doc/1234")
+ .reply(200, helpers.testFixture("mocks/fileset-unpublished-1234.json"));
+
+ const event = helpers
+ .mockEvent("GET", "/file-sets/{id}/authorization")
+ .pathParams({ id: 1234 })
+ .headers({
+ Cookie:
+ "dcApiV2Token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkaXNwbGF5TmFtZSI6IlNvbWUgT25lIiwiaWF0IjoxNjY1NDE3NzYzfQ.Nwi8dJnc7w201ZtO5de5zYmU-F5gEalkmHZ5pR1VXms;",
+ })
+ .render();
+ const result = await handler(event);
+ expect(result.statusCode).to.eq(403);
+ });
+
+ it("authorizes a netid, published file set with a valid token", async () => {
+ mock
+ .get("/dc-v2-file-set/_doc/1234")
+ .reply(200, helpers.testFixture("mocks/fileset-netid-1234.json"));
+
+ const event = helpers
+ .mockEvent("GET", "/file-sets/{id}/authorization")
+ .pathParams({ id: 1234 })
+ .headers({
+ Cookie:
+ "dcApiV2Token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkaXNwbGF5TmFtZSI6IlNvbWUgT25lIiwiaWF0IjoxNjY1NDE3NzYzfQ.Nwi8dJnc7w201ZtO5de5zYmU-F5gEalkmHZ5pR1VXms;",
+ })
+ .render();
+ const result = await handler(event);
+ expect(result.statusCode).to.eq(204);
+ });
+
+ it("does not authorize a netid, published file set with no token", async () => {
+ mock
+ .get("/dc-v2-file-set/_doc/1234")
+ .reply(200, helpers.testFixture("mocks/fileset-netid-1234.json"));
+
+ const event = helpers
+ .mockEvent("GET", "/file-sets/{id}/authorization")
+ .pathParams({ id: 1234 })
+ .render();
+ const result = await handler(event);
+ expect(result.statusCode).to.eq(403);
+ });
+
+ it("does authorize a netid, published file set with no token if the user is in the reading room", async () => {
+ mock
+ .get("/dc-v2-file-set/_doc/1234")
+ .reply(200, helpers.testFixture("mocks/fileset-netid-1234.json"));
+
+ const event = helpers
+ .mockEvent("GET", "/file-sets/{id}/authorization")
+ .pathParams({ id: 1234 })
+ .render();
+
+ process.env.READING_ROOM_IPS = event.requestContext.http.sourceIp;
+ const result = await handler(event);
+ expect(result.statusCode).to.eq(204);
+ });
+
+ it("authorizes an restricted file set if the user is in a Reading Room", async () => {
+ mock
+ .get("/dc-v2-file-set/_doc/1234")
+ .reply(200, helpers.testFixture("mocks/fileset-restricted-1234.json"));
+
+ const event = helpers
+ .mockEvent("GET", "/file-sets/{id}/authorization")
+ .pathParams({ id: 1234 })
+ .render();
+ process.env.READING_ROOM_IPS = event.requestContext.http.sourceIp;
+
+ const result = await handler(event);
+ expect(result.statusCode).to.eq(204);
+ });
+
+ it("does not authorize a restricted, unpublished file set if the user is in a Reading Room", async () => {
+ mock
+ .get("/dc-v2-file-set/_doc/1234")
+ .reply(200, helpers.testFixture("mocks/fileset-restricted-1234.json"));
+
+ const event = helpers
+ .mockEvent("GET", "/file-sets/{id}/authorization")
+ .pathParams({ id: 1234 })
+ .render();
+ process.env.READING_ROOM_IPS = event.requestContext.http.sourceIp;
+
+ const result = await handler(event);
+ expect(result.statusCode).to.eq(204);
+ });
+
+ it("404s a missing file set", async () => {
+ mock
+ .get("/dc-v2-file-set/_doc/1234")
+ .reply(200, helpers.testFixture("mocks/missing-fileset-1234.json"));
+
+ const event = helpers
+ .mockEvent("GET", "/file-sets/{id}")
+ .pathParams({ id: 1234 })
+ .render();
+ const result = await handler(event);
+ expect(result.statusCode).to.eq(404);
+ });
+
+ it("does not authorize a file set with invalid visibility value", async () => {
+ mock
+ .get("/dc-v2-file-set/_doc/1234")
+ .reply(200, helpers.testFixture("mocks/fileset-baddata-1234.json"));
+
+ const event = helpers
+ .mockEvent("GET", "/file-sets/{id}/authorization")
+ .pathParams({ id: 1234 })
+ .render();
+ const result = await handler(event);
+ expect(result.statusCode).to.eq(403);
+ });
+
+ it("authorizes requests for IDs in the always-allow namespace", async () => {
+ const id = "00000000-0000-0000-0000-000000000001";
+
+ mock.get(`/dc-v2-file-set/_doc/${id}`).reply(404, "Not Found");
+
+ const event = helpers
+ .mockEvent("GET", "/file-sets/{id}/authorization")
+ .pathParams({ id })
+ .render();
+ const result = await handler(event);
+ expect(result.statusCode).to.eq(204);
+ });
+ });
+});
diff --git a/test/integration/get-shared-link-by-id.test.js b/test/integration/get-shared-link-by-id.test.js
new file mode 100644
index 00000000..44f7210c
--- /dev/null
+++ b/test/integration/get-shared-link-by-id.test.js
@@ -0,0 +1,103 @@
+"use strict";
+
+const chai = require("chai");
+const expect = chai.expect;
+chai.use(require("chai-http"));
+
+describe("Retrieve shared link by id", () => {
+ helpers.saveEnvironment();
+ const mock = helpers.mockIndex();
+
+ describe("GET /shared-links/{id}", () => {
+ const { handler } = require("../../src/handlers/get-shared-link-by-id");
+
+ it("retrieves a single shared link document", async () => {
+ mock
+ .get("/shared_links/_doc/1234")
+ .reply(200, helpers.testFixture("mocks/shared-link-1234.json"));
+
+ mock
+ .get("/dc-v2-work/_doc/1234")
+ .reply(200, helpers.testFixture("mocks/private-work-1234.json"));
+
+ const event = helpers
+ .mockEvent("GET", "/shared-links/{id}")
+ .pathParams({ id: 1234 })
+ .render();
+ const result = await handler(event);
+ expect(result.statusCode).to.eq(200);
+ const resultBody = JSON.parse(result.body);
+ expect(resultBody.data.api_model).to.eq("Work");
+ expect(resultBody.data.visibility).to.eq("Private");
+ });
+
+ it("404s a missing shared link", async () => {
+ mock
+ .get("/shared_links/_doc/5678")
+ .reply(404, helpers.testFixture("mocks/missing-shared-link-5678.json"));
+
+ const event = helpers
+ .mockEvent("GET", "/shared_links/{id}")
+ .pathParams({ id: 5678 })
+ .render();
+ const result = await handler(event);
+ expect(result.statusCode).to.eq(404);
+ });
+
+ it("404s an expired shared link", async () => {
+ mock
+ .get("/shared_links/_doc/9101112")
+ .reply(
+ 200,
+ helpers.testFixture("mocks/expired-shared-link-9101112.json")
+ );
+
+ const event = helpers
+ .mockEvent("GET", "/shared_links/{id}")
+ .pathParams({ id: 9101112 })
+ .render();
+ const result = await handler(event);
+ expect(result.statusCode).to.eq(404);
+ });
+
+ it("retrieves an unpublished single shared link document", async () => {
+ mock
+ .get("/shared_links/_doc/1234")
+ .reply(200, helpers.testFixture("mocks/shared-link-1234.json"));
+
+ mock
+ .get("/dc-v2-work/_doc/1234")
+ .reply(
+ 200,
+ helpers.testFixture("mocks/private-unpublished-work-1234.json")
+ );
+
+ const event = helpers
+ .mockEvent("GET", "/shared-links/{id}")
+ .pathParams({ id: 1234 })
+ .render();
+ const result = await handler(event);
+ expect(result.statusCode).to.eq(200);
+ const resultBody = JSON.parse(result.body);
+ expect(resultBody.data.api_model).to.eq("Work");
+ expect(resultBody.data.visibility).to.eq("Private");
+ });
+
+ it("returns a 404 when the link exists but the work doesn't", async () => {
+ mock
+ .get("/shared_links/_doc/1234")
+ .reply(200, helpers.testFixture("mocks/shared-link-1234.json"));
+
+ mock
+ .get("/dc-v2-work/_doc/1234")
+ .reply(200, helpers.testFixture("mocks/missing-work-1234.json"));
+
+ const event = helpers
+ .mockEvent("GET", "/shared-links/{id}")
+ .pathParams({ id: 1234 })
+ .render();
+ const result = await handler(event);
+ expect(result.statusCode).to.eq(404);
+ });
+ });
+});
diff --git a/test/integration/get-similar.test.js b/test/integration/get-similar.test.js
new file mode 100644
index 00000000..6e9086b1
--- /dev/null
+++ b/test/integration/get-similar.test.js
@@ -0,0 +1,110 @@
+"use strict";
+
+const chai = require("chai");
+const expect = chai.expect;
+const { handler } = require("../../src/handlers/get-similar");
+const RequestPipeline = require("../../src/api/request/pipeline");
+chai.use(require("chai-http"));
+
+describe("Similar routes", () => {
+ helpers.saveEnvironment();
+ const mock = helpers.mockIndex();
+ let baseEvent = helpers
+ .mockEvent("GET", "/works/{id}/similar")
+ .pathParams({ id: 1234 });
+ const makeQuery = (params) =>
+ new RequestPipeline(params).authFilter().toJson();
+
+ it("paginates results using default size and page number", async () => {
+ mock
+ .post(
+ "/dc-v2-work/_search",
+ makeQuery({
+ query: {
+ more_like_this: {
+ fields: [
+ "title",
+ "description",
+ "subject.label",
+ "genre.label",
+ "contributor.label",
+ "creator.label",
+ ],
+ like: [
+ {
+ _index: "dc-v2-work",
+ _id: 1234,
+ },
+ ],
+ max_query_terms: 10,
+ min_doc_freq: 1,
+ min_term_freq: 1,
+ },
+ },
+ })
+ )
+ .reply(200, helpers.testFixture("mocks/similar.json"));
+ const event = baseEvent.render();
+ const result = await handler(event);
+ expect(result.statusCode).to.eq(200);
+ expect(result).to.have.header(
+ "content-type",
+ /application\/json;.*charset=UTF-8/
+ );
+ const {
+ pagination: { query_url },
+ } = JSON.parse(result.body);
+ const url = new URL(query_url);
+ expect(url.searchParams.has("searchToken")).to.be.false;
+ expect(url.searchParams.has("size")).to.be.false;
+ });
+
+ it("paginates results using provided size and page number", async () => {
+ let mocked = mock
+ .post(
+ "/dc-v2-work/_search",
+ makeQuery({
+ query: {
+ more_like_this: {
+ fields: [
+ "title",
+ "description",
+ "subject.label",
+ "genre.label",
+ "contributor.label",
+ "creator.label",
+ ],
+ like: [
+ {
+ _index: "dc-v2-work",
+ _id: 1234,
+ },
+ ],
+ max_query_terms: 10,
+ min_doc_freq: 1,
+ min_term_freq: 1,
+ },
+ },
+ size: 3,
+ from: 6,
+ })
+ )
+ .reply(200, helpers.testFixture("mocks/similar.json"));
+ const event = baseEvent.queryParams({ page: 3, size: 3 }).render();
+ const result = await handler(event);
+ expect(result.statusCode).to.eq(200);
+ expect(result).to.have.header(
+ "content-type",
+ /application\/json;.*charset=UTF-8/
+ );
+ const resultBody = JSON.parse(result.body);
+ expect(resultBody.pagination.current_page).to.eq(3);
+ expect(resultBody.pagination.limit).to.eq(3);
+ expect(resultBody.pagination.offset).to.eq(6);
+ expect(resultBody.pagination.total_hits).to.eq(9);
+ expect(resultBody.pagination.total_pages).to.eq(3);
+ const url = new URL(resultBody.pagination.query_url);
+ expect(url.searchParams.has("searchToken")).to.be.false;
+ expect(url.searchParams.get("size")).to.eq("3");
+ });
+});
diff --git a/test/integration/get-thumbnail.test.js b/test/integration/get-thumbnail.test.js
new file mode 100644
index 00000000..2c356f8d
--- /dev/null
+++ b/test/integration/get-thumbnail.test.js
@@ -0,0 +1,222 @@
+"use strict";
+
+const chai = require("chai");
+const expect = chai.expect;
+const { handler } = require("../../src/handlers/get-thumbnail");
+
+describe("Thumbnail routes", () => {
+ helpers.saveEnvironment();
+ const mock = helpers.mockIndex();
+
+ beforeEach(() => {
+ process.env.API_TOKEN_SECRET = "abcdef";
+ });
+
+ describe("Collection", () => {
+ const event = helpers
+ .mockEvent("GET", "/collections/{id}/thumbnail")
+ .pathParams({ id: 1234 });
+
+ it("retrieves a thumbnail", async () => {
+ mock
+ .get("/dc-v2-collection/_doc/1234")
+ .reply(200, helpers.testFixture("mocks/collection-1234.json"));
+ mock
+ .get("/dc-v2-work/_doc/1234")
+ .reply(200, helpers.testFixture("mocks/work-1234.json"));
+ mock
+ .get("/iiif/2/mbk-dev/5678/full/!300,300/0/default.jpg")
+ .reply(200, helpers.testFixture("mocks/thumbnail_full.jpg"), {
+ "Content-Type": "image/jpeg",
+ });
+
+ const result = await handler(event.render());
+ expect(result.statusCode).to.eq(200);
+ expect(result.headers["content-type"]).to.eq("image/jpeg");
+ });
+
+ it("returns an error from the IIIF server", async () => {
+ mock
+ .get("/dc-v2-collection/_doc/1234")
+ .reply(200, helpers.testFixture("mocks/collection-1234.json"));
+ mock
+ .get("/dc-v2-work/_doc/1234")
+ .reply(200, helpers.testFixture("mocks/work-1234.json"));
+ mock
+ .get("/iiif/2/mbk-dev/5678/full/!300,300/0/default.jpg")
+ .reply(403, "Forbidden", { "Content-Type": "text/plain" });
+
+ const result = await handler(event.render());
+ expect(result.statusCode).to.eq(403);
+ expect(result.body).to.eq("Forbidden");
+ });
+
+ it("returns 404 if the collection doc can't be found", async () => {
+ mock
+ .get("/dc-v2-collection/_doc/1234")
+ .reply(200, helpers.testFixture("mocks/missing-collection-1234.json"));
+
+ const result = await handler(event.render());
+ expect(result.statusCode).to.eq(404);
+ });
+
+ it("returns 404 if the work doc can't be found", async () => {
+ mock
+ .get("/dc-v2-collection/_doc/1234")
+ .reply(200, helpers.testFixture("mocks/collection-1234.json"));
+ mock
+ .get("/dc-v2-work/_doc/1234")
+ .reply(200, helpers.testFixture("mocks/missing-work-1234.json"));
+
+ const result = await handler(event.render());
+ expect(result.statusCode).to.eq(404);
+ });
+
+ it("returns 404 if the collection doc has no representative work", async () => {
+ mock
+ .get("/dc-v2-collection/_doc/1234")
+ .reply(
+ 200,
+ helpers.testFixture("mocks/collection-1234-no-thumbnail.json")
+ );
+
+ const result = await handler(event.render());
+ expect(result.statusCode).to.eq(404);
+ });
+
+ it("returns 404 if the work doc has no thumbnail", async () => {
+ mock
+ .get("/dc-v2-collection/_doc/1234")
+ .reply(200, helpers.testFixture("mocks/collection-1234.json"));
+ mock
+ .get("/dc-v2-work/_doc/1234")
+ .reply(200, helpers.testFixture("mocks/work-1234-no-thumbnail.json"));
+
+ const result = await handler(event.render());
+ expect(result.statusCode).to.eq(404);
+ });
+ });
+
+ describe("Work", () => {
+ const event = helpers
+ .mockEvent("GET", "/works/{id}/thumbnail")
+ .pathParams({ id: 1234 });
+
+ it("retrieves a thumbnail", async () => {
+ mock
+ .get("/dc-v2-work/_doc/1234")
+ .reply(200, helpers.testFixture("mocks/work-1234.json"));
+ mock
+ .get("/iiif/2/mbk-dev/5678/full/!300,300/0/default.jpg")
+ .reply(200, helpers.testFixture("mocks/thumbnail_full.jpg"), {
+ "Content-Type": "image/jpeg",
+ });
+
+ const result = await handler(event.render());
+ expect(result.statusCode).to.eq(200);
+ expect(result.headers["content-type"]).to.eq("image/jpeg");
+ });
+
+ it("returns an error from the IIIF server", async () => {
+ mock
+ .get("/dc-v2-work/_doc/1234")
+ .reply(200, helpers.testFixture("mocks/work-1234.json"));
+ mock
+ .get("/iiif/2/mbk-dev/5678/full/!300,300/0/default.jpg")
+ .reply(403, "Forbidden", { "Content-Type": "text/plain" });
+
+ const result = await handler(event.render());
+ expect(result.statusCode).to.eq(403);
+ expect(result.body).to.eq("Forbidden");
+ });
+
+ it("returns 404 if the work doc can't be found", async () => {
+ mock
+ .get("/dc-v2-work/_doc/1234")
+ .reply(200, helpers.testFixture("mocks/missing-work-1234.json"));
+
+ const result = await handler(event.render());
+ expect(result.statusCode).to.eq(404);
+ });
+
+ it("returns 404 if the work doc has no thumbnail", async () => {
+ mock
+ .get("/dc-v2-work/_doc/1234")
+ .reply(200, helpers.testFixture("mocks/work-1234-no-thumbnail.json"));
+
+ const result = await handler(event.render());
+ expect(result.statusCode).to.eq(404);
+ });
+ });
+
+ describe("QueryString parameters", () => {
+ const event = helpers
+ .mockEvent("GET", "/works/{id}/thumbnail")
+ .pathParams({ id: 1234 });
+
+ it("accepts a proper size", async () => {
+ mock
+ .get("/dc-v2-work/_doc/1234")
+ .reply(200, helpers.testFixture("mocks/work-1234.json"));
+ mock
+ .get("/iiif/2/mbk-dev/5678/full/!200,200/0/default.jpg")
+ .reply(200, helpers.testFixture("mocks/thumbnail_full.jpg"), {
+ "Content-Type": "image/jpeg",
+ });
+
+ const result = await handler(event.queryParams({ size: 200 }).render());
+ expect(result.statusCode).to.eq(200);
+ });
+
+ it("rejects invalid sizes", async () => {
+ let result = await handler(event.queryParams({ size: "foo" }).render());
+ expect(result.statusCode).to.eq(400);
+ expect(result.body).to.contain("foo is not");
+
+ result = await handler(event.queryParams({ size: 500 }).render());
+ expect(result.statusCode).to.eq(400);
+ expect(result.body).to.contain("500px");
+ });
+
+ it("accepts proper aspect ratios", async () => {
+ mock
+ .get("/dc-v2-work/_doc/1234")
+ .times(2)
+ .reply(200, helpers.testFixture("mocks/work-1234.json"));
+
+ let resultFixture = "mocks/thumbnail_full.jpg";
+ mock
+ .get("/iiif/2/mbk-dev/5678/full/!300,300/0/default.jpg")
+ .reply(200, helpers.testFixture(resultFixture), {
+ "Content-Type": "image/jpeg",
+ });
+
+ let result = await handler(
+ event.queryParams({ aspect: "full" }).render()
+ );
+ expect(result.statusCode).to.eq(200);
+ let expected = helpers.encodedFixture(resultFixture);
+ expect(result.body).to.eq(expected);
+
+ resultFixture = "mocks/thumbnail_square.jpg";
+ mock
+ .get("/iiif/2/mbk-dev/5678/square/!300,300/0/default.jpg")
+ .reply(200, helpers.testFixture(resultFixture), {
+ "Content-Type": "image/jpeg",
+ });
+
+ result = await handler(event.queryParams({ aspect: "square" }).render());
+ expect(result.statusCode).to.eq(200);
+ expected = helpers.encodedFixture(resultFixture);
+ expect(result.body).to.eq(expected);
+ });
+
+ it("rejects improper aspect ratio", async () => {
+ const result = await handler(
+ event.queryParams({ aspect: "foo" }).render()
+ );
+ expect(result.statusCode).to.eq(400);
+ expect(result.body).to.contain("Unknown aspect ratio: foo");
+ });
+ });
+});
diff --git a/test/integration/get-work-by-id.test.js b/test/integration/get-work-by-id.test.js
new file mode 100644
index 00000000..6109e319
--- /dev/null
+++ b/test/integration/get-work-by-id.test.js
@@ -0,0 +1,79 @@
+"use strict";
+
+const chai = require("chai");
+const expect = chai.expect;
+const RequestPipeline = require("../../src/api/request/pipeline");
+chai.use(require("chai-http"));
+
+describe("Retrieve work by id", () => {
+ helpers.saveEnvironment();
+ const mock = helpers.mockIndex();
+
+ describe("GET /works/{id}", () => {
+ const { handler } = require("../../src/handlers/get-work-by-id");
+
+ it("retrieves a single work document", async () => {
+ mock
+ .get("/dc-v2-work/_doc/1234")
+ .reply(200, helpers.testFixture("mocks/work-1234.json"));
+
+ const event = helpers
+ .mockEvent("GET", "/work/{id}")
+ .pathParams({ id: 1234 })
+ .render();
+ const result = await handler(event);
+ expect(result.statusCode).to.eq(200);
+ expect(result).to.have.header(
+ "content-type",
+ /application\/json;.*charset=UTF-8/
+ );
+
+ const resultBody = JSON.parse(result.body);
+ expect(resultBody.data.id).to.eq("1234");
+ });
+
+ it("404s a missing work", async () => {
+ mock
+ .get("/dc-v2-work/_doc/1234")
+ .reply(200, helpers.testFixture("mocks/missing-work-1234.json"));
+
+ const event = helpers
+ .mockEvent("GET", "/works/{id}")
+ .pathParams({ id: 1234 })
+ .render();
+ const result = await handler(event);
+ expect(result.statusCode).to.eq(404);
+ });
+
+ it("returns a single work as a IIIF Manifest", async () => {
+ // const originalQuery = {
+ // query: { query_string: { query: "collection.id:1234" } },
+ // };
+ // const authQuery = new RequestPipeline(originalQuery)
+ // .authFilter()
+ // .toJson();
+
+ mock
+ .get("/dc-v2-work/_doc/1234")
+ .reply(200, helpers.testFixture("mocks/work-1234.json"));
+
+ const event = helpers
+ .mockEvent("GET", "/works/{id}")
+ .pathParams({ id: 1234 })
+ .queryParams({ as: "iiif" })
+ .render();
+ const result = await handler(event);
+ expect(result.statusCode).to.eq(200);
+ expect(result).to.have.header(
+ "content-type",
+ /application\/json;.*charset=UTF-8/
+ );
+ const resultBody = JSON.parse(result.body);
+ expect(resultBody.type).to.eq("Manifest");
+ expect(resultBody["@context"]).to.eq(
+ "http://iiif.io/api/presentation/3/context.json"
+ );
+ expect(resultBody.label.none[0]).to.eq("Canary Record TEST 1");
+ });
+ });
+});
diff --git a/test/integration/options-request.test.js b/test/integration/options-request.test.js
new file mode 100644
index 00000000..6e449412
--- /dev/null
+++ b/test/integration/options-request.test.js
@@ -0,0 +1,22 @@
+"use strict";
+
+const chai = require("chai");
+const expect = chai.expect;
+const optionsHandler = require("../../src/handlers/options-request");
+
+describe("OPTIONS handler", async () => {
+ const event = helpers
+ .mockEvent("OPTIONS", "/auth/whoami")
+ .headers({
+ Origin: "https://dc.library.northwestern.edu/origin-test-path",
+ })
+ .render();
+
+ it("sends the correct CORS headers", async () => {
+ const response = await optionsHandler.handler(event);
+ expect(response.headers).to.contain({
+ "Access-Control-Allow-Origin":
+ "https://dc.library.northwestern.edu/origin-test-path",
+ });
+ });
+});
diff --git a/test/integration/search.test.js b/test/integration/search.test.js
new file mode 100644
index 00000000..88c06016
--- /dev/null
+++ b/test/integration/search.test.js
@@ -0,0 +1,203 @@
+"use strict";
+
+const chai = require("chai");
+const expect = chai.expect;
+const searchHandlers = require("../../src/handlers/search");
+const RequestPipeline = require("../../src/api/request/pipeline");
+chai.use(require("chai-http"));
+
+describe("Search routes", () => {
+ helpers.saveEnvironment();
+ const mock = helpers.mockIndex();
+
+ describe("POST /search/{targets}", () => {
+ const handler = searchHandlers.postSearch;
+ const originalQuery = { query: { match_all: {} } };
+ const authQuery = new RequestPipeline(originalQuery).authFilter().toJson();
+
+ it("performs a works search by default", async () => {
+ mock
+ .post("/dc-v2-work/_search", authQuery)
+ .reply(200, helpers.testFixture("mocks/search.json"));
+ const event = helpers
+ .mockEvent("POST", "/search")
+ .body(originalQuery)
+ .render();
+ const result = await handler(event);
+ expect(result.statusCode).to.eq(200);
+ expect(result).to.have.header(
+ "content-type",
+ /application\/json;.*charset=UTF-8/
+ );
+
+ const resultBody = JSON.parse(result.body);
+ expect(resultBody).to.include.keys(["data", "pagination"]);
+ expect(resultBody.data.length).to.eq(10);
+ });
+
+ it("performs a search on specified models", async () => {
+ mock
+ .post("/dc-v2-work,dc-v2-collection/_search", authQuery)
+ .reply(200, helpers.testFixture("mocks/search-multiple-targets.json"));
+ const event = helpers
+ .mockEvent("POST", "/search/{models}")
+ .pathParams({ models: "works,collections" })
+ .body(originalQuery)
+ .base64Encode()
+ .render();
+ const result = await handler(event);
+ expect(result.statusCode).to.eq(200);
+ expect(result).to.have.header(
+ "content-type",
+ /application\/json;.*charset=UTF-8/
+ );
+
+ const resultBody = JSON.parse(result.body);
+ expect(resultBody).to.include.keys(["data", "pagination"]);
+ expect(resultBody.data.length).to.eq(10);
+ });
+
+ it("errors if invalid models specified", async () => {
+ const event = helpers
+ .mockEvent("POST", "/search/{models}")
+ .pathParams({ models: "works,collections,blargh" })
+ .body(originalQuery)
+ .render();
+
+ const result = await handler(event);
+ expect(result.statusCode).to.eq(400);
+
+ const resultBody = JSON.parse(result.body);
+ expect(resultBody.message).to.eq(
+ "Invalid models requested: works,collections,blargh"
+ );
+ });
+ });
+
+ describe("GET /search", () => {
+ const handler = searchHandlers.getSearch;
+ const originalQuery = { query: { match_all: {} } };
+ const authQuery = new RequestPipeline(originalQuery).authFilter().toJson();
+ const searchToken =
+ "N4IgRg9gJgniBcoCOBXApgJzokBbAhgC4DGAFgPr4A2VCwAvvQDQgDOAlgF5oICMADMzzQ0VVggDaIAO4QMAa3EBdekA";
+
+ it("Does not require a searchToken", async () => {
+ const originalQuery = {
+ query: { query_string: { query: "*" } },
+ };
+ const authQuery = new RequestPipeline(originalQuery)
+ .authFilter()
+ .toJson();
+
+ mock
+ .post("/dc-v2-work/_search", authQuery)
+ .reply(200, helpers.testFixture("mocks/search.json"));
+ const event = helpers.mockEvent("GET", "/search").queryParams().render();
+ const result = await handler(event);
+ expect(result.statusCode).to.eq(200);
+ expect(result).to.have.header(
+ "content-type",
+ /application\/json;.*charset=UTF-8/
+ );
+ const resultBody = JSON.parse(result.body);
+ expect(resultBody.pagination.next_url).not.null;
+ expect(resultBody.pagination.current_page).to.eq(1);
+ });
+
+ it("Errors on invalid searchToken", async () => {
+ const event = helpers
+ .mockEvent("GET", "/search")
+ .queryParams({ searchToken: "Ceci n'est pas une searchToken" })
+ .render();
+ const result = await handler(event);
+ expect(result.statusCode).to.eq(400);
+ const resultBody = JSON.parse(result.body);
+ expect(resultBody.message).to.eq("searchToken is invalid");
+ });
+
+ it("performs a search using a searchToken and page number", async () => {
+ mock
+ .post("/dc-v2-work/_search", authQuery)
+ .reply(200, helpers.testFixture("mocks/search.json"));
+
+ const event = helpers
+ .mockEvent("GET", "/search")
+ .queryParams({ searchToken, page: 1 })
+ .render();
+ const result = await handler(event);
+ expect(result.statusCode).to.eq(200);
+ expect(result).to.have.header(
+ "content-type",
+ /application\/json;.*charset=UTF-8/
+ );
+ });
+
+ it("defaults to page 1", async () => {
+ mock
+ .post("/dc-v2-work/_search", authQuery)
+ .reply(200, helpers.testFixture("mocks/search.json"));
+
+ const event = helpers
+ .mockEvent("GET", "/search")
+ .queryParams({ searchToken })
+ .render();
+ const result = await handler(event);
+ expect(result.statusCode).to.eq(200);
+ expect(result).to.have.header(
+ "content-type",
+ /application\/json;.*charset=UTF-8/
+ );
+ });
+
+ it("will return a IIIF collection", async () => {
+ const originalQuery = {
+ query: { query_string: { query: "*" } },
+ };
+ const authQuery = new RequestPipeline(originalQuery)
+ .authFilter()
+ .toJson();
+
+ mock
+ .post("/dc-v2-work/_search", authQuery)
+ .reply(200, helpers.testFixture("mocks/search.json"));
+
+ const event = helpers
+ .mockEvent("GET", "/search")
+ .queryParams({ as: "iiif" })
+ .render();
+ const result = await handler(event);
+ expect(result.statusCode).to.eq(200);
+ expect(result).to.have.header(
+ "content-type",
+ /application\/json;.*charset=UTF-8/
+ );
+ const resultBody = JSON.parse(result.body);
+ expect(resultBody.type).to.eq("Collection");
+ });
+
+ it("allows sorting via query string parameters", async () => {
+ const originalQuery = {
+ query: { query_string: { query: "*" } },
+ sort: [{ create_date: "asc" }, { modified_date: "desc" }],
+ };
+ const authQuery = new RequestPipeline(originalQuery)
+ .authFilter()
+ .toJson();
+
+ mock
+ .post("/dc-v2-work/_search", authQuery)
+ .reply(200, helpers.testFixture("mocks/search.json"));
+
+ const event = helpers
+ .mockEvent("GET", "/search")
+ .queryParams({ sort: "create_date:asc,modified_date:desc" })
+ .render();
+ const result = await handler(event);
+ expect(result.statusCode).to.eq(200);
+ const resultBody = JSON.parse(result.body);
+ expect(resultBody.pagination.query_url).to.contain(
+ "?sort=create_date%3Aasc%2Cmodified_date%3Adesc"
+ );
+ });
+ });
+});
diff --git a/test/test-helpers/event-builder.js b/test/test-helpers/event-builder.js
new file mode 100644
index 00000000..aa94f992
--- /dev/null
+++ b/test/test-helpers/event-builder.js
@@ -0,0 +1,123 @@
+const sortJson = require("sort-json");
+
+module.exports = class {
+ constructor(method, route) {
+ const now = new Date();
+ this._method = method;
+ this._route = route;
+ this._event = {
+ version: "2.0",
+ routeKey: `${method} ${route}`,
+ rawPath: `/v2/${route}`,
+ rawQueryString: "",
+ headers: {
+ Host: "api.test.library.northwestern.edu",
+ "X-Forwarded-For": "10.9.8.7, 10.6.5.4",
+ "X-Forwarded-Port": "443",
+ "X-Forwarded-Proto": "https",
+ },
+ requestContext: {
+ accountId: "123456789012",
+ apiId: "pewpew",
+ domainName: "api.test.library.northwestern.edu",
+ domainPrefix: "api",
+ http: {
+ method: method,
+ path: `/v2/${route}`,
+ protocol: "HTTP/1.1",
+ sourceIp: "10.9.8.7",
+ userAgent: "Mocha Test",
+ },
+ requestId: "id",
+ routeKey: `${method} ${route}`,
+ stage: "v2",
+ time: now.toISOString(),
+ timeEpoch: Number(now),
+ },
+ body: "",
+ stageVariables: { basePath: "api/v2" },
+ isBase64Encoded: false,
+ };
+ }
+
+ body(body) {
+ switch (typeof body) {
+ case "string":
+ this._event.body = body;
+ break;
+ case "undefined":
+ this._event.body = "";
+ break;
+ case "object":
+ this._event.body = JSON.stringify(body);
+ break;
+ }
+ return this;
+ }
+
+ headers(headers) {
+ Object.assign(this._event.headers, headers);
+ return this;
+ }
+
+ pathParams(params) {
+ this._pathParams = params;
+ return this;
+ }
+
+ queryParams(params) {
+ this._queryParams = params;
+ return this;
+ }
+
+ stageVariables(vars) {
+ this._event.stageVariables = vars;
+ return this;
+ }
+
+ base64Encode() {
+ this._base64Encode = true;
+ return this;
+ }
+
+ cookie(name, value) {
+ if (!this._event.cookies) this._event.cookies = [];
+ this._event.cookies.push(`${name}=${encodeURIComponent(value)}`);
+ return this;
+ }
+
+ render() {
+ const result = { ...this._event };
+
+ if (this._base64Encode) {
+ result.isBase64Encoded = true;
+ result.body = Buffer.from(result.body, "utf8").toString("base64");
+ }
+
+ const cookies = result.headers.cookie || result.headers.Cookie;
+ if (cookies) {
+ result.cookies = cookies.split(/;\s*/);
+ }
+
+ result.requestContext.http.path = result.rawPath;
+
+ if (this._pathParams) {
+ result.pathParameters = { ...this._pathParams };
+ for (const param in result.pathParameters) {
+ result.rawPath = result.rawPath.replace(
+ `{${param}}`,
+ result.pathParameters[param]
+ );
+ }
+ }
+
+ if (this._queryParams) {
+ result.queryStringParameters = { ...this._queryParams };
+ result.rawQueryString = new URLSearchParams(
+ result.queryStringParameters
+ ).toString();
+ }
+
+ return sortJson(result);
+ }
+};
diff --git a/test/test-helpers/index.js b/test/test-helpers/index.js
new file mode 100644
index 00000000..68a19cb8
--- /dev/null
+++ b/test/test-helpers/index.js
@@ -0,0 +1,53 @@
+const fs = require("fs");
+const nock = require("nock");
+const path = require("path");
+const EventBuilder = require("./event-builder.js");
+
+function saveEnvironment() {
+ const env = Object.assign({}, process.env);
+
+ beforeEach(function () {
+ process.env.DC_URL = "https://thisisafakedcurl";
+ process.env.DC_API_ENDPOINT = "https://thisisafakeapiurl";
+ });
+
+ afterEach(function () {
+ process.env = env;
+ });
+}
+
+function mockEvent(method, route) {
+ return new EventBuilder(method, route);
+}
+
+function mockIndex() {
+ const mock = nock("https://index.test.library.northwestern.edu");
+
+ beforeEach(function () {
+ process.env.ELASTICSEARCH_ENDPOINT = "index.test.library.northwestern.edu";
+ });
+
+ afterEach(function () {
+ mock.removeAllListeners();
+ });
+
+ return mock;
+}
+
+function encodedFixture(file) {
+ const content = testFixture(file);
+ return new Buffer.from(content).toString("base64");
+}
+
+function testFixture(file) {
+ const fixtureFile = path.join("test/fixtures", file);
+ return fs.readFileSync(fixtureFile);
+}
+
+global.helpers = {
+ saveEnvironment,
+ mockEvent,
+ mockIndex,
+ encodedFixture,
+ testFixture,
+};
diff --git a/test/unit/api/helpers.test.js b/test/unit/api/helpers.test.js
new file mode 100644
index 00000000..b73a4545
--- /dev/null
+++ b/test/unit/api/helpers.test.js
@@ -0,0 +1,213 @@
+"use strict";
+
+const {
+ baseUrl,
+ decodeEventBody,
+ isFromReadingRoom,
+ normalizeHeaders,
+ objectifyCookies,
+ stubEventMembers,
+} = require("../../../src/helpers");
+const chai = require("chai");
+const expect = chai.expect;
+
+describe("helpers", () => {
+ describe("baseUrl()", () => {
+ it("extracts the base URL from a local event", () => {
+ const event = {
+ routeKey: "GET /route/{param}",
+ rawPath: "/route/value",
+ headers: {
+ host: "localhost",
+ "x-forwarded-proto": "http",
+ "x-forwarded-port": "3000",
+ },
+ requestContext: {
+ domainName: "localhost",
+ domainPrefix: "localhost",
+ stage: "v2",
+ },
+ };
+
+ expect(baseUrl(event)).to.eq("http://localhost:3000/");
+ });
+
+ it("extracts the base URL from an API Gateway event", () => {
+ const event = {
+ routeKey: "GET /route/{param}",
+ rawPath: "/api/v2/route/value",
+ headers: {
+ host: "abcdefghijz.execute-api.us-east-1.amazonaws.com",
+ "x-forwarded-proto": "https",
+ "x-forwarded-port": "443",
+ },
+ requestContext: {
+ domainName: "abcdefghijz.execute-api.us-east-1.amazonaws.com",
+ domainPrefix: "abcdefghijz",
+ stage: "v2",
+ },
+ stageVariables: "api/v2",
+ };
+
+ expect(baseUrl(event)).to.eq(
+ "https://abcdefghijz.execute-api.us-east-1.amazonaws.com/api/v2/"
+ );
+ });
+
+ it("extracts the base URL from a CloudWatch event", () => {
+ const event = {
+ routeKey: "GET /route/{param}",
+ rawPath: "/route/value",
+ headers: {
+ host: "abcdefghijz.cloudfront.net",
+ "x-forwarded-proto": "https",
+ "x-forwarded-port": "443",
+ },
+ requestContext: {
+ domainName: "abcdefghijz.cloudfront.net",
+ domainPrefix: "abcdefghijz",
+ stage: "v2",
+ },
+ };
+
+ expect(baseUrl(event)).to.eq("https://abcdefghijz.cloudfront.net/");
+ });
+
+ it("extracts the base URL from an event with a custom domain", () => {
+ const event = {
+ routeKey: "GET /route/{param}",
+ rawPath: "/route/value",
+ headers: {
+ host: "api.test.library.northwestern.edu",
+ "x-forwarded-proto": "https",
+ "x-forwarded-port": "443",
+ },
+ requestContext: {
+ domainName: "api.test.library.northwestern.edu",
+ domainPrefix: "api",
+ stage: "v2",
+ },
+ };
+
+ expect(baseUrl(event)).to.eq(
+ "https://api.test.library.northwestern.edu/"
+ );
+ });
+
+ it("prefers a custom domain over localhost", () => {
+ const event = {
+ routeKey: "GET /route/{param}",
+ rawPath: "/route/value",
+ headers: {
+ host: "localhost",
+ "x-forwarded-proto": "http",
+ "x-forwarded-port": "3000",
+ },
+ requestContext: {
+ domainName: "api.test.library.northwestern.edu",
+ domainPrefix: "api",
+ stage: "v2",
+ },
+ };
+
+ expect(baseUrl(event)).to.eq(
+ "http://api.test.library.northwestern.edu:3000/"
+ );
+ });
+
+ it("properly handles a base path mapping", () => {
+ const event = helpers
+ .mockEvent("GET", "/works/{id}")
+ .pathParams({ id: 1234 })
+ .stageVariables({ basePath: "api/v2" })
+ .render();
+
+ expect(baseUrl(event)).to.eq(
+ "https://api.test.library.northwestern.edu/api/v2/"
+ );
+ });
+ });
+
+ describe("decodeEventBody()", () => {
+ it("passes plain text body through unaltered", () => {
+ const event = helpers
+ .mockEvent("POST", "/search")
+ .body("plain body")
+ .render();
+ const result = decodeEventBody(event);
+ expect(result.isBase64Encoded).to.be.false;
+ expect(result.body).to.eq("plain body");
+ });
+
+ it("decodes base64 encoded body", () => {
+ const event = helpers
+ .mockEvent("POST", "/search")
+ .body("encoded body")
+ .base64Encode()
+ .render();
+ expect(event.isBase64Encoded).to.be.true;
+ expect(event.body).not.to.eq("encoded body");
+
+ const result = decodeEventBody(event);
+ expect(result.isBase64Encoded).to.be.false;
+ expect(result.body).to.eq("encoded body");
+ });
+ });
+
+ describe("isFromReadingRoom()", () => {
+ helpers.saveEnvironment();
+
+ it("knows when a request is coming from a reading room IP", () => {
+ const event = helpers.mockEvent("GET", "/search").render();
+ expect(isFromReadingRoom(event)).to.be.false;
+ process.env.READING_ROOM_IPS = event.requestContext.http.sourceIp;
+ expect(isFromReadingRoom(event)).to.be.true;
+ });
+ });
+
+ describe("normalizeHeaders()", () => {
+ it("converts all headers to lowercase", () => {
+ const upperHeaders = ["Host", "X-Forwarded-For", "X-Forwarded-Proto"];
+ const lowerHeaders = ["host", "x-forwarded-for", "x-forwarded-proto"];
+
+ const event = helpers.mockEvent("GET", "/search").render();
+ expect(event.headers).not.to.include.keys(lowerHeaders);
+ expect(event.headers).to.include.keys(upperHeaders);
+
+ const result = normalizeHeaders(event);
+ expect(result.headers).to.include.keys(lowerHeaders);
+ expect(result.headers).not.to.include.keys(upperHeaders);
+ });
+ });
+
+ describe("objectifyCookies", () => {
+ it("works when there are no cookies", () => {
+ const event = helpers.mockEvent("GET", "/search").render();
+ const result = objectifyCookies(event);
+ expect(result.cookies).to.be.undefined;
+ expect(result.cookieObject).to.be.empty;
+ });
+
+ it("works when there are cookies", () => {
+ const event = helpers
+ .mockEvent("GET", "/search")
+ .cookie("testName", "works when there are cookies")
+ .cookie("cookieType", "snickerdoodle")
+ .render();
+ const result = objectifyCookies(event);
+ expect(result.cookieObject).to.include({
+ testName: "works%20when%20there%20are%20cookies",
+ cookieType: "snickerdoodle",
+ });
+ });
+ });
+
+ describe("stubEventMembers", () => {
+ it("makes sure the event has all expected members", () => {
+ const result = stubEventMembers({});
+ expect(result.cookies).to.eql([]);
+ expect(result.pathParameters).to.eql({});
+ expect(result.queryStringParameters).to.eql({});
+ });
+ });
+});
diff --git a/test/unit/api/opensearch.test.js b/test/unit/api/opensearch.test.js
new file mode 100644
index 00000000..f9b1f7ee
--- /dev/null
+++ b/test/unit/api/opensearch.test.js
@@ -0,0 +1,113 @@
+"use strict";
+
+const opensearch = require("../../../src/api/opensearch");
+const chai = require("chai");
+const expect = chai.expect;
+
+describe("getWork()", function () {
+ helpers.saveEnvironment();
+ const mock = helpers.mockIndex();
+
+ it("gets a work by its id", async function () {
+ mock
+ .get("/dc-v2-work/_doc/1234")
+ .reply(200, helpers.testFixture("mocks/work-1234.json"));
+
+ const result = await opensearch.getWork("1234");
+ const body = JSON.parse(result.body);
+ expect(result.statusCode).to.eq(200);
+ expect(body._source.api_model).to.eq("Work");
+ });
+
+ it("returns 404 Not Found for unpublished works", async function () {
+ mock
+ .get("/dc-v2-work/_doc/1234")
+ .reply(200, helpers.testFixture("mocks/unpublished-work-1234.json"));
+
+ const result = await opensearch.getWork("1234");
+ const body = JSON.parse(result.body);
+ expect(result.statusCode).to.eq(404);
+ expect(body.found).to.be.false;
+ });
+
+ it("returns 404 Not Found for missing documents", async function () {
+ mock
+ .get("/dc-v2-work/_doc/1234")
+ .reply(404, helpers.testFixture("mocks/missing-work-1234.json"));
+
+ const result = await opensearch.getWork("1234");
+ const body = JSON.parse(result.body);
+ expect(result.statusCode).to.eq(404);
+ expect(body.found).to.be.false;
+ });
+});
+
+describe("getFileSet()", function () {
+ helpers.saveEnvironment();
+ const mock = helpers.mockIndex();
+
+ it("gets a fileset by its id", async function () {
+ mock
+ .get("/dc-v2-file-set/_doc/1234")
+ .reply(200, helpers.testFixture("mocks/fileset-1234.json"));
+
+ const result = await opensearch.getFileSet("1234");
+ const body = JSON.parse(result.body);
+ expect(result.statusCode).to.eq(200);
+ expect(body._source.api_model).to.eq("FileSet");
+ });
+});
+
+describe("getCollection()", function () {
+ helpers.saveEnvironment();
+ const mock = helpers.mockIndex();
+
+ it("gets a collection by its id", async function () {
+ mock
+ .get("/dc-v2-collection/_doc/1234")
+ .reply(200, helpers.testFixture("mocks/collection-1234.json"));
+
+ const result = await opensearch.getCollection("1234");
+ const body = JSON.parse(result.body);
+ expect(result.statusCode).to.eq(200);
+ expect(body._source.api_model).to.eq("Collection");
+ });
+});
+
+describe("search()", function () {
+ helpers.saveEnvironment();
+ const mock = helpers.mockIndex();
+
+ it("performs searches", async function () {
+ mock
+ .post("/dc-v2-work/_search", "{ query: { match_all: {} } }")
+ .reply(200, helpers.testFixture("mocks/search.json"));
+
+ const result = await opensearch.search(
+ "dc-v2-work",
+ "{ query: { match_all: {} } }"
+ );
+ const body = JSON.parse(result.body);
+ expect(result.statusCode).to.eq(200);
+ expect(body.hits.hits.length).to.eq(10);
+ expect(body.hits.total.value).to.eq(4199);
+ });
+
+ it("can search multiple targets", async function () {
+ mock
+ .post(
+ "/dc-v2-work,dc-v2-collection/_search",
+ "{ query: { match_all: {} } }"
+ )
+ .reply(200, helpers.testFixture("mocks/search-multiple-targets.json"));
+
+ const result = await opensearch.search(
+ "dc-v2-work,dc-v2-collection",
+ "{ query: { match_all: {} } }"
+ );
+ const body = JSON.parse(result.body);
+ expect(result.statusCode).to.eq(200);
+ expect(body.hits.hits.length).to.eq(10);
+ expect(body.hits.total.value).to.eq(4331);
+ });
+});
diff --git a/test/unit/api/pagination.test.js b/test/unit/api/pagination.test.js
new file mode 100644
index 00000000..23199a67
--- /dev/null
+++ b/test/unit/api/pagination.test.js
@@ -0,0 +1,89 @@
+"use strict";
+
+const { decodeSearchToken, Paginator } = require("../../../src/api/pagination");
+const chai = require("chai");
+const expect = chai.expect;
+
+describe("Paginator", function () {
+ const requestBody = {
+ query: { match_all: {} },
+ size: 50,
+ sort: [{ create_date: "asc" }],
+ _source: ["id", "title", "collection"],
+ aggs: { collection: { terms: { field: "contributor.label", size: 10 } } },
+ };
+
+ let pager;
+
+ this.beforeEach(() => {
+ pager = new Paginator(
+ "https://api.test.library.northwestern.edu/api/v2/",
+ "search",
+ ["works"],
+ requestBody
+ );
+ });
+
+ it("produces page 1 pagination", async () => {
+ let result = await pager.pageInfo(1275);
+ expect(result.current_page).to.eq(1);
+ expect(result.offset).to.eq(0);
+ expect(result.limit).to.eq(50);
+ expect(result.total_hits).to.eq(1275);
+ expect(result.total_pages).to.eq(26);
+ expect(result.prev_url).to.be.undefined;
+
+ let url = new URL(result.next_url);
+ expect(url.host).to.eq("api.test.library.northwestern.edu");
+ expect(url.pathname).to.eq("/api/v2/search");
+ expect(url.searchParams.get("page")).to.eq("2");
+ });
+
+ it("produces additional page pagination", async () => {
+ pager.body.from = 100;
+ let result = await pager.pageInfo(1275);
+ expect(result.current_page).to.eq(3);
+ expect(new URL(result.prev_url).searchParams.get("page")).to.eq("2");
+ expect(new URL(result.next_url).searchParams.get("page")).to.eq("4");
+ expect(requestBody.from).to.be.undefined;
+ });
+
+ it("produces last page pagination", async () => {
+ pager.body.from = 1270;
+ const result = await pager.pageInfo(1275);
+ expect(result.next_url).to.be.undefined;
+ });
+
+ it("produces a usable token", async () => {
+ pager.body.from = 100;
+ const result = await pager.pageInfo(1275);
+ const token = new URL(result.query_url).searchParams.get("searchToken");
+ const rehydrated = await decodeSearchToken(token);
+
+ expect(rehydrated.models).to.include.members(["works"]);
+ for (const field of ["query", "size", "sort", "_source"]) {
+ expect(rehydrated.body[field]).to.deep.equal(requestBody[field]);
+ }
+ expect(rehydrated.body).not.to.include.keys(["aggs", "from"]);
+ });
+
+ it("correctly sets the default size", async () => {
+ delete pager.body.size;
+ const result = await pager.pageInfo(1275);
+ expect(result.limit).to.eq(10);
+ });
+
+ it("excludes searchToken when required", async () => {
+ pager.options = { includeToken: false };
+ const result = await pager.pageInfo(1275);
+ const url = new URL(result.query_url);
+ expect(url.searchParams.has("searchToken")).to.be.false;
+ });
+
+ it("includes extra parameters", async () => {
+ pager.options = { queryStringParameters: { size: 5 } };
+ const result = await pager.pageInfo(1275);
+ const url = new URL(result.query_url);
+ expect(url.searchParams.get("size")).to.eq("5");
+ });
+});
diff --git a/test/unit/api/request/models.test.js b/test/unit/api/request/models.test.js
new file mode 100644
index 00000000..59d9774b
--- /dev/null
+++ b/test/unit/api/request/models.test.js
@@ -0,0 +1,29 @@
+"use strict";
+
+const models = require("../../../../src/api/request/models");
+const chai = require("chai");
+const expect = chai.expect;
+
+describe("models", () => {
+ helpers.saveEnvironment();
+
+ it("knows valid models", () => {
+ expect(models.validModels(["collections", "file-sets", "works"])).to.be
+ .true;
+ });
+
+ it("detects invalid models", () => {
+ expect(models.validModels(["works", "foo"])).to.be.false;
+ });
+
+ it("maps models to targets", () => {
+ let result = models.modelsToTargets(["collections", "file-sets", "works"]);
+ expect(result).to.eq("dc-v2-collection,dc-v2-file-set,dc-v2-work");
+
+ process.env.ENV_PREFIX = "pre";
+ result = models.modelsToTargets(["collections", "file-sets", "works"]);
+ expect(result).to.eq(
+ "pre-dc-v2-collection,pre-dc-v2-file-set,pre-dc-v2-work"
+ );
+ });
+});
diff --git a/test/unit/api/request/pipeline.test.js b/test/unit/api/request/pipeline.test.js
new file mode 100644
index 00000000..5461c755
--- /dev/null
+++ b/test/unit/api/request/pipeline.test.js
@@ -0,0 +1,69 @@
+"use strict";
+
+const RequestPipeline = require("../../../../src/api/request/pipeline");
+const chai = require("chai");
+const expect = chai.expect;
+
+describe("RequestPipeline", () => {
+ helpers.saveEnvironment();
+
+ const event = helpers.mockEvent("GET", "/search").render();
+
+ const requestBody = {
+ query: { match: { term: { title: "The Title" } } },
+ size: 50,
+ from: 0,
+ sort: [{ create_date: "asc" }],
+ _source: ["id", "title", "collection"],
+ aggs: { collection: { terms: { field: "contributor.label", size: 10 } } },
+ };
+
+ let pipeline;
+ beforeEach(() => {
+ pipeline = new RequestPipeline(requestBody);
+ });
+
+ it("adds an auth filter", () => {
+ const result = pipeline.authFilter(event);
+ expect(result.searchContext.size).to.eq(50);
+ expect(result.searchContext.query.bool.must).to.include(requestBody.query);
+ expect(result.searchContext.query.bool.must_not).to.deep.include(
+ { term: { visibility: "Private" } },
+ { term: { published: false } }
+ );
+ });
+
+ it("serializes JSON", () => {
+ expect(JSON.parse(pipeline.toJson())).to.deep.equal(requestBody);
+ });
+
+ describe("reading room IPs", () => {
+ it("filters out private results by default", () => {
+ process.env.READING_ROOM_IPS = "192.168.0.1,172.16.10.2";
+ const result = pipeline.authFilter(event);
+ expect(result.searchContext.size).to.eq(50);
+ expect(result.searchContext.query.bool.must).to.include(
+ requestBody.query
+ );
+ expect(result.searchContext.query.bool.must_not).to.deep.include(
+ { term: { visibility: "Private" } },
+ { term: { published: false } }
+ );
+ });
+
+ it("includes private results from allowed IP addresses", () => {
+ process.env.READING_ROOM_IPS = "10.9.8.7,192.168.0.1";
+ const result = pipeline.authFilter(event);
+ expect(result.searchContext.size).to.eq(50);
+ expect(result.searchContext.query.bool.must).to.include(
+ requestBody.query
+ );
+ expect(result.searchContext.query.bool.must_not).to.deep.include({
+ term: { published: false },
+ });
+ expect(result.searchContext.query.bool.must_not).not.to.deep.include({
+ term: { visibility: "Private" },
+ });
+ });
+ });
+});
diff --git a/test/unit/api/response/iiif/collection.test.js b/test/unit/api/response/iiif/collection.test.js
new file mode 100644
index 00000000..9512420a
--- /dev/null
+++ b/test/unit/api/response/iiif/collection.test.js
@@ -0,0 +1,54 @@
+"use strict";
+
+const transformer = require("../../../../../src/api/response/iiif/collection");
+const { Paginator } = require("../../../../../src/api/pagination");
+const chai = require("chai");
+const expect = chai.expect;
+
+describe("IIIF Collection response transformer", () => {
+ let pager;
+ beforeEach(() => {
+ pager = new Paginator(
+ "http://dcapi.library.northwestern.edu/api/v2/",
+ "search",
+ ["works"],
+ { query: { query_string: { query: "genre.label:architecture" } } },
+ "iiif",
+ {
+ includeToken: false,
+ queryStringParameters: {
+ collectionLabel: "The collection label",
+ collectionSummary: "The collection Summary",
+ query: "genre.label:architecture",
+ },
+ }
+ );
+ });
+
+ it("transforms a search response", async () => {
+ const response = {
+ statusCode: 200,
+ body: helpers.testFixture("mocks/search.json"),
+ };
+ const result = await transformer.transform(response, pager);
+ expect(result.statusCode).to.eq(200);
+
+ const body = JSON.parse(result.body);
+ expect(body.type).to.eq("Collection");
+ expect(body.label.none[0]).to.eq("The collection label");
+ });
+
+ it("transforms an error response", async () => {
+ const response = {
+ statusCode: 404,
+ body: helpers.testFixture("mocks/missing-index.json"),
+ };
+
+ const result = await transformer.transform(response, pager);
+ expect(result.statusCode).to.eq(404);
+
+ const body = JSON.parse(result.body);
+ expect(body.status).to.eq(404);
+ expect(body.error).to.be.a("string");
+ });
+});
diff --git a/test/unit/api/response/iiif/manifest.test.js b/test/unit/api/response/iiif/manifest.test.js
new file mode 100644
index 00000000..b91b0499
--- /dev/null
+++ b/test/unit/api/response/iiif/manifest.test.js
@@ -0,0 +1,185 @@
+"use strict";
+
+const transformer = require("../../../../../src/api/response/iiif/manifest");
+const chai = require("chai");
+const expect = chai.expect;
+const { dcApiEndpoint, dcUrl } = require("../../../../../src/aws/environment");
+
+describe("Image Work as IIIF Manifest response transformer", () => {
+ function getMetadataValueByLabel(metadataArray, targetLabel) {
+ const foundObj = metadataArray.find(
+ (item) => item.label.none[0] === targetLabel
+ );
+ return foundObj ? foundObj.value.none : undefined;
+ }
+
+ async function setup() {
+ const response = {
+ statusCode: 200,
+ body: helpers.testFixture("mocks/work-1234.json"),
+ };
+ const source = JSON.parse(response.body)._source;
+
+ const result = await transformer.transform(response);
+ expect(result.statusCode).to.eq(200);
+
+ return { source, manifest: JSON.parse(result.body) };
+ }
+
+ it("transforms an Image work response to minimal Manifest", async () => {
+ const { manifest } = await setup();
+ expect(manifest.type).to.eq("Manifest");
+ });
+
+ it("populates Manifest label", async () => {
+ const { source, manifest } = await setup();
+ expect(manifest.label.none[0]).to.eq(source.title);
+ });
+
+ it("populates Manifest summary", async () => {
+ const { source, manifest } = await setup();
+ expect(manifest.summary.none[0]).to.eq(source.description[0]);
+ });
+
+ it("populates Manifest metadata", async () => {
+ const { source, manifest } = await setup();
+ expect(
+ getMetadataValueByLabel(manifest.metadata, "Alternate Title")[0]
+ ).to.eq(source.alternate_title[0]);
+ expect(getMetadataValueByLabel(manifest.metadata, "Abstract")).to.be
+ .undefined;
+ });
+
+ it("populates Manifest requiredStatement", async () => {
+ const { source, manifest } = await setup();
+ expect(manifest.requiredStatement.label.none[0]).to.eq("Attribution");
+ expect(manifest.requiredStatement.value.none[0]).to.eq(
+ "Courtesy of Northwestern University Libraries"
+ );
+ expect(manifest.requiredStatement.value.none.includes(source.terms_of_use))
+ .to.be.true;
+ });
+
+ it("populates Manifest rights", async () => {
+ const { source, manifest } = await setup();
+ expect(manifest.rights).to.eq(source.rights_statement.id);
+ });
+
+ it("populates Manifest thumbnail", async () => {
+ const { source, manifest } = await setup();
+ expect(manifest.thumbnail[0].id).to.eq(source.thumbnail);
+ });
+
+ it("populates Manifest seeAlso", async () => {
+ const { source, manifest } = await setup();
+ expect(manifest.seeAlso[0].id).to.eq(source.api_link);
+ expect(manifest.seeAlso[0].type).to.eq("Dataset");
+ expect(manifest.seeAlso[0].format).to.eq("application/json");
+ expect(manifest.seeAlso[0].label.none[0]).to.eq(
+ "Northwestern University Libraries Digital Collections API"
+ );
+ });
+
+ it("populates Manifest homepage", async () => {
+ const { source, manifest } = await setup();
+ expect(manifest.homepage[0].id).to.eq(`${dcUrl()}/items/${source.id}`);
+ expect(manifest.homepage[0].label.none[0]).to.eq(
+ "Homepage at Northwestern University Libraries Digital Collections"
+ );
+ });
+
+ it("populates Manifest partOf", async () => {
+ const { source, manifest } = await setup();
+ const partOf = manifest.partOf[0];
+ expect(partOf.id).to.eq(
+ `${dcApiEndpoint()}/collections/${source.collection.id}?as=iiif`
+ );
+ expect(partOf.type).to.eq("Collection");
+ expect(partOf.label.none).to.be.an("array").that.is.not.empty;
+ expect(partOf.summary.none).to.be.an("array").that.is.not.empty;
+ });
+
+ it("populates Manifest items (canvases)", async () => {
+ const { source, manifest } = await setup();
+ expect(manifest.items.length).to.eq(3);
+ manifest.items.forEach((canvas) => {
+ expect(canvas.type).to.eq("Canvas");
+ });
+ expect(manifest.items[0].width).to.eq(source.file_sets[0].width);
+ expect(manifest.items[0].height).to.eq(source.file_sets[0].height);
+ expect(manifest.items[0].label.none[0]).to.eq(source.file_sets[0].label);
+ expect(manifest.items[0].thumbnail[0].id).contains(
+ source.file_sets[0].representative_image_url
+ );
+ });
+
+ it("excludes Preservation and Supplemental filesets", async () => {
+ const { source, manifest } = await setup();
+ manifest.items.forEach((canvas) => {
+ expect(canvas.id).not.contains(["preservation", "supplemental"]);
+ });
+ });
+
+ it("populates Annotation (painting) for Image fileset", async () => {
+ const { source, manifest } = await setup();
+ const annotation = manifest.items[0].items[0].items[0];
+ expect(annotation.type).to.eq("Annotation");
+ expect(annotation.motivation).to.eq("painting");
+ expect(annotation.target).to.eq(manifest.items[0].id);
+ expect(annotation.body.id).contains(
+ source.file_sets[0].representative_image_url
+ );
+ expect(annotation.body.format).to.eq(source.file_sets[0].mime_type);
+ expect(annotation.body.type).to.eq("Image");
+ expect(annotation.body.width).to.eq(source.file_sets[0].width);
+ expect(annotation.body.height).to.eq(source.file_sets[0].height);
+ expect(annotation.body.service[0]["@id"]).to.eq(
+ source.file_sets[0].representative_image_url
+ );
+ });
+});
+
+describe("A/V Work as IIIF Manifest response transformer", () => {
+ async function setup() {
+ const response = {
+ statusCode: 200,
+ body: helpers.testFixture("mocks/work-video-5678.json"),
+ };
+ const source = JSON.parse(response.body)._source;
+
+ const result = await transformer.transform(response);
+ expect(result.statusCode).to.eq(200);
+
+ return { source, manifest: JSON.parse(result.body) };
+ }
+
+ it("transforms a Video work response to minimal Manifest", async () => {
+ const { manifest } = await setup();
+ expect(manifest.type).to.eq("Manifest");
+ });
+
+ it("renders duration on AV canvases", async () => {
+ const { manifest } = await setup();
+ expect(manifest.items[0].duration).to.eq(5.599);
+ });
+
+ it("renders annotation for type: Sound and Video ", async () => {
+ const { source, manifest } = await setup();
+ const annotation = manifest.items[0].items[0].items[0];
+
+ expect(annotation.body.duration).to.eq(5.599);
+ expect(annotation.body.type).to.eq("Video");
+ expect(annotation.body.id).to.eq(source.file_sets[0].streaming_url);
+ });
+});
+
+describe("404 network response", () => {
+ it("returns as expected", async () => {
+ const response = {
+ statusCode: 404,
+ body: helpers.testFixture("mocks/missing-work-1234.json"),
+ };
+ const result = await transformer.transform(response);
+ expect(result.statusCode).to.eq(404);
+ });
+});
diff --git a/test/unit/api/response/iiif/presentation-api/items.test.js b/test/unit/api/response/iiif/presentation-api/items.test.js
new file mode 100644
index 00000000..dffecc29
--- /dev/null
+++ b/test/unit/api/response/iiif/presentation-api/items.test.js
@@ -0,0 +1,104 @@
+"use strict";
+
+const items = require("../../../../../../src/api/response/iiif/presentation-api/items");
+const chai = require("chai");
+const expect = chai.expect;
+
+describe("IIIF response presentation API items helpers", () => {
+ const accessImage = {
+ duration: null,
+ height: 3024,
+ id: "076dcbd8-8c57-40e8-bdf7-dc9153c87a36",
+ label: "Access File - Tiff",
+ mime_type: "image/tiff",
+ original_filename: "Squirrel.tif",
+ poster_offset: null,
+ rank: 0,
+ representative_image_url:
+ "https://iiif.stack.rdc-staging.library.northwestern.edu/iiif/2/076dcbd8-8c57-40e8-bdf7-dc9153c87a36",
+ role: "Access",
+ streaming_url: null,
+ webvtt: null,
+ width: 4032,
+ };
+
+ // const accessAudio = {
+ // duration: null,
+ // height: 3024,
+ // id: "076dcbd8-8c57-40e8-bdf7-dc9153c87a36",
+ // label: "Access File - Tiff",
+ // mime_type: "image/tiff",
+ // original_filename: "Squirrel.tif",
+ // poster_offset: null,
+ // rank: 0,
+ // representative_image_url:
+ // "https://iiif.stack.rdc-staging.library.northwestern.edu/iiif/2/076dcbd8-8c57-40e8-bdf7-dc9153c87a36",
+ // role: "Access",
+ // streaming_url: null,
+ // webvtt: null,
+ // width: 4032,
+ // };
+
+ it("annotationType(workType)", () => {
+ expect(items.annotationType("Audio")).to.eq("Sound");
+ expect(items.annotationType("Image")).to.eq("Image");
+ expect(items.annotationType("Video")).to.eq("Video");
+ });
+
+ it("buildAnnotationBody(fileSet, workType)", () => {
+ const body = items.buildAnnotationBody(accessImage, "Image");
+
+ expect(body.id).contains(accessImage.representative_image_url);
+ expect(body.width).to.eq(accessImage.width);
+ expect(body.format).to.eq(accessImage.mime_type);
+ expect(body.service[0].id).to.eq(accessImage.representative_image_url);
+ });
+
+ it("buildAnnotationBody(fileSet, workType)", () => {
+ const bodyId = items.buildAnnotationBodyId(accessImage, "Image");
+
+ expect(bodyId).eq(
+ `${accessImage.representative_image_url}/full/600,/0/default.jpg`
+ );
+ });
+
+ it('buildImageResourceId(representativeImageUrl,size = "!300,300")', () => {
+ expect(
+ items.buildImageResourceId(accessImage.representative_image_url)
+ ).to.eq(
+ `${accessImage.representative_image_url}/full/!300,300/0/default.jpg`
+ );
+ expect(
+ items.buildImageResourceId(
+ accessImage.representative_image_url,
+ "1000,1000"
+ )
+ ).to.eq(
+ `${accessImage.representative_image_url}/full/1000,1000/0/default.jpg`
+ );
+ });
+
+ it("buildImageService(representativeImageUrl)", () => {
+ const imageService = items.buildImageService(
+ accessImage.representative_image_url
+ )[0];
+
+ expect(imageService.id).to.eq(accessImage.representative_image_url);
+ expect(imageService.profile).to.eq(
+ "http://iiif.io/api/image/2/level2.json"
+ );
+ expect(imageService.type).to.eq("ImageService2");
+ });
+
+ it("isAudioVideo(workType)", () => {
+ expect(items.isAudioVideo("Audio")).to.be.true;
+ expect(items.isAudioVideo("Image")).to.be.false;
+ expect(items.isAudioVideo("Video")).to.be.true;
+ });
+
+ it("isImage(workType)", () => {
+ expect(items.isImage("Audio")).to.be.false;
+ expect(items.isImage("Image")).to.be.true;
+ expect(items.isImage("Video")).to.be.false;
+ });
+});
diff --git a/test/unit/api/response/iiif/presentation-api/metadata.test.js b/test/unit/api/response/iiif/presentation-api/metadata.test.js
new file mode 100644
index 00000000..998a03bc
--- /dev/null
+++ b/test/unit/api/response/iiif/presentation-api/metadata.test.js
@@ -0,0 +1,33 @@
+"use strict";
+
+const {
+ formatSingleValuedField,
+ metadataLabelFields,
+} = require("../../../../../../src/api/response/iiif/presentation-api/metadata");
+const chai = require("chai");
+const expect = chai.expect;
+
+describe("IIIF response presentation API metadata helpers", () => {
+ const response = {
+ statusCode: 200,
+ body: helpers.testFixture("mocks/work-1234.json"),
+ };
+ const source = JSON.parse(response.body)._source;
+
+ it("formatSingleValuedField(value)", () => {
+ expect(formatSingleValuedField("This value."))
+ .to.be.an("array")
+ .that.does.include("This value.");
+ expect(formatSingleValuedField(null)).to.be.an("array").that.is.empty;
+ });
+
+ it("metadataLabelFields(source)", () => {
+ const metadata = metadataLabelFields(source);
+ expect(Array.isArray(metadata)).to.be;
+ expect(metadata.length).to.eq(28);
+ metadata.forEach((item) => {
+ expect(item.label).to.be.a("string");
+ expect(item.value).to.be.an("array");
+ });
+ });
+});
diff --git a/test/unit/api/response/opensearch.test.js b/test/unit/api/response/opensearch.test.js
new file mode 100644
index 00000000..a360a427
--- /dev/null
+++ b/test/unit/api/response/opensearch.test.js
@@ -0,0 +1,67 @@
+"use strict";
+
+const transformer = require("../../../../src/api/response/opensearch");
+const { Paginator } = require("../../../../src/api/pagination");
+const chai = require("chai");
+const expect = chai.expect;
+
+describe("OpenSearch response transformer", () => {
+ let pager;
+ beforeEach(() => {
+ pager = new Paginator(
+ "http://dcapi.library.northwestern.edu/v2/",
+ "search",
+ ["works"],
+ { query: { match_all: {} } }
+ );
+ });
+
+ it("transforms a doc response", async () => {
+ const response = {
+ statusCode: 200,
+ body: helpers.testFixture("mocks/work-1234.json"),
+ };
+ const result = await transformer.transform(response, pager);
+ expect(result.statusCode).to.eq(200);
+
+ const body = JSON.parse(result.body);
+ expect(body.data).to.be.an("object");
+ expect(body).not.to.include.key("pagination");
+ });
+
+ it("transforms a search response", async () => {
+ const response = {
+ statusCode: 200,
+ body: helpers.testFixture("mocks/search.json"),
+ };
+ const result = await transformer.transform(response, pager);
+ expect(result.statusCode).to.eq(200);
+
+ const body = JSON.parse(result.body);
+ expect(body.data).to.be.an("array");
+ expect(body).to.include.key("pagination");
+ expect(body.pagination).to.include.keys([
+ "query_url",
+ "current_page",
+ "limit",
+ "next_url",
+ "offset",
+ "total_hits",
+ "total_pages",
+ ]);
+ });
+
+ it("transforms an error response", async () => {
+ const response = {
+ statusCode: 404,
+ body: helpers.testFixture("mocks/missing-index.json"),
+ };
+
+ const result = await transformer.transform(response, pager);
+ expect(result.statusCode).to.eq(404);
+
+ const body = JSON.parse(result.body);
+ expect(body.status).to.eq(404);
+ expect(body.error).to.be.a("string");
+ });
+});
diff --git a/test/unit/aws/environment.test.js b/test/unit/aws/environment.test.js
new file mode 100644
index 00000000..8076a6de
--- /dev/null
+++ b/test/unit/aws/environment.test.js
@@ -0,0 +1,45 @@
+"use strict";
+
+const environment = require("../../../src/aws/environment");
+
+const chai = require("chai");
+const expect = chai.expect;
+
+describe("environment", function () {
+ helpers.saveEnvironment();
+
+ it("returns the index endpoint", function () {
+ process.env.ELASTICSEARCH_ENDPOINT = "index.test.library.northwestern.edu";
+ expect(environment.elasticsearchEndpoint()).to.eq(
+ "index.test.library.northwestern.edu"
+ );
+ });
+
+ it("correctly handles an environment prefix", function () {
+ process.env.ENV_PREFIX = "test-env";
+ expect(environment.prefix()).to.eq("test-env");
+ expect(environment.prefix("name")).to.eq("test-env-name");
+ });
+
+ it("correctly handles an empty environment prefix", function () {
+ process.env.ENV_PREFIX = "";
+ expect(environment.prefix()).to.eq("");
+ expect(environment.prefix("name")).to.eq("name");
+ });
+
+ it("correctly handles a missing environment prefix", function () {
+ delete process.env.ENV_PREFIX;
+ expect(environment.prefix()).to.eq("");
+ expect(environment.prefix("name")).to.eq("name");
+ });
+
+ it("returns the AWS region", function () {
+ process.env.AWS_REGION = "my-region-1";
+ expect(environment.region()).to.eq("my-region-1");
+ });
+
+ it("returns the default region", function () {
+ delete process.env.AWS_REGION;
+ expect(environment.region()).to.eq("us-east-1");
+ });
+});
diff --git a/test/unit/redirect.test.js b/test/unit/redirect.test.js
new file mode 100644
index 00000000..2a6ab0ce
--- /dev/null
+++ b/test/unit/redirect.test.js
@@ -0,0 +1,18 @@
+"use strict";
+
+const { handler } = require("../../redirect");
+
+const chai = require("chai");
+const expect = chai.expect;
+
+describe("redirect", function () {
+ helpers.saveEnvironment();
+
+ it("redirects unrecognized routes to the configured path", async () => {
+ process.env.REDIRECT_TO = "/redirect/target";
+ const event = helpers.mockEvent("GET", "/").render();
+ const result = await handler(event);
+ expect(result.statusCode).to.eq(302);
+ expect(result.headers.location).to.eq("/redirect/target");
+ });
+});
diff --git a/tests/unit/api/opensearch.test.js b/tests/unit/api/opensearch.test.js
deleted file mode 100644
index 5e5cb36a..00000000
--- a/tests/unit/api/opensearch.test.js
+++ /dev/null
@@ -1,11 +0,0 @@
-"use strict";
-
-const opensearch = require("../../src/api/opensearch");
-const chai = require("chai");
-const expect = chai.expect;
-
-describe("getWork()", () => {
- it("gets a work by its id", async () => {
-
- });
-})
\ No newline at end of file
diff --git a/tests/unit/test-handler.js b/tests/unit/test-handler.js
deleted file mode 100644
index 82dd454e..00000000
--- a/tests/unit/test-handler.js
+++ /dev/null
@@ -1,22 +0,0 @@
-"use strict";
-
-const app = require("../../src/handlers/hello.js");
-const chai = require("chai");
-const expect = chai.expect;
-var event, context;
-
-describe("Tests index", function () {
- it("verifies successful response", async () => {
- const result = await app.helloHandler(event, context);
-
- expect(result).to.be.an("object");
- expect(result.statusCode).to.equal(200);
- expect(result.body).to.be.an("string");
-
- let response = JSON.parse(result.body);
-
- expect(response).to.be.an("object");
- expect(response.message).to.be.equal("hello world");
- // expect(response.location).to.be.an("string");
- });
-});