diff --git a/.github/workflows/function-deploy-cela-dev.yml b/.github/workflows/function-deploy-cela-dev.yml new file mode 100644 index 00000000..220e6332 --- /dev/null +++ b/.github/workflows/function-deploy-cela-dev.yml @@ -0,0 +1,71 @@ + +name: functions deploy + +on: + push: + branches: [ cela-dev ] + paths: + - 'webhooks/**' + - '.github/workflows/function-deploy-cela-dev.yml' + +jobs: + deploy: + name: "Deploy Firebase functions" + runs-on: ubuntu-latest + strategy: + matrix: + node-version: [16.x] + # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ + + env: + working-directory: './webhooks/functions' + project-id: 'cela-2' + defaults: + run: + working-directory: './webhooks/functions' + + steps: + - name: Checkout repo + uses: actions/checkout@v2 + + - name : GITHUB CONTEXT + env: + GITHUB_CONTEXT: ${{ toJson(github) }} + run: echo "$GITHUB_CONTEXT" + + - name: Install node ${{ matrix.node-version }} + uses: actions/setup-node@v1 + with: + node-version: ${{ matrix.node-version }} + + - name: Install Dependencies + run: npm ci --no-audit + working-directory: ${{ env.working-directory }} + + - name: test + run: npm test + working-directory: ${{ env.working-directory }} + + - name: lint + run: npm run lint + working-directory: ${{ env.working-directory }} + + - name: build + run: npm run build + working-directory: ${{ env.working-directory }} + + - name: set commit name to function config + uses: w9jds/firebase-action@master + with: + args: functions:config:set debug.message=\"${{ github.event.head_commit.message }}\" --project ${{ env.project-id }} + env: + FIREBASE_TOKEN: ${{ secrets.FIREBASE_TOKEN }} + PROJECT_PATH: './webhooks' + + - name: Deploy to Firebase + uses: w9jds/firebase-action@master + with: + args: deploy --only \"functions:ActionsOnGoogleFulfillment\" --project ${{ env.project-id }} --message \"${{ github.event.head_commit.message }}\" + env: + FIREBASE_TOKEN: ${{ secrets.FIREBASE_TOKEN }} + PROJECT_PATH: './webhooks' diff --git a/.github/workflows/functions-avh-dev.yml b/.github/workflows/functions-avh-dev.yml new file mode 100644 index 00000000..2ed7ab84 --- /dev/null +++ b/.github/workflows/functions-avh-dev.yml @@ -0,0 +1,97 @@ + +name: functions deploy + +on: + push: + branches: [ avh-dev ] + paths: + - 'webhooks/**' + - '.github/workflows/functions-avh-dev.yml' + +jobs: + deploy: + name: "Deploy Firebase functions" + runs-on: ubuntu-latest + strategy: + matrix: + node-version: [16.x] + # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ + + env: + working-directory: './webhooks/functions' + project-id: 'valentin-5' + defaults: + run: + working-directory: './webhooks/functions' + + steps: + - name: Checkout repo + uses: actions/checkout@v2 + + - name : GITHUB CONTEXT + env: + GITHUB_CONTEXT: ${{ toJson(github) }} + run: echo "$GITHUB_CONTEXT" + + - name: Install node ${{ matrix.node-version }} + uses: actions/setup-node@v1 + with: + node-version: ${{ matrix.node-version }} + + - name: Install Dependencies + run: npm ci --no-audit + working-directory: ${{ env.working-directory }} + + - name: test + run: npm test + working-directory: ${{ env.working-directory }} + + - name: lint + run: npm run lint + working-directory: ${{ env.working-directory }} + + - name: build + run: npm run build + working-directory: ${{ env.working-directory }} + + - name: set commit name to function config + uses: w9jds/firebase-action@master + with: + args: functions:config:set debug.message=\"${{ github.event.head_commit.message }}\" --project ${{ env.project-id }} + env: + FIREBASE_TOKEN: ${{ secrets.FIREBASE_TOKEN }} + PROJECT_PATH: './webhooks' + + - name: Deploy to Firebase + uses: w9jds/firebase-action@master + with: + args: deploy --only \"functions:ActionsOnGoogleFulfillment\" --project ${{ env.project-id }} --message \"${{ github.event.head_commit.message }}\" + env: + FIREBASE_TOKEN: ${{ secrets.FIREBASE_TOKEN }} + PROJECT_PATH: './webhooks' + + sdk-test-dev: + name: "Test sdk DEV" + needs: deploy + runs-on: ubuntu-latest + strategy: + matrix: + node-version: [14.x] + # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ + defaults: + run: + working-directory: './test/dev' + + steps: + + - uses: actions/checkout@v2 + - uses: actions/setup-node@v2 + with: + node-version: ${{ matrix.node }} + + - name: save service_account + run: echo $SECRET >> service_account.json + env: + SECRET : ${{ secrets.SERVICE_ACCOUNT_VALENTIN5 }} + - run: npm install + - run: npm test diff --git a/.github/workflows/functions.yml b/.github/workflows/functions-edrlab-dev.yml similarity index 62% rename from .github/workflows/functions.yml rename to .github/workflows/functions-edrlab-dev.yml index e2ac0bf4..374af269 100644 --- a/.github/workflows/functions.yml +++ b/.github/workflows/functions-edrlab-dev.yml @@ -3,10 +3,10 @@ name: functions deploy on: push: - branches: [ main ] + branches: [ develop ] paths: - - 'functions/**' - - '.github/workflows/functions.yml' + - 'webhooks/**' + - '.github/workflows/functions-edrlab-dev.yml' jobs: deploy: @@ -18,10 +18,11 @@ jobs: # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ env: - working-directory: './functions/functions' + working-directory: './webhooks/functions' + project-id: 'edrlab-1' defaults: run: - working-directory: './functions/functions' + working-directory: './webhooks/functions' steps: - name: Checkout repo @@ -40,19 +41,31 @@ jobs: - name: Install Dependencies run: npm ci --no-audit working-directory: ${{ env.working-directory }} + + - name: test + run: npm test + working-directory: ${{ env.working-directory }} + + - name: lint + run: npm run lint + working-directory: ${{ env.working-directory }} + + - name: build + run: npm run build + working-directory: ${{ env.working-directory }} - name: set commit name to function config uses: w9jds/firebase-action@master with: - args: functions:config:set debug.message=\"${{ github.event.head_commit.message }}\" + args: functions:config:set debug.message=\"${{ github.event.head_commit.message }}\" --project ${{ env.project-id }} env: FIREBASE_TOKEN: ${{ secrets.FIREBASE_TOKEN }} - PROJECT_PATH: './functions' + PROJECT_PATH: './webhooks' - name: Deploy to Firebase uses: w9jds/firebase-action@master with: - args: deploy --only \"functions:ActionsOnGoogleFulfillment\" --message \"${{ github.event.head_commit.message }}\" + args: deploy --only \"functions:ActionsOnGoogleFulfillment\" --project ${{ env.project-id }} --message \"${{ github.event.head_commit.message }}\" env: FIREBASE_TOKEN: ${{ secrets.FIREBASE_TOKEN }} - PROJECT_PATH: './functions' + PROJECT_PATH: './webhooks' diff --git a/.github/workflows/webhooks-test.yml b/.github/workflows/webhooks-test.yml new file mode 100644 index 00000000..c9e6f17f --- /dev/null +++ b/.github/workflows/webhooks-test.yml @@ -0,0 +1,32 @@ + +name: webhooks unitary tests + +on: + push: + branches: [ develop, avh-prod, avh-dev, cela-prod, cela-dev ] + # paths: + pull_request: + branches: [ develop, avh-prod, avh-dev, cela-prod, cela-dev ] + +jobs: + sdk-test-prod: + runs-on: ubuntu-latest + strategy: + matrix: + node: [12, 14, 16] + # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ + defaults: + run: + working-directory: './webhooks/functions' + name: Node ${{ matrix.node }} webhooks unitary tests + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v2 + with: + node-version: ${{ matrix.node }} + - run: node -v + - run: npm -v + - run: find . -type f + - run: npm ci + - run: npm test + - run: npm run lint diff --git a/.gitignore b/.gitignore index 7cb323d8..2e88cad1 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,7 @@ node_modules service_account.json + +.nyc_output/ +firebase-debug.log +ui-debug.log diff --git a/README.md b/README.md index fdf849b3..1ef1f515 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,11 @@ # lis-mon-livre +> develop branch + - https://console.firebase.google.com/u/1/project/edrlab-1/firestore/data + - https://console.actions.google.com/u/1/project/edrlab-1/overview + - https://console.cloud.google.com/logs/query?referrer=search&authuser=1&project=edrlab-1 -## gactions +## gactions sdk -`cd sdk && gactions pull --force --clean --project-id valentin-4` +`cd sdk && gactions pull --force --clean --project-id valentin-5` diff --git a/flowchart.drawio b/flowchart.drawio new file mode 100644 index 00000000..8af25367 --- /dev/null +++ b/flowchart.drawio @@ -0,0 +1 @@ +7VlLc9s2EP4tOWimPUgjkqIkH23ZTtO6qTtuJ/EpA5EgCRsCWAC0pPz67ILgS5TcOGM7yrQXkthdLMDdbx8gB8FitXmrSJ79LmPKB/443gyC84Hv+8HEhxtStiUl8KdhSUkVi0ua1xBu2GfqiGNHLVhMdUfQSMkNy7vESApBI9OhEaXkuiuWSN5dNScp7RFuIsL71A8sNllJnfuzhv4LZWlWrexNT0rOilTC7k10RmK5bpGCi0GwUFKa8mm1WVCO1qvsUs67PMCtN6aoMF8zIZn/oT8ltx/Hp3/evRey+FVd3w2dlgfCC/fCA3/KQd+ZzomA5xSfKxoo30f+RtEPlEdyRa1HB7j58VYWCm6Li6tTuF2xpSJq+8byyulLtauwofyFSpKC8y3cqbiT20YjKWIml1LeaxyIGK9RRLVuRHKqtBQELaYpBygxCTtdlAJwXTNrTUFpXO2YM3Hf2zXolYUwo/4GP8iCx7U+zu7rV4/xovEiECGXB41ocWS2FTgVrBRT9K8H7HXGDL3JSYTcNcQj0DKz4o6dkSgrFH2L9PMJEHLJhKHq4gEAhFEyrpdog6pCCFWGblokB7K3FFxoFNracScO71XET9143YRPUEV31g6dwBGJC9m0Vt2gGh4csJ8A8rBnOBpDkLuhkAJuZ1GhHmpTNoZFo0hlMpkiOK6kzJ3IHTVm6/IVKcCNHWPTDTMfcfoodKPbFud84zTbwbYaCHjZ1iQc3rZ5zTQ7aubFp5jpYChzKjDKDFHG7c2blCLtoQbERvSaKgYGpgoxw0QK3DkwYW5KzQHmQXyUKh9xgisEpfZH5CalHHroUbQpyolhD900/ezQ8Xv58QZt2wMUJPccH8EyhHPKZarICmOsMuMu77ph/FvgJmxDa/e9YiAHs24kz/uB7Pl7Ann6UnEcHEWxWpLovkrcTyhYCynA76ZA1EqhUejWFoKMPKBaXWBBquoXlhYatwpYWVXq6hXhzmy1aFUyYk0ok2ZaQh6kAnDhtrH6vXlKVdKUqCizTZPdApJyGrGERU4frlaWV0iQqqyWWM6YjiTgDNl2Gwaypj8OEJAssjXYTlt3ls4VTewcm70w5ZRruoUSJVfNi9m3yShPfvRqGYY75TL87uVy/h3LZatYNqXzv1guJ19ZLr3nLpd2KhiIbFsCFvy6pfkaCQ2KvZOwg+KqBjQwLDU2oKy39u049Sa9evD3+6t373+7ON+L4CuyhNNpB3eEsxQQcB5RUZZiDFwGp79Tx1ixOEYdZ4pq9pksrb5xlQ6sdcKzQXi+19ePRVcvQ9RHWLdI55S4L3OMR5P5zO+a3VXIpzm78WYlIpNEU9NLJM/hs/Fe17xKcvH+Ty5PTC7BUSSX6bxbIv1Z+ArJpd9sHn1qqYLrOXLLeD6fdaw+9GbHnlz69eAd9MJTssLeTix13urts6Djxek/BX6HO1tBSDDwDrbz43wD16Ff3u1c8EEc2whsBBzfa4stpYqpGi6lMdC1WmGb2ip+JDl0wJau0uVPwcQ2ztg+dx5/rickUphhQlYMTgd2Wv1eAz8IbB6hqcQFCtZj1Ro1EXqoIZskzRtX7XJ9wijts25OCFdwFrHteI8DZ2FT6Fb/jVY91H1ncrUE4aPpvIOdzhv82T/fTvd13uFLdd7e4c+xeBLK4ITUQWtmDH4GP8VV/Utiv1nqoRTDVMqU01HKTFYsR0wiV2sGtQhgBLkArKTtOXQoZEzvwIWXwWg2gve6jDhIUqS05T5lcO7kVH0qAD4je7Eu8wOHG16CRFeI2EHXEe+0wi45CF0AlOliVBsl7+mijOKqa0kY5zukry8C+4Ki2/m82vfbnXLref24mOyNi9mLxUW4Jy6OPb94YfdMFM76dpzvMeP8xaw47VlxS3W/n+Gc5foQJr+DIYf1z0BnyemeXwr7LPlyeJz1LCnkD2DIk1ezIwybP5tlf9f8IA4uvgA= \ No newline at end of file diff --git a/sdk/prod/actions/actions.yaml b/sdk/actions/actions.yaml similarity index 100% rename from sdk/prod/actions/actions.yaml rename to sdk/actions/actions.yaml diff --git a/sdk/test/actions/actions.yaml b/sdk/actions/en/actions.yaml similarity index 100% rename from sdk/test/actions/actions.yaml rename to sdk/actions/en/actions.yaml diff --git a/sdk/custom/global/actions.intent.CANCEL.yaml b/sdk/custom/global/actions.intent.CANCEL.yaml new file mode 100644 index 00000000..1166ed64 --- /dev/null +++ b/sdk/custom/global/actions.intent.CANCEL.yaml @@ -0,0 +1,3 @@ +handler: + webhookHandler: cancel +transitionToScene: actions.scene.END_CONVERSATION diff --git a/sdk/custom/global/actions.intent.MAIN.yaml b/sdk/custom/global/actions.intent.MAIN.yaml new file mode 100644 index 00000000..c43ab2e2 --- /dev/null +++ b/sdk/custom/global/actions.intent.MAIN.yaml @@ -0,0 +1,2 @@ +handler: + webhookHandler: main diff --git a/sdk/custom/global/actions.intent.MEDIA_STATUS_STOPPED.yaml b/sdk/custom/global/actions.intent.MEDIA_STATUS_STOPPED.yaml new file mode 100644 index 00000000..af0c87f2 --- /dev/null +++ b/sdk/custom/global/actions.intent.MEDIA_STATUS_STOPPED.yaml @@ -0,0 +1 @@ +transitionToScene: actions.scene.END_CONVERSATION diff --git a/sdk/custom/global/actions.intent.NO_INPUT_1.yaml b/sdk/custom/global/actions.intent.NO_INPUT_1.yaml new file mode 100644 index 00000000..a92bb198 --- /dev/null +++ b/sdk/custom/global/actions.intent.NO_INPUT_1.yaml @@ -0,0 +1,2 @@ +handler: + webhookHandler: silence_1 diff --git a/sdk/custom/global/actions.intent.NO_INPUT_2.yaml b/sdk/custom/global/actions.intent.NO_INPUT_2.yaml new file mode 100644 index 00000000..ca8ab58a --- /dev/null +++ b/sdk/custom/global/actions.intent.NO_INPUT_2.yaml @@ -0,0 +1,2 @@ +handler: + webhookHandler: silence_2 \ No newline at end of file diff --git a/sdk/custom/global/actions.intent.NO_INPUT_FINAL.yaml b/sdk/custom/global/actions.intent.NO_INPUT_FINAL.yaml new file mode 100644 index 00000000..f4869858 --- /dev/null +++ b/sdk/custom/global/actions.intent.NO_INPUT_FINAL.yaml @@ -0,0 +1,3 @@ +handler: + webhookHandler: silence_end +transitionToScene: actions.scene.END_CONVERSATION diff --git a/sdk/custom/global/actions.intent.NO_MATCH_1.yaml b/sdk/custom/global/actions.intent.NO_MATCH_1.yaml new file mode 100644 index 00000000..59af8936 --- /dev/null +++ b/sdk/custom/global/actions.intent.NO_MATCH_1.yaml @@ -0,0 +1,2 @@ +handler: + webhookHandler: fallback_1 diff --git a/sdk/custom/global/actions.intent.NO_MATCH_2.yaml b/sdk/custom/global/actions.intent.NO_MATCH_2.yaml new file mode 100644 index 00000000..c5df3091 --- /dev/null +++ b/sdk/custom/global/actions.intent.NO_MATCH_2.yaml @@ -0,0 +1,2 @@ +handler: + webhookHandler: fallback_2 diff --git a/sdk/custom/global/actions.intent.NO_MATCH_FINAL.yaml b/sdk/custom/global/actions.intent.NO_MATCH_FINAL.yaml new file mode 100644 index 00000000..c72b085b --- /dev/null +++ b/sdk/custom/global/actions.intent.NO_MATCH_FINAL.yaml @@ -0,0 +1,3 @@ +handler: + webhookHandler: fallback_end +transitionToScene: actions.scene.END_CONVERSATION diff --git a/sdk/custom/intents/another_one.yaml b/sdk/custom/intents/another_one.yaml new file mode 100644 index 00000000..6ad8421c --- /dev/null +++ b/sdk/custom/intents/another_one.yaml @@ -0,0 +1,5 @@ +trainingPhrases: +- prochain +- suivant +- page suivante +- un autre diff --git a/sdk/custom/intents/bookshelf.yaml b/sdk/custom/intents/bookshelf.yaml new file mode 100644 index 00000000..6984d2c3 --- /dev/null +++ b/sdk/custom/intents/bookshelf.yaml @@ -0,0 +1,10 @@ +trainingPhrases: +- voir mon étagère +- consulter ma liste personnelle +- voir ma liste personnelle +- liste personnelle +- consulter mon étagère +- étagère +- mon étagère +- bibliothèque +- ma bibliothèque diff --git a/sdk/custom/intents/by_genre.yaml b/sdk/custom/intents/by_genre.yaml new file mode 100644 index 00000000..f406e65f --- /dev/null +++ b/sdk/custom/intents/by_genre.yaml @@ -0,0 +1,4 @@ +trainingPhrases: +- par genre +- genre +- je préfère par genre diff --git a/sdk/custom/intents/by_theme.yaml b/sdk/custom/intents/by_theme.yaml new file mode 100644 index 00000000..1f2b18b9 --- /dev/null +++ b/sdk/custom/intents/by_theme.yaml @@ -0,0 +1,6 @@ +trainingPhrases: +- je veux par thème +- je t'aime +- par thème +- thème +- je préfère par thème diff --git a/sdk/custom/intents/collections.yaml b/sdk/custom/intents/collections.yaml new file mode 100644 index 00000000..f853d232 --- /dev/null +++ b/sdk/custom/intents/collections.yaml @@ -0,0 +1,6 @@ +trainingPhrases: +- recommandations +- collections +- navigue dans les collections +- sélections +- navigue dans les sélections diff --git a/sdk/custom/intents/current_book.yaml b/sdk/custom/intents/current_book.yaml new file mode 100644 index 00000000..b723aa6f --- /dev/null +++ b/sdk/custom/intents/current_book.yaml @@ -0,0 +1,8 @@ +trainingPhrases: +- Reprendre ma lecture +- Reprends ma lecture +- Reprends +- Reprends le dernier livre +- Reprends la lecture +- Reprendre la lecture +- Reprendre diff --git a/sdk/custom/intents/en/another_one.yaml b/sdk/custom/intents/en/another_one.yaml new file mode 100644 index 00000000..790fb96e --- /dev/null +++ b/sdk/custom/intents/en/another_one.yaml @@ -0,0 +1,5 @@ +trainingPhrases: +- the next one +- next +- next page +- another one diff --git a/sdk/custom/intents/en/bookshelf.yaml b/sdk/custom/intents/en/bookshelf.yaml new file mode 100644 index 00000000..a627ab60 --- /dev/null +++ b/sdk/custom/intents/en/bookshelf.yaml @@ -0,0 +1,7 @@ +trainingPhrases: +- personal list +- browse my bookshelf +- book shelves +- book shelf +- my bookshelf +- bookshelf diff --git a/sdk/custom/intents/en/by_genre.yaml b/sdk/custom/intents/en/by_genre.yaml new file mode 100644 index 00000000..1a198d69 --- /dev/null +++ b/sdk/custom/intents/en/by_genre.yaml @@ -0,0 +1,6 @@ +trainingPhrases: +- by genre please +- genre +- I prefer by genre +- I prefer collections by genre +- by genre diff --git a/sdk/custom/intents/en/by_theme.yaml b/sdk/custom/intents/en/by_theme.yaml new file mode 100644 index 00000000..8447be17 --- /dev/null +++ b/sdk/custom/intents/en/by_theme.yaml @@ -0,0 +1,6 @@ +trainingPhrases: +- by theme please +- theme +- I prefer by theme +- I prefer to get a book selection by theme +- by theme diff --git a/sdk/custom/intents/en/collections.yaml b/sdk/custom/intents/en/collections.yaml new file mode 100644 index 00000000..f6a9901a --- /dev/null +++ b/sdk/custom/intents/en/collections.yaml @@ -0,0 +1,4 @@ +trainingPhrases: +- recommendations +- collections +- Browse collections diff --git a/sdk/custom/intents/en/current_book.yaml b/sdk/custom/intents/en/current_book.yaml new file mode 100644 index 00000000..7b2bf448 --- /dev/null +++ b/sdk/custom/intents/en/current_book.yaml @@ -0,0 +1,5 @@ +trainingPhrases: +- Resume +- Resume reading +- Resume playback +- resume the last book diff --git a/sdk/custom/intents/en/help.yaml b/sdk/custom/intents/en/help.yaml new file mode 100644 index 00000000..13c3f3b2 --- /dev/null +++ b/sdk/custom/intents/en/help.yaml @@ -0,0 +1,4 @@ +trainingPhrases: +- help me please +- help me +- help diff --git a/sdk/custom/intents/en/learn_more.yaml b/sdk/custom/intents/en/learn_more.yaml new file mode 100644 index 00000000..105f4309 --- /dev/null +++ b/sdk/custom/intents/en/learn_more.yaml @@ -0,0 +1,3 @@ +trainingPhrases: +- information +- learn more diff --git a/sdk/custom/intents/en/link_account.yaml b/sdk/custom/intents/en/link_account.yaml new file mode 100644 index 00000000..3b559d4c --- /dev/null +++ b/sdk/custom/intents/en/link_account.yaml @@ -0,0 +1,3 @@ +trainingPhrases: +- link account +- i want to link my account diff --git a/sdk/custom/intents/en/maybe_later.yaml b/sdk/custom/intents/en/maybe_later.yaml new file mode 100644 index 00000000..19f5a18c --- /dev/null +++ b/sdk/custom/intents/en/maybe_later.yaml @@ -0,0 +1,4 @@ +trainingPhrases: +- later please +- later +- maybe later diff --git a/sdk/custom/intents/en/membership.yaml b/sdk/custom/intents/en/membership.yaml new file mode 100644 index 00000000..c34b6b1d --- /dev/null +++ b/sdk/custom/intents/en/membership.yaml @@ -0,0 +1,2 @@ +trainingPhrases: +- membership diff --git a/sdk/prod/custom/intents/no.yaml b/sdk/custom/intents/en/no.yaml similarity index 85% rename from sdk/prod/custom/intents/no.yaml rename to sdk/custom/intents/en/no.yaml index 873ac739..3de19e6f 100644 --- a/sdk/prod/custom/intents/no.yaml +++ b/sdk/custom/intents/en/no.yaml @@ -1,5 +1,4 @@ trainingPhrases: -- "n" -- non -- "no" - nop +- "no" +- "n" diff --git a/sdk/custom/intents/en/player_prequel_back.yaml b/sdk/custom/intents/en/player_prequel_back.yaml new file mode 100644 index 00000000..56fdc838 --- /dev/null +++ b/sdk/custom/intents/en/player_prequel_back.yaml @@ -0,0 +1,5 @@ +trainingPhrases: +- back to collections +- back to selections +- back to the list +- back diff --git a/sdk/custom/intents/en/player_prequel_resume.yaml b/sdk/custom/intents/en/player_prequel_resume.yaml new file mode 100644 index 00000000..0e882540 --- /dev/null +++ b/sdk/custom/intents/en/player_prequel_resume.yaml @@ -0,0 +1,7 @@ +trainingPhrases: +- continue reading +- continue playing +- continue +- Resume playback +- Resume +- resume reading diff --git a/sdk/custom/intents/en/player_prequel_start.yaml b/sdk/custom/intents/en/player_prequel_start.yaml new file mode 100644 index 00000000..5e4181b4 --- /dev/null +++ b/sdk/custom/intents/en/player_prequel_start.yaml @@ -0,0 +1,3 @@ +trainingPhrases: +- start reading +- start diff --git a/sdk/custom/intents/en/player_prequel_summary.yaml b/sdk/custom/intents/en/player_prequel_summary.yaml new file mode 100644 index 00000000..829997a8 --- /dev/null +++ b/sdk/custom/intents/en/player_prequel_summary.yaml @@ -0,0 +1,6 @@ +trainingPhrases: +- Information +- Info +- Description +- Summarize +- Summary diff --git a/sdk/custom/intents/en/recent_books.yaml b/sdk/custom/intents/en/recent_books.yaml new file mode 100644 index 00000000..1d5c775c --- /dev/null +++ b/sdk/custom/intents/en/recent_books.yaml @@ -0,0 +1,6 @@ +trainingPhrases: +- last book +- play the last book +- last books +- recent +- recent books diff --git a/sdk/custom/intents/en/repeat.yaml b/sdk/custom/intents/en/repeat.yaml new file mode 100644 index 00000000..4818ec7e --- /dev/null +++ b/sdk/custom/intents/en/repeat.yaml @@ -0,0 +1,4 @@ +trainingPhrases: +- again +- repeat +- i do not understand diff --git a/sdk/custom/intents/en/search.yaml b/sdk/custom/intents/en/search.yaml new file mode 100644 index 00000000..1469f390 --- /dev/null +++ b/sdk/custom/intents/en/search.yaml @@ -0,0 +1,20 @@ +trainingPhrases: +- search for a book +- search for a book by ($query 'Ernest Hemingway' auto=false) +- I want to search for a book +- search for a specific book +- I am looking for ($query 'The Little Prince by Antoine de Saint-Exupéry' auto=false) +- search +- find +- search for +- I am looking for a book ($query 'The Little Prince by Antoine de Saint-Exupéry' + auto=false) +- I want to listen ($query 'this book title' auto=false) +- I want to listen ($query 'this book by this author name' auto=false) +- search ($query 'Wild by Cheryl Strayed' auto=false) +- I want to search ($query 'The Little Prince by Antoine de Saint-Exupéry' auto=false) +- I am looking for a book by ($query 'author' auto=false) +- I want to search a book +- search a title +- search a book +- search diff --git a/sdk/custom/intents/en/search_query.yaml b/sdk/custom/intents/en/search_query.yaml new file mode 100644 index 00000000..a0564f23 --- /dev/null +++ b/sdk/custom/intents/en/search_query.yaml @@ -0,0 +1,4 @@ +trainingPhrases: +- ($query 'To kill a mockingbird by Harper Lee' auto=false) +- ($query 'Wild by Cheryl Strayed' auto=false) +- ($query 'The Little Prince by Antoine de Saint-Exupéry' auto=false) diff --git a/sdk/custom/intents/en/selects_book.yaml b/sdk/custom/intents/en/selects_book.yaml new file mode 100644 index 00000000..5656aaba --- /dev/null +++ b/sdk/custom/intents/en/selects_book.yaml @@ -0,0 +1,16 @@ +trainingPhrases: +- ($number 'four' auto=true) +- ($number 'five' auto=true) +- number ($number 'five' auto=true) +- number ($number 'four' auto=true) +- number ($number 'three' auto=true) +- the ($number 'fifth' auto=false) +- the ($number 'fourth' auto=false) +- the ($number 'first' auto=false) +- the ($number 'second' auto=false) +- the ($number 'third' auto=false) +- ($number 'three' auto=true) +- ($number 'two' auto=true) +- ($number 'one' auto=false) +- number ($number 'two' auto=false) +- number ($number 'one' auto=false) diff --git a/sdk/custom/intents/en/yes.yaml b/sdk/custom/intents/en/yes.yaml new file mode 100644 index 00000000..60b9c8ab --- /dev/null +++ b/sdk/custom/intents/en/yes.yaml @@ -0,0 +1,4 @@ +trainingPhrases: +- "y" +- yep +- "yes" diff --git a/sdk/prod/custom/intents/enter_member_space_lvl1.yaml b/sdk/custom/intents/enter_member_space_lvl1.yaml similarity index 100% rename from sdk/prod/custom/intents/enter_member_space_lvl1.yaml rename to sdk/custom/intents/enter_member_space_lvl1.yaml diff --git a/sdk/prod/custom/intents/get_info_association_lvl1.yaml b/sdk/custom/intents/get_info_association_lvl1.yaml similarity index 100% rename from sdk/prod/custom/intents/get_info_association_lvl1.yaml rename to sdk/custom/intents/get_info_association_lvl1.yaml diff --git a/sdk/custom/intents/help.yaml b/sdk/custom/intents/help.yaml new file mode 100644 index 00000000..61394d5c --- /dev/null +++ b/sdk/custom/intents/help.yaml @@ -0,0 +1,4 @@ +trainingPhrases: +- aide +- aide moi +- de l'aide diff --git a/sdk/prod/custom/intents/i_want_to_listen_lvl3.yaml b/sdk/custom/intents/i_want_to_listen_lvl3.yaml similarity index 100% rename from sdk/prod/custom/intents/i_want_to_listen_lvl3.yaml rename to sdk/custom/intents/i_want_to_listen_lvl3.yaml diff --git a/sdk/custom/intents/learn_more.yaml b/sdk/custom/intents/learn_more.yaml new file mode 100644 index 00000000..e193efdc --- /dev/null +++ b/sdk/custom/intents/learn_more.yaml @@ -0,0 +1,4 @@ +trainingPhrases: +- en apprendre plus +- en savoir plus +- information diff --git a/sdk/custom/intents/link_account.yaml b/sdk/custom/intents/link_account.yaml new file mode 100644 index 00000000..1de587a0 --- /dev/null +++ b/sdk/custom/intents/link_account.yaml @@ -0,0 +1,3 @@ +trainingPhrases: +- je veux me connecter +- me connecter diff --git a/sdk/prod/custom/intents/listen_audiobook_lvl1.yaml b/sdk/custom/intents/listen_audiobook_lvl1.yaml similarity index 100% rename from sdk/prod/custom/intents/listen_audiobook_lvl1.yaml rename to sdk/custom/intents/listen_audiobook_lvl1.yaml diff --git a/sdk/prod/custom/intents/listen_audiobook_lvl2.yaml b/sdk/custom/intents/listen_audiobook_lvl2.yaml similarity index 100% rename from sdk/prod/custom/intents/listen_audiobook_lvl2.yaml rename to sdk/custom/intents/listen_audiobook_lvl2.yaml diff --git a/sdk/custom/intents/listen_toc.yaml b/sdk/custom/intents/listen_toc.yaml new file mode 100644 index 00000000..68285400 --- /dev/null +++ b/sdk/custom/intents/listen_toc.yaml @@ -0,0 +1,5 @@ +trainingPhrases: +- table des matières +- lis la table des matières +- lis moi la table des matières +- lis moi la toc diff --git a/sdk/custom/intents/maybe_later.yaml b/sdk/custom/intents/maybe_later.yaml new file mode 100644 index 00000000..59497421 --- /dev/null +++ b/sdk/custom/intents/maybe_later.yaml @@ -0,0 +1,3 @@ +trainingPhrases: +- plus tard +- peut être plus tard diff --git a/sdk/custom/intents/membership.yaml b/sdk/custom/intents/membership.yaml new file mode 100644 index 00000000..bbe7b193 --- /dev/null +++ b/sdk/custom/intents/membership.yaml @@ -0,0 +1,2 @@ +trainingPhrases: +- espace membre diff --git a/sdk/custom/intents/menu.yaml b/sdk/custom/intents/menu.yaml new file mode 100644 index 00000000..fade5c08 --- /dev/null +++ b/sdk/custom/intents/menu.yaml @@ -0,0 +1,3 @@ +trainingPhrases: +- revenir au menu +- menu diff --git a/sdk/custom/intents/next.yaml b/sdk/custom/intents/next.yaml new file mode 100644 index 00000000..79a4e281 --- /dev/null +++ b/sdk/custom/intents/next.yaml @@ -0,0 +1,2 @@ +trainingPhrases: +- suivant diff --git a/sdk/test/custom/intents/no.yaml b/sdk/custom/intents/no.yaml similarity index 85% rename from sdk/test/custom/intents/no.yaml rename to sdk/custom/intents/no.yaml index 873ac739..47ed4273 100644 --- a/sdk/test/custom/intents/no.yaml +++ b/sdk/custom/intents/no.yaml @@ -2,4 +2,3 @@ trainingPhrases: - "n" - non - "no" -- nop diff --git a/sdk/custom/intents/player_prequel_back.yaml b/sdk/custom/intents/player_prequel_back.yaml new file mode 100644 index 00000000..a33c3b40 --- /dev/null +++ b/sdk/custom/intents/player_prequel_back.yaml @@ -0,0 +1,5 @@ +trainingPhrases: +- Revenir aux sélections +- Revenir aux collections +- Revenir à la liste +- revenir à la liste diff --git a/sdk/custom/intents/player_prequel_resume.yaml b/sdk/custom/intents/player_prequel_resume.yaml new file mode 100644 index 00000000..ba4d8cf1 --- /dev/null +++ b/sdk/custom/intents/player_prequel_resume.yaml @@ -0,0 +1,8 @@ +trainingPhrases: +- Reprends +- Reprends la lecture +- Reprendre ma lecture +- relancer la lecture +- reprendre la lecture +- lecture +- Reprendre la lecture diff --git a/sdk/custom/intents/player_prequel_start.yaml b/sdk/custom/intents/player_prequel_start.yaml new file mode 100644 index 00000000..af23681f --- /dev/null +++ b/sdk/custom/intents/player_prequel_start.yaml @@ -0,0 +1,4 @@ +trainingPhrases: +- commencer la lecture +- démarrer +- démarrer la lecture diff --git a/sdk/custom/intents/player_prequel_summary.yaml b/sdk/custom/intents/player_prequel_summary.yaml new file mode 100644 index 00000000..48c4f922 --- /dev/null +++ b/sdk/custom/intents/player_prequel_summary.yaml @@ -0,0 +1,5 @@ +trainingPhrases: +- information +- info +- écouter le résumé +- résumé diff --git a/sdk/custom/intents/recent_books.yaml b/sdk/custom/intents/recent_books.yaml new file mode 100644 index 00000000..54fed1ac --- /dev/null +++ b/sdk/custom/intents/recent_books.yaml @@ -0,0 +1,7 @@ +trainingPhrases: +- mes livres récents +- derniers livres +- livres récents +- voir mes derniers livres +- voir mes livres récents +- derniers livres lus diff --git a/sdk/prod/custom/intents/remaing_time_player.yaml b/sdk/custom/intents/remaing_time_player.yaml similarity index 100% rename from sdk/prod/custom/intents/remaing_time_player.yaml rename to sdk/custom/intents/remaing_time_player.yaml diff --git a/sdk/custom/intents/repeat.yaml b/sdk/custom/intents/repeat.yaml new file mode 100644 index 00000000..775ce064 --- /dev/null +++ b/sdk/custom/intents/repeat.yaml @@ -0,0 +1,4 @@ +trainingPhrases: +- répéter +- répête +- je ne comprends pas \ No newline at end of file diff --git a/sdk/prod/custom/intents/resume_audiobook_lvl2.yaml b/sdk/custom/intents/resume_audiobook_lvl2.yaml similarity index 81% rename from sdk/prod/custom/intents/resume_audiobook_lvl2.yaml rename to sdk/custom/intents/resume_audiobook_lvl2.yaml index aab5315b..838b6349 100644 --- a/sdk/prod/custom/intents/resume_audiobook_lvl2.yaml +++ b/sdk/custom/intents/resume_audiobook_lvl2.yaml @@ -1,7 +1,3 @@ -parameters: -- name: number1 - type: - name: actions.type.Number trainingPhrases: - lecture d'($number1 'un' auto=true) livre - lecture de mon livre diff --git a/sdk/test/custom/intents/resume_listening_player.yaml b/sdk/custom/intents/resume_listening_player.yaml similarity index 73% rename from sdk/test/custom/intents/resume_listening_player.yaml rename to sdk/custom/intents/resume_listening_player.yaml index 2cd0b674..d03ff0d7 100644 --- a/sdk/test/custom/intents/resume_listening_player.yaml +++ b/sdk/custom/intents/resume_listening_player.yaml @@ -1,3 +1,5 @@ trainingPhrases: +- continue +- reprends - reprend la lecture - reprendre la lecture diff --git a/sdk/custom/intents/search.yaml b/sdk/custom/intents/search.yaml new file mode 100644 index 00000000..8b338ae1 --- /dev/null +++ b/sdk/custom/intents/search.yaml @@ -0,0 +1,20 @@ +parameters: +- name: query + type: + name: string +trainingPhrases: +- chercher un livre +- chercher un livre audio +- chercher ($number1 'un' auto=true) nouveau livre +- chercher +- je veux chercher un livre audio +- je veux chercher un livre +- recherche un livre +- recherche +- je veux rechercher un livre +- Je recherche ($query 'Le Petit Prince par Antoine de Saint-Exupéry' auto=false) +- Cherche ($query 'La Peste' auto=false) +- Recherche ($query 'La Horla' auto=false) +- Je veux écouter ($query 'Ce livre' auto=false) +- Je veux lire ($query 'Ce livre par cet auteur' auto=false) +- Je cherche un livre écrit par ($query 'Auteur' auto=false) diff --git a/sdk/custom/intents/search_query.yaml b/sdk/custom/intents/search_query.yaml new file mode 100644 index 00000000..13277820 --- /dev/null +++ b/sdk/custom/intents/search_query.yaml @@ -0,0 +1,7 @@ +parameters: +- name: query + type: + name: string +trainingPhrases: +- ($query 'La Peste de Camus' auto=false) +- ($query 'Le Petit Prince par Antoine de Saint-Exupéry' auto=false) diff --git a/sdk/custom/intents/selection_all_publication_lvl3.yaml b/sdk/custom/intents/selection_all_publication_lvl3.yaml new file mode 100644 index 00000000..97be19f7 --- /dev/null +++ b/sdk/custom/intents/selection_all_publication_lvl3.yaml @@ -0,0 +1,2 @@ +trainingPhrases: +- toute les publications diff --git a/sdk/prod/custom/intents/selection_audiobook_lvl2.yaml b/sdk/custom/intents/selection_audiobook_lvl2.yaml similarity index 100% rename from sdk/prod/custom/intents/selection_audiobook_lvl2.yaml rename to sdk/custom/intents/selection_audiobook_lvl2.yaml diff --git a/sdk/prod/custom/intents/selection_genre_lvl3.yaml b/sdk/custom/intents/selection_genre_lvl3.yaml similarity index 100% rename from sdk/prod/custom/intents/selection_genre_lvl3.yaml rename to sdk/custom/intents/selection_genre_lvl3.yaml diff --git a/sdk/prod/custom/intents/selection_my_list_lvl3.yaml b/sdk/custom/intents/selection_my_list_lvl3.yaml similarity index 100% rename from sdk/prod/custom/intents/selection_my_list_lvl3.yaml rename to sdk/custom/intents/selection_my_list_lvl3.yaml diff --git a/sdk/prod/custom/intents/selection_thematic_list_lvl3.yaml b/sdk/custom/intents/selection_thematic_list_lvl3.yaml similarity index 100% rename from sdk/prod/custom/intents/selection_thematic_list_lvl3.yaml rename to sdk/custom/intents/selection_thematic_list_lvl3.yaml diff --git a/sdk/custom/intents/selects_book.yaml b/sdk/custom/intents/selects_book.yaml new file mode 100644 index 00000000..2bde62a1 --- /dev/null +++ b/sdk/custom/intents/selects_book.yaml @@ -0,0 +1,25 @@ +parameters: +- name: number + type: + name: actions.type.Number +trainingPhrases: +- Le ($number 'premier' auto=false) +- Le ($number 'second' auto=false) +- Le ($number 'troisième' auto=false) +- Le ($number 'quatrième' auto=false) +- Le ($number 'cinquième' auto=false) +- Numéro ($number 'un' auto=false) +- Numéro ($number 'deux' auto=false) +- Numéro ($number 'trois' auto=false) +- Numéro ($number 'quatre' auto=false) +- Numéro ($number 'cinq' auto=false) +- Le numéro ($number 'un' auto=false) +- Le numéro ($number 'deux' auto=false) +- Le numéro ($number 'trois' auto=false) +- Le numéro ($number 'quatre' auto=false) +- Le numéro ($number 'cinq' auto=false) +- ($number 'un' auto=false) +- ($number 'deux' auto=false) +- ($number 'trois' auto=false) +- ($number 'quatre' auto=false) +- ($number 'cinq' auto=false) diff --git a/sdk/custom/intents/stop.yaml b/sdk/custom/intents/stop.yaml new file mode 100644 index 00000000..432c35ff --- /dev/null +++ b/sdk/custom/intents/stop.yaml @@ -0,0 +1,3 @@ +trainingPhrases: +- revenir au menu précédent +- partir de là diff --git a/sdk/custom/intents/test_player_sdk.yaml b/sdk/custom/intents/test_player_sdk.yaml new file mode 100644 index 00000000..69b07339 --- /dev/null +++ b/sdk/custom/intents/test_player_sdk.yaml @@ -0,0 +1,7 @@ +parameters: +- name: number + type: + name: actions.type.Number +trainingPhrases: +- test player sdk ($number '123' auto=false) +- test player ($number '123' auto=true) diff --git a/sdk/custom/intents/test_setup_sdk.yaml b/sdk/custom/intents/test_setup_sdk.yaml new file mode 100644 index 00000000..dd25c1d1 --- /dev/null +++ b/sdk/custom/intents/test_setup_sdk.yaml @@ -0,0 +1,8 @@ +parameters: +- name: number + type: + name: actions.type.Number +trainingPhrases: +- setup test ($number '123' auto=false) +- test setup sdk ($number '123' auto=true) +- setup test sdk ($number '123' auto=true) diff --git a/sdk/prod/custom/intents/test_webhook.yaml b/sdk/custom/intents/test_webhook.yaml similarity index 100% rename from sdk/prod/custom/intents/test_webhook.yaml rename to sdk/custom/intents/test_webhook.yaml diff --git a/sdk/test/custom/intents/yes.yaml b/sdk/custom/intents/yes.yaml similarity index 57% rename from sdk/test/custom/intents/yes.yaml rename to sdk/custom/intents/yes.yaml index 92072da0..0e2cde57 100644 --- a/sdk/test/custom/intents/yes.yaml +++ b/sdk/custom/intents/yes.yaml @@ -1,6 +1,3 @@ trainingPhrases: -- "y" -- ui -- ouep -- ouais - oui +- ui diff --git a/sdk/custom/scenes/ask_to_resume_listening_at_last_offset.yaml b/sdk/custom/scenes/ask_to_resume_listening_at_last_offset.yaml new file mode 100644 index 00000000..84eb2ac0 --- /dev/null +++ b/sdk/custom/scenes/ask_to_resume_listening_at_last_offset.yaml @@ -0,0 +1,9 @@ +intentEvents: +- handler: + webhookHandler: ask_to_resume_listening_at_last_offset__intent__yes + intent: "yes" +- handler: + webhookHandler: ask_to_resume_listening_at_last_offset__intent__no + intent: "no" +onEnter: + webhookHandler: ask_to_resume_listening_at_last_offset diff --git a/sdk/custom/scenes/collections.yaml b/sdk/custom/scenes/collections.yaml new file mode 100644 index 00000000..83d250a4 --- /dev/null +++ b/sdk/custom/scenes/collections.yaml @@ -0,0 +1,33 @@ +intentEvents: +- handler: + webhookHandler: collections__intent__bookshelf + intent: bookshelf +- handler: + webhookHandler: collections__intent__by_genre + intent: by_genre +- handler: + webhookHandler: collections__intent__by_theme + intent: by_theme +- handler: + webhookHandler: collections__intent__help + intent: help +- handler: + webhookHandler: collections__intent__fallback + intent: actions.intent.NO_MATCH_1 +- handler: + webhookHandler: collections__intent__fallback + intent: actions.intent.NO_MATCH_2 +- handler: + webhookHandler: collections__intent__fallback_end + intent: actions.intent.NO_MATCH_FINAL +- handler: + webhookHandler: collections__intent__silence + intent: actions.intent.NO_INPUT_1 +- handler: + webhookHandler: collections__intent__silence + intent: actions.intent.NO_INPUT_2 +- handler: + webhookHandler: collections__intent__silence_end + intent: actions.intent.NO_INPUT_FINAL +onEnter: + webhookHandler: collections__on_enter diff --git a/sdk/custom/scenes/home_lvl1.yaml b/sdk/custom/scenes/home_lvl1.yaml new file mode 100644 index 00000000..e9a83216 --- /dev/null +++ b/sdk/custom/scenes/home_lvl1.yaml @@ -0,0 +1,18 @@ +intentEvents: +- handler: + webhookHandler: home_lvl1__intent__get_info_association_lvl1 + intent: get_info_association_lvl1 +- handler: + webhookHandler: home_lvl1__intent__enter_member_space_lvl1 + intent: enter_member_space_lvl1 +- handler: + webhookHandler: home_lvl1__intent__resume_listening_player + intent: resume_listening_player +- handler: + webhookHandler: home_lvl1__intent__listen_audiobook_lvl1 + intent: listen_audiobook_lvl1 +- handler: + webhookHandler: test_webhook + intent: test_webhook +onEnter: + webhookHandler: home_lvl1 diff --git a/sdk/prod/custom/scenes/home_lvl1_AccountLinking.yaml b/sdk/custom/scenes/home_lvl1_AccountLinking.yaml similarity index 100% rename from sdk/prod/custom/scenes/home_lvl1_AccountLinking.yaml rename to sdk/custom/scenes/home_lvl1_AccountLinking.yaml diff --git a/sdk/custom/scenes/home_members_lvl2.yaml b/sdk/custom/scenes/home_members_lvl2.yaml new file mode 100644 index 00000000..b0d4ccf9 --- /dev/null +++ b/sdk/custom/scenes/home_members_lvl2.yaml @@ -0,0 +1,30 @@ +intentEvents: +- handler: + webhookHandler: home_members_lvl2__intent__listen_audiobook_lvl2 + intent: listen_audiobook_lvl2 +- handler: + webhookHandler: home_members_lvl2__intent__resume_audiobook_lvl2 + intent: resume_audiobook_lvl2 +- handler: + webhookHandler: home_members__intent__selection_audiobook_lvl2 + intent: selection_audiobook_lvl2 +- handler: + webhookHandler: test_setup_sdk + intent: test_setup_sdk + transitionToScene: home_members_lvl2 +- handler: + webhookHandler: test_player_sdk + intent: test_player_sdk + transitionToScene: home_members_lvl2 +- handler: + webhookHandler: test_webhook + intent: test_webhook +- intent: menu + transitionToScene: home_members_lvl2 +- handler: + webhookHandler: selection_lvl3__intent__selection_my_list_lvl3 + intent: selection_my_list_lvl3 +- intent: listen_toc + transitionToScene: player_toc +onEnter: + webhookHandler: home_members_lvl2 diff --git a/sdk/custom/scenes/home_new_user.yaml b/sdk/custom/scenes/home_new_user.yaml new file mode 100644 index 00000000..b1add435 --- /dev/null +++ b/sdk/custom/scenes/home_new_user.yaml @@ -0,0 +1,34 @@ +intentEvents: +- handler: + webhookHandler: home_new_user__intent__help + intent: help +- handler: + webhookHandler: home_new_user__intent__maybe_later + intent: maybe_later +- handler: + webhookHandler: home_new_user__intent__no + intent: "no" +- handler: + webhookHandler: home_new_user__intent__repeat + intent: repeat +- handler: + webhookHandler: home_new_user__intent__yes + intent: "yes" + transitionToScene: home_new_user_AccountLinking +- handler: + webhookHandler: home_new_user__intent__fallback + intent: actions.intent.NO_MATCH_1 +- handler: + webhookHandler: home_new_user__intent__fallback + intent: actions.intent.NO_MATCH_2 +- handler: + webhookHandler: home_new_user__intent__fallback_end + intent: actions.intent.NO_MATCH_FINAL +- handler: + webhookHandler: home_new_user__intent__silence + intent: actions.intent.NO_INPUT_1 +- handler: + webhookHandler: home_new_user__intent__silence_end + intent: actions.intent.NO_INPUT_FINAL +onEnter: + webhookHandler: home_new_user__on_enter diff --git a/sdk/test/custom/scenes/home_lvl1_AccountLinking.yaml b/sdk/custom/scenes/home_new_user_AccountLinking.yaml similarity index 79% rename from sdk/test/custom/scenes/home_lvl1_AccountLinking.yaml rename to sdk/custom/scenes/home_new_user_AccountLinking.yaml index a3fb2cf1..4772059e 100644 --- a/sdk/test/custom/scenes/home_lvl1_AccountLinking.yaml +++ b/sdk/custom/scenes/home_new_user_AccountLinking.yaml @@ -1,10 +1,10 @@ conditionalEvents: - condition: session.params.AccountLinkingSlot == "LINKED" - transitionToScene: home_members_lvl2 + transitionToScene: home_user - condition: session.params.AccountLinkingSlot == "ERROR" - transitionToScene: home_lvl1 + transitionToScene: actions.scene.END_CONVERSATION - condition: session.params.AccountLinkingSlot == "REJECTED" - transitionToScene: home_lvl1 + transitionToScene: actions.scene.END_CONVERSATION slots: - commitBehavior: writeSessionParam: AccountLinkingSlot diff --git a/sdk/custom/scenes/home_new_user_maybe_later.yaml b/sdk/custom/scenes/home_new_user_maybe_later.yaml new file mode 100644 index 00000000..e16e4b41 --- /dev/null +++ b/sdk/custom/scenes/home_new_user_maybe_later.yaml @@ -0,0 +1,33 @@ +intentEvents: +- handler: + webhookHandler: home_new_user_maybe_later__intent__learn_more + intent: learn_more +- handler: + webhookHandler: home_new_user_maybe_later__intent__repeat + intent: repeat +- handler: + webhookHandler: home_new_user_maybe_later__intent__link_account + intent: link_account +- handler: + webhookHandler: home_new_user_maybe_later__intent__help + intent: help +- handler: + webhookHandler: home_new_user_maybe_later__intent__fallback + intent: actions.intent.NO_MATCH_1 +- handler: + webhookHandler: home_new_user_maybe_later__intent__fallback + intent: actions.intent.NO_MATCH_2 +- handler: + webhookHandler: home_new_user_maybe_later__intent__fallback_end + intent: actions.intent.NO_MATCH_FINAL +- handler: + webhookHandler: home_new_user_maybe_later__intent__silence + intent: actions.intent.NO_INPUT_1 +- handler: + webhookHandler: home_new_user_maybe_later__intent__silence + intent: actions.intent.NO_INPUT_2 +- handler: + webhookHandler: home_new_user_maybe_later__intent__silence_end + intent: actions.intent.NO_INPUT_FINAL +onEnter: + webhookHandler: home_new_user_maybe_later__on_enter diff --git a/sdk/custom/scenes/home_new_user_no.yaml b/sdk/custom/scenes/home_new_user_no.yaml new file mode 100644 index 00000000..88c467da --- /dev/null +++ b/sdk/custom/scenes/home_new_user_no.yaml @@ -0,0 +1,33 @@ +intentEvents: +- handler: + webhookHandler: home_new_user_no__intent__yes + intent: "yes" +- handler: + webhookHandler: home_new_user_no__intent__no + intent: "no" +- handler: + webhookHandler: home_new_user_no__intent__repeat + intent: repeat +- handler: + webhookHandler: home_new_user_no__intent__help + intent: help +- handler: + webhookHandler: home_new_user_no__intent__fallback + intent: actions.intent.NO_MATCH_1 +- handler: + webhookHandler: home_new_user_no__intent__fallback + intent: actions.intent.NO_MATCH_2 +- handler: + webhookHandler: home_new_user_no__intent__fallback_end + intent: actions.intent.NO_MATCH_FINAL +- handler: + webhookHandler: home_new_user_no__intent__silence + intent: actions.intent.NO_INPUT_1 +- handler: + webhookHandler: home_new_user_no__intent__silence + intent: actions.intent.NO_INPUT_2 +- handler: + webhookHandler: home_new_user_no__intent__silence_end + intent: actions.intent.NO_INPUT_FINAL +onEnter: + webhookHandler: home_new_user_no__on_enter diff --git a/sdk/custom/scenes/home_user.yaml b/sdk/custom/scenes/home_user.yaml new file mode 100644 index 00000000..2e143efd --- /dev/null +++ b/sdk/custom/scenes/home_user.yaml @@ -0,0 +1,42 @@ +intentEvents: +- handler: + webhookHandler: home_user__intent__help + intent: help +- handler: + webhookHandler: home_user__intent__repeat + intent: repeat +- handler: + webhookHandler: home_user__intent__bookshelf + intent: bookshelf +- handler: + webhookHandler: home_user__intent__collections + intent: collections +- handler: + webhookHandler: home_user__intent__search + intent: search +- handler: + webhookHandler: home_user__intent__recent_books + intent: recent_books +- handler: + webhookHandler: home_user__intent__current_book + intent: current_book +- handler: + webhookHandler: home_user__intent__fallback + intent: actions.intent.NO_MATCH_1 +- handler: + webhookHandler: home_user__intent__fallback + intent: actions.intent.NO_MATCH_2 +- handler: + webhookHandler: home_user__intent__fallback_end + intent: actions.intent.NO_MATCH_FINAL +- handler: + webhookHandler: home_user__intent__silence + intent: actions.intent.NO_INPUT_1 +- handler: + webhookHandler: home_user__intent__silence + intent: actions.intent.NO_INPUT_2 +- handler: + webhookHandler: home_user__intent__silence_end + intent: actions.intent.NO_INPUT_FINAL +onEnter: + webhookHandler: home_user__on_enter diff --git a/sdk/custom/scenes/info.yaml b/sdk/custom/scenes/info.yaml new file mode 100644 index 00000000..f1538109 --- /dev/null +++ b/sdk/custom/scenes/info.yaml @@ -0,0 +1,38 @@ +intentEvents: +- handler: + webhookHandler: info__intent__yes + intent: "yes" + transitionToScene: actions.scene.END_CONVERSATION +- handler: + webhookHandler: info__intent__help + intent: help +- handler: + webhookHandler: info__intent__repeat + intent: repeat +- handler: + webhookHandler: info__intent__yes + intent: membership + transitionToScene: actions.scene.END_CONVERSATION +- handler: + webhookHandler: info__intent__no + intent: "no" +- handler: + webhookHandler: info__intent__fallback + intent: actions.intent.NO_MATCH_1 +- handler: + webhookHandler: info__intent__fallback + intent: actions.intent.NO_MATCH_2 +- handler: + webhookHandler: info__intent__fallback_end + intent: actions.intent.NO_MATCH_FINAL +- handler: + webhookHandler: info__intent__silence + intent: actions.intent.NO_INPUT_1 +- handler: + webhookHandler: info__intent__silence + intent: actions.intent.NO_INPUT_2 +- handler: + webhookHandler: info__intent__silence_end + intent: actions.intent.NO_INPUT_FINAL +onEnter: + webhookHandler: info__on_enter diff --git a/sdk/custom/scenes/player.yaml b/sdk/custom/scenes/player.yaml new file mode 100644 index 00000000..e9c731a7 --- /dev/null +++ b/sdk/custom/scenes/player.yaml @@ -0,0 +1,15 @@ +intentEvents: +- handler: + webhookHandler: player__intent__media_status_finished + intent: actions.intent.MEDIA_STATUS_FINISHED +- handler: + webhookHandler: player__intent__media_status_paused + intent: actions.intent.MEDIA_STATUS_PAUSED +- handler: + webhookHandler: player__intent__media_status_stopped + intent: actions.intent.MEDIA_STATUS_STOPPED +- handler: + webhookHandler: player__intent__media_status_failed + intent: actions.intent.MEDIA_STATUS_FAILED +onEnter: + webhookHandler: player__on_enter diff --git a/sdk/custom/scenes/player_prequel.yaml b/sdk/custom/scenes/player_prequel.yaml new file mode 100644 index 00000000..8ca05d70 --- /dev/null +++ b/sdk/custom/scenes/player_prequel.yaml @@ -0,0 +1,39 @@ +intentEvents: +- handler: + webhookHandler: player_prequel__intent__help + intent: help +- handler: + webhookHandler: player_prequel__intent__repeat + intent: repeat +- handler: + webhookHandler: player_prequel__intent__player_prequel_back + intent: player_prequel_back +- handler: + webhookHandler: player_prequel__intent__player_prequel_resume + intent: player_prequel_resume +- handler: + webhookHandler: player_prequel__intent__player_prequel_start + intent: player_prequel_start +- handler: + webhookHandler: player_prequel__intent__player_prequel_summary + intent: player_prequel_summary +- handler: + webhookHandler: player_prequel__fallback + intent: actions.intent.NO_MATCH_1 +- handler: + webhookHandler: player_prequel__fallback + intent: actions.intent.NO_MATCH_2 +- handler: + webhookHandler: player_prequel__fallback_end + intent: actions.intent.NO_MATCH_FINAL +- handler: + webhookHandler: player_prequel__silence + intent: actions.intent.NO_INPUT_1 +- handler: + webhookHandler: player_prequel__silence + intent: actions.intent.NO_INPUT_2 +- handler: + webhookHandler: player_prequel__silence_end + intent: actions.intent.NO_INPUT_FINAL +onEnter: + webhookHandler: player_prequel__on_enter diff --git a/sdk/custom/scenes/player_toc.yaml b/sdk/custom/scenes/player_toc.yaml new file mode 100644 index 00000000..7cfb9b62 --- /dev/null +++ b/sdk/custom/scenes/player_toc.yaml @@ -0,0 +1,19 @@ +intentEvents: +- handler: + webhookHandler: player_toc__intent__repeat + intent: repeat +- handler: + webhookHandler: player_toc__intent__next + intent: next +- handler: + webhookHandler: player_toc__intent__resume_listening_player + intent: resume_listening_player +onEnter: + webhookHandler: player_toc +onSlotUpdated: + webhookHandler: player_toc__slot__number +slots: +- name: number + required: true + type: + name: actions.type.Number diff --git a/sdk/custom/scenes/search.yaml b/sdk/custom/scenes/search.yaml new file mode 100644 index 00000000..4dd62b61 --- /dev/null +++ b/sdk/custom/scenes/search.yaml @@ -0,0 +1,9 @@ +intentEvents: +- handler: + webhookHandler: search__intent__search_query + intent: search_query +- handler: + webhookHandler: search__intent__search + intent: search +onEnter: + webhookHandler: search__on_enter \ No newline at end of file diff --git a/sdk/prod/custom/scenes/select_pub_after_selection.yaml b/sdk/custom/scenes/select_group.yaml similarity index 79% rename from sdk/prod/custom/scenes/select_pub_after_selection.yaml rename to sdk/custom/scenes/select_group.yaml index 10d12712..203b7eb2 100644 --- a/sdk/prod/custom/scenes/select_pub_after_selection.yaml +++ b/sdk/custom/scenes/select_group.yaml @@ -1,6 +1,10 @@ intentEvents: -- intent: resume_listening_player - transitionToScene: select_pub_after_selection +- handler: + webhookHandler: select_group__intent__stop + intent: stop +- handler: + webhookHandler: select_group__intent__menu + intent: menu - handler: staticPrompt: candidates: @@ -50,18 +54,11 @@ intentEvents: - speech: je n’ai pas compris le numéro intent: actions.intent.NO_INPUT_FINAL onEnter: - staticPrompt: - candidates: - - promptResponse: - firstSimple: - variants: - - speech: Pour choisir une publication dite son numéro + webhookHandler: select_group onSlotUpdated: - webhookHandler: select_publication_number_after_selection + webhookHandler: select_group__slot__number slots: -- commitBehavior: - writeSessionParam: number - name: number +- name: number required: true type: name: actions.type.Number diff --git a/sdk/prod/custom/scenes/select_pub_after_search.yaml b/sdk/custom/scenes/select_publication.yaml similarity index 74% rename from sdk/prod/custom/scenes/select_pub_after_search.yaml rename to sdk/custom/scenes/select_publication.yaml index f6dc9f7b..d2cab1b4 100644 --- a/sdk/prod/custom/scenes/select_pub_after_search.yaml +++ b/sdk/custom/scenes/select_publication.yaml @@ -1,6 +1,18 @@ intentEvents: -- intent: resume_listening_player - transitionToScene: select_pub_after_search +- handler: + webhookHandler: select_publication__intent__resume_listening_player + intent: resume_listening_player +- handler: + webhookHandler: select_publication__intent__stop + intent: stop +- handler: + webhookHandler: select_publication__intent__next + intent: next +- handler: + webhookHandler: select_publication__intent__repeat + intent: repeat +- intent: menu + transitionToScene: home_members_lvl2 - handler: staticPrompt: candidates: @@ -52,18 +64,11 @@ intentEvents: intent: actions.intent.NO_INPUT_FINAL transitionToScene: search onEnter: - staticPrompt: - candidates: - - promptResponse: - firstSimple: - variants: - - speech: Pour choisir une publication dite son numéro + webhookHandler: select_publication onSlotUpdated: - webhookHandler: select_publication_number_after_search + webhookHandler: select_publication__slot__number slots: -- commitBehavior: - writeSessionParam: number - name: number +- name: number required: true type: name: actions.type.Number diff --git a/sdk/custom/scenes/selection.yaml b/sdk/custom/scenes/selection.yaml new file mode 100644 index 00000000..60f3e272 --- /dev/null +++ b/sdk/custom/scenes/selection.yaml @@ -0,0 +1,33 @@ +intentEvents: +- handler: + webhookHandler: selection__intent__selects_book + intent: selects_book +- handler: + webhookHandler: selection__intent__repeat + intent: repeat +- handler: + webhookHandler: selection__intent__another_one + intent: another_one +- handler: + webhookHandler: selection__intent__help + intent: help +- handler: + webhookHandler: selection__intent__fallback + intent: actions.intent.NO_MATCH_1 +- handler: + webhookHandler: selection__intent__fallback + intent: actions.intent.NO_MATCH_2 +- handler: + webhookHandler: selection__intent__fallback_end + intent: actions.intent.NO_MATCH_FINAL +- handler: + webhookHandler: selection__intent__silence + intent: actions.intent.NO_INPUT_1 +- handler: + webhookHandler: selection__intent__silence + intent: actions.intent.NO_INPUT_2 +- handler: + webhookHandler: selection__intent__silence_end + intent: actions.intent.NO_INPUT_FINAL +onEnter: + webhookHandler: selection__on_enter diff --git a/sdk/custom/scenes/selection_lvl3.yaml b/sdk/custom/scenes/selection_lvl3.yaml new file mode 100644 index 00000000..72a33a36 --- /dev/null +++ b/sdk/custom/scenes/selection_lvl3.yaml @@ -0,0 +1,15 @@ +intentEvents: +- handler: + webhookHandler: selection_lvl3__intent__selection_genre_lvl3 + intent: selection_genre_lvl3 +- handler: + webhookHandler: selection_lvl3__intent__selection_thematic_list_lvl3 + intent: selection_thematic_list_lvl3 +- handler: + webhookHandler: selection_lvl3__intent__selection_my_list_lvl3 + intent: selection_my_list_lvl3 +- handler: + webhookHandler: selection_lvl3__intent__selection_all_publication_lvl3 + intent: selection_all_publication_lvl3 +onEnter: + webhookHandler: selection_lvl3 diff --git a/sdk/prod/custom/types/string.yaml b/sdk/custom/types/en/string.yaml similarity index 100% rename from sdk/prod/custom/types/string.yaml rename to sdk/custom/types/en/string.yaml diff --git a/sdk/test/custom/types/string.yaml b/sdk/custom/types/string.yaml similarity index 100% rename from sdk/test/custom/types/string.yaml rename to sdk/custom/types/string.yaml diff --git a/sdk/prod/manifest.yaml b/sdk/manifest.yaml similarity index 100% rename from sdk/prod/manifest.yaml rename to sdk/manifest.yaml diff --git a/sdk/prod/custom/global/actions.intent.CANCEL.yaml b/sdk/prod/custom/global/actions.intent.CANCEL.yaml deleted file mode 100644 index 22c095fb..00000000 --- a/sdk/prod/custom/global/actions.intent.CANCEL.yaml +++ /dev/null @@ -1,9 +0,0 @@ -handler: - staticPrompt: - candidates: - - promptResponse: - firstSimple: - variants: - - speech: Au revoir et a bientôt - webhookHandler: cancel -transitionToScene: actions.scene.END_CONVERSATION diff --git a/sdk/prod/custom/global/actions.intent.MAIN.yaml b/sdk/prod/custom/global/actions.intent.MAIN.yaml deleted file mode 100644 index 463025af..00000000 --- a/sdk/prod/custom/global/actions.intent.MAIN.yaml +++ /dev/null @@ -1,9 +0,0 @@ -handler: - staticPrompt: - candidates: - - promptResponse: - firstSimple: - variants: - - speech: Bienvenue dans l'application d'écoute de livre audio valentin - hauy -transitionToScene: home_lvl1 diff --git a/sdk/prod/custom/global/actions.intent.NO_INPUT_1.yaml b/sdk/prod/custom/global/actions.intent.NO_INPUT_1.yaml deleted file mode 100644 index de975f82..00000000 --- a/sdk/prod/custom/global/actions.intent.NO_INPUT_1.yaml +++ /dev/null @@ -1,7 +0,0 @@ -handler: - staticPrompt: - candidates: - - promptResponse: - firstSimple: - variants: - - speech: je n'ai pas entendu. Que voulez-vous dire ? diff --git a/sdk/prod/custom/global/actions.intent.NO_INPUT_2.yaml b/sdk/prod/custom/global/actions.intent.NO_INPUT_2.yaml deleted file mode 100644 index 59e57245..00000000 --- a/sdk/prod/custom/global/actions.intent.NO_INPUT_2.yaml +++ /dev/null @@ -1,7 +0,0 @@ -handler: - staticPrompt: - candidates: - - promptResponse: - firstSimple: - variants: - - speech: Que dite-vous ? diff --git a/sdk/prod/custom/global/actions.intent.NO_INPUT_FINAL.yaml b/sdk/prod/custom/global/actions.intent.NO_INPUT_FINAL.yaml deleted file mode 100644 index 63087279..00000000 --- a/sdk/prod/custom/global/actions.intent.NO_INPUT_FINAL.yaml +++ /dev/null @@ -1,8 +0,0 @@ -handler: - staticPrompt: - candidates: - - promptResponse: - firstSimple: - variants: - - speech: Je quitte l'application -transitionToScene: actions.scene.END_CONVERSATION diff --git a/sdk/prod/custom/global/actions.intent.NO_MATCH_1.yaml b/sdk/prod/custom/global/actions.intent.NO_MATCH_1.yaml deleted file mode 100644 index 166efc70..00000000 --- a/sdk/prod/custom/global/actions.intent.NO_MATCH_1.yaml +++ /dev/null @@ -1,7 +0,0 @@ -handler: - staticPrompt: - candidates: - - promptResponse: - firstSimple: - variants: - - speech: je n'ai pas compris. Que voulez-vous dire ? diff --git a/sdk/prod/custom/global/actions.intent.NO_MATCH_2.yaml b/sdk/prod/custom/global/actions.intent.NO_MATCH_2.yaml deleted file mode 100644 index deda0dc7..00000000 --- a/sdk/prod/custom/global/actions.intent.NO_MATCH_2.yaml +++ /dev/null @@ -1,7 +0,0 @@ -handler: - staticPrompt: - candidates: - - promptResponse: - firstSimple: - variants: - - speech: je n'ai vraiment pas compris. Que voulez-vous dire ? diff --git a/sdk/prod/custom/global/actions.intent.NO_MATCH_FINAL.yaml b/sdk/prod/custom/global/actions.intent.NO_MATCH_FINAL.yaml deleted file mode 100644 index 2f8cf92a..00000000 --- a/sdk/prod/custom/global/actions.intent.NO_MATCH_FINAL.yaml +++ /dev/null @@ -1,8 +0,0 @@ -handler: - staticPrompt: - candidates: - - promptResponse: - firstSimple: - variants: - - speech: malheureusement je m'en vais, je ne comprend pas -transitionToScene: actions.scene.END_CONVERSATION diff --git a/sdk/prod/custom/intents/resume_listening_player.yaml b/sdk/prod/custom/intents/resume_listening_player.yaml deleted file mode 100644 index 2cd0b674..00000000 --- a/sdk/prod/custom/intents/resume_listening_player.yaml +++ /dev/null @@ -1,3 +0,0 @@ -trainingPhrases: -- reprend la lecture -- reprendre la lecture diff --git a/sdk/prod/custom/intents/yes.yaml b/sdk/prod/custom/intents/yes.yaml deleted file mode 100644 index 92072da0..00000000 --- a/sdk/prod/custom/intents/yes.yaml +++ /dev/null @@ -1,6 +0,0 @@ -trainingPhrases: -- "y" -- ui -- ouep -- ouais -- oui diff --git a/sdk/prod/custom/scenes/ask_to_resume_listening_at_last_offset.yaml b/sdk/prod/custom/scenes/ask_to_resume_listening_at_last_offset.yaml deleted file mode 100644 index c575375b..00000000 --- a/sdk/prod/custom/scenes/ask_to_resume_listening_at_last_offset.yaml +++ /dev/null @@ -1,11 +0,0 @@ -intentEvents: -- handler: - webhookHandler: ask_to_resume_listening_at_last_offset__yes - intent: "yes" - transitionToScene: player -- handler: - webhookHandler: ask_to_resume_listening_at_last_offset__no - intent: "no" - transitionToScene: player -onEnter: - webhookHandler: ask_to_resume_listening_at_last_offset diff --git a/sdk/prod/custom/scenes/home_lvl1.yaml b/sdk/prod/custom/scenes/home_lvl1.yaml deleted file mode 100644 index 4bf88a05..00000000 --- a/sdk/prod/custom/scenes/home_lvl1.yaml +++ /dev/null @@ -1,31 +0,0 @@ -intentEvents: -- handler: - staticPrompt: - candidates: - - promptResponse: - firstSimple: - variants: - - speech: Voici les informations sur l'association - intent: get_info_association_lvl1 - transitionToScene: home_lvl1 -- intent: enter_member_space_lvl1 - transitionToScene: home_lvl1_AccountLinking -- intent: resume_listening_player - transitionToScene: home_lvl1 -- intent: listen_audiobook_lvl1 - transitionToScene: home_lvl1_AccountLinking -- handler: - webhookHandler: test_webhook - intent: test_webhook - transitionToScene: home_lvl1 -onEnter: - staticPrompt: - candidates: - - promptResponse: - firstSimple: - variants: - - speech: Que voulez-vous faire ? Vous pouvez dire informations ou espace - membres - suggestions: - - title: informations - - title: espace membres diff --git a/sdk/prod/custom/scenes/home_members_lvl2.yaml b/sdk/prod/custom/scenes/home_members_lvl2.yaml deleted file mode 100644 index 2498e69c..00000000 --- a/sdk/prod/custom/scenes/home_members_lvl2.yaml +++ /dev/null @@ -1,25 +0,0 @@ -intentEvents: -- handler: - webhookHandler: ecouter_livre_audio_lvl2 - intent: listen_audiobook_lvl2 - transitionToScene: search -- handler: - webhookHandler: reprendre_mon_livre_lvl2 - intent: resume_audiobook_lvl2 - transitionToScene: ask_to_resume_listening_at_last_offset -- handler: - webhookHandler: selection_livre_lvl2 - intent: selection_audiobook_lvl2 - transitionToScene: selection_lvl3 -onEnter: - staticPrompt: - candidates: - - promptResponse: - firstSimple: - variants: - - speech: Bienvenue dans l'espace membres. Les commandes possibles sont, - sélection, lecture, recherche. Que voulez-vous faire ? - suggestions: - - title: selection d'un livre - - title: lecture du dernier livre - - title: recherche d'un livre diff --git a/sdk/prod/custom/scenes/player.yaml b/sdk/prod/custom/scenes/player.yaml deleted file mode 100644 index 06957f78..00000000 --- a/sdk/prod/custom/scenes/player.yaml +++ /dev/null @@ -1,21 +0,0 @@ -intentEvents: -- handler: - webhookHandler: reprendre_la_lecture - intent: resume_listening_player -- handler: - webhookHandler: remaining_time - intent: remaing_time_player -- handler: - webhookHandler: media_status - intent: actions.intent.MEDIA_STATUS_FINISHED -- handler: - webhookHandler: media_status - intent: actions.intent.MEDIA_STATUS_PAUSED -- handler: - webhookHandler: media_status - intent: actions.intent.MEDIA_STATUS_STOPPED -- handler: - webhookHandler: media_status - intent: actions.intent.MEDIA_STATUS_FAILED -onEnter: - webhookHandler: player diff --git a/sdk/prod/custom/scenes/search.yaml b/sdk/prod/custom/scenes/search.yaml deleted file mode 100644 index 4d95c236..00000000 --- a/sdk/prod/custom/scenes/search.yaml +++ /dev/null @@ -1,21 +0,0 @@ -conditionalEvents: -- condition: scene.slots.status == "FINAL" - handler: - webhookHandler: search_livre_lvl2 -intentEvents: -- intent: resume_listening_player - transitionToScene: search -onEnter: - staticPrompt: - candidates: - - promptResponse: - firstSimple: - variants: - - speech: Que voulez-vous écouter ? Par exemple Zola -slots: -- commitBehavior: - writeSessionParam: query - name: query - required: true - type: - name: string diff --git a/sdk/prod/custom/scenes/selection_lvl3.yaml b/sdk/prod/custom/scenes/selection_lvl3.yaml deleted file mode 100644 index 583e652a..00000000 --- a/sdk/prod/custom/scenes/selection_lvl3.yaml +++ /dev/null @@ -1,10 +0,0 @@ -intentEvents: -- handler: - webhookHandler: selection_genre_lvl3 - intent: selection_genre_lvl3 -- handler: - webhookHandler: selection_thematic_list_lvl3 - intent: selection_thematic_list_lvl3 -- handler: - webhookHandler: selection_my_list_lvl3 - intent: selection_my_list_lvl3 diff --git a/sdk/prod/settings/settings.yaml b/sdk/prod/settings/settings.yaml deleted file mode 100644 index 3e43f2a0..00000000 --- a/sdk/prod/settings/settings.yaml +++ /dev/null @@ -1,24 +0,0 @@ -accountLinking: - appClientId: "1232456" - authGrantType: IMPLICIT - authorizationUrl: https://opds-auth-test-server-aplqpqv3wa-ey.a.run.app/implicit/login?lang=fr - linkingType: OAUTH -category: EDUCATION_AND_REFERENCE -defaultLocale: fr -localizedSettings: - developerEmail: dev.edrlab@gmail.com - developerName: edrlab - displayName: valentin audio - fullDescription: lis mon live edrlab demo - privacyPolicyUrl: https://www.edrlab.org/lml-privacy-policy/ - pronunciation: valentin audio - sampleInvocations: - - Parler avec valentin audio - - Connecter avec valentin audio - - Discuter avec valentin audio - shortDescription: lis mon livre - smallLogoImage: https://lh3.googleusercontent.com/IPE84cRJZSbgpkLCNMhJFkP_sbh5e18cYRvn30hVHE6nYNLfQ_9a-opqTKbQNThVPUzo8sfP1_cR - voice: female_1 -projectId: valentin-4 -testingInstructions: "login: \n\nadmin\nadmin\n\nyou can test with the query \"zola\" - or \"la guerre des boutons\"" diff --git a/sdk/prod/webhooks/ActionsOnGoogleFulfillment.yaml b/sdk/prod/webhooks/ActionsOnGoogleFulfillment.yaml deleted file mode 100644 index 814e3d4d..00000000 --- a/sdk/prod/webhooks/ActionsOnGoogleFulfillment.yaml +++ /dev/null @@ -1,22 +0,0 @@ -handlers: -- name: cancel -- name: ecouter_livre_audio_lvl2 -- name: reprendre_mon_livre_lvl2 -- name: media_status -- name: player -- name: reprendre_la_lecture -- name: remaining_time -- name: selection_livre_lvl2 -- name: select_publication_number_after_search -- name: select_publication_number_after_selection -- name: test_webhook -- name: search_livre_lvl2 -- name: ask_to_resume_listening_at_last_offset -- name: ask_to_resume_listening_at_last_offset__yes -- name: ask_to_resume_listening_at_last_offset__no -- name: selection_genre_lvl3 -- name: selection_thematic_list_lvl3 -- name: selection_my_list_lvl3 -httpsEndpoint: - baseUrl: https://us-central1-valentin-4.cloudfunctions.net/ActionsOnGoogleFulfillment - endpointApiVersion: 2 diff --git a/sdk/settings/en/settings.yaml b/sdk/settings/en/settings.yaml new file mode 100644 index 00000000..72a8d167 --- /dev/null +++ b/sdk/settings/en/settings.yaml @@ -0,0 +1,4 @@ +localizedSettings: + displayName: edrlab + pronunciation: edrlab + voice: female_1 diff --git a/sdk/test/settings/settings.yaml b/sdk/settings/settings.yaml similarity index 75% rename from sdk/test/settings/settings.yaml rename to sdk/settings/settings.yaml index 3448ec21..3059e74b 100644 --- a/sdk/test/settings/settings.yaml +++ b/sdk/settings/settings.yaml @@ -1,3 +1,8 @@ +accountLinking: + appClientId: "123456" + authGrantType: IMPLICIT + authorizationUrl: https://opds-auth-test-server-aplqpqv3wa-ey.a.run.app/implicit/login + linkingType: OAUTH category: EDUCATION_AND_REFERENCE defaultLocale: fr localizedSettings: @@ -14,4 +19,4 @@ localizedSettings: shortDescription: lis mon livre smallLogoImage: https://lh3.googleusercontent.com/IPE84cRJZSbgpkLCNMhJFkP_sbh5e18cYRvn30hVHE6nYNLfQ_9a-opqTKbQNThVPUzo8sfP1_cR voice: female_1 -projectId: valentin-5 +projectId: valentin-5 \ No newline at end of file diff --git a/sdk/test/custom/global/actions.intent.CANCEL.yaml b/sdk/test/custom/global/actions.intent.CANCEL.yaml deleted file mode 100644 index 22c095fb..00000000 --- a/sdk/test/custom/global/actions.intent.CANCEL.yaml +++ /dev/null @@ -1,9 +0,0 @@ -handler: - staticPrompt: - candidates: - - promptResponse: - firstSimple: - variants: - - speech: Au revoir et a bientôt - webhookHandler: cancel -transitionToScene: actions.scene.END_CONVERSATION diff --git a/sdk/test/custom/global/actions.intent.MAIN.yaml b/sdk/test/custom/global/actions.intent.MAIN.yaml deleted file mode 100644 index 849f748c..00000000 --- a/sdk/test/custom/global/actions.intent.MAIN.yaml +++ /dev/null @@ -1,9 +0,0 @@ -handler: - staticPrompt: - candidates: - - promptResponse: - firstSimple: - variants: - - speech: Bienvenue dans l'application d'écoute de livre audio valentin - hauy -transitionToScene: home_members_lvl2 diff --git a/sdk/test/custom/global/actions.intent.NO_INPUT_1.yaml b/sdk/test/custom/global/actions.intent.NO_INPUT_1.yaml deleted file mode 100644 index de975f82..00000000 --- a/sdk/test/custom/global/actions.intent.NO_INPUT_1.yaml +++ /dev/null @@ -1,7 +0,0 @@ -handler: - staticPrompt: - candidates: - - promptResponse: - firstSimple: - variants: - - speech: je n'ai pas entendu. Que voulez-vous dire ? diff --git a/sdk/test/custom/global/actions.intent.NO_INPUT_2.yaml b/sdk/test/custom/global/actions.intent.NO_INPUT_2.yaml deleted file mode 100644 index 59e57245..00000000 --- a/sdk/test/custom/global/actions.intent.NO_INPUT_2.yaml +++ /dev/null @@ -1,7 +0,0 @@ -handler: - staticPrompt: - candidates: - - promptResponse: - firstSimple: - variants: - - speech: Que dite-vous ? diff --git a/sdk/test/custom/global/actions.intent.NO_INPUT_FINAL.yaml b/sdk/test/custom/global/actions.intent.NO_INPUT_FINAL.yaml deleted file mode 100644 index 63087279..00000000 --- a/sdk/test/custom/global/actions.intent.NO_INPUT_FINAL.yaml +++ /dev/null @@ -1,8 +0,0 @@ -handler: - staticPrompt: - candidates: - - promptResponse: - firstSimple: - variants: - - speech: Je quitte l'application -transitionToScene: actions.scene.END_CONVERSATION diff --git a/sdk/test/custom/global/actions.intent.NO_MATCH_1.yaml b/sdk/test/custom/global/actions.intent.NO_MATCH_1.yaml deleted file mode 100644 index 166efc70..00000000 --- a/sdk/test/custom/global/actions.intent.NO_MATCH_1.yaml +++ /dev/null @@ -1,7 +0,0 @@ -handler: - staticPrompt: - candidates: - - promptResponse: - firstSimple: - variants: - - speech: je n'ai pas compris. Que voulez-vous dire ? diff --git a/sdk/test/custom/global/actions.intent.NO_MATCH_2.yaml b/sdk/test/custom/global/actions.intent.NO_MATCH_2.yaml deleted file mode 100644 index deda0dc7..00000000 --- a/sdk/test/custom/global/actions.intent.NO_MATCH_2.yaml +++ /dev/null @@ -1,7 +0,0 @@ -handler: - staticPrompt: - candidates: - - promptResponse: - firstSimple: - variants: - - speech: je n'ai vraiment pas compris. Que voulez-vous dire ? diff --git a/sdk/test/custom/global/actions.intent.NO_MATCH_FINAL.yaml b/sdk/test/custom/global/actions.intent.NO_MATCH_FINAL.yaml deleted file mode 100644 index 2f8cf92a..00000000 --- a/sdk/test/custom/global/actions.intent.NO_MATCH_FINAL.yaml +++ /dev/null @@ -1,8 +0,0 @@ -handler: - staticPrompt: - candidates: - - promptResponse: - firstSimple: - variants: - - speech: malheureusement je m'en vais, je ne comprend pas -transitionToScene: actions.scene.END_CONVERSATION diff --git a/sdk/test/custom/intents/enter_member_space_lvl1.yaml b/sdk/test/custom/intents/enter_member_space_lvl1.yaml deleted file mode 100644 index b61cfd70..00000000 --- a/sdk/test/custom/intents/enter_member_space_lvl1.yaml +++ /dev/null @@ -1,5 +0,0 @@ -trainingPhrases: -- espace maman -- membres -- espace membres -- Je veux entrer dans l'espace membres diff --git a/sdk/test/custom/intents/get_info_association_lvl1.yaml b/sdk/test/custom/intents/get_info_association_lvl1.yaml deleted file mode 100644 index 837e0830..00000000 --- a/sdk/test/custom/intents/get_info_association_lvl1.yaml +++ /dev/null @@ -1,4 +0,0 @@ -trainingPhrases: -- informations -- obtenir des informations -- Je veux obtenir des informations sur l'association diff --git a/sdk/test/custom/intents/i_want_to_listen_lvl3.yaml b/sdk/test/custom/intents/i_want_to_listen_lvl3.yaml deleted file mode 100644 index aa4c1c81..00000000 --- a/sdk/test/custom/intents/i_want_to_listen_lvl3.yaml +++ /dev/null @@ -1,10 +0,0 @@ -parameters: -- name: query - type: - name: string -trainingPhrases: -- ($query 'le nom du livre suivi de l\'auteur' auto=false) -- je veux écouter ($query 'cyrano de Bergerac d\'Edmond Rostand' auto=false) -- je veux écouter ($query 'le rouge et le noir de stendhall' auto=false) -- je veux écouter ($query 'le rouge et le noir' auto=false) -- je veux écouter ($query 'la chartreuse de parme' auto=false) diff --git a/sdk/test/custom/intents/listen_audiobook_lvl1.yaml b/sdk/test/custom/intents/listen_audiobook_lvl1.yaml deleted file mode 100644 index 5ee4919f..00000000 --- a/sdk/test/custom/intents/listen_audiobook_lvl1.yaml +++ /dev/null @@ -1,6 +0,0 @@ -trainingPhrases: -- recherche d'un livre -- recherche -- rechercher ($number1 'un' auto=true) livre -- écouter un livre -- je veux écouter un livre diff --git a/sdk/test/custom/intents/listen_audiobook_lvl2.yaml b/sdk/test/custom/intents/listen_audiobook_lvl2.yaml deleted file mode 100644 index 61fb43ec..00000000 --- a/sdk/test/custom/intents/listen_audiobook_lvl2.yaml +++ /dev/null @@ -1,12 +0,0 @@ -trainingPhrases: -- recherche d'un livre -- recherche -- rechercher ($number1 'un' auto=true) livre -- je veux écouter -- je veux écouter un livre -- écouter -- livre audio -- livre -- écouter u($number1 'n ' auto=true)audiobook -- écouter un livre -- écouter un livre audio diff --git a/sdk/test/custom/intents/remaing_time_player.yaml b/sdk/test/custom/intents/remaing_time_player.yaml deleted file mode 100644 index 703f8de9..00000000 --- a/sdk/test/custom/intents/remaing_time_player.yaml +++ /dev/null @@ -1,7 +0,0 @@ -trainingPhrases: -- combien de temps de lecture me restent-t-il ? -- depuis combien de temps j'écoute ce livre ? -- dis-moi le temps de lecture -- donne moi le temps de lecture -- quel temps me reste-t-il ? -- combien de temps de lecture reste-t-il ? diff --git a/sdk/test/custom/intents/resume_audiobook_lvl2.yaml b/sdk/test/custom/intents/resume_audiobook_lvl2.yaml deleted file mode 100644 index aab5315b..00000000 --- a/sdk/test/custom/intents/resume_audiobook_lvl2.yaml +++ /dev/null @@ -1,15 +0,0 @@ -parameters: -- name: number1 - type: - name: actions.type.Number -trainingPhrases: -- lecture d'($number1 'un' auto=true) livre -- lecture de mon livre -- lecture -- lis ($number1 'un' auto=true) livre -- lis mon livre -- reprend la lecture de mon dernier livre -- reprendre l'écoute -- reprendre la lecture de mon dernier livre -- reprend la lecture -- reprendre la lecture diff --git a/sdk/test/custom/intents/selection_audiobook_lvl2.yaml b/sdk/test/custom/intents/selection_audiobook_lvl2.yaml deleted file mode 100644 index f07b780e..00000000 --- a/sdk/test/custom/intents/selection_audiobook_lvl2.yaml +++ /dev/null @@ -1,5 +0,0 @@ -trainingPhrases: -- ma liste de lecture -- liste de lecture -- selection d'($number1 'un' auto=true) livre -- selection diff --git a/sdk/test/custom/intents/selection_genre_lvl3.yaml b/sdk/test/custom/intents/selection_genre_lvl3.yaml deleted file mode 100644 index 63195424..00000000 --- a/sdk/test/custom/intents/selection_genre_lvl3.yaml +++ /dev/null @@ -1,4 +0,0 @@ -trainingPhrases: -- je veux la sélection par genre -- genre -- sélection par genre diff --git a/sdk/test/custom/intents/selection_my_list_lvl3.yaml b/sdk/test/custom/intents/selection_my_list_lvl3.yaml deleted file mode 100644 index 020db8d6..00000000 --- a/sdk/test/custom/intents/selection_my_list_lvl3.yaml +++ /dev/null @@ -1,4 +0,0 @@ -trainingPhrases: -- je veux ma liste -- ma liste de lecture -- ma liste diff --git a/sdk/test/custom/intents/selection_thematic_list_lvl3.yaml b/sdk/test/custom/intents/selection_thematic_list_lvl3.yaml deleted file mode 100644 index 5ff3b4b0..00000000 --- a/sdk/test/custom/intents/selection_thematic_list_lvl3.yaml +++ /dev/null @@ -1,4 +0,0 @@ -trainingPhrases: -- sélection thématique -- je veux la liste thématique -- liste thématique diff --git a/sdk/test/custom/intents/test_webhook.yaml b/sdk/test/custom/intents/test_webhook.yaml deleted file mode 100644 index b955a43c..00000000 --- a/sdk/test/custom/intents/test_webhook.yaml +++ /dev/null @@ -1,3 +0,0 @@ -trainingPhrases: -- test -- test webhook diff --git a/sdk/test/custom/scenes/ask_to_resume_listening_at_last_offset.yaml b/sdk/test/custom/scenes/ask_to_resume_listening_at_last_offset.yaml deleted file mode 100644 index c575375b..00000000 --- a/sdk/test/custom/scenes/ask_to_resume_listening_at_last_offset.yaml +++ /dev/null @@ -1,11 +0,0 @@ -intentEvents: -- handler: - webhookHandler: ask_to_resume_listening_at_last_offset__yes - intent: "yes" - transitionToScene: player -- handler: - webhookHandler: ask_to_resume_listening_at_last_offset__no - intent: "no" - transitionToScene: player -onEnter: - webhookHandler: ask_to_resume_listening_at_last_offset diff --git a/sdk/test/custom/scenes/home_lvl1.yaml b/sdk/test/custom/scenes/home_lvl1.yaml deleted file mode 100644 index 4bf88a05..00000000 --- a/sdk/test/custom/scenes/home_lvl1.yaml +++ /dev/null @@ -1,31 +0,0 @@ -intentEvents: -- handler: - staticPrompt: - candidates: - - promptResponse: - firstSimple: - variants: - - speech: Voici les informations sur l'association - intent: get_info_association_lvl1 - transitionToScene: home_lvl1 -- intent: enter_member_space_lvl1 - transitionToScene: home_lvl1_AccountLinking -- intent: resume_listening_player - transitionToScene: home_lvl1 -- intent: listen_audiobook_lvl1 - transitionToScene: home_lvl1_AccountLinking -- handler: - webhookHandler: test_webhook - intent: test_webhook - transitionToScene: home_lvl1 -onEnter: - staticPrompt: - candidates: - - promptResponse: - firstSimple: - variants: - - speech: Que voulez-vous faire ? Vous pouvez dire informations ou espace - membres - suggestions: - - title: informations - - title: espace membres diff --git a/sdk/test/custom/scenes/home_members_lvl2.yaml b/sdk/test/custom/scenes/home_members_lvl2.yaml deleted file mode 100644 index 2498e69c..00000000 --- a/sdk/test/custom/scenes/home_members_lvl2.yaml +++ /dev/null @@ -1,25 +0,0 @@ -intentEvents: -- handler: - webhookHandler: ecouter_livre_audio_lvl2 - intent: listen_audiobook_lvl2 - transitionToScene: search -- handler: - webhookHandler: reprendre_mon_livre_lvl2 - intent: resume_audiobook_lvl2 - transitionToScene: ask_to_resume_listening_at_last_offset -- handler: - webhookHandler: selection_livre_lvl2 - intent: selection_audiobook_lvl2 - transitionToScene: selection_lvl3 -onEnter: - staticPrompt: - candidates: - - promptResponse: - firstSimple: - variants: - - speech: Bienvenue dans l'espace membres. Les commandes possibles sont, - sélection, lecture, recherche. Que voulez-vous faire ? - suggestions: - - title: selection d'un livre - - title: lecture du dernier livre - - title: recherche d'un livre diff --git a/sdk/test/custom/scenes/player.yaml b/sdk/test/custom/scenes/player.yaml deleted file mode 100644 index 06957f78..00000000 --- a/sdk/test/custom/scenes/player.yaml +++ /dev/null @@ -1,21 +0,0 @@ -intentEvents: -- handler: - webhookHandler: reprendre_la_lecture - intent: resume_listening_player -- handler: - webhookHandler: remaining_time - intent: remaing_time_player -- handler: - webhookHandler: media_status - intent: actions.intent.MEDIA_STATUS_FINISHED -- handler: - webhookHandler: media_status - intent: actions.intent.MEDIA_STATUS_PAUSED -- handler: - webhookHandler: media_status - intent: actions.intent.MEDIA_STATUS_STOPPED -- handler: - webhookHandler: media_status - intent: actions.intent.MEDIA_STATUS_FAILED -onEnter: - webhookHandler: player diff --git a/sdk/test/custom/scenes/search.yaml b/sdk/test/custom/scenes/search.yaml deleted file mode 100644 index 4d95c236..00000000 --- a/sdk/test/custom/scenes/search.yaml +++ /dev/null @@ -1,21 +0,0 @@ -conditionalEvents: -- condition: scene.slots.status == "FINAL" - handler: - webhookHandler: search_livre_lvl2 -intentEvents: -- intent: resume_listening_player - transitionToScene: search -onEnter: - staticPrompt: - candidates: - - promptResponse: - firstSimple: - variants: - - speech: Que voulez-vous écouter ? Par exemple Zola -slots: -- commitBehavior: - writeSessionParam: query - name: query - required: true - type: - name: string diff --git a/sdk/test/custom/scenes/select_pub_after_search.yaml b/sdk/test/custom/scenes/select_pub_after_search.yaml deleted file mode 100644 index f6dc9f7b..00000000 --- a/sdk/test/custom/scenes/select_pub_after_search.yaml +++ /dev/null @@ -1,69 +0,0 @@ -intentEvents: -- intent: resume_listening_player - transitionToScene: select_pub_after_search -- handler: - staticPrompt: - candidates: - - promptResponse: - firstSimple: - variants: - - speech: je n’ai pas compris le numéro, merci de le répêter - intent: actions.intent.NO_MATCH_1 -- handler: - staticPrompt: - candidates: - - promptResponse: - firstSimple: - variants: - - speech: je n’ai pas compris le numéro, dite un numéro - intent: actions.intent.NO_MATCH_2 -- handler: - staticPrompt: - candidates: - - promptResponse: - firstSimple: - variants: - - speech: je n’ai pas compris le numéro. - intent: actions.intent.NO_MATCH_FINAL - transitionToScene: search -- handler: - staticPrompt: - candidates: - - promptResponse: - firstSimple: - variants: - - speech: je n’ai pas compris le numéro, merci de le répêter - intent: actions.intent.NO_INPUT_1 -- handler: - staticPrompt: - candidates: - - promptResponse: - firstSimple: - variants: - - speech: je n’ai pas compris le numéro, merci de le répêter - intent: actions.intent.NO_INPUT_2 -- handler: - staticPrompt: - candidates: - - promptResponse: - firstSimple: - variants: - - speech: je n’ai pas compris le numéro - intent: actions.intent.NO_INPUT_FINAL - transitionToScene: search -onEnter: - staticPrompt: - candidates: - - promptResponse: - firstSimple: - variants: - - speech: Pour choisir une publication dite son numéro -onSlotUpdated: - webhookHandler: select_publication_number_after_search -slots: -- commitBehavior: - writeSessionParam: number - name: number - required: true - type: - name: actions.type.Number diff --git a/sdk/test/custom/scenes/select_pub_after_selection.yaml b/sdk/test/custom/scenes/select_pub_after_selection.yaml deleted file mode 100644 index 10d12712..00000000 --- a/sdk/test/custom/scenes/select_pub_after_selection.yaml +++ /dev/null @@ -1,67 +0,0 @@ -intentEvents: -- intent: resume_listening_player - transitionToScene: select_pub_after_selection -- handler: - staticPrompt: - candidates: - - promptResponse: - firstSimple: - variants: - - speech: je n’ai pas compris le numéro, merci de le répêter - intent: actions.intent.NO_MATCH_1 -- handler: - staticPrompt: - candidates: - - promptResponse: - firstSimple: - variants: - - speech: je n’ai pas compris le numéro, dite un numéro - intent: actions.intent.NO_MATCH_2 -- handler: - staticPrompt: - candidates: - - promptResponse: - firstSimple: - variants: - - speech: je n’ai pas compris le numéro, dite un numéro - intent: actions.intent.NO_MATCH_FINAL -- handler: - staticPrompt: - candidates: - - promptResponse: - firstSimple: - variants: - - speech: je n’ai pas compris le numéro, dite un numéro - intent: actions.intent.NO_INPUT_1 -- handler: - staticPrompt: - candidates: - - promptResponse: - firstSimple: - variants: - - speech: je n’ai pas compris le numéro, dite un numéro - intent: actions.intent.NO_INPUT_2 -- handler: - staticPrompt: - candidates: - - promptResponse: - firstSimple: - variants: - - speech: je n’ai pas compris le numéro - intent: actions.intent.NO_INPUT_FINAL -onEnter: - staticPrompt: - candidates: - - promptResponse: - firstSimple: - variants: - - speech: Pour choisir une publication dite son numéro -onSlotUpdated: - webhookHandler: select_publication_number_after_selection -slots: -- commitBehavior: - writeSessionParam: number - name: number - required: true - type: - name: actions.type.Number diff --git a/sdk/test/custom/scenes/selection_lvl3.yaml b/sdk/test/custom/scenes/selection_lvl3.yaml deleted file mode 100644 index 583e652a..00000000 --- a/sdk/test/custom/scenes/selection_lvl3.yaml +++ /dev/null @@ -1,10 +0,0 @@ -intentEvents: -- handler: - webhookHandler: selection_genre_lvl3 - intent: selection_genre_lvl3 -- handler: - webhookHandler: selection_thematic_list_lvl3 - intent: selection_thematic_list_lvl3 -- handler: - webhookHandler: selection_my_list_lvl3 - intent: selection_my_list_lvl3 diff --git a/sdk/test/manifest.yaml b/sdk/test/manifest.yaml deleted file mode 100644 index d847aecb..00000000 --- a/sdk/test/manifest.yaml +++ /dev/null @@ -1 +0,0 @@ -version: "1.0" diff --git a/sdk/test/webhooks/ActionsOnGoogleFulfillment.yaml b/sdk/test/webhooks/ActionsOnGoogleFulfillment.yaml deleted file mode 100644 index 814e3d4d..00000000 --- a/sdk/test/webhooks/ActionsOnGoogleFulfillment.yaml +++ /dev/null @@ -1,22 +0,0 @@ -handlers: -- name: cancel -- name: ecouter_livre_audio_lvl2 -- name: reprendre_mon_livre_lvl2 -- name: media_status -- name: player -- name: reprendre_la_lecture -- name: remaining_time -- name: selection_livre_lvl2 -- name: select_publication_number_after_search -- name: select_publication_number_after_selection -- name: test_webhook -- name: search_livre_lvl2 -- name: ask_to_resume_listening_at_last_offset -- name: ask_to_resume_listening_at_last_offset__yes -- name: ask_to_resume_listening_at_last_offset__no -- name: selection_genre_lvl3 -- name: selection_thematic_list_lvl3 -- name: selection_my_list_lvl3 -httpsEndpoint: - baseUrl: https://us-central1-valentin-4.cloudfunctions.net/ActionsOnGoogleFulfillment - endpointApiVersion: 2 diff --git a/sdk/webhooks/ActionsOnGoogleFulfillment.yaml b/sdk/webhooks/ActionsOnGoogleFulfillment.yaml new file mode 100644 index 00000000..d1851636 --- /dev/null +++ b/sdk/webhooks/ActionsOnGoogleFulfillment.yaml @@ -0,0 +1,98 @@ +handlers: +- name: main +- name: home_new_user__intent__help +- name: home_new_user__intent__maybe_later +- name: home_new_user__intent__no +- name: home_new_user__intent__repeat +- name: home_new_user__intent__yes +- name: home_new_user__intent__fallback +- name: home_new_user__intent__fallback_end +- name: home_new_user__intent__silence +- name: home_new_user__intent__silence_end +- name: home_new_user_maybe_later__intent__learn_more +- name: home_new_user_maybe_later__intent__repeat +- name: home_new_user_maybe_later__intent__link_account +- name: home_new_user_maybe_later__intent__help +- name: home_new_user_maybe_later__intent__fallback +- name: home_new_user_maybe_later__intent__fallback_end +- name: home_new_user_maybe_later__intent__silence +- name: home_new_user_maybe_later__intent__silence_end +- name: info__intent__yes +- name: info__intent__help +- name: info__intent__repeat +- name: info__intent__fallback +- name: info__intent__fallback_end +- name: info__intent__silence +- name: info__intent__silence_end +- name: home_new_user_no__intent__yes +- name: home_new_user_no__intent__no +- name: home_new_user_no__intent__repeat +- name: home_new_user_no__intent__help +- name: home_new_user_no__intent__fallback +- name: home_new_user_no__intent__fallback_end +- name: home_new_user_no__intent__silence +- name: home_new_user_no__intent__silence_end +- name: cancel +- name: home_new_user__on_enter +- name: home_new_user_no__on_enter +- name: home_new_user_maybe_later__on_enter +- name: info__on_enter +- name: home_user__on_enter +- name: home_user__intent__help +- name: home_user__intent__repeat +- name: home_user__intent__bookshelf +- name: home_user__intent__collections +- name: home_user__intent__search +- name: home_user__intent__fallback +- name: home_user__intent__fallback_end +- name: home_user__intent__silence +- name: home_user__intent__silence_end +- name: selection__on_enter +- name: selection__intent__selects_book +- name: selection__intent__repeat +- name: selection__intent__another_one +- name: selection__intent__help +- name: selection__intent__fallback +- name: selection__intent__fallback_end +- name: selection__intent__silence +- name: selection__intent__silence_end +- name: fallback_1 +- name: fallback_2 +- name: fallback_end +- name: silence_1 +- name: silence_2 +- name: silence_end +- name: player__on_enter +- name: player__intent__media_status_finished +- name: player__intent__media_status_paused +- name: player__intent__media_status_stopped +- name: player__intent__media_status_failed +- name: search__on_enter +- name: search__intent__search_query +- name: search__intent__search +- name: collections__on_enter +- name: collections__intent__bookshelf +- name: collections__intent__by_genre +- name: collections__intent__by_theme +- name: collections__intent__help +- name: collections__intent__fallback +- name: collections__intent__fallback_end +- name: collections__intent__silence +- name: collections__intent__silence_end +- name: player_prequel__on_enter +- name: home_user__intent__recent_books +- name: info__intent__no +- name: home_user__intent__current_book +- name: player_prequel__intent__help +- name: player_prequel__intent__repeat +- name: player_prequel__intent__player_prequel_back +- name: player_prequel__intent__player_prequel_resume +- name: player_prequel__intent__player_prequel_start +- name: player_prequel__intent__player_prequel_summary +- name: player_prequel__fallback +- name: player_prequel__fallback_end +- name: player_prequel__silence +- name: player_prequel__silence_end +httpsEndpoint: + baseUrl: https://us-central1-valentin-5.cloudfunctions.net/ActionsOnGoogleFulfillment + endpointApiVersion: 2 diff --git a/test/dev/.eslintrc.json b/test/dev/.eslintrc.json deleted file mode 100644 index c5624c4e..00000000 --- a/test/dev/.eslintrc.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "env": { - "browser": true, - "es2021": true - }, - "extends": [ - "eslint:recommended", - "plugin:@typescript-eslint/recommended" - ], - "parser": "@typescript-eslint/parser", - "parserOptions": { - "ecmaVersion": 12, - "sourceType": "module" - }, - "plugins": [ - "@typescript-eslint" - ], - "rules": { - } -} diff --git a/test/dev/package-lock.json b/test/dev/package-lock.json deleted file mode 100644 index 3677cf9a..00000000 --- a/test/dev/package-lock.json +++ /dev/null @@ -1,3094 +0,0 @@ -{ - "name": "lis-mon-livre-test", - "version": "1.0.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@assistant/actions": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@assistant/actions/-/actions-0.1.0.tgz", - "integrity": "sha512-V3PUGj7j/8Gq4VPFwP40k6AnsJaV2nnViuGskYnCe8sKLgCTzeGsOKnoGJgEEjI3ETm5mPd8ym3/HoksRODMNw==", - "dev": true, - "requires": { - "google-gax": "^2.9.2" - } - }, - "@assistant/conversation-testing": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@assistant/conversation-testing/-/conversation-testing-1.0.0.tgz", - "integrity": "sha512-9NZ3q1PI/FXegVaF+Kt2M/z2tWcDSPZ8aQ/UBYqtmYk0xSQX3ZRNhg9FWEGeAGL7+1tV4aRRkBylTvUUOGivrQ==", - "dev": true, - "requires": { - "@assistant/actions": "0.1.0", - "@types/chai": "^4.1.4", - "@types/i18n": "^0.8.6", - "@types/js-yaml": "^3.12.5", - "@types/node": "^10.9.4", - "@types/promise.prototype.finally": "^2.0.3", - "chai": "^4.2.0", - "google-auth-library": "^6.1.2", - "grpc": "^1.24.0", - "i18n": "^0.8.3", - "js-yaml": "^3.14.0", - "promise.prototype.finally": "^3.1.1", - "ts-node": "^7.0.1" - }, - "dependencies": { - "@types/node": { - "version": "10.17.60", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", - "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==", - "dev": true - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "ts-node": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz", - "integrity": "sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==", - "dev": true, - "requires": { - "arrify": "^1.0.0", - "buffer-from": "^1.1.0", - "diff": "^3.1.0", - "make-error": "^1.1.1", - "minimist": "^1.2.0", - "mkdirp": "^0.5.1", - "source-map-support": "^0.5.6", - "yn": "^2.0.0" - } - } - } - }, - "@cspotcode/source-map-consumer": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz", - "integrity": "sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==", - "dev": true - }, - "@cspotcode/source-map-support": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz", - "integrity": "sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==", - "dev": true, - "requires": { - "@cspotcode/source-map-consumer": "0.8.0" - } - }, - "@eslint/eslintrc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.3.tgz", - "integrity": "sha512-DHI1wDPoKCBPoLZA3qDR91+3te/wDSc1YhKg3jR8NxKKRJq2hwHwcWv31cSwSYvIBrmbENoYMWcenW8uproQqg==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.0.0", - "globals": "^13.9.0", - "ignore": "^4.0.6", - "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" - } - }, - "@grpc/grpc-js": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.4.1.tgz", - "integrity": "sha512-/chkA48TdAvATHA7RXJPeHQLdfFhpu51974s8htjO/XTDHA41j5+SkR5Io+lr9XsLmkZD6HxLyRAFGmA9wjO2w==", - "dev": true, - "requires": { - "@grpc/proto-loader": "^0.6.4", - "@types/node": ">=12.12.47" - } - }, - "@grpc/proto-loader": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.6.6.tgz", - "integrity": "sha512-cdMaPZ8AiFz6ua6PUbP+LKbhwJbFXnrQ/mlnKGUyzDUZ3wp7vPLksnmLCBX6SHgSmjX7CbNVNLFYD5GmmjO4GQ==", - "dev": true, - "requires": { - "@types/long": "^4.0.1", - "lodash.camelcase": "^4.3.0", - "long": "^4.0.0", - "protobufjs": "^6.10.0", - "yargs": "^16.1.1" - } - }, - "@humanwhocodes/config-array": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.6.0.tgz", - "integrity": "sha512-JQlEKbcgEUjBFhLIF4iqM7u/9lwgHRBcpHrmUNCALK0Q3amXN6lxdoXLnF0sm11E9VqTmBALR87IlUg1bZ8A9A==", - "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^1.2.0", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - } - }, - "@humanwhocodes/object-schema": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", - "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", - "dev": true - }, - "@mapbox/node-pre-gyp": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.6.tgz", - "integrity": "sha512-qK1ECws8UxuPqOA8F5LFD90vyVU33W7N3hGfgsOVfrJaRVc8McC3JClTDHpeSbL9CBrOHly/4GsNPAvIgNZE+g==", - "dev": true, - "requires": { - "detect-libc": "^1.0.3", - "https-proxy-agent": "^5.0.0", - "make-dir": "^3.1.0", - "node-fetch": "^2.6.5", - "nopt": "^5.0.0", - "npmlog": "^5.0.1", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.11" - } - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=", - "dev": true - }, - "@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", - "dev": true - }, - "@protobufjs/codegen": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", - "dev": true - }, - "@protobufjs/eventemitter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=", - "dev": true - }, - "@protobufjs/fetch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", - "dev": true, - "requires": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" - } - }, - "@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=", - "dev": true - }, - "@protobufjs/inquire": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=", - "dev": true - }, - "@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=", - "dev": true - }, - "@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=", - "dev": true - }, - "@protobufjs/utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=", - "dev": true - }, - "@tsconfig/node10": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz", - "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==", - "dev": true - }, - "@tsconfig/node12": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz", - "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==", - "dev": true - }, - "@tsconfig/node14": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz", - "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==", - "dev": true - }, - "@tsconfig/node16": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz", - "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==", - "dev": true - }, - "@types/bytebuffer": { - "version": "5.0.42", - "resolved": "https://registry.npmjs.org/@types/bytebuffer/-/bytebuffer-5.0.42.tgz", - "integrity": "sha512-lEgKojWUAc/MG2t649oZS5AfYFP2xRNPoDuwDBlBMjHXd8MaGPgFgtCXUK7inZdBOygmVf10qxc1Us8GXC96aw==", - "dev": true, - "requires": { - "@types/long": "*", - "@types/node": "*" - } - }, - "@types/chai": { - "version": "4.2.22", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.2.22.tgz", - "integrity": "sha512-tFfcE+DSTzWAgifkjik9AySNqIyNoYwmR+uecPwwD/XRNfvOjmC/FjCxpiUGDkDVDphPfCUecSQVFw+lN3M3kQ==", - "dev": true - }, - "@types/i18n": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/@types/i18n/-/i18n-0.8.8.tgz", - "integrity": "sha512-RI4LFAraGrimMTxXkediCMXGVLC6ksXIIo3U+d3E4n+Mhw3uIDbmokO7DHlPB/eu6Tn6KBv4IUE1WrrEDRdNUQ==", - "dev": true - }, - "@types/js-yaml": { - "version": "3.12.7", - "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-3.12.7.tgz", - "integrity": "sha512-S6+8JAYTE1qdsc9HMVsfY7+SgSuUU/Tp6TYTmITW0PZxiyIMvol3Gy//y69Wkhs0ti4py5qgR3uZH6uz/DNzJQ==", - "dev": true - }, - "@types/json-schema": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", - "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", - "dev": true - }, - "@types/long": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", - "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==", - "dev": true - }, - "@types/mocha": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.0.0.tgz", - "integrity": "sha512-scN0hAWyLVAvLR9AyW7HoFF5sJZglyBsbPuHO4fv7JRvfmPBMfp1ozWqOf/e4wwPNxezBZXRfWzMb6iFLgEVRA==", - "dev": true - }, - "@types/node": { - "version": "16.11.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.4.tgz", - "integrity": "sha512-TMgXmy0v2xWyuCSCJM6NCna2snndD8yvQF67J29ipdzMcsPa9u+o0tjF5+EQNdhcuZplYuouYqpc4zcd5I6amQ==", - "dev": true - }, - "@types/promise.prototype.finally": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/promise.prototype.finally/-/promise.prototype.finally-2.0.4.tgz", - "integrity": "sha512-bkzsMz11tGI5r/ZhJIVI1+QSWKKBcX/Llv0zoM2ufOH+o/3sLXwE5xCW0OUX81xPa4EGOyPKFlNrH9GH+IF4lg==", - "dev": true - }, - "@typescript-eslint/eslint-plugin": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.1.0.tgz", - "integrity": "sha512-bekODL3Tqf36Yz8u+ilha4zGxL9mdB6LIsIoMAvvC5FAuWo4NpZYXtCbv7B2CeR1LhI/lLtLk+q4tbtxuoVuCg==", - "dev": true, - "requires": { - "@typescript-eslint/experimental-utils": "5.1.0", - "@typescript-eslint/scope-manager": "5.1.0", - "debug": "^4.3.2", - "functional-red-black-tree": "^1.0.1", - "ignore": "^5.1.8", - "regexpp": "^3.2.0", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - }, - "dependencies": { - "ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", - "dev": true - } - } - }, - "@typescript-eslint/experimental-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.1.0.tgz", - "integrity": "sha512-ovE9qUiZMOMgxQAESZsdBT+EXIfx/YUYAbwGUI6V03amFdOOxI9c6kitkgRvLkJaLusgMZ2xBhss+tQ0Y1HWxA==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.1.0", - "@typescript-eslint/types": "5.1.0", - "@typescript-eslint/typescript-estree": "5.1.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" - }, - "dependencies": { - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - } - } - }, - "@typescript-eslint/parser": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.1.0.tgz", - "integrity": "sha512-vx1P+mhCtYw3+bRHmbalq/VKP2Y3gnzNgxGxfEWc6OFpuEL7iQdAeq11Ke3Rhy8NjgB+AHsIWEwni3e+Y7djKA==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "5.1.0", - "@typescript-eslint/types": "5.1.0", - "@typescript-eslint/typescript-estree": "5.1.0", - "debug": "^4.3.2" - } - }, - "@typescript-eslint/scope-manager": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.1.0.tgz", - "integrity": "sha512-yYlyVjvn5lvwCL37i4hPsa1s0ORsjkauhTqbb8MnpvUs7xykmcjGqwlNZ2Q5QpoqkJ1odlM2bqHqJwa28qV6Tw==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.1.0", - "@typescript-eslint/visitor-keys": "5.1.0" - } - }, - "@typescript-eslint/types": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.1.0.tgz", - "integrity": "sha512-sEwNINVxcB4ZgC6Fe6rUyMlvsB2jvVdgxjZEjQUQVlaSPMNamDOwO6/TB98kFt4sYYfNhdhTPBEQqNQZjMMswA==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.1.0.tgz", - "integrity": "sha512-SSz+l9YrIIsW4s0ZqaEfnjl156XQ4VRmJsbA0ZE1XkXrD3cRpzuZSVCyqeCMR3EBjF27IisWakbBDGhGNIOvfQ==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.1.0", - "@typescript-eslint/visitor-keys": "5.1.0", - "debug": "^4.3.2", - "globby": "^11.0.4", - "is-glob": "^4.0.3", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.1.0.tgz", - "integrity": "sha512-uqNXepKBg81JVwjuqAxYrXa1Ql/YDzM+8g/pS+TCPxba0wZttl8m5DkrasbfnmJGHs4lQ2jTbcZ5azGhI7kK+w==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.1.0", - "eslint-visitor-keys": "^3.0.0" - } - }, - "@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 - }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "dev": true, - "requires": { - "event-target-shim": "^5.0.0" - } - }, - "acorn": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz", - "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==", - "dev": true - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true - }, - "acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true - }, - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "requires": { - "debug": "4" - } - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "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" - } - }, - "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" - } - }, - "aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", - "dev": true - }, - "are-we-there-yet": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", - "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", - "dev": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - } - }, - "arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - }, - "dependencies": { - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - } - } - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", - "dev": true - }, - "ascli": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ascli/-/ascli-1.0.1.tgz", - "integrity": "sha1-vPpZdKYvGOgcq660lzKrSoj5Brw=", - "dev": true, - "requires": { - "colour": "~0.7.1", - "optjs": "~3.2.2" - } - }, - "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 - }, - "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 - }, - "bignumber.js": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz", - "integrity": "sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==", - "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 - }, - "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", - "concat-map": "0.0.1" - } - }, - "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" - } - }, - "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-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": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=", - "dev": true - }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "bytebuffer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/bytebuffer/-/bytebuffer-5.0.1.tgz", - "integrity": "sha1-WC7qSxqHO20CCkjVjfhfC7ps/d0=", - "dev": true, - "requires": { - "long": "~3" - }, - "dependencies": { - "long": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz", - "integrity": "sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s=", - "dev": true - } - } - }, - "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, - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", - "dev": true - }, - "chai": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.4.tgz", - "integrity": "sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA==", - "dev": true, - "requires": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^3.0.1", - "get-func-name": "^2.0.0", - "pathval": "^1.1.1", - "type-detect": "^4.0.5" - } - }, - "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", - "supports-color": "^7.1.0" - } - }, - "check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", - "dev": true - }, - "chokidar": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", - "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.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" - }, - "dependencies": { - "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" - } - } - } - }, - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "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", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "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" - } - }, - "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 - }, - "color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true - }, - "colour": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/colour/-/colour-0.7.1.tgz", - "integrity": "sha1-nLFpkX7F0SwHNtPoaFdG3xyt93g=", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true - }, - "create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "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" - } - }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "requires": { - "object-keys": "^1.0.12" - } - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true - }, - "detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", - "dev": true - }, - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "duplexify": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz", - "integrity": "sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==", - "dev": true, - "requires": { - "end-of-stream": "^1.4.1", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1", - "stream-shift": "^1.0.0" - } - }, - "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==", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "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 - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, - "requires": { - "ansi-colors": "^4.1.1" - } - }, - "es-abstract": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", - "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.1.1", - "get-symbol-description": "^1.0.0", - "has": "^1.0.3", - "has-symbols": "^1.0.2", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", - "is-negative-zero": "^2.0.1", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.1", - "is-string": "^1.0.7", - "is-weakref": "^1.0.1", - "object-inspect": "^1.11.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "string.prototype.trimend": "^1.0.4", - "string.prototype.trimstart": "^1.0.4", - "unbox-primitive": "^1.0.1" - } - }, - "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" - } - }, - "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 - }, - "eslint": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.1.0.tgz", - "integrity": "sha512-JZvNneArGSUsluHWJ8g8MMs3CfIEzwaLx9KyH4tZ2i+R2/rPWzL8c0zg3rHdwYVpN/1sB9gqnjHwz9HoeJpGHw==", - "dev": true, - "requires": { - "@eslint/eslintrc": "^1.0.3", - "@humanwhocodes/config-array": "^0.6.0", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "enquirer": "^2.3.5", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^6.0.0", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.0.0", - "espree": "^9.0.0", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^6.0.1", - "globals": "^13.6.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.2.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "dependencies": { - "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 - }, - "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, - "requires": { - "argparse": "^2.0.1" - } - } - } - }, - "eslint-scope": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-6.0.0.tgz", - "integrity": "sha512-uRDL9MWmQCkaFus8RF5K9/L/2fn+80yoW3jkD53l4shjCh26fCtvJGasxjUqP5OT87SYTxCVA3BwTUzuELx9kA==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true - } - } - }, - "eslint-visitor-keys": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.0.0.tgz", - "integrity": "sha512-mJOZa35trBTb3IyRmo8xmKBZlxf+N7OnUl4+ZhJHs/r+0770Wh/LEACE2pqMGMe27G/4y8P2bYGk4J70IC5k1Q==", - "dev": true - }, - "espree": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.0.0.tgz", - "integrity": "sha512-r5EQJcYZ2oaGbeR0jR0fFVijGOcwai07/690YRXLINuhmVeRY4UKSAsQPe/0BNuDgwP7Ophoc1PRsr2E3tkbdQ==", - "dev": true, - "requires": { - "acorn": "^8.5.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^3.0.0" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "dev": true - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-glob": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", - "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "dependencies": { - "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" - } - } - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "fast-text-encoding": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.3.tgz", - "integrity": "sha512-dtm4QZH9nZtcDt8qJiOH9fcQd1NAgi+K1O2DbE6GG1PPCK/BWfOH3idCTRQ4ImXRUOyopDEgDEnVEE7Y/2Wrig==", - "dev": true - }, - "fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "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-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", - "path-exists": "^4.0.0" - } - }, - "flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true - }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - } - }, - "flatted": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", - "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==", - "dev": true - }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "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 - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "gauge": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.1.tgz", - "integrity": "sha512-6STz6KdQgxO4S/ko+AbjlFGGdGcknluoqU+79GOFCDqqyYj5OanQf9AjxwN0jCidtT+ziPMmPSt9E4hfQ0CwIQ==", - "dev": true, - "requires": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.1", - "object-assign": "^4.1.1", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1 || ^2.0.0", - "strip-ansi": "^3.0.1 || ^4.0.0", - "wide-align": "^1.1.2" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "gaxios": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-4.3.2.tgz", - "integrity": "sha512-T+ap6GM6UZ0c4E6yb1y/hy2UB6hTrqhglp3XfmU9qbLCGRYhLVV5aRPpC4EmoG8N8zOnkYCgoBz+ScvGAARY6Q==", - "dev": true, - "requires": { - "abort-controller": "^3.0.0", - "extend": "^3.0.2", - "https-proxy-agent": "^5.0.0", - "is-stream": "^2.0.0", - "node-fetch": "^2.6.1" - } - }, - "gcp-metadata": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-4.3.1.tgz", - "integrity": "sha512-x850LS5N7V1F3UcV7PoupzGsyD6iVwTVvsh3tbXfkctZnBnjW5yu5z1/3k3SehF7TyoTIe78rJs02GMMy+LF+A==", - "dev": true, - "requires": { - "gaxios": "^4.0.0", - "json-bigint": "^1.0.0" - } - }, - "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": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", - "dev": true - }, - "get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - } - }, - "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" - } - }, - "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", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - } - }, - "globals": { - "version": "13.11.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz", - "integrity": "sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "globby": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", - "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", - "slash": "^3.0.0" - }, - "dependencies": { - "ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", - "dev": true - } - } - }, - "google-auth-library": { - "version": "6.1.6", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-6.1.6.tgz", - "integrity": "sha512-Q+ZjUEvLQj/lrVHF/IQwRo6p3s8Nc44Zk/DALsN+ac3T4HY/g/3rrufkgtl+nZ1TW7DNAw5cTChdVp4apUXVgQ==", - "dev": true, - "requires": { - "arrify": "^2.0.0", - "base64-js": "^1.3.0", - "ecdsa-sig-formatter": "^1.0.11", - "fast-text-encoding": "^1.0.0", - "gaxios": "^4.0.0", - "gcp-metadata": "^4.2.0", - "gtoken": "^5.0.4", - "jws": "^4.0.0", - "lru-cache": "^6.0.0" - } - }, - "google-gax": { - "version": "2.28.0", - "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-2.28.0.tgz", - "integrity": "sha512-kuqc8a4+CTCMBcF3tlOL7Sa74JWkTzcZxatAQTCVK35WToXkHnJ0qncFOJuegUv3EbV9IQY4j/+NZdFLv+lbTA==", - "dev": true, - "requires": { - "@grpc/grpc-js": "~1.4.0", - "@grpc/proto-loader": "^0.6.1", - "@types/long": "^4.0.0", - "abort-controller": "^3.0.0", - "duplexify": "^4.0.0", - "fast-text-encoding": "^1.0.3", - "google-auth-library": "^7.6.1", - "is-stream-ended": "^0.1.4", - "node-fetch": "^2.6.1", - "object-hash": "^2.1.1", - "proto3-json-serializer": "^0.1.1", - "protobufjs": "6.11.2", - "retry-request": "^4.0.0" - }, - "dependencies": { - "google-auth-library": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-7.10.1.tgz", - "integrity": "sha512-nQxgM1ZopUMcpMnu95kOSzI+9tJl4YDOZJomSTBGlRLpxfBopdwto7WvzoI87HuN0nQqVETgOsHi/C/po1rppA==", - "dev": true, - "requires": { - "arrify": "^2.0.0", - "base64-js": "^1.3.0", - "ecdsa-sig-formatter": "^1.0.11", - "fast-text-encoding": "^1.0.0", - "gaxios": "^4.0.0", - "gcp-metadata": "^4.2.0", - "gtoken": "^5.0.4", - "jws": "^4.0.0", - "lru-cache": "^6.0.0" - } - } - } - }, - "google-p12-pem": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-3.1.2.tgz", - "integrity": "sha512-tjf3IQIt7tWCDsa0ofDQ1qqSCNzahXDxdAGJDbruWqu3eCg5CKLYKN+hi0s6lfvzYZ1GDVr+oDF9OOWlDSdf0A==", - "dev": true, - "requires": { - "node-forge": "^0.10.0" - } - }, - "growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true - }, - "grpc": { - "version": "1.24.11", - "resolved": "https://registry.npmjs.org/grpc/-/grpc-1.24.11.tgz", - "integrity": "sha512-8/AQdFCzCeCDWW3SoaMNp6ccbRvTQEH1O1u1uFtt29eWsg5gSZCJ3m6fbkduEIh3smY7WAPP+LgVJ5n3nZRxcA==", - "dev": true, - "requires": { - "@mapbox/node-pre-gyp": "^1.0.4", - "@types/bytebuffer": "^5.0.40", - "lodash.camelcase": "^4.3.0", - "lodash.clone": "^4.5.0", - "nan": "^2.13.2", - "protobufjs": "^5.0.3" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" - } - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "protobufjs": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-5.0.3.tgz", - "integrity": "sha512-55Kcx1MhPZX0zTbVosMQEO5R6/rikNXd9b6RQK4KSPcrSIIwoXTtebIczUrXlwaSrbz4x8XUVThGPob1n8I4QA==", - "dev": true, - "requires": { - "ascli": "~1", - "bytebuffer": "~5", - "glob": "^7.0.5", - "yargs": "^3.10.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - } - }, - "y18n": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", - "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", - "dev": true - }, - "yargs": { - "version": "3.32.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", - "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", - "dev": true, - "requires": { - "camelcase": "^2.0.1", - "cliui": "^3.0.3", - "decamelize": "^1.1.1", - "os-locale": "^1.4.0", - "string-width": "^1.0.1", - "window-size": "^0.1.4", - "y18n": "^3.2.0" - } - } - } - }, - "gtoken": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-5.3.1.tgz", - "integrity": "sha512-yqOREjzLHcbzz1UrQoxhBtpk8KjrVhuqPE7od1K2uhyxG2BHjKZetlbLw/SPZak/QqTIQW+addS+EcjqQsZbwQ==", - "dev": true, - "requires": { - "gaxios": "^4.0.0", - "google-p12-pem": "^3.0.3", - "jws": "^4.0.0" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-bigints": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", - "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", - "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-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", - "dev": true - }, - "has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true - }, - "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 - }, - "https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", - "dev": true, - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "i18n": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/i18n/-/i18n-0.8.6.tgz", - "integrity": "sha512-aMsJq8i1XXrb+BBsgmJBwak9mr69zPEIAUPb6c5yw2G/O4k1Q52lBxL+agZdQDN/RGf1ylQzrCswsOOgIiC1FA==", - "dev": true, - "requires": { - "debug": "*", - "make-plural": "^6.0.1", - "math-interval-parser": "^2.0.1", - "messageformat": "^2.3.0", - "mustache": "*", - "sprintf-js": "^1.1.2" - } - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "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" - } - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true - }, - "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" - } - }, - "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": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "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-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.1", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", - "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", - "dev": true - }, - "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.6", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", - "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", - "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==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-shared-array-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", - "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", - "dev": true - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true - }, - "is-stream-ended": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-stream-ended/-/is-stream-ended-0.1.4.tgz", - "integrity": "sha512-xj0XPvmr7bQFTvirqnFr50o0hQIh6ZItDqloxt5aJrR4NQsYeSsyFQERYGCAzfindAcnKjINnwEEgLx4IqVzQw==", - "dev": true - }, - "is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "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==", - "dev": true - }, - "is-weakref": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz", - "integrity": "sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.0" - } - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "json-bigint": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", - "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", - "dev": true, - "requires": { - "bignumber.js": "^9.0.0" - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "jwa": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", - "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", - "dev": true, - "requires": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "jws": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", - "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", - "dev": true, - "requires": { - "jwa": "^2.0.0", - "safe-buffer": "^5.0.1" - } - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "requires": { - "invert-kv": "^1.0.0" - } - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "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.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=", - "dev": true - }, - "lodash.clone": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz", - "integrity": "sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y=", - "dev": true - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "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", - "is-unicode-supported": "^0.1.0" - } - }, - "long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", - "dev": true - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "make-plural": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/make-plural/-/make-plural-6.2.2.tgz", - "integrity": "sha512-8iTuFioatnTTmb/YJjywkVIHLjcwkFD9Ms0JpxjEm9Mo8eQYkh1z+55dwv4yc1jQ8ftVBxWQbihvZL1DfzGGWA==", - "dev": true - }, - "math-interval-parser": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/math-interval-parser/-/math-interval-parser-2.0.1.tgz", - "integrity": "sha512-VmlAmb0UJwlvMyx8iPhXUDnVW1F9IrGEd9CIOmv+XL8AErCUUuozoDMrgImvnYt2A+53qVX/tPW6YJurMKYsvA==", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "messageformat": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/messageformat/-/messageformat-2.3.0.tgz", - "integrity": "sha512-uTzvsv0lTeQxYI2y1NPa1lItL5VRI8Gb93Y2K2ue5gBPyrbJxfDi/EYWxh2PKv5yO42AJeeqblS9MJSh/IEk4w==", - "dev": true, - "requires": { - "make-plural": "^4.3.0", - "messageformat-formatters": "^2.0.1", - "messageformat-parser": "^4.1.2" - }, - "dependencies": { - "make-plural": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/make-plural/-/make-plural-4.3.0.tgz", - "integrity": "sha512-xTYd4JVHpSCW+aqDof6w/MebaMVNTVYBZhbB/vi513xXdiPT92JMVCo0Jq8W2UZnzYRFeVbQiQ+I25l13JuKvA==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - } - } - }, - "messageformat-formatters": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/messageformat-formatters/-/messageformat-formatters-2.0.1.tgz", - "integrity": "sha512-E/lQRXhtHwGuiQjI7qxkLp8AHbMD5r2217XNe/SREbBlSawe0lOqsFb7rflZJmlQFSULNLIqlcjjsCPlB3m3Mg==", - "dev": true - }, - "messageformat-parser": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/messageformat-parser/-/messageformat-parser-4.1.3.tgz", - "integrity": "sha512-2fU3XDCanRqeOCkn7R5zW5VQHWf+T3hH65SzuqRvjatBK7r4uyFa5mEX+k6F9Bd04LVM5G4/BHBTUJsOdW7uyg==", - "dev": true - }, - "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - } - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "minipass": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.5.tgz", - "integrity": "sha512-+8NzxD82XQoNKNrl1d/FSi+X8wAEWR+sbYAfIvub4Nz0d22plFG72CEVVaufV8PNf4qSslFTD8VMOxNVhHCjTw==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dev": true, - "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "mocha": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.1.3.tgz", - "integrity": "sha512-Xcpl9FqXOAYqI3j79pEtHBBnQgVXIhpULjGQa7DVb0Po+VzmSIK9kanAiWLHoRR/dbZ2qpdPshuXr8l1VaHCzw==", - "dev": true, - "requires": { - "@ungap/promise-all-settled": "1.1.2", - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.2", - "debug": "4.3.2", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.1.7", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "3.0.4", - "ms": "2.1.3", - "nanoid": "3.1.25", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "which": "2.0.2", - "workerpool": "6.1.5", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "dependencies": { - "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 - }, - "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 - }, - "glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", - "dev": true, - "requires": { - "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" - } - }, - "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, - "requires": { - "argparse": "^2.0.1" - } - }, - "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 - }, - "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" - } - }, - "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 - } - } - }, - "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 - }, - "mustache": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", - "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", - "dev": true - }, - "nan": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", - "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==", - "dev": true - }, - "nanoid": { - "version": "3.1.25", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.25.tgz", - "integrity": "sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q==", - "dev": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "node-fetch": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.5.tgz", - "integrity": "sha512-mmlIVHJEu5rnIxgEgez6b9GgWXbkZj5YZ7fx+2r94a2E+Uirsp6HsPTPlomfdHtpt/B0cdKviwkoaM6pyvUOpQ==", - "dev": true, - "requires": { - "whatwg-url": "^5.0.0" - } - }, - "node-forge": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", - "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", - "dev": true - }, - "nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "dev": true, - "requires": { - "abbrev": "1" - } - }, - "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 - }, - "npmlog": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", - "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", - "dev": true, - "requires": { - "are-we-there-yet": "^2.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^3.0.0", - "set-blocking": "^2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "object-hash": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", - "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", - "dev": true - }, - "object-inspect": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", - "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", - "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": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - } - }, - "optjs": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/optjs/-/optjs-3.2.2.tgz", - "integrity": "sha1-aabOicRCpEQDFBrS+bNwvVu29O4=", - "dev": true - }, - "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "dev": true, - "requires": { - "lcid": "^1.0.0" - } - }, - "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" - } - }, - "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" - } - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "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": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true - }, - "picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", - "dev": true - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, - "promise.prototype.finally": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/promise.prototype.finally/-/promise.prototype.finally-3.1.3.tgz", - "integrity": "sha512-EXRF3fC9/0gz4qkt/f5EP5iW4kj9oFpBICNpCNOb/52+8nlHIX07FPLbi/q4qYBQ1xZqivMzTpNQSnArVASolQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" - } - }, - "proto3-json-serializer": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/proto3-json-serializer/-/proto3-json-serializer-0.1.4.tgz", - "integrity": "sha512-bFzdsKU/zaTobWrRxRniMZIzzcgKYlmBWL1gAcTXZ2M7TQTGPI0JoYYs6bN7tpWj59ZCfwg7Ii/A2e8BbQGYnQ==", - "dev": true - }, - "protobufjs": { - "version": "6.11.2", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.2.tgz", - "integrity": "sha512-4BQJoPooKJl2G9j3XftkIXjoC9C0Av2NOrWmbLWT1vH32GcSUHjM0Arra6UfTsVyfMAuFzaLucXn1sadxJydAw==", - "dev": true, - "requires": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/long": "^4.0.1", - "@types/node": ">=13.7.0", - "long": "^4.0.0" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "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": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "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" - } - }, - "regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "retry-request": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-4.2.2.tgz", - "integrity": "sha512-xA93uxUD/rogV7BV59agW/JHPGXeREMWiZc9jhcwY4YdZ7QOtC7qbomYg0n4wyk2lJhggjvKvhNX8wln/Aldhg==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "extend": "^3.0.2" - } - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "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==", - "dev": true - }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "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", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "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, - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "signal-exit": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.5.tgz", - "integrity": "sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-support": { - "version": "0.5.20", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.20.tgz", - "integrity": "sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "sprintf-js": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", - "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", - "dev": true - }, - "stream-shift": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", - "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "string.prototype.trimend": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", - "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "string.prototype.trimstart": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", - "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "requires": { - "safe-buffer": "~5.2.0" - } - }, - "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-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 - }, - "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" - } - }, - "tar": { - "version": "6.1.11", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", - "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", - "dev": true, - "requires": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "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" - } - }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", - "dev": true - }, - "ts-node": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.4.0.tgz", - "integrity": "sha512-g0FlPvvCXSIO1JDF6S232P5jPYqBkRL9qly81ZgAOSU7rwI0stphCgd2kLiCrU9DjQCrJMWEqcNSjQL02s6d8A==", - "dev": true, - "requires": { - "@cspotcode/source-map-support": "0.7.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "yn": "3.1.1" - }, - "dependencies": { - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - }, - "yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true - } - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "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 - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - }, - "typescript": { - "version": "4.4.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.4.tgz", - "integrity": "sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA==", - "dev": true - }, - "unbox-primitive": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", - "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has-bigints": "^1.0.1", - "has-symbols": "^1.0.2", - "which-boxed-primitive": "^1.0.2" - } - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=", - "dev": true - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", - "dev": true, - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "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" - } - }, - "wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "dev": true, - "requires": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "window-size": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", - "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=", - "dev": true - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "workerpool": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.5.tgz", - "integrity": "sha512-XdKkCK0Zqc6w3iTxLckiuJ81tiD/o5rBE/m+nXpRCB+/Sq4DqkfXZ/x0jW02DG1tGsfUGXbTJyZDP+eu67haSw==", - "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", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "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 - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "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", - "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" - } - }, - "yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "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", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" - }, - "dependencies": { - "camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", - "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 - } - } - }, - "yn": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", - "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=", - "dev": true - }, - "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/test/dev/package.json b/test/dev/package.json deleted file mode 100644 index b06c8543..00000000 --- a/test/dev/package.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "name": "lis-mon-livre-test", - "version": "1.0.0", - "description": "", - "private": true, - "scripts": { - "lint": "eslint \"test/*.ts\"", - "enable-activity-controls": "env GOOGLE_APPLICATION_CREDENTIALS=$PWD/service_account.json web-and-app-activity-controls", - "test": "npm run lint && env GOOGLE_APPLICATION_CREDENTIALS=$PWD/service_account.json PROJECT_ID=$(cat $PWD/service_account.json| jq -r '.project_id') mocha --recursive --require ts-node/register test/*.ts" - }, - "author": "", - "license": "ISC", - "devDependencies": { - "@assistant/conversation-testing": "^1.0.0", - "@types/mocha": "^9.0.0", - "@types/node": "^16.11.4", - "@typescript-eslint/eslint-plugin": "^5.1.0", - "@typescript-eslint/parser": "^5.1.0", - "chai": "^4.3.4", - "eslint": "^8.1.0", - "mocha": "^9.1.3", - "ts-node": "^10.4.0", - "typescript": "^4.4.4" - } -} diff --git a/test/dev/test/test1.ts b/test/dev/test/test1.ts deleted file mode 100644 index 18307e6c..00000000 --- a/test/dev/test/test1.ts +++ /dev/null @@ -1,66 +0,0 @@ -import 'mocha'; - -import {env} from 'process'; -import {ActionsOnGoogleTestManager} from '@assistant/conversation-testing'; -import {ok, rejects} from 'assert'; -import { inspect } from 'util'; - -const DEFAULT_LOCALE = 'fr-FR'; -const DEFAULT_SURFACE = 'PHONE'; -const CONTINUE_CONVO_PROMPT = "Bienvenue dans l'application d'écoute de livre audio valentin hauy Que voulez-vous faire ? Vous pouvez dire informations ou espace membres"; - -const PROJECT_ID = env['PROJECT_ID'] || ''; -const TRIGGER_PHRASE = 'Parler avec valentin audio'; - -console.log(`PROJECT_ID=${PROJECT_ID}`); - -ok(PROJECT_ID, 'no PROJECT_ID'); - -// tslint:disable:only-arrow-functions - -describe('My Action Test Suite', function () { - // Set the timeout for each test run to 60s. - this.timeout(60000); - let test: ActionsOnGoogleTestManager; - - async function startConversation() { - await test.sendQuery(TRIGGER_PHRASE); - test.assertSpeech(CONTINUE_CONVO_PROMPT); - test.assertText(CONTINUE_CONVO_PROMPT); - test.assertIntent('actions.intent.MAIN'); - test.assertScene('home_lvl1'); - - let se = await test.sendQuery("espace membres"); - console.log(se); - - // test.assertSpeech("Bienvenue dans l'espace membres. Les commandes possibles sont, sélection, lecture, recherche. Que voulez-vous faire ?"); - let resp = test.getLatestResponse(); - console.log(inspect(resp, {showHidden: false, depth: null, colors: true})); - - test.assertText("Pour continuer d'utiliser valentin audio, je dois associer votre compte valentin audio à Google. Êtes-vous d'accord ?"); - - se = await test.sendQuery("oui"); - console.log(se); - - resp = test.getLatestResponse(); - console.dir(resp); - } - - before('before all', async () => { - // Load project settings to read project ID and trigger phrase. - test = new ActionsOnGoogleTestManager({projectId: PROJECT_ID}); - await test.writePreviewFromDraft(); - test.setSuiteLocale(DEFAULT_LOCALE); - test.setSuiteSurface(DEFAULT_SURFACE); - }); - - afterEach('post test cleans', async () => { - test.cleanUpAfterTest(); - }); - - it('trigger only', async () => { - await startConversation(); - await test.sendQuery("quitter"); - // test.assertConversationEnded(); - }); -}); diff --git a/test/prod/.eslintrc.json b/test/prod/.eslintrc.json deleted file mode 100644 index c5624c4e..00000000 --- a/test/prod/.eslintrc.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "env": { - "browser": true, - "es2021": true - }, - "extends": [ - "eslint:recommended", - "plugin:@typescript-eslint/recommended" - ], - "parser": "@typescript-eslint/parser", - "parserOptions": { - "ecmaVersion": 12, - "sourceType": "module" - }, - "plugins": [ - "@typescript-eslint" - ], - "rules": { - } -} diff --git a/test/prod/package-lock.json b/test/prod/package-lock.json deleted file mode 100644 index be66871b..00000000 --- a/test/prod/package-lock.json +++ /dev/null @@ -1,3161 +0,0 @@ -{ - "name": "lis-mon-livre-test", - "version": "1.0.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@assistant/actions": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@assistant/actions/-/actions-0.1.0.tgz", - "integrity": "sha512-V3PUGj7j/8Gq4VPFwP40k6AnsJaV2nnViuGskYnCe8sKLgCTzeGsOKnoGJgEEjI3ETm5mPd8ym3/HoksRODMNw==", - "dev": true, - "requires": { - "google-gax": "^2.9.2" - } - }, - "@assistant/conversation-testing": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@assistant/conversation-testing/-/conversation-testing-1.0.0.tgz", - "integrity": "sha512-9NZ3q1PI/FXegVaF+Kt2M/z2tWcDSPZ8aQ/UBYqtmYk0xSQX3ZRNhg9FWEGeAGL7+1tV4aRRkBylTvUUOGivrQ==", - "dev": true, - "requires": { - "@assistant/actions": "0.1.0", - "@types/chai": "^4.1.4", - "@types/i18n": "^0.8.6", - "@types/js-yaml": "^3.12.5", - "@types/node": "^10.9.4", - "@types/promise.prototype.finally": "^2.0.3", - "chai": "^4.2.0", - "google-auth-library": "^6.1.2", - "grpc": "^1.24.0", - "i18n": "^0.8.3", - "js-yaml": "^3.14.0", - "promise.prototype.finally": "^3.1.1", - "ts-node": "^7.0.1" - }, - "dependencies": { - "@types/node": { - "version": "10.17.60", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", - "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==", - "dev": true - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "ts-node": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz", - "integrity": "sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==", - "dev": true, - "requires": { - "arrify": "^1.0.0", - "buffer-from": "^1.1.0", - "diff": "^3.1.0", - "make-error": "^1.1.1", - "minimist": "^1.2.0", - "mkdirp": "^0.5.1", - "source-map-support": "^0.5.6", - "yn": "^2.0.0" - } - } - } - }, - "@cspotcode/source-map-consumer": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz", - "integrity": "sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==", - "dev": true - }, - "@cspotcode/source-map-support": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz", - "integrity": "sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==", - "dev": true, - "requires": { - "@cspotcode/source-map-consumer": "0.8.0" - } - }, - "@eslint/eslintrc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.3.tgz", - "integrity": "sha512-DHI1wDPoKCBPoLZA3qDR91+3te/wDSc1YhKg3jR8NxKKRJq2hwHwcWv31cSwSYvIBrmbENoYMWcenW8uproQqg==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.0.0", - "globals": "^13.9.0", - "ignore": "^4.0.6", - "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" - } - }, - "@grpc/grpc-js": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.4.1.tgz", - "integrity": "sha512-/chkA48TdAvATHA7RXJPeHQLdfFhpu51974s8htjO/XTDHA41j5+SkR5Io+lr9XsLmkZD6HxLyRAFGmA9wjO2w==", - "dev": true, - "requires": { - "@grpc/proto-loader": "^0.6.4", - "@types/node": ">=12.12.47" - } - }, - "@grpc/proto-loader": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.6.6.tgz", - "integrity": "sha512-cdMaPZ8AiFz6ua6PUbP+LKbhwJbFXnrQ/mlnKGUyzDUZ3wp7vPLksnmLCBX6SHgSmjX7CbNVNLFYD5GmmjO4GQ==", - "dev": true, - "requires": { - "@types/long": "^4.0.1", - "lodash.camelcase": "^4.3.0", - "long": "^4.0.0", - "protobufjs": "^6.10.0", - "yargs": "^16.1.1" - } - }, - "@humanwhocodes/config-array": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.6.0.tgz", - "integrity": "sha512-JQlEKbcgEUjBFhLIF4iqM7u/9lwgHRBcpHrmUNCALK0Q3amXN6lxdoXLnF0sm11E9VqTmBALR87IlUg1bZ8A9A==", - "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^1.2.0", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - } - }, - "@humanwhocodes/object-schema": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", - "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", - "dev": true - }, - "@mapbox/node-pre-gyp": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.6.tgz", - "integrity": "sha512-qK1ECws8UxuPqOA8F5LFD90vyVU33W7N3hGfgsOVfrJaRVc8McC3JClTDHpeSbL9CBrOHly/4GsNPAvIgNZE+g==", - "dev": true, - "requires": { - "detect-libc": "^1.0.3", - "https-proxy-agent": "^5.0.0", - "make-dir": "^3.1.0", - "node-fetch": "^2.6.5", - "nopt": "^5.0.0", - "npmlog": "^5.0.1", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.11" - } - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=", - "dev": true - }, - "@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", - "dev": true - }, - "@protobufjs/codegen": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", - "dev": true - }, - "@protobufjs/eventemitter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=", - "dev": true - }, - "@protobufjs/fetch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", - "dev": true, - "requires": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" - } - }, - "@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=", - "dev": true - }, - "@protobufjs/inquire": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=", - "dev": true - }, - "@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=", - "dev": true - }, - "@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=", - "dev": true - }, - "@protobufjs/utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=", - "dev": true - }, - "@tsconfig/node10": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz", - "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==", - "dev": true - }, - "@tsconfig/node12": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz", - "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==", - "dev": true - }, - "@tsconfig/node14": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz", - "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==", - "dev": true - }, - "@tsconfig/node16": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz", - "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==", - "dev": true - }, - "@types/bytebuffer": { - "version": "5.0.42", - "resolved": "https://registry.npmjs.org/@types/bytebuffer/-/bytebuffer-5.0.42.tgz", - "integrity": "sha512-lEgKojWUAc/MG2t649oZS5AfYFP2xRNPoDuwDBlBMjHXd8MaGPgFgtCXUK7inZdBOygmVf10qxc1Us8GXC96aw==", - "dev": true, - "requires": { - "@types/long": "*", - "@types/node": "*" - } - }, - "@types/chai": { - "version": "4.2.22", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.2.22.tgz", - "integrity": "sha512-tFfcE+DSTzWAgifkjik9AySNqIyNoYwmR+uecPwwD/XRNfvOjmC/FjCxpiUGDkDVDphPfCUecSQVFw+lN3M3kQ==", - "dev": true - }, - "@types/i18n": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/@types/i18n/-/i18n-0.8.8.tgz", - "integrity": "sha512-RI4LFAraGrimMTxXkediCMXGVLC6ksXIIo3U+d3E4n+Mhw3uIDbmokO7DHlPB/eu6Tn6KBv4IUE1WrrEDRdNUQ==", - "dev": true - }, - "@types/js-yaml": { - "version": "3.12.7", - "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-3.12.7.tgz", - "integrity": "sha512-S6+8JAYTE1qdsc9HMVsfY7+SgSuUU/Tp6TYTmITW0PZxiyIMvol3Gy//y69Wkhs0ti4py5qgR3uZH6uz/DNzJQ==", - "dev": true - }, - "@types/json-schema": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", - "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", - "dev": true - }, - "@types/long": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", - "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==", - "dev": true - }, - "@types/mocha": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.0.0.tgz", - "integrity": "sha512-scN0hAWyLVAvLR9AyW7HoFF5sJZglyBsbPuHO4fv7JRvfmPBMfp1ozWqOf/e4wwPNxezBZXRfWzMb6iFLgEVRA==", - "dev": true - }, - "@types/node": { - "version": "16.11.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.4.tgz", - "integrity": "sha512-TMgXmy0v2xWyuCSCJM6NCna2snndD8yvQF67J29ipdzMcsPa9u+o0tjF5+EQNdhcuZplYuouYqpc4zcd5I6amQ==", - "dev": true - }, - "@types/promise.prototype.finally": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/promise.prototype.finally/-/promise.prototype.finally-2.0.4.tgz", - "integrity": "sha512-bkzsMz11tGI5r/ZhJIVI1+QSWKKBcX/Llv0zoM2ufOH+o/3sLXwE5xCW0OUX81xPa4EGOyPKFlNrH9GH+IF4lg==", - "dev": true - }, - "@typescript-eslint/eslint-plugin": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.2.0.tgz", - "integrity": "sha512-qQwg7sqYkBF4CIQSyRQyqsYvP+g/J0To9ZPVNJpfxfekl5RmdvQnFFTVVwpRtaUDFNvjfe/34TgY/dpc3MgNTw==", - "dev": true, - "requires": { - "@typescript-eslint/experimental-utils": "5.2.0", - "@typescript-eslint/scope-manager": "5.2.0", - "debug": "^4.3.2", - "functional-red-black-tree": "^1.0.1", - "ignore": "^5.1.8", - "regexpp": "^3.2.0", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - }, - "dependencies": { - "@typescript-eslint/scope-manager": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.2.0.tgz", - "integrity": "sha512-RW+wowZqPzQw8MUFltfKYZfKXqA2qgyi6oi/31J1zfXJRpOn6tCaZtd9b5u9ubnDG2n/EMvQLeZrsLNPpaUiFQ==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.2.0", - "@typescript-eslint/visitor-keys": "5.2.0" - } - }, - "@typescript-eslint/types": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.2.0.tgz", - "integrity": "sha512-cTk6x08qqosps6sPyP2j7NxyFPlCNsJwSDasqPNjEQ8JMD5xxj2NHxcLin5AJQ8pAVwpQ8BMI3bTxR0zxmK9qQ==", - "dev": true - }, - "@typescript-eslint/visitor-keys": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.2.0.tgz", - "integrity": "sha512-Nk7HizaXWWCUBfLA/rPNKMzXzWS8Wg9qHMuGtT+v2/YpPij4nVXrVJc24N/r5WrrmqK31jCrZxeHqIgqRzs0Xg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.2.0", - "eslint-visitor-keys": "^3.0.0" - } - }, - "ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", - "dev": true - } - } - }, - "@typescript-eslint/experimental-utils": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.2.0.tgz", - "integrity": "sha512-fWyT3Agf7n7HuZZRpvUYdFYbPk3iDCq6fgu3ulia4c7yxmPnwVBovdSOX7RL+k8u6hLbrXcdAehlWUVpGh6IEw==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.2.0", - "@typescript-eslint/types": "5.2.0", - "@typescript-eslint/typescript-estree": "5.2.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" - }, - "dependencies": { - "@typescript-eslint/scope-manager": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.2.0.tgz", - "integrity": "sha512-RW+wowZqPzQw8MUFltfKYZfKXqA2qgyi6oi/31J1zfXJRpOn6tCaZtd9b5u9ubnDG2n/EMvQLeZrsLNPpaUiFQ==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.2.0", - "@typescript-eslint/visitor-keys": "5.2.0" - } - }, - "@typescript-eslint/types": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.2.0.tgz", - "integrity": "sha512-cTk6x08qqosps6sPyP2j7NxyFPlCNsJwSDasqPNjEQ8JMD5xxj2NHxcLin5AJQ8pAVwpQ8BMI3bTxR0zxmK9qQ==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.2.0.tgz", - "integrity": "sha512-RsdXq2XmVgKbm9nLsE3mjNUM7BTr/K4DYR9WfFVMUuozHWtH5gMpiNZmtrMG8GR385EOSQ3kC9HiEMJWimxd/g==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.2.0", - "@typescript-eslint/visitor-keys": "5.2.0", - "debug": "^4.3.2", - "globby": "^11.0.4", - "is-glob": "^4.0.3", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.2.0.tgz", - "integrity": "sha512-Nk7HizaXWWCUBfLA/rPNKMzXzWS8Wg9qHMuGtT+v2/YpPij4nVXrVJc24N/r5WrrmqK31jCrZxeHqIgqRzs0Xg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.2.0", - "eslint-visitor-keys": "^3.0.0" - } - }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - } - } - }, - "@typescript-eslint/parser": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.1.0.tgz", - "integrity": "sha512-vx1P+mhCtYw3+bRHmbalq/VKP2Y3gnzNgxGxfEWc6OFpuEL7iQdAeq11Ke3Rhy8NjgB+AHsIWEwni3e+Y7djKA==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "5.1.0", - "@typescript-eslint/types": "5.1.0", - "@typescript-eslint/typescript-estree": "5.1.0", - "debug": "^4.3.2" - } - }, - "@typescript-eslint/scope-manager": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.1.0.tgz", - "integrity": "sha512-yYlyVjvn5lvwCL37i4hPsa1s0ORsjkauhTqbb8MnpvUs7xykmcjGqwlNZ2Q5QpoqkJ1odlM2bqHqJwa28qV6Tw==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.1.0", - "@typescript-eslint/visitor-keys": "5.1.0" - } - }, - "@typescript-eslint/types": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.1.0.tgz", - "integrity": "sha512-sEwNINVxcB4ZgC6Fe6rUyMlvsB2jvVdgxjZEjQUQVlaSPMNamDOwO6/TB98kFt4sYYfNhdhTPBEQqNQZjMMswA==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.1.0.tgz", - "integrity": "sha512-SSz+l9YrIIsW4s0ZqaEfnjl156XQ4VRmJsbA0ZE1XkXrD3cRpzuZSVCyqeCMR3EBjF27IisWakbBDGhGNIOvfQ==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.1.0", - "@typescript-eslint/visitor-keys": "5.1.0", - "debug": "^4.3.2", - "globby": "^11.0.4", - "is-glob": "^4.0.3", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.1.0.tgz", - "integrity": "sha512-uqNXepKBg81JVwjuqAxYrXa1Ql/YDzM+8g/pS+TCPxba0wZttl8m5DkrasbfnmJGHs4lQ2jTbcZ5azGhI7kK+w==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.1.0", - "eslint-visitor-keys": "^3.0.0" - } - }, - "@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 - }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "dev": true, - "requires": { - "event-target-shim": "^5.0.0" - } - }, - "acorn": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz", - "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==", - "dev": true - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true - }, - "acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true - }, - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "requires": { - "debug": "4" - } - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "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" - } - }, - "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" - } - }, - "aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", - "dev": true - }, - "are-we-there-yet": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", - "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", - "dev": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - } - }, - "arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - }, - "dependencies": { - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - } - } - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", - "dev": true - }, - "ascli": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ascli/-/ascli-1.0.1.tgz", - "integrity": "sha1-vPpZdKYvGOgcq660lzKrSoj5Brw=", - "dev": true, - "requires": { - "colour": "~0.7.1", - "optjs": "~3.2.2" - } - }, - "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 - }, - "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 - }, - "bignumber.js": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz", - "integrity": "sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==", - "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 - }, - "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", - "concat-map": "0.0.1" - } - }, - "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" - } - }, - "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-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": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=", - "dev": true - }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "bytebuffer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/bytebuffer/-/bytebuffer-5.0.1.tgz", - "integrity": "sha1-WC7qSxqHO20CCkjVjfhfC7ps/d0=", - "dev": true, - "requires": { - "long": "~3" - }, - "dependencies": { - "long": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz", - "integrity": "sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s=", - "dev": true - } - } - }, - "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, - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", - "dev": true - }, - "chai": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.4.tgz", - "integrity": "sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA==", - "dev": true, - "requires": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^3.0.1", - "get-func-name": "^2.0.0", - "pathval": "^1.1.1", - "type-detect": "^4.0.5" - } - }, - "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", - "supports-color": "^7.1.0" - } - }, - "check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", - "dev": true - }, - "chokidar": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", - "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.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" - }, - "dependencies": { - "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" - } - } - } - }, - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "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", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "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" - } - }, - "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 - }, - "color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true - }, - "colour": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/colour/-/colour-0.7.1.tgz", - "integrity": "sha1-nLFpkX7F0SwHNtPoaFdG3xyt93g=", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true - }, - "create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "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" - } - }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "requires": { - "object-keys": "^1.0.12" - } - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true - }, - "detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", - "dev": true - }, - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "duplexify": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz", - "integrity": "sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==", - "dev": true, - "requires": { - "end-of-stream": "^1.4.1", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1", - "stream-shift": "^1.0.0" - } - }, - "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==", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "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 - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, - "requires": { - "ansi-colors": "^4.1.1" - } - }, - "es-abstract": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", - "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.1.1", - "get-symbol-description": "^1.0.0", - "has": "^1.0.3", - "has-symbols": "^1.0.2", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", - "is-negative-zero": "^2.0.1", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.1", - "is-string": "^1.0.7", - "is-weakref": "^1.0.1", - "object-inspect": "^1.11.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "string.prototype.trimend": "^1.0.4", - "string.prototype.trimstart": "^1.0.4", - "unbox-primitive": "^1.0.1" - } - }, - "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" - } - }, - "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 - }, - "eslint": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.1.0.tgz", - "integrity": "sha512-JZvNneArGSUsluHWJ8g8MMs3CfIEzwaLx9KyH4tZ2i+R2/rPWzL8c0zg3rHdwYVpN/1sB9gqnjHwz9HoeJpGHw==", - "dev": true, - "requires": { - "@eslint/eslintrc": "^1.0.3", - "@humanwhocodes/config-array": "^0.6.0", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "enquirer": "^2.3.5", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^6.0.0", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.0.0", - "espree": "^9.0.0", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^6.0.1", - "globals": "^13.6.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.2.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "dependencies": { - "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 - }, - "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, - "requires": { - "argparse": "^2.0.1" - } - } - } - }, - "eslint-scope": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-6.0.0.tgz", - "integrity": "sha512-uRDL9MWmQCkaFus8RF5K9/L/2fn+80yoW3jkD53l4shjCh26fCtvJGasxjUqP5OT87SYTxCVA3BwTUzuELx9kA==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true - } - } - }, - "eslint-visitor-keys": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.0.0.tgz", - "integrity": "sha512-mJOZa35trBTb3IyRmo8xmKBZlxf+N7OnUl4+ZhJHs/r+0770Wh/LEACE2pqMGMe27G/4y8P2bYGk4J70IC5k1Q==", - "dev": true - }, - "espree": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.0.0.tgz", - "integrity": "sha512-r5EQJcYZ2oaGbeR0jR0fFVijGOcwai07/690YRXLINuhmVeRY4UKSAsQPe/0BNuDgwP7Ophoc1PRsr2E3tkbdQ==", - "dev": true, - "requires": { - "acorn": "^8.5.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^3.0.0" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "dev": true - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-glob": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", - "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "dependencies": { - "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" - } - } - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "fast-text-encoding": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.3.tgz", - "integrity": "sha512-dtm4QZH9nZtcDt8qJiOH9fcQd1NAgi+K1O2DbE6GG1PPCK/BWfOH3idCTRQ4ImXRUOyopDEgDEnVEE7Y/2Wrig==", - "dev": true - }, - "fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "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-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", - "path-exists": "^4.0.0" - } - }, - "flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true - }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - } - }, - "flatted": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", - "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==", - "dev": true - }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "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 - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "gauge": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.1.tgz", - "integrity": "sha512-6STz6KdQgxO4S/ko+AbjlFGGdGcknluoqU+79GOFCDqqyYj5OanQf9AjxwN0jCidtT+ziPMmPSt9E4hfQ0CwIQ==", - "dev": true, - "requires": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.1", - "object-assign": "^4.1.1", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1 || ^2.0.0", - "strip-ansi": "^3.0.1 || ^4.0.0", - "wide-align": "^1.1.2" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "gaxios": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-4.3.2.tgz", - "integrity": "sha512-T+ap6GM6UZ0c4E6yb1y/hy2UB6hTrqhglp3XfmU9qbLCGRYhLVV5aRPpC4EmoG8N8zOnkYCgoBz+ScvGAARY6Q==", - "dev": true, - "requires": { - "abort-controller": "^3.0.0", - "extend": "^3.0.2", - "https-proxy-agent": "^5.0.0", - "is-stream": "^2.0.0", - "node-fetch": "^2.6.1" - } - }, - "gcp-metadata": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-4.3.1.tgz", - "integrity": "sha512-x850LS5N7V1F3UcV7PoupzGsyD6iVwTVvsh3tbXfkctZnBnjW5yu5z1/3k3SehF7TyoTIe78rJs02GMMy+LF+A==", - "dev": true, - "requires": { - "gaxios": "^4.0.0", - "json-bigint": "^1.0.0" - } - }, - "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": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", - "dev": true - }, - "get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - } - }, - "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" - } - }, - "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", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - } - }, - "globals": { - "version": "13.11.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz", - "integrity": "sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "globby": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", - "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", - "slash": "^3.0.0" - }, - "dependencies": { - "ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", - "dev": true - } - } - }, - "google-auth-library": { - "version": "6.1.6", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-6.1.6.tgz", - "integrity": "sha512-Q+ZjUEvLQj/lrVHF/IQwRo6p3s8Nc44Zk/DALsN+ac3T4HY/g/3rrufkgtl+nZ1TW7DNAw5cTChdVp4apUXVgQ==", - "dev": true, - "requires": { - "arrify": "^2.0.0", - "base64-js": "^1.3.0", - "ecdsa-sig-formatter": "^1.0.11", - "fast-text-encoding": "^1.0.0", - "gaxios": "^4.0.0", - "gcp-metadata": "^4.2.0", - "gtoken": "^5.0.4", - "jws": "^4.0.0", - "lru-cache": "^6.0.0" - } - }, - "google-gax": { - "version": "2.28.0", - "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-2.28.0.tgz", - "integrity": "sha512-kuqc8a4+CTCMBcF3tlOL7Sa74JWkTzcZxatAQTCVK35WToXkHnJ0qncFOJuegUv3EbV9IQY4j/+NZdFLv+lbTA==", - "dev": true, - "requires": { - "@grpc/grpc-js": "~1.4.0", - "@grpc/proto-loader": "^0.6.1", - "@types/long": "^4.0.0", - "abort-controller": "^3.0.0", - "duplexify": "^4.0.0", - "fast-text-encoding": "^1.0.3", - "google-auth-library": "^7.6.1", - "is-stream-ended": "^0.1.4", - "node-fetch": "^2.6.1", - "object-hash": "^2.1.1", - "proto3-json-serializer": "^0.1.1", - "protobufjs": "6.11.2", - "retry-request": "^4.0.0" - }, - "dependencies": { - "google-auth-library": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-7.10.1.tgz", - "integrity": "sha512-nQxgM1ZopUMcpMnu95kOSzI+9tJl4YDOZJomSTBGlRLpxfBopdwto7WvzoI87HuN0nQqVETgOsHi/C/po1rppA==", - "dev": true, - "requires": { - "arrify": "^2.0.0", - "base64-js": "^1.3.0", - "ecdsa-sig-formatter": "^1.0.11", - "fast-text-encoding": "^1.0.0", - "gaxios": "^4.0.0", - "gcp-metadata": "^4.2.0", - "gtoken": "^5.0.4", - "jws": "^4.0.0", - "lru-cache": "^6.0.0" - } - } - } - }, - "google-p12-pem": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-3.1.2.tgz", - "integrity": "sha512-tjf3IQIt7tWCDsa0ofDQ1qqSCNzahXDxdAGJDbruWqu3eCg5CKLYKN+hi0s6lfvzYZ1GDVr+oDF9OOWlDSdf0A==", - "dev": true, - "requires": { - "node-forge": "^0.10.0" - } - }, - "growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true - }, - "grpc": { - "version": "1.24.11", - "resolved": "https://registry.npmjs.org/grpc/-/grpc-1.24.11.tgz", - "integrity": "sha512-8/AQdFCzCeCDWW3SoaMNp6ccbRvTQEH1O1u1uFtt29eWsg5gSZCJ3m6fbkduEIh3smY7WAPP+LgVJ5n3nZRxcA==", - "dev": true, - "requires": { - "@mapbox/node-pre-gyp": "^1.0.4", - "@types/bytebuffer": "^5.0.40", - "lodash.camelcase": "^4.3.0", - "lodash.clone": "^4.5.0", - "nan": "^2.13.2", - "protobufjs": "^5.0.3" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" - } - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "protobufjs": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-5.0.3.tgz", - "integrity": "sha512-55Kcx1MhPZX0zTbVosMQEO5R6/rikNXd9b6RQK4KSPcrSIIwoXTtebIczUrXlwaSrbz4x8XUVThGPob1n8I4QA==", - "dev": true, - "requires": { - "ascli": "~1", - "bytebuffer": "~5", - "glob": "^7.0.5", - "yargs": "^3.10.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - } - }, - "y18n": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", - "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", - "dev": true - }, - "yargs": { - "version": "3.32.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", - "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", - "dev": true, - "requires": { - "camelcase": "^2.0.1", - "cliui": "^3.0.3", - "decamelize": "^1.1.1", - "os-locale": "^1.4.0", - "string-width": "^1.0.1", - "window-size": "^0.1.4", - "y18n": "^3.2.0" - } - } - } - }, - "gtoken": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-5.3.1.tgz", - "integrity": "sha512-yqOREjzLHcbzz1UrQoxhBtpk8KjrVhuqPE7od1K2uhyxG2BHjKZetlbLw/SPZak/QqTIQW+addS+EcjqQsZbwQ==", - "dev": true, - "requires": { - "gaxios": "^4.0.0", - "google-p12-pem": "^3.0.3", - "jws": "^4.0.0" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-bigints": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", - "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", - "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-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", - "dev": true - }, - "has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true - }, - "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 - }, - "https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", - "dev": true, - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "i18n": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/i18n/-/i18n-0.8.6.tgz", - "integrity": "sha512-aMsJq8i1XXrb+BBsgmJBwak9mr69zPEIAUPb6c5yw2G/O4k1Q52lBxL+agZdQDN/RGf1ylQzrCswsOOgIiC1FA==", - "dev": true, - "requires": { - "debug": "*", - "make-plural": "^6.0.1", - "math-interval-parser": "^2.0.1", - "messageformat": "^2.3.0", - "mustache": "*", - "sprintf-js": "^1.1.2" - } - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "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" - } - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true - }, - "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" - } - }, - "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": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "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-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.1", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", - "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", - "dev": true - }, - "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.6", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", - "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", - "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==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-shared-array-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", - "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", - "dev": true - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true - }, - "is-stream-ended": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-stream-ended/-/is-stream-ended-0.1.4.tgz", - "integrity": "sha512-xj0XPvmr7bQFTvirqnFr50o0hQIh6ZItDqloxt5aJrR4NQsYeSsyFQERYGCAzfindAcnKjINnwEEgLx4IqVzQw==", - "dev": true - }, - "is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "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==", - "dev": true - }, - "is-weakref": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz", - "integrity": "sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.0" - } - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "json-bigint": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", - "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", - "dev": true, - "requires": { - "bignumber.js": "^9.0.0" - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "jwa": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", - "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", - "dev": true, - "requires": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "jws": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", - "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", - "dev": true, - "requires": { - "jwa": "^2.0.0", - "safe-buffer": "^5.0.1" - } - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "requires": { - "invert-kv": "^1.0.0" - } - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "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.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=", - "dev": true - }, - "lodash.clone": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz", - "integrity": "sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y=", - "dev": true - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "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", - "is-unicode-supported": "^0.1.0" - } - }, - "long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", - "dev": true - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "make-plural": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/make-plural/-/make-plural-6.2.2.tgz", - "integrity": "sha512-8iTuFioatnTTmb/YJjywkVIHLjcwkFD9Ms0JpxjEm9Mo8eQYkh1z+55dwv4yc1jQ8ftVBxWQbihvZL1DfzGGWA==", - "dev": true - }, - "math-interval-parser": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/math-interval-parser/-/math-interval-parser-2.0.1.tgz", - "integrity": "sha512-VmlAmb0UJwlvMyx8iPhXUDnVW1F9IrGEd9CIOmv+XL8AErCUUuozoDMrgImvnYt2A+53qVX/tPW6YJurMKYsvA==", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "messageformat": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/messageformat/-/messageformat-2.3.0.tgz", - "integrity": "sha512-uTzvsv0lTeQxYI2y1NPa1lItL5VRI8Gb93Y2K2ue5gBPyrbJxfDi/EYWxh2PKv5yO42AJeeqblS9MJSh/IEk4w==", - "dev": true, - "requires": { - "make-plural": "^4.3.0", - "messageformat-formatters": "^2.0.1", - "messageformat-parser": "^4.1.2" - }, - "dependencies": { - "make-plural": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/make-plural/-/make-plural-4.3.0.tgz", - "integrity": "sha512-xTYd4JVHpSCW+aqDof6w/MebaMVNTVYBZhbB/vi513xXdiPT92JMVCo0Jq8W2UZnzYRFeVbQiQ+I25l13JuKvA==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - } - } - }, - "messageformat-formatters": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/messageformat-formatters/-/messageformat-formatters-2.0.1.tgz", - "integrity": "sha512-E/lQRXhtHwGuiQjI7qxkLp8AHbMD5r2217XNe/SREbBlSawe0lOqsFb7rflZJmlQFSULNLIqlcjjsCPlB3m3Mg==", - "dev": true - }, - "messageformat-parser": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/messageformat-parser/-/messageformat-parser-4.1.3.tgz", - "integrity": "sha512-2fU3XDCanRqeOCkn7R5zW5VQHWf+T3hH65SzuqRvjatBK7r4uyFa5mEX+k6F9Bd04LVM5G4/BHBTUJsOdW7uyg==", - "dev": true - }, - "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - } - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "minipass": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.5.tgz", - "integrity": "sha512-+8NzxD82XQoNKNrl1d/FSi+X8wAEWR+sbYAfIvub4Nz0d22plFG72CEVVaufV8PNf4qSslFTD8VMOxNVhHCjTw==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dev": true, - "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "mocha": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.1.3.tgz", - "integrity": "sha512-Xcpl9FqXOAYqI3j79pEtHBBnQgVXIhpULjGQa7DVb0Po+VzmSIK9kanAiWLHoRR/dbZ2qpdPshuXr8l1VaHCzw==", - "dev": true, - "requires": { - "@ungap/promise-all-settled": "1.1.2", - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.2", - "debug": "4.3.2", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.1.7", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "3.0.4", - "ms": "2.1.3", - "nanoid": "3.1.25", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "which": "2.0.2", - "workerpool": "6.1.5", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "dependencies": { - "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 - }, - "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 - }, - "glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", - "dev": true, - "requires": { - "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" - } - }, - "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, - "requires": { - "argparse": "^2.0.1" - } - }, - "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 - }, - "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" - } - }, - "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 - } - } - }, - "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 - }, - "mustache": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", - "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", - "dev": true - }, - "nan": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", - "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==", - "dev": true - }, - "nanoid": { - "version": "3.1.25", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.25.tgz", - "integrity": "sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q==", - "dev": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "node-fetch": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.5.tgz", - "integrity": "sha512-mmlIVHJEu5rnIxgEgez6b9GgWXbkZj5YZ7fx+2r94a2E+Uirsp6HsPTPlomfdHtpt/B0cdKviwkoaM6pyvUOpQ==", - "dev": true, - "requires": { - "whatwg-url": "^5.0.0" - } - }, - "node-forge": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", - "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", - "dev": true - }, - "nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "dev": true, - "requires": { - "abbrev": "1" - } - }, - "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 - }, - "npmlog": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", - "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", - "dev": true, - "requires": { - "are-we-there-yet": "^2.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^3.0.0", - "set-blocking": "^2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "object-hash": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", - "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", - "dev": true - }, - "object-inspect": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", - "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", - "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": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - } - }, - "optjs": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/optjs/-/optjs-3.2.2.tgz", - "integrity": "sha1-aabOicRCpEQDFBrS+bNwvVu29O4=", - "dev": true - }, - "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "dev": true, - "requires": { - "lcid": "^1.0.0" - } - }, - "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" - } - }, - "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" - } - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "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": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true - }, - "picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", - "dev": true - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, - "promise.prototype.finally": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/promise.prototype.finally/-/promise.prototype.finally-3.1.3.tgz", - "integrity": "sha512-EXRF3fC9/0gz4qkt/f5EP5iW4kj9oFpBICNpCNOb/52+8nlHIX07FPLbi/q4qYBQ1xZqivMzTpNQSnArVASolQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" - } - }, - "proto3-json-serializer": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/proto3-json-serializer/-/proto3-json-serializer-0.1.4.tgz", - "integrity": "sha512-bFzdsKU/zaTobWrRxRniMZIzzcgKYlmBWL1gAcTXZ2M7TQTGPI0JoYYs6bN7tpWj59ZCfwg7Ii/A2e8BbQGYnQ==", - "dev": true - }, - "protobufjs": { - "version": "6.11.2", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.2.tgz", - "integrity": "sha512-4BQJoPooKJl2G9j3XftkIXjoC9C0Av2NOrWmbLWT1vH32GcSUHjM0Arra6UfTsVyfMAuFzaLucXn1sadxJydAw==", - "dev": true, - "requires": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/long": "^4.0.1", - "@types/node": ">=13.7.0", - "long": "^4.0.0" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "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": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "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" - } - }, - "regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "retry-request": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-4.2.2.tgz", - "integrity": "sha512-xA93uxUD/rogV7BV59agW/JHPGXeREMWiZc9jhcwY4YdZ7QOtC7qbomYg0n4wyk2lJhggjvKvhNX8wln/Aldhg==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "extend": "^3.0.2" - } - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "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==", - "dev": true - }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "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", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "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, - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "signal-exit": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.5.tgz", - "integrity": "sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-support": { - "version": "0.5.20", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.20.tgz", - "integrity": "sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "sprintf-js": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", - "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", - "dev": true - }, - "stream-shift": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", - "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "string.prototype.trimend": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", - "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "string.prototype.trimstart": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", - "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "requires": { - "safe-buffer": "~5.2.0" - } - }, - "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-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 - }, - "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" - } - }, - "tar": { - "version": "6.1.11", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", - "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", - "dev": true, - "requires": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "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" - } - }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", - "dev": true - }, - "ts-node": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.4.0.tgz", - "integrity": "sha512-g0FlPvvCXSIO1JDF6S232P5jPYqBkRL9qly81ZgAOSU7rwI0stphCgd2kLiCrU9DjQCrJMWEqcNSjQL02s6d8A==", - "dev": true, - "requires": { - "@cspotcode/source-map-support": "0.7.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "yn": "3.1.1" - }, - "dependencies": { - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - }, - "yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true - } - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "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 - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - }, - "typescript": { - "version": "4.4.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.4.tgz", - "integrity": "sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA==", - "dev": true - }, - "unbox-primitive": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", - "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has-bigints": "^1.0.1", - "has-symbols": "^1.0.2", - "which-boxed-primitive": "^1.0.2" - } - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=", - "dev": true - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", - "dev": true, - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "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" - } - }, - "wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "dev": true, - "requires": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "window-size": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", - "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=", - "dev": true - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "workerpool": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.5.tgz", - "integrity": "sha512-XdKkCK0Zqc6w3iTxLckiuJ81tiD/o5rBE/m+nXpRCB+/Sq4DqkfXZ/x0jW02DG1tGsfUGXbTJyZDP+eu67haSw==", - "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", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "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 - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "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", - "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" - } - }, - "yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "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", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" - }, - "dependencies": { - "camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", - "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 - } - } - }, - "yn": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", - "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=", - "dev": true - }, - "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/test/prod/package.json b/test/prod/package.json deleted file mode 100644 index f55c007a..00000000 --- a/test/prod/package.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "name": "lis-mon-livre-test", - "version": "1.0.0", - "description": "", - "private": true, - "scripts": { - "lint": "eslint \"test/*.ts\"", - "enable-activity-controls": "env GOOGLE_APPLICATION_CREDENTIALS=$PWD/service_account.json web-and-app-activity-controls", - "test": "npm run lint && env GOOGLE_APPLICATION_CREDENTIALS=$PWD/service_account.json PROJECT_ID=$(cat $PWD/service_account.json| jq -r '.project_id') mocha --recursive --require ts-node/register test/*.ts" - }, - "author": "", - "license": "ISC", - "devDependencies": { - "@assistant/conversation-testing": "^1.0.0", - "@types/mocha": "^9.0.0", - "@types/node": "^16.11.4", - "@typescript-eslint/eslint-plugin": "^5.2.0", - "@typescript-eslint/parser": "^5.1.0", - "chai": "^4.3.4", - "eslint": "^8.1.0", - "mocha": "^9.1.3", - "ts-node": "^10.4.0", - "typescript": "^4.4.4" - } -} diff --git a/test/prod/test/test1.ts b/test/prod/test/test1.ts deleted file mode 100644 index 775959f1..00000000 --- a/test/prod/test/test1.ts +++ /dev/null @@ -1,56 +0,0 @@ -import 'mocha'; - -import {env} from 'process'; -import {ActionsOnGoogleTestManager} from '@assistant/conversation-testing'; -import {ok} from 'assert'; - -const DEFAULT_LOCALE = 'fr-FR'; -const DEFAULT_SURFACE = 'PHONE'; -const CONTINUE_CONVO_PROMPT = "Bienvenue dans l'application d'écoute de livre audio valentin hauy Que voulez-vous faire ? Vous pouvez dire informations ou espace membres"; - -const PROJECT_ID = env['PROJECT_ID'] || ''; -const TRIGGER_PHRASE = 'Parler avec valentin audio'; - -console.log(`PROJECT_ID=${PROJECT_ID}`); - -ok(PROJECT_ID, 'no PROJECT_ID'); - -// tslint:disable:only-arrow-functions - -describe('My Action Test Suite', function () { - // Set the timeout for each test run to 60s. - this.timeout(60000); - let test: ActionsOnGoogleTestManager; - - async function startConversation() { - await test.sendQuery(TRIGGER_PHRASE); - test.assertSpeech(CONTINUE_CONVO_PROMPT); - test.assertText(CONTINUE_CONVO_PROMPT); - test.assertIntent('actions.intent.MAIN'); - test.assertScene('home_lvl1'); - - await test.sendQuery("espace membres"); - test.assertText("Pour continuer d'utiliser valentin audio, je dois associer votre compte valentin audio à Google. Êtes-vous d'accord ?"); - - await test.sendQuery("oui"); - test.assertText(""); - - } - - before('before all', async () => { - // Load project settings to read project ID and trigger phrase. - test = new ActionsOnGoogleTestManager({projectId: PROJECT_ID}); - await test.writePreviewFromDraft(); - test.setSuiteLocale(DEFAULT_LOCALE); - test.setSuiteSurface(DEFAULT_SURFACE); - }); - - afterEach('post test cleans', async () => { - test.cleanUpAfterTest(); - }); - - it('trigger only', async () => { - await startConversation(); - // test.assertConversationEnded(); - }); -}); diff --git a/webhooks/.firebaserc b/webhooks/.firebaserc deleted file mode 100644 index 6d5da75c..00000000 --- a/webhooks/.firebaserc +++ /dev/null @@ -1,5 +0,0 @@ -{ - "projects": { - "default": "valentin-4" - } -} diff --git a/webhooks/.gitignore b/webhooks/.gitignore deleted file mode 100644 index dbb58ffb..00000000 --- a/webhooks/.gitignore +++ /dev/null @@ -1,66 +0,0 @@ -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -firebase-debug.log* -firebase-debug.*.log* - -# Firebase cache -.firebase/ - -# Firebase config - -# Uncomment this if you'd like others to create their own Firebase project. -# For a team working on the same Firebase project(s), it is recommended to leave -# it commented so all members can deploy to the same project(s) in .firebaserc. -# .firebaserc - -# Runtime data -pids -*.pid -*.seed -*.pid.lock - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage - -# nyc test coverage -.nyc_output - -# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# Bower dependency directory (https://bower.io/) -bower_components - -# node-waf configuration -.lock-wscript - -# Compiled binary addons (http://nodejs.org/api/addons.html) -build/Release - -# Dependency directories -node_modules/ - -# Optional npm cache directory -.npm - -# Optional eslint cache -.eslintcache - -# Optional REPL history -.node_repl_history - -# Output of 'npm pack' -*.tgz - -# Yarn Integrity file -.yarn-integrity - -# dotenv environment variables file -.env diff --git a/webhooks/debug/test.js b/webhooks/debug/test.js new file mode 100644 index 00000000..0f73022d --- /dev/null +++ b/webhooks/debug/test.js @@ -0,0 +1,14 @@ + +const opds = require('opds-fetcher-parser'); +const fs = require('fs'); + +(async function () { + + const o = new opds.OpdsFetcher(); + + const feed = await o.feedRequest("https://storage.googleapis.com/audiobook_edrlab/navigation/thematic_list.json"); + + console.log(feed); + fs.writeFileSync("/tmp/feed.json", JSON.stringify(feed)); + +})() \ No newline at end of file diff --git a/webhooks/firebase.json b/webhooks/firebase.json index ffde5d9f..0967ef42 100644 --- a/webhooks/firebase.json +++ b/webhooks/firebase.json @@ -1,19 +1 @@ -{ - "functions": { - "predeploy": [ - "npm --prefix \"$RESOURCE_DIR\" run lint" - ], - "source": "functions" - }, - "emulators": { - "functions": { - "port": 5001 - }, - "firestore": { - "port": 8080 - }, - "ui": { - "enabled": true - } - } -} +{} diff --git a/webhooks/functions/.eslintrc.js b/webhooks/functions/.eslintrc.js index e5639392..1554c48a 100644 --- a/webhooks/functions/.eslintrc.js +++ b/webhooks/functions/.eslintrc.js @@ -1,18 +1,21 @@ module.exports = { - root: true, - env: { - es6: true, - node: true, - }, - "parserOptions": { - "ecmaVersion": 2017 - }, - extends: [ - "eslint:recommended", - // "google", - ], - rules: { - quotes: ["error", "double"], - "no-unused-vars": "off" - }, + "env": { + }, + "extends": [ + "google" + ], + "parser": "@typescript-eslint/parser", + "parserOptions": { + "ecmaVersion": 13, + "sourceType": "module" + }, + "plugins": [ + "@typescript-eslint" + ], + "rules": { + "max-len": 0, + "require-jsdoc": 0, + "camelcase": 0, + "new-cap": 0, + } }; diff --git a/webhooks/functions/.gitignore b/webhooks/functions/.gitignore index 40b878db..e568fe8e 100644 --- a/webhooks/functions/.gitignore +++ b/webhooks/functions/.gitignore @@ -1 +1,3 @@ -node_modules/ \ No newline at end of file +node_modules/ + +build/ diff --git a/webhooks/functions/cd.sh b/webhooks/functions/cd.sh new file mode 100755 index 00000000..6e15b752 --- /dev/null +++ b/webhooks/functions/cd.sh @@ -0,0 +1,11 @@ + +function cd { + # actually change the directory with all args passed to the function + builtin cd "$@" + + case $PWD/ in + /Users/edrlab/Documents/edrlab/projects/lis-mon-livre-project/lis-mon-livre-edrlab/webhooks/functions/*) + node14 + ;; + esac +} diff --git a/webhooks/functions/index.js b/webhooks/functions/index.js deleted file mode 100644 index 4fd9cb0a..00000000 --- a/webhooks/functions/index.js +++ /dev/null @@ -1,604 +0,0 @@ -const {conversation, Media} = require("@assistant/conversation"); -const functions = require("firebase-functions"); -const admin = require("firebase-admin"); - -admin.initializeApp(); - -const db = admin.firestore(); - -const {OpdsFetcher} = require("opds-fetcher-parser"); -const {ok} = require("assert"); - -const app = conversation(); - -const appHandle = app.handle.bind(app); - -app.handle = (path, fn) => { - - appHandle(path, async (conv) => { - - let pass = false; - try { - - const id = conv.user.params.bearerToken; - - ok(id, "bearerToken not defined"); - - const docRef = db.collection("user-storage").doc(id); - await Promise.resolve(fn(conv)); - pass = true; - await docRef.set(conv.user.params); - - } catch (e) { - console.error(e); - if (!pass) - await Promise.resolve(fn(conv)); - - } - }); -}; - -function isValidHttpUrl(string) { - let url; - - try { - url = new URL(string); - } catch (_) { - return false; - } - - return url.protocol === "http:" || url.protocol === "https:"; -} - -async function getPubsFromFeed(url) { - - const opds = new OpdsFetcher(); - const feed = await opds.feedRequest(url); - - ok(Array.isArray(feed.publications), "no publications"); - const list = feed.publications - .filter(({openAccessLinks: l}) /* : l is IOpdsLinkView[]*/ => { - return ( - Array.isArray(l) && - l[0] && - isValidHttpUrl(l[0].url) - ); - }) - .slice(0, 5) - .map(({title, authors, openAccessLinks}) => ({ - title: title, - author: Array.isArray(authors) ? authors[0].name : "", - webpuburl: openAccessLinks[0].url, - })); - - return list; -} - -// ---------------- -// -// CONVERSATION START -// -// ---------------- - -app.handle("cancel", (conv) => { - // Implement your code here - // conv.add("cancel"); -}); - -app.handle("test_webhook", (conv) => { - - conv.add("Webook works :", functions.config().debug.message || ""); - console.log("TEST OK"); -}); - -// ----------- -// LVL2 MENU -// SELECTION -// ----------- - - -const WEBPUB_URL = "https://storage.googleapis.com/audiobook_edrlab/webpub/"; - -const extract_name_from_url = (url) => { - - const name = /\/(?:.(?!\/))+$/.exec(url)[0]; - - if (typeof name === "string") - return name.slice(1); - - return ""; -}; - -// ----------- -// LVL3 MENU -// SELECTION -// ----------- - -app.handle("selection_genre_lvl3", async (conv) => { - - conv.add("sélection par genre"); -}); - -app.handle("selection_thematic_list_lvl3", async (conv) => { - - conv.add("sélection par liste thématique"); -}); - -const SELECTION_URL = "https://storage.googleapis.com/audiobook_edrlab/groups/popular.json" -app.handle("selection_my_list_lvl3", async (conv) => { - - const url = SELECTION_URL; - const list = await getPubsFromFeed(url); - - console.log("PUBs: ", list); - - const length = list.length; - if (length > 1) { - conv.scene.next.name = "select_pub_after_selection"; - conv.add(`Il y a ${length} publications :\n`); - - let text = ""; - list.map(({title, author}, i) => { - text += `numero ${i + 1} : ${title} ${author ? `de ${author}` : ""}\n`; - }); - - conv.add(text); - } else if (length === 1) { - conv.scene.next.name = "ask_to_resume_listening_at_last_offset"; - - conv.user.params.p_n = extract_name_from_url(list[0].webpuburl); - } else { - conv.scene.next.name = "home_members"; - - conv.add("aucun résultat trouvé"); - } - - console.log("selection_my_list_lvl3 EXIT"); - -}); - -// --------- -// LVL3 MENU -// SELECTION -// --------- - -app.handle("select_publication_number_after_selection", async (conv) => { - console.log("select_publication_number START"); - - const number = conv.intent.params.number.resolved; - - const url = SELECTION_URL; - const list = await getPubsFromFeed(url); - const pub = list[number - 1]; - if (pub) { - console.log("PUB: ", pub); - - const url = extract_name_from_url(pub.webpuburl); - - if (!conv.user.params.player) { - conv.user.params.player = {}; - } - - const history = conv.user.params.player[url]; - if (!history) { - conv.user.params.p_i = 0; - conv.user.params.p_t = 0; - } else { - conv.user.params.p_i = history.i; - conv.user.params.p_t = history.t; - } - conv.user.params.p_n = url; - - // should be specified - conv.scene.next.name = "ask_to_resume_listening_at_last_offset"; - } else { - console.log("NO PUBS found !!"); - conv.add(`Le numéro ${number} est inconnu. Veuillez choisir un autre numéro.`); - conv.scene.next.name = "select_pub_after_selection"; - } - - console.log("select_publication_number END"); -}); - - -// ----------- -// LVL2 MENU -// SELECTION -// ----------- - -app.handle("reprendre_mon_livre_lvl2", (conv) => { - - // void - - const name = conv.user.params.p_n; - if (!name) { - conv.scene.next.name = "home_members"; - conv.add("aucune lecture en cours"); - } - -}); - -app.handle("ecouter_livre_audio_lvl2", (conv) => { - // void - - console.log("écouter_livre_audio_lvl2"); - - // first entry point for search - // - // VOID - // - // search_livre_lvl2 is the main entry point -}); - - -// ---------- -// LVL2 MENU -// SEARCH -// ---------- - -const SEARCH_URL = "https://europe-west1-audiobooks-a6348.cloudfunctions.net/indexer?url=https://storage.googleapis.com/audiobook_edrlab/navigation/all.json&query={query}"; - -// if scene.slot.status == "FINAL" => call search_livre_lvl2 -app.handle("search_livre_lvl2", async (conv) => { - // void - - console.log("search_livre_lvl2 START"); - - let query = null; - - try { - query = conv.intent.params.query.resolved; - } catch (_) { - // ignore - } - - ok(typeof query === "string", "aucune requete demandée"); - conv.session.params.query = query; - - const url = SEARCH_URL.replace("{query}", encodeURIComponent(query)); - console.log("search URL: ", url); - - const list = await getPubsFromFeed(url); - - console.log("PUBs: "); - console.log(list); - - const length = list.length; - if (length > 1) { - conv.scene.next.name = "select_pub_after_search"; - conv.add(`Il y a ${length} publications :\n`); - - let text = ""; - list.map(({title, author}, i) => { - text += `numero ${i + 1} : ${title} ${author ? `de ${author}` : ""}\n`; - }); - - conv.add(text); - } else if (length === 1) { - conv.scene.next.name = "ask_to_resume_listening_at_last_offset"; - - conv.user.params.p_n = extract_name_from_url(list[0].webpuburl); - } else { - conv.scene.next.name = "search"; - - conv.add("aucun résultat trouvé"); - } - - console.log("search_livre_lvl2 STOP"); - - // slot available for research -}); - -app.handle("select_publication_number_after_search", async (conv) => { - console.log("select_publication_number START"); - - const number = conv.intent.params.number.resolved; - - console.log("NUMBER: ", number); - const query = conv.session.params.query; - ok(typeof query === "string", "aucune requete demandée"); - - const url = SEARCH_URL.replace("{query}", encodeURIComponent(query)); - console.log("select_publication_number_after_search URL: ", url); - - const list = await getPubsFromFeed(url); - const pub = list[number - 1]; - if (pub) { - console.log("PUB: ", pub); - - const name = extract_name_from_url(pub.webpuburl); - - if (!conv.user.params.player) { - conv.user.params.player = {}; - } - - const history = conv.user.params.player[name]; - if (!history) { - conv.user.params.p_i= 0; - conv.user.params.p_t = 0; - } else { - conv.user.params.p_i = history.i; - conv.user.params.p_t = history.t; - } - conv.user.params.p_n = name; - - // should be specified - conv.scene.next.name = "ask_to_resume_listening_at_last_offset"; - } else { - console.log("NO PUBS found !!"); - conv.add(`Le numéro ${number} est inconnu. Veuillez choisir un autre numéro.`); - conv.scene.next.name = "select_pub_after_search"; - } - - console.log("select_publication_number END"); -}); - - -// ---------- -// LVL2 MENU -// SEARCH -// ---------- - -app.handle("ask_to_resume_listening_at_last_offset", async (conv) => { - - const { p_n: name, p_i, p_t } = conv.user.params; - if (name && (p_i > 0 || p_t > 0)) { - console.log("ask to resume enabled , wait yes or no"); - // ask yes or no in the no-code scene - const history = conv.user.params.player[name]; - const date = history.d; - // TODO: use the date info - - conv.add("Voulez-vous reprendre la lecture là où c'était arrêtée ?"); - } else { - console.log("no need to ask to resume"); - conv.scene.next.name = "player"; - } - -}); - -app.handle("ask_to_resume_listening_at_last_offset__yes", async (conv) => { - - // nothing - // not used - conv.scene.next.name = "player"; - -}); - - -app.handle("ask_to_resume_listening_at_last_offset__no", async (conv) => { - - const name = conv.user.params.p_n; - if (name) { - console.log("erase ", name, " resume listening NO"); - conv.user.params.p_i = 0; - conv.user.params.p_t = 0; - } - conv.scene.next.name = "player"; - -}); - - -// ---------- -// PLAYER -// ---------- - -app.handle("player", async (conv) => { - const name = conv.user.params.p_n; - - const url = WEBPUB_URL + name; - console.log("Player URL:", url); - ok(url, "url not defined"); - ok(isValidHttpUrl(url), "url not valid " + url); - - const opds = new OpdsFetcher(); - const webpub = await opds.webpubRequest(url); - ok(webpub, "webpub not defined"); - - const startIndexRaw = conv.user.params.p_i; - const startIndex = - typeof startIndexRaw === "number" && - startIndexRaw <= webpub.readingOrders.length ? startIndexRaw : 0; - - const startTimeRaw = conv.user.params.p_t; - const startTime = - typeof startTimeRaw === "number" && - startTimeRaw <= (webpub.readingOrders[startIndex].duration || Infinity) ? startTimeRaw : 0; - - const mediaObjects = webpub.readingOrders - .map((v, i) => ({ - name: `${webpub.title || ""} - ${i + 1}`, - url: v.url, - image: { - large: { - alt: webpub.title, - url: webpub.cover || "", - }, - }, - })).slice(startIndex); - - console.log("Media list"); - console.log(mediaObjects); - console.log("Start Index = ", startIndex, " Start Time = ", startTime, " Start Time"); - - conv.add( - new Media({ - mediaObjects: mediaObjects, - mediaType: "AUDIO", - optionalMediaControls: ["PAUSED", "STOPPED"], - startOffset: `${startTime}s`, - }), - ); -}); - -// ---------- -// PLAYER -// ---------- - - -// //////////////////////// -// Media PLAYET CONTEXT // -// //////////////////////// - -function persistMediaPlayer(conv) { - if (conv.request.context) { - // Persist the media progress value - - const progress = parseInt(conv.request.context.media.progress, 10); - const index = conv.request.context.media.index; - const name = conv.user.params.p_n; - - conv.user.params.p_i = index; - conv.user.params.p_t = progress; - - if (!conv.user.params.player) { - conv.user.params.player = {}; - } - - conv.user.params.player[name] = { - i: index, - t: progress, - d: new Date().getTime(), - }; - - console.log("player persistence :"); - console.log(conv.user.params.player); - } else { - - console.log("NO conv.request.context !!"); - } -} - -app.handle("reprendre_la_lecture", (conv) => { - persistMediaPlayer(conv); - - // // Acknowledge pause/stop - // conv.add(new Media({ - // mediaType: 'MEDIA_STATUS_ACK' - // })); - - conv.scene.next.name = "player"; -}); - -app.handle("remaining_time", async (conv) => { - persistMediaPlayer(conv); - - const name = conv.user.params.p_n; - ok(name, "titre non défini"); - - const url = WEBPUB_URL + name; - ok(isValidHttpUrl(url), "url not valid " + url); - - const opds = new OpdsFetcher(); - const webpub = await opds.webpubRequest(url); - ok(webpub, "webpub not defined"); - - const index = conv.user.params.player_startIndex || 0; - const time = conv.user.params.player_startTime || 0; - - let minutes = 0; - if (Array.isArray(webpub.readingOrders)) { - let remainingTime = 0; - for (let i = index + 1; i < webpub.readingOrders.length; i += 1) { - remainingTime += webpub.readingOrders[i].duration || 0; - } - const pos = (v) => (v < 0 ? 0 : v); - remainingTime += pos((webpub.readingOrders[index].duration || 0) - time); - - if (remainingTime >= 60) { - minutes = Math.floor(remainingTime / 60); - } - } - - const hours = Math.floor(minutes / 60); - if (hours) { - minutes = minutes % 60; - conv.add(`il reste ${hours} heures et ${minutes} minutes`); - } else { - conv.add(`il reste ${minutes} minutes`); - } - - // // Acknowledge pause/stop - // conv.add(new Media({ - // mediaType: 'MEDIA_STATUS_ACK' - // })); - - conv.scene.next.name = "player"; -}); - -// //////////////////////// -// Media PLAYET CONTEXT // -// //////////////////////// - -// Media status -app.handle("media_status", (conv) => { - console.log("MediaStatus START"); - const mediaStatus = conv.intent.params.MEDIA_STATUS.resolved; - console.log("MediaStatus : ", mediaStatus); - switch (mediaStatus) { - case "FINISHED": - persistMediaPlayer(conv); - conv.scene.next.name = "home_members"; - - // void - break; - case "FAILED": - - // void - break; - case "PAUSED": - case "STOPPED": - persistMediaPlayer(conv); - // Acknowledge pause/stop - conv.add(new Media({ - mediaType: "MEDIA_STATUS_ACK", - })); - break; - default: - conv.add("media status incorrect"); - } - - console.log("MediaStatus END"); -}); - - -// catch(catcher: ExceptionHandler): ConversationV3App -// ExceptionHandler(conv: TConversation, error: Error): any -app.catch((conv, error) => { - conv.add("une erreur s'est produite"); - - console.log("ERROR"); - console.log(error); -}); - -// middleware(middleware: ConversationV3Middleware): ConversationV3App -// ConversationV3Middleware(conv: ConversationV3, framework: BuiltinFrameworkMetadata): void | ConversationV3 & TConversationPlugin | Promise | Promise -app.middleware(async (conv) => { - - console.log(conv.user.params); - console.log("=========="); - console.log(conv); - console.log("----------"); - - try { - - const id = conv.user.params.bearerToken; - ok(id, "bearerToken not defined"); - const docRef = db.collection("user-storage").doc(id); - const doc = await docRef.get(); - if (!doc.exists) { - console.log("No such document!"); - } else { - console.log("Document data:", doc.data()); - conv.user.params = doc.data(); - } - } catch (e) { - - console.error("Middleware critical error firebase firestore"); - console.error(e); - } - - // void -}); - -exports.ActionsOnGoogleFulfillment = functions.https.onRequest(app); diff --git a/webhooks/functions/package-lock.json b/webhooks/functions/package-lock.json index a1593347..fe3b4d44 100644 --- a/webhooks/functions/package-lock.json +++ b/webhooks/functions/package-lock.json @@ -1,4648 +1,233 @@ { "name": "functions", - "lockfileVersion": 2, "requires": true, - "packages": { - "": { - "name": "functions", - "dependencies": { - "@assistant/conversation": "^3.0.0", - "firebase-admin": "^9.11.1", - "firebase-functions": "^3.14.1", - "opds-fetcher-parser": "github:panaC/opds_fetcher_parser#efec695f50b386071ccf935396f0a8ea4750c9ae" - }, - "devDependencies": { - "eslint": "^7.6.0", - "eslint-config-google": "^0.14.0", - "firebase-functions-test": "^0.2.0" - }, - "engines": { - "node": ">14", - "npm": ">6" - } - }, - "node_modules/@assistant/conversation": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@assistant/conversation/-/conversation-3.8.1.tgz", - "integrity": "sha512-YEyQ33xD1VCkJP16GRdXiuG55Vklbds3yiPcGSSf0hj2dj7mprWybipEZvVA4qsgv/NHrLvXPBFTySJrUpV/7g==", - "dependencies": { - "@types/aws-lambda": "^0.0.33", - "@types/debug": "^0.0.30", - "@types/express": "^4.11.1", - "@types/node": "12.12.24", - "debug": "^3.1.0", - "google-auth-library": "^6.1.0" - }, - "engines": { - "node": ">=10.18.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.10.4" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.15.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", - "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", - "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.14.5", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", - "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^13.9.0", - "ignore": "^4.0.6", - "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/@eslint/eslintrc/node_modules/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@eslint/eslintrc/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/@firebase/app": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.7.1.tgz", - "integrity": "sha512-B4z6E1EPQc0mOjF35IPKdDRCFnT/fNQIHfM+v7F9obB7ItPhGILK3LxaQfuampSQpF6GG6TPFDbrWK6myXAq+g==", - "peer": true, - "dependencies": { - "@firebase/component": "0.5.7", - "@firebase/logger": "0.3.0", - "@firebase/util": "1.4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@firebase/app-compat": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.1.2.tgz", - "integrity": "sha512-kF1maoqA8bZqJ4v/ojVvA7kIyyXEPkJmL48otGrC8LIgdcen7xCx3JFDe0DGeQywg+qujvdkJz/TptFN1cvAgw==", - "peer": true, - "dependencies": { - "@firebase/app": "0.7.1", - "@firebase/component": "0.5.7", - "@firebase/logger": "0.3.0", - "@firebase/util": "1.4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@firebase/app-types": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.7.0.tgz", - "integrity": "sha512-6fbHQwDv2jp/v6bXhBw2eSRbNBpxHcd1NBF864UksSMVIqIyri9qpJB1Mn6sGZE+bnDsSQBC5j2TbMxYsJQkQg==" - }, - "node_modules/@firebase/auth-interop-types": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.1.6.tgz", - "integrity": "sha512-etIi92fW3CctsmR9e3sYM3Uqnoq861M0Id9mdOPF6PWIg38BXL5k4upCNBggGUpLIS0H1grMOvy/wn1xymwe2g==", - "peerDependencies": { - "@firebase/app-types": "0.x", - "@firebase/util": "1.x" - } - }, - "node_modules/@firebase/component": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.5.7.tgz", - "integrity": "sha512-CiAHUPXh2hn/lpzMShNmfAxHNQhKQwmQUJSYMPCjf2bCCt4Z2vLGpS+UWEuNFm9Zf8LNmkS+Z+U/s4Obi5carg==", - "dependencies": { - "@firebase/util": "1.4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@firebase/database": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/@firebase/database/-/database-0.12.1.tgz", - "integrity": "sha512-Ethk0hc476qnkSKNBa+8Yc7iM8AO69HYWsaD+QUC983FZtnuMyNLHtEeSUbLQYvyHo7cOjcc52slop14WmfZeQ==", - "dependencies": { - "@firebase/auth-interop-types": "0.1.6", - "@firebase/component": "0.5.7", - "@firebase/logger": "0.3.0", - "@firebase/util": "1.4.0", - "faye-websocket": "0.11.4", - "tslib": "^2.1.0" - } - }, - "node_modules/@firebase/database-compat": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-0.1.1.tgz", - "integrity": "sha512-K3DFWiw0YkLZtlfA9TOGPw6zVXKu5dQ1XqIGztUufFVRYW8IizReXVxzSSmJNR4Adr2LiU9j66Wenc6e5UfwaQ==", - "dependencies": { - "@firebase/component": "0.5.7", - "@firebase/database": "0.12.1", - "@firebase/database-types": "0.9.1", - "@firebase/logger": "0.3.0", - "@firebase/util": "1.4.0", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/database-compat/node_modules/@firebase/database-types": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-0.9.1.tgz", - "integrity": "sha512-RUixK/YrbpxbfdE+nYP0wMcEsz1xPTnafP0q3UlSS/+fW744OITKtR1J0cMRaXbvY7EH0wUVTNVkrtgxYY8IgQ==", - "dependencies": { - "@firebase/app-types": "0.7.0", - "@firebase/util": "1.4.0" - } - }, - "node_modules/@firebase/database-types": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-0.7.3.tgz", - "integrity": "sha512-dSOJmhKQ0nL8O4EQMRNGpSExWCXeHtH57gGg0BfNAdWcKhC8/4Y+qfKLfWXzyHvrSecpLmO0SmAi/iK2D5fp5A==", - "dependencies": { - "@firebase/app-types": "0.6.3" - } - }, - "node_modules/@firebase/database-types/node_modules/@firebase/app-types": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.6.3.tgz", - "integrity": "sha512-/M13DPPati7FQHEQ9Minjk1HGLm/4K4gs9bR4rzLCWJg64yGtVC0zNg9gDpkw9yc2cvol/mNFxqTtd4geGrwdw==" - }, - "node_modules/@firebase/logger": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.3.0.tgz", - "integrity": "sha512-7oQ+TctqekfgZImWkKuda50JZfkmAKMgh5qY4aR4pwRyqZXuJXN1H/BKkHvN1y0S4XWtF0f/wiCLKHhyi1ppPA==", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/@firebase/util": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.4.0.tgz", - "integrity": "sha512-Qn58d+DVi1nGn0bA9RV89zkz0zcbt6aUcRdyiuub/SuEvjKYstWmHcHwh1C0qmE1wPf9a3a+AuaRtduaGaRT7A==", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/@google-cloud/common": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-3.7.2.tgz", - "integrity": "sha512-5Q9f74IbZaY6xAwJSNFy5SrGwbm1j7mpv+6A/r+K2dymjsXBH5UauB0tziaMwWoVVaMq1IQnZF9lgtfqqvxcUg==", - "optional": true, - "dependencies": { - "@google-cloud/projectify": "^2.0.0", - "@google-cloud/promisify": "^2.0.0", - "arrify": "^2.0.1", - "duplexify": "^4.1.1", - "ent": "^2.2.0", - "extend": "^3.0.2", - "google-auth-library": "^7.0.2", - "retry-request": "^4.2.2", - "teeny-request": "^7.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@google-cloud/common/node_modules/google-auth-library": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-7.10.0.tgz", - "integrity": "sha512-ICsqaU+lxMHVlDUzMrfVIEqnARw2AwBiZ/2KnNM6BcTf9Nott+Af87DTIzmlnW865p3REUP2MVL0xkPC3a61aQ==", - "optional": true, - "dependencies": { - "arrify": "^2.0.0", - "base64-js": "^1.3.0", - "ecdsa-sig-formatter": "^1.0.11", - "fast-text-encoding": "^1.0.0", - "gaxios": "^4.0.0", - "gcp-metadata": "^4.2.0", - "gtoken": "^5.0.4", - "jws": "^4.0.0", - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@google-cloud/firestore": { - "version": "4.15.1", - "resolved": "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-4.15.1.tgz", - "integrity": "sha512-2PWsCkEF1W02QbghSeRsNdYKN1qavrHBP3m72gPDMHQSYrGULOaTi7fSJquQmAtc4iPVB2/x6h80rdLHTATQtA==", - "optional": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "functional-red-black-tree": "^1.0.1", - "google-gax": "^2.24.1", - "protobufjs": "^6.8.6" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@google-cloud/paginator": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-3.0.6.tgz", - "integrity": "sha512-XCTm/GfQIlc1ZxpNtTSs/mnZxC2cePNhxU3X8EzHXKIJ2JFncmJj2Fcd2IP+gbmZaSZnY0juFxbUCkIeuu/2eQ==", - "optional": true, - "dependencies": { - "arrify": "^2.0.0", - "extend": "^3.0.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@google-cloud/projectify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-2.1.1.tgz", - "integrity": "sha512-+rssMZHnlh0twl122gXY4/aCrk0G1acBqkHFfYddtsqpYXGxA29nj9V5V9SfC+GyOG00l650f6lG9KL+EpFEWQ==", - "optional": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/@google-cloud/promisify": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-2.0.4.tgz", - "integrity": "sha512-j8yRSSqswWi1QqUGKVEKOG03Q7qOoZP6/h2zN2YO+F5h2+DHU0bSrHCK9Y7lo2DI9fBd8qGAw795sf+3Jva4yA==", - "optional": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/@google-cloud/storage": { - "version": "5.14.4", - "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-5.14.4.tgz", - "integrity": "sha512-CjpGuk+ZZB7b3yMXPQrPb0TMIhXqbDzrGxngeSl2S2fItFp2pZDnYhvFuB0/8S73cA2T/4x3g1tl6PB1OuuaoQ==", - "optional": true, - "dependencies": { - "@google-cloud/common": "^3.7.0", - "@google-cloud/paginator": "^3.0.0", - "@google-cloud/promisify": "^2.0.0", - "arrify": "^2.0.0", - "async-retry": "^1.3.1", - "compressible": "^2.0.12", - "date-and-time": "^2.0.0", - "duplexify": "^4.0.0", - "extend": "^3.0.2", - "gcs-resumable-upload": "^3.3.0", - "get-stream": "^6.0.0", - "hash-stream-validation": "^0.2.2", - "mime": "^2.2.0", - "mime-types": "^2.0.8", - "p-limit": "^3.0.1", - "pumpify": "^2.0.0", - "snakeize": "^0.1.0", - "stream-events": "^1.0.1", - "xdg-basedir": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@grpc/grpc-js": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.3.7.tgz", - "integrity": "sha512-CKQVuwuSPh40tgOkR7c0ZisxYRiN05PcKPW72mQL5y++qd7CwBRoaJZvU5xfXnCJDFBmS3qZGQ71Frx6Ofo2XA==", - "optional": true, - "dependencies": { - "@types/node": ">=12.12.47" - }, - "engines": { - "node": "^8.13.0 || >=10.10.0" - } - }, - "node_modules/@grpc/grpc-js/node_modules/@types/node": { - "version": "16.10.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.10.2.tgz", - "integrity": "sha512-zCclL4/rx+W5SQTzFs9wyvvyCwoK9QtBpratqz2IYJ3O8Umrn0m3nsTv0wQBk9sRGpvUe9CwPDrQFB10f1FIjQ==", - "optional": true - }, - "node_modules/@grpc/proto-loader": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.6.5.tgz", - "integrity": "sha512-GZdzyVQI1Bln/kCzIYgTKu+rQJ5dno0gVrfmLe4jqQu7T2e7svSwJzpCBqVU5hhBSJP3peuPjOMWsj5GR61YmQ==", - "optional": true, - "dependencies": { - "@types/long": "^4.0.1", - "lodash.camelcase": "^4.3.0", - "long": "^4.0.0", - "protobufjs": "^6.10.0", - "yargs": "^16.1.1" - }, - "bin": { - "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", - "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^1.2.0", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/config-array/node_modules/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@humanwhocodes/config-array/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/@humanwhocodes/object-schema": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", - "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", - "dev": true - }, - "node_modules/@panva/asn1.js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@panva/asn1.js/-/asn1.js-1.0.0.tgz", - "integrity": "sha512-UdkG3mLEqXgnlKsWanWcgb6dOjUzJ+XC5f+aWw30qrtjxeNUSfKX1cd5FBzOaXQumoe9nIqeZUvrRJS03HCCtw==", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=", - "optional": true - }, - "node_modules/@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", - "optional": true - }, - "node_modules/@protobufjs/codegen": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", - "optional": true - }, - "node_modules/@protobufjs/eventemitter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=", - "optional": true - }, - "node_modules/@protobufjs/fetch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", - "optional": true, - "dependencies": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" - } - }, - "node_modules/@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=", - "optional": true - }, - "node_modules/@protobufjs/inquire": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=", - "optional": true - }, - "node_modules/@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=", - "optional": true - }, - "node_modules/@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=", - "optional": true - }, - "node_modules/@protobufjs/utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=", - "optional": true - }, - "node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "optional": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@types/aws-lambda": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-0.0.33.tgz", - "integrity": "sha512-p13MzAb/1ZJK1h0jDhRjdFqlRHC44HAOS7qYuVpn7NnFDv8UdNbRjExfhK69syvI9IoIR4NN4dRGjpVDsN6tEQ==" - }, - "node_modules/@types/body-parser": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.1.tgz", - "integrity": "sha512-a6bTJ21vFOGIkwM0kzh9Yr89ziVxq4vYH2fQ6N8AeipEzai/cFK6aGMArIkUeIdRIgpwQa+2bXiLuUJCpSf2Cg==", - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/cors": { - "version": "2.8.12", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz", - "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==" - }, - "node_modules/@types/debug": { - "version": "0.0.30", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-0.0.30.tgz", - "integrity": "sha512-orGL5LXERPYsLov6CWs3Fh6203+dXzJkR7OnddIr2514Hsecwc8xRpzCapshBbKFImCsvS/mk6+FWiN5LyZJAQ==" - }, - "node_modules/@types/express": { - "version": "4.17.13", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", - "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.18", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "node_modules/@types/express-jwt": { - "version": "0.0.42", - "resolved": "https://registry.npmjs.org/@types/express-jwt/-/express-jwt-0.0.42.tgz", - "integrity": "sha512-WszgUddvM1t5dPpJ3LhWNH8kfNN8GPIBrAGxgIYXVCEGx6Bx4A036aAuf/r5WH9DIEdlmp7gHOYvSM6U87B0ag==", - "dependencies": { - "@types/express": "*", - "@types/express-unless": "*" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "4.17.24", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.24.tgz", - "integrity": "sha512-3UJuW+Qxhzwjq3xhwXm2onQcFHn76frIYVbTu+kn24LFxI+dEhdfISDFovPB8VpEgW8oQCTpRuCe+0zJxB7NEA==", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*" - } - }, - "node_modules/@types/express-unless": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@types/express-unless/-/express-unless-0.5.2.tgz", - "integrity": "sha512-Q74UyYRX/zIgl1HSp9tUX2PlG8glkVm+59r7aK4KGKzC5jqKIOX6rrVLRQrzpZUQ84VukHtRoeAuon2nIssHPQ==", - "dependencies": { - "@types/express": "*" - } - }, - "node_modules/@types/lodash": { - "version": "4.14.175", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.175.tgz", - "integrity": "sha512-XmdEOrKQ8a1Y/yxQFOMbC47G/V2VDO1GvMRnl4O75M4GW/abC5tnfzadQYkqEveqRM1dEJGFFegfPNA2vvx2iw==", - "dev": true - }, - "node_modules/@types/long": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", - "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==", - "optional": true - }, - "node_modules/@types/mime": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", - "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" - }, - "node_modules/@types/node": { - "version": "12.12.24", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.24.tgz", - "integrity": "sha512-1Ciqv9pqwVtW6FsIUKSZNB82E5Cu1I2bBTj1xuIHXLe/1zYLl3956Nbhg2MzSYHVfl9/rmanjbQIb7LibfCnug==" - }, - "node_modules/@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" - }, - "node_modules/@types/range-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" - }, - "node_modules/@types/serve-static": { - "version": "1.13.10", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", - "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "node_modules/@types/xmldom": { - "version": "0.1.31", - "resolved": "https://registry.npmjs.org/@types/xmldom/-/xmldom-0.1.31.tgz", - "integrity": "sha512-bVy7s0nvaR5D1mT1a8ZkByHWNOGb6Vn4yi5TWhEdmyKlAG+08SA7Md6+jH+tYmMLueAwNeWvHHpeKrr6S4c4BA==" - }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, - "node_modules/accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "dependencies": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/agent-base/node_modules/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/agent-base/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==" - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-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==", - "devOptional": 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==", - "devOptional": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" - }, - "node_modules/arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", - "engines": { - "node": ">=8" - } - }, - "node_modules/asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/async-retry": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", - "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", - "optional": true, - "dependencies": { - "retry": "0.13.1" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "engines": { - "node": "*" - } - }, - "node_modules/aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" - }, - "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==" - }, - "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==", - "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/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dependencies": { - "tweetnacl": "^0.14.3" - } - }, - "node_modules/big-integer": { - "version": "1.6.49", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.49.tgz", - "integrity": "sha512-KJ7VhqH+f/BOt9a3yMwJNmcZjG53ijWMTjSAGMveQWyLwqIiwkjNP5PFgDob3Snnx86SjDj6I89fIbv0dkQeNw==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/bignumber.js": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz", - "integrity": "sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==", - "engines": { - "node": "*" - } - }, - "node_modules/binary": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", - "integrity": "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=", - "dependencies": { - "buffers": "~0.1.1", - "chainsaw": "~0.1.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dependencies": { - "file-uri-to-path": "1.0.0" - } - }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" - }, - "node_modules/body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", - "dependencies": { - "bytes": "3.1.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "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==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", - "engines": { - "node": "*" - } - }, - "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": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" - }, - "node_modules/buffer-indexof-polyfill": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz", - "integrity": "sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/buffers": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", - "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=", - "engines": { - "node": ">=0.2.0" - } - }, - "node_modules/bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" - }, - "node_modules/chainsaw": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", - "integrity": "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=", - "dependencies": { - "traverse": ">=0.3.0 <0.4" - }, - "engines": { - "node": "*" - } - }, - "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, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "optional": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "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==", - "devOptional": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "devOptional": true - }, - "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/compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "optional": true, - "dependencies": { - "mime-db": ">= 1.43.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "node_modules/configstore": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", - "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", - "optional": true, - "dependencies": { - "dot-prop": "^5.2.0", - "graceful-fs": "^4.1.2", - "make-dir": "^3.0.0", - "unique-string": "^2.0.0", - "write-file-atomic": "^3.0.0", - "xdg-basedir": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", - "dependencies": { - "safe-buffer": "5.1.2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" - }, - "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "node_modules/cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "dependencies": { - "object-assign": "^4", - "vary": "^1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/date-and-time": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/date-and-time/-/date-and-time-2.0.0.tgz", - "integrity": "sha512-HJSzj25iPm8E01nt+rSmCIlwjsmjvKfUivG/kXBglpymcHF1FolWAqWwTEV4FvN1Lx5UjPf0J1W4H8yQsVBfFg==", - "optional": true - }, - "node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" - }, - "node_modules/dicer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.3.0.tgz", - "integrity": "sha512-MdceRRWqltEG2dZqO769g27N/3PXfcKl04VhYnBlo2YhH7zPi88VebsjTKclaOyiuMaGU72hTfw3VkUitGcVCA==", - "dependencies": { - "streamsearch": "0.1.2" - }, - "engines": { - "node": ">=4.5.0" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "optional": true, - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", - "dependencies": { - "readable-stream": "^2.0.2" - } - }, - "node_modules/duplexer2/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==", - "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/duplexer2/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==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/duplexify": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz", - "integrity": "sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==", - "optional": true, - "dependencies": { - "end-of-stream": "^1.4.1", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1", - "stream-shift": "^1.0.0" - } - }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.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/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" - }, - "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==", - "devOptional": true - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "optional": true, - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, - "dependencies": { - "ansi-colors": "^4.1.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/ent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", - "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", - "optional": true - }, - "node_modules/err-code": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-1.1.2.tgz", - "integrity": "sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA=" - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "optional": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" - }, - "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" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "7.32.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", - "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "7.12.11", - "@eslint/eslintrc": "^0.4.3", - "@humanwhocodes/config-array": "^0.5.0", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "enquirer": "^2.3.5", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.1", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.1.2", - "globals": "^13.6.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", - "strip-json-comments": "^3.1.0", - "table": "^6.0.9", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-config-google": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/eslint-config-google/-/eslint-config-google-0.14.0.tgz", - "integrity": "sha512-WsbX4WbjuMvTdeVL6+J3rK1RGhCTqjsFjX7UMSMgZiyxxaNLkoJENbrGExzERFeoTpGw3F3FypTiWAP9ZXzkEw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - }, - "peerDependencies": { - "eslint": ">=5.16.0" - } - }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint/node_modules/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/eslint/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/espree": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", - "dev": true, - "dependencies": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", - "dependencies": { - "accepts": "~1.3.7", - "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", - "content-type": "~1.0.4", - "cookie": "0.4.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.1.2", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "~1.5.0", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "engines": [ - "node >=0.6.0" - ] - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "node_modules/fast-text-encoding": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.3.tgz", - "integrity": "sha512-dtm4QZH9nZtcDt8qJiOH9fcQd1NAgi+K1O2DbE6GG1PPCK/BWfOH3idCTRQ4ImXRUOyopDEgDEnVEE7Y/2Wrig==" - }, - "node_modules/faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "dependencies": { - "websocket-driver": ">=0.5.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", - "dependencies": { - "pend": "~1.2.0" - } - }, - "node_modules/fetch-cookie": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fetch-cookie/-/fetch-cookie-1.0.0.tgz", - "integrity": "sha512-SWcAhkDe4yVBFtwRqJNmot6k1XjjzI7tw3aRHepxXrK6FQp6obBhqcnsdm2aNUzrtE71607crNAYodtKMq3TjA==", - "dependencies": { - "tough-cookie": "^2.3.3 || ^3.0.1 || ^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/file-js": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/file-js/-/file-js-0.3.0.tgz", - "integrity": "sha1-+rRr94I0bJKUSZ8fDSrQfYOPJdE=", - "dependencies": { - "bluebird": "^3.4.7", - "minimatch": "^3.0.3", - "proper-lockfile": "^1.2.0" - } - }, - "node_modules/file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" - }, - "node_modules/filehound": { - "version": "1.17.5", - "resolved": "https://registry.npmjs.org/filehound/-/filehound-1.17.5.tgz", - "integrity": "sha512-BsNTM3xoscYKgv0quE9RWPVhu5ZTb7BNu3H/IbZQbOfQeA7ZyOV/hIYfo60H3Jhorw/J5vbg59KHS1UCHt4FAw==", - "dependencies": { - "bluebird": "^3.7.2", - "file-js": "0.3.0", - "lodash": "^4.17.21", - "minimatch": "^3.0.4", - "moment": "^2.29.1", - "unit-compare": "^1.0.1" - } - }, - "node_modules/finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "node_modules/firebase-admin": { - "version": "9.12.0", - "resolved": "https://registry.npmjs.org/firebase-admin/-/firebase-admin-9.12.0.tgz", - "integrity": "sha512-AtA7OH5RbIFGoc0gZOQgaYC6cdjdhZv4w3XgWoupkPKO1HY+0GzixOuXDa75kFeoVyhIyo4PkLg/GAC1dC1P6w==", - "dependencies": { - "@firebase/database-compat": "^0.1.1", - "@firebase/database-types": "^0.7.2", - "@types/node": ">=12.12.47", - "dicer": "^0.3.0", - "jsonwebtoken": "^8.5.1", - "jwks-rsa": "^2.0.2", - "node-forge": "^0.10.0" - }, - "engines": { - "node": ">=10.13.0" - }, - "optionalDependencies": { - "@google-cloud/firestore": "^4.5.0", - "@google-cloud/storage": "^5.3.0" - } - }, - "node_modules/firebase-admin/node_modules/@types/node": { - "version": "16.10.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.10.2.tgz", - "integrity": "sha512-zCclL4/rx+W5SQTzFs9wyvvyCwoK9QtBpratqz2IYJ3O8Umrn0m3nsTv0wQBk9sRGpvUe9CwPDrQFB10f1FIjQ==" - }, - "node_modules/firebase-functions": { - "version": "3.15.7", - "resolved": "https://registry.npmjs.org/firebase-functions/-/firebase-functions-3.15.7.tgz", - "integrity": "sha512-ZD7r8eoWWebgs+mTqfH8NLUT2C0f7/cyAvIA1RSUdBVQZN7MBBt3oSlN/rL3e+m6tdlJz6YbQ3hrOKOGjOVYvQ==", - "dependencies": { - "@types/cors": "^2.8.5", - "@types/express": "4.17.3", - "cors": "^2.8.5", - "express": "^4.17.1", - "lodash": "^4.17.14" - }, - "engines": { - "node": "^8.13.0 || >=10.10.0" - }, - "peerDependencies": { - "firebase-admin": "^8.0.0 || ^9.0.0" - } - }, - "node_modules/firebase-functions-test": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/firebase-functions-test/-/firebase-functions-test-0.2.3.tgz", - "integrity": "sha512-zYX0QTm53wCazuej7O0xqbHl90r/v1PTXt/hwa0jo1YF8nDM+iBKnLDlkIoW66MDd0R6aGg4BvKzTTdJpvigUA==", - "dev": true, - "dependencies": { - "@types/lodash": "^4.14.104", - "lodash": "^4.17.5" - }, - "engines": { - "node": ">=8.0.0" - }, - "peerDependencies": { - "firebase-admin": ">=6.0.0", - "firebase-functions": ">=2.0.0" - } - }, - "node_modules/firebase-functions/node_modules/@types/express": { - "version": "4.17.3", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.3.tgz", - "integrity": "sha512-I8cGRJj3pyOLs/HndoP+25vOqhqWkAZsWMEmq1qXy/b/M3ppufecUwaK2/TVDVxcV61/iSdhykUjQQ2DLSrTdg==", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "*", - "@types/serve-static": "*" - } - }, - "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", - "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==", - "dev": true - }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "engines": { - "node": "*" - } - }, - "node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "node_modules/fstream": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", - "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", - "dependencies": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" - }, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/fstream/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "devOptional": true - }, - "node_modules/gaxios": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-4.3.2.tgz", - "integrity": "sha512-T+ap6GM6UZ0c4E6yb1y/hy2UB6hTrqhglp3XfmU9qbLCGRYhLVV5aRPpC4EmoG8N8zOnkYCgoBz+ScvGAARY6Q==", - "dependencies": { - "abort-controller": "^3.0.0", - "extend": "^3.0.2", - "https-proxy-agent": "^5.0.0", - "is-stream": "^2.0.0", - "node-fetch": "^2.6.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/gcp-metadata": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-4.3.1.tgz", - "integrity": "sha512-x850LS5N7V1F3UcV7PoupzGsyD6iVwTVvsh3tbXfkctZnBnjW5yu5z1/3k3SehF7TyoTIe78rJs02GMMy+LF+A==", - "dependencies": { - "gaxios": "^4.0.0", - "json-bigint": "^1.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/gcs-resumable-upload": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/gcs-resumable-upload/-/gcs-resumable-upload-3.3.1.tgz", - "integrity": "sha512-WyC0i4VkslIdrdmeM5PNuGzANALLXTG5RoHb08OE30gYT+FEvCDPiA8KOjV2s1wOu9ngEW4+IuzBjtP/ni7UdQ==", - "optional": true, - "dependencies": { - "abort-controller": "^3.0.0", - "configstore": "^5.0.0", - "extend": "^3.0.2", - "gaxios": "^4.0.0", - "google-auth-library": "^7.0.0", - "pumpify": "^2.0.0", - "stream-events": "^1.0.4" - }, - "bin": { - "gcs-upload": "build/src/cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/gcs-resumable-upload/node_modules/google-auth-library": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-7.10.0.tgz", - "integrity": "sha512-ICsqaU+lxMHVlDUzMrfVIEqnARw2AwBiZ/2KnNM6BcTf9Nott+Af87DTIzmlnW865p3REUP2MVL0xkPC3a61aQ==", - "optional": true, - "dependencies": { - "arrify": "^2.0.0", - "base64-js": "^1.3.0", - "ecdsa-sig-formatter": "^1.0.11", - "fast-text-encoding": "^1.0.0", - "gaxios": "^4.0.0", - "gcp-metadata": "^4.2.0", - "gtoken": "^5.0.4", - "jws": "^4.0.0", - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "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==", - "optional": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "optional": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dependencies": { - "assert-plus": "^1.0.0" - } - }, - "node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "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", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/globals": { - "version": "13.11.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz", - "integrity": "sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/google-auth-library": { - "version": "6.1.6", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-6.1.6.tgz", - "integrity": "sha512-Q+ZjUEvLQj/lrVHF/IQwRo6p3s8Nc44Zk/DALsN+ac3T4HY/g/3rrufkgtl+nZ1TW7DNAw5cTChdVp4apUXVgQ==", - "dependencies": { - "arrify": "^2.0.0", - "base64-js": "^1.3.0", - "ecdsa-sig-formatter": "^1.0.11", - "fast-text-encoding": "^1.0.0", - "gaxios": "^4.0.0", - "gcp-metadata": "^4.2.0", - "gtoken": "^5.0.4", - "jws": "^4.0.0", - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/google-gax": { - "version": "2.26.0", - "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-2.26.0.tgz", - "integrity": "sha512-D/8fjTydl9p3ejxuW3ZVHVZqKzz6zYaz5MMEucijsJonJ4RHqWAzHFKZMKSc7yyUiTEBGqG7nU2S8NUPUUYDEA==", - "optional": true, - "dependencies": { - "@grpc/grpc-js": "~1.3.0", - "@grpc/proto-loader": "^0.6.1", - "@types/long": "^4.0.0", - "abort-controller": "^3.0.0", - "duplexify": "^4.0.0", - "fast-text-encoding": "^1.0.3", - "google-auth-library": "^7.6.1", - "is-stream-ended": "^0.1.4", - "node-fetch": "^2.6.1", - "object-hash": "^2.1.1", - "proto3-json-serializer": "^0.1.1", - "protobufjs": "6.11.2", - "retry-request": "^4.0.0" - }, - "bin": { - "compileProtos": "build/tools/compileProtos.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/google-gax/node_modules/google-auth-library": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-7.10.0.tgz", - "integrity": "sha512-ICsqaU+lxMHVlDUzMrfVIEqnARw2AwBiZ/2KnNM6BcTf9Nott+Af87DTIzmlnW865p3REUP2MVL0xkPC3a61aQ==", - "optional": true, - "dependencies": { - "arrify": "^2.0.0", - "base64-js": "^1.3.0", - "ecdsa-sig-formatter": "^1.0.11", - "fast-text-encoding": "^1.0.0", - "gaxios": "^4.0.0", - "gcp-metadata": "^4.2.0", - "gtoken": "^5.0.4", - "jws": "^4.0.0", - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/google-p12-pem": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-3.1.2.tgz", - "integrity": "sha512-tjf3IQIt7tWCDsa0ofDQ1qqSCNzahXDxdAGJDbruWqu3eCg5CKLYKN+hi0s6lfvzYZ1GDVr+oDF9OOWlDSdf0A==", - "dependencies": { - "node-forge": "^0.10.0" - }, - "bin": { - "gp12-pem": "build/src/bin/gp12-pem.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", - "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==" - }, - "node_modules/gtoken": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-5.3.1.tgz", - "integrity": "sha512-yqOREjzLHcbzz1UrQoxhBtpk8KjrVhuqPE7od1K2uhyxG2BHjKZetlbLw/SPZak/QqTIQW+addS+EcjqQsZbwQ==", - "dependencies": { - "gaxios": "^4.0.0", - "google-p12-pem": "^3.0.3", - "jws": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "engines": { - "node": ">=4" - } - }, - "node_modules/har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "deprecated": "this library is no longer supported", - "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "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, - "engines": { - "node": ">=8" - } - }, - "node_modules/hash-stream-validation": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/hash-stream-validation/-/hash-stream-validation-0.2.4.tgz", - "integrity": "sha512-Gjzu0Xn7IagXVkSu9cSFuK1fqzwtLwFhNhVL8IFJijRNMgUttFbBSIAzKuSIrsFMO1+g1RlsoN49zPIbwPDMGQ==", - "optional": true - }, - "node_modules/http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/http-errors/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "node_modules/http-parser-js": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz", - "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==" - }, - "node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "optional": true, - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/http-proxy-agent/node_modules/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "optional": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/http-proxy-agent/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==", - "optional": true - }, - "node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/https-proxy-agent/node_modules/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/https-proxy-agent/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==" - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/image-size": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.0.0.tgz", - "integrity": "sha512-JLJ6OwBfO1KcA+TvJT+v8gbE6iWbj24LyDNFgFEN0lzegn6cC6a/p3NIDaepMsJjQjlUWqIC7wJv8lBFxPNjcw==", - "dependencies": { - "queue": "6.0.2" - }, - "bin": { - "image-size": "bin/image-size.js" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "devOptional": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "devOptional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-stream-ended": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-stream-ended/-/is-stream-ended-0.1.4.tgz", - "integrity": "sha512-xj0XPvmr7bQFTvirqnFr50o0hQIh6ZItDqloxt5aJrR4NQsYeSsyFQERYGCAzfindAcnKjINnwEEgLx4IqVzQw==", - "optional": true - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" - }, - "node_modules/jose": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/jose/-/jose-2.0.5.tgz", - "integrity": "sha512-BAiDNeDKTMgk4tvD0BbxJ8xHEHBZgpeRZ1zGPPsitSyMgjoMWiLGYAE7H7NpP5h0lPppQajQs871E8NHUrzVPA==", - "dependencies": { - "@panva/asn1.js": "^1.0.0" - }, - "engines": { - "node": ">=10.13.0 < 13 || >=13.7.0" - }, - "funding": { - "url": "https://github.com/sponsors/panva" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" - }, - "node_modules/json-bigint": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", - "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", - "dependencies": { - "bignumber.js": "^9.0.0" - } - }, - "node_modules/json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" - }, - "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/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/jsonwebtoken/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/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/jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "node_modules/jwa": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", - "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", - "dependencies": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jwks-rsa": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/jwks-rsa/-/jwks-rsa-2.0.4.tgz", - "integrity": "sha512-iJqVCECYZZ+3oPmY1qXv3Fq+3ywDtuNEVBvG41pPlaR0zyGxa12nC0beAOBBUhETJmc05puS50mRQN4NkCGhmg==", - "dependencies": { - "@types/express-jwt": "0.0.42", - "debug": "^4.3.2", - "jose": "^2.0.5", - "limiter": "^1.1.5", - "lru-memoizer": "^2.1.4" - }, - "engines": { - "node": ">=10 < 13 || >=14" - } - }, - "node_modules/jwks-rsa/node_modules/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/jwks-rsa/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==" - }, - "node_modules/jws": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", - "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", - "dependencies": { - "jwa": "^2.0.0", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/limiter": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", - "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==" - }, - "node_modules/listenercount": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", - "integrity": "sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc=" - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=", - "optional": true - }, - "node_modules/lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" - }, - "node_modules/lodash.includes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", - "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" - }, - "node_modules/lodash.isboolean": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" - }, - "node_modules/lodash.isinteger": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", - "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=" - }, - "node_modules/lodash.isnumber": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", - "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=" - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" - }, - "node_modules/lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/lodash.once": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" - }, - "node_modules/lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", - "dev": true - }, - "node_modules/long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", - "optional": true - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/lru-memoizer": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/lru-memoizer/-/lru-memoizer-2.1.4.tgz", - "integrity": "sha512-IXAq50s4qwrOBrXJklY+KhgZF+5y98PDaNo0gi/v2KQBFLyWr+JyFvijZXkGKjQj/h9c0OwoE+JZbwUXce76hQ==", - "dependencies": { - "lodash.clonedeep": "^4.5.0", - "lru-cache": "~4.0.0" - } - }, - "node_modules/lru-memoizer/node_modules/lru-cache": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.0.2.tgz", - "integrity": "sha1-HRdnnAac2l0ECZGgnbwsDbN35V4=", - "dependencies": { - "pseudomap": "^1.0.1", - "yallist": "^2.0.0" - } - }, - "node_modules/lru-memoizer/node_modules/yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" - }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "optional": true, - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "optional": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", - "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", - "optional": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/mime-db": { - "version": "1.50.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.50.0.tgz", - "integrity": "sha512-9tMZCDlYHqeERXEHO9f/hKfNXhre5dK2eE/krIvUjZbS2KPcqGDfNShIWS1uW9XOTKQKqK6qbeOci18rbfW77A==", - "optional": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.32", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz", - "integrity": "sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==", - "dependencies": { - "mime-db": "1.49.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types/node_modules/mime-db": { - "version": "1.49.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz", - "integrity": "sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" - }, - "node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/moment": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", - "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==", - "engines": { - "node": "*" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/nanoid": { - "version": "3.1.28", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.28.tgz", - "integrity": "sha512-gSu9VZ2HtmoKYe/lmyPFES5nknFrHa+/DT9muUFWFMi6Jh9E1I7bkvlQ8xxf1Kos9pi9o8lBnIOkatMhKX/YUw==", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "node_modules/negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/node-fetch": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.5.tgz", - "integrity": "sha512-mmlIVHJEu5rnIxgEgez6b9GgWXbkZj5YZ7fx+2r94a2E+Uirsp6HsPTPlomfdHtpt/B0cdKviwkoaM6pyvUOpQ==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - } - }, - "node_modules/node-forge": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", - "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/node-stream-zip": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/node-stream-zip/-/node-stream-zip-1.15.0.tgz", - "integrity": "sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw==", - "engines": { - "node": ">=0.12.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/antelle" - } - }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "engines": { - "node": "*" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-hash": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", - "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", - "optional": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/opds-fetcher-parser": { - "version": "0.1.0", - "resolved": "git+ssh://git@github.com/panaC/opds_fetcher_parser.git#efec695f50b386071ccf935396f0a8ea4750c9ae", - "integrity": "sha512-vhOHEBu7Bs9y0XHgGo8u6ntgrjAtclGZE61cP11F1HBwBnF8s7w+Vlagc7MJq2xMy0RuMN45lzVoco8Rl9petQ==", - "license": "Apache-2.0", - "dependencies": { - "moment": "^2.29.1", - "nanoid": "^3.1.23", - "r2-lcp-js": "^1.0.30", - "r2-opds-js": "^1.0.35", - "r2-shared-js": "^1.0.51", - "ts-fetch": "github:panaC/ts_fetch#7f585951111aa0e9cb7fe7f99bdd927a9261cd7b" - } - }, - "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "optional": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "engines": { - "node": ">= 0.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": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" - }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" - }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "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==" - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/proper-lockfile": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-1.2.0.tgz", - "integrity": "sha1-zv9d2J0+XxD7deHo52vHWAGlnDQ=", - "dependencies": { - "err-code": "^1.0.0", - "extend": "^3.0.0", - "graceful-fs": "^4.1.2", - "retry": "^0.10.0" - } - }, - "node_modules/proper-lockfile/node_modules/retry": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz", - "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=", - "engines": { - "node": "*" - } - }, - "node_modules/proto3-json-serializer": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/proto3-json-serializer/-/proto3-json-serializer-0.1.4.tgz", - "integrity": "sha512-bFzdsKU/zaTobWrRxRniMZIzzcgKYlmBWL1gAcTXZ2M7TQTGPI0JoYYs6bN7tpWj59ZCfwg7Ii/A2e8BbQGYnQ==", - "optional": true - }, - "node_modules/protobufjs": { - "version": "6.11.2", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.2.tgz", - "integrity": "sha512-4BQJoPooKJl2G9j3XftkIXjoC9C0Av2NOrWmbLWT1vH32GcSUHjM0Arra6UfTsVyfMAuFzaLucXn1sadxJydAw==", - "hasInstallScript": true, - "optional": true, - "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/long": "^4.0.1", - "@types/node": ">=13.7.0", - "long": "^4.0.0" - }, - "bin": { - "pbjs": "bin/pbjs", - "pbts": "bin/pbts" - } - }, - "node_modules/protobufjs/node_modules/@types/node": { - "version": "16.10.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.10.2.tgz", - "integrity": "sha512-zCclL4/rx+W5SQTzFs9wyvvyCwoK9QtBpratqz2IYJ3O8Umrn0m3nsTv0wQBk9sRGpvUe9CwPDrQFB10f1FIjQ==", - "optional": true - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" - }, - "node_modules/psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" - }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "optional": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/pumpify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-2.0.1.tgz", - "integrity": "sha512-m7KOje7jZxrmutanlkS1daj1dS6z6BgslzOXmcSEpIlCxM3VJH7lG5QLeck/6hgF6F4crFf01UtQmNsJfweTAw==", - "optional": true, - "dependencies": { - "duplexify": "^4.1.1", - "inherits": "^2.0.3", - "pump": "^3.0.0" - } - }, - "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "engines": { - "node": ">=6" - } - }, - "node_modules/qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/queue": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", - "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", - "dependencies": { - "inherits": "~2.0.3" - } - }, - "node_modules/r2-lcp-js": { - "version": "1.0.32", - "resolved": "https://registry.npmjs.org/r2-lcp-js/-/r2-lcp-js-1.0.32.tgz", - "integrity": "sha512-cNpOc9ZWatCe7WPMQxVfA7p1xtynrU7eWZ/Cw41+zkKRUsOU4b+CTtwq1APMut+dMhnEHNIjDVUqxGBnFUa7dw==", - "dependencies": { - "bindings": "^1.5.0", - "debug": "^4.3.2", - "moment": "^2.29.1", - "r2-utils-js": "^1.0.26", - "request": "^2.88.2", - "request-promise-native": "^1.0.9", - "ta-json-x": "^2.5.3", - "tslib": "^2.3.1", - "urijs": "^1.19.7" - }, - "engines": { - "node": ">=12", - "npm": ">=6", - "yarn": ">=1.0" - } - }, - "node_modules/r2-lcp-js/node_modules/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/r2-lcp-js/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==" - }, - "node_modules/r2-opds-js": { - "version": "1.0.36", - "resolved": "https://registry.npmjs.org/r2-opds-js/-/r2-opds-js-1.0.36.tgz", - "integrity": "sha512-JQB92qGzJWTO1l8NkZ3AhsQXm197Ny2pnU2NtakjWPnASnw60DJxs14yxXHKjTDZZzLI+XzsWYJJ6BKitIN55w==", - "dependencies": { - "debug": "^4.3.2", - "r2-lcp-js": "^1.0.31", - "r2-shared-js": "^1.0.52", - "r2-utils-js": "^1.0.26", - "ta-json-x": "^2.5.3", - "tslib": "^2.3.1", - "xmldom": "^0.6.0" - }, - "engines": { - "node": ">=6", - "npm": ">=3", - "yarn": ">=1.0" - } - }, - "node_modules/r2-opds-js/node_modules/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/r2-opds-js/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==" - }, - "node_modules/r2-shared-js": { - "version": "1.0.52", - "resolved": "https://registry.npmjs.org/r2-shared-js/-/r2-shared-js-1.0.52.tgz", - "integrity": "sha512-GYPdqK7FPUSczC68ZHqz3gFL98VZU/UCQtlgknxvJdDrM7+2Pz805X6iMUMzr1mkL203/Wl8mm+O5BsjQnc8tw==", - "dependencies": { - "debug": "^4.3.2", - "fast-deep-equal": "^3.1.3", - "image-size": "^1.0.0", - "mime-types": "^2.1.32", - "moment": "^2.29.1", - "r2-lcp-js": "^1.0.31", - "r2-utils-js": "^1.0.26", - "slugify": "^1.6.0", - "ta-json-x": "^2.5.3", - "tslib": "^2.3.1", - "xmldom": "^0.6.0", - "xpath": "^0.0.32", - "yazl": "^2.5.1" - }, - "bin": { - "r2-shared-js-cli": "dist/es6-es2015/src/_utils/cli.js" - }, - "engines": { - "node": ">=6", - "npm": ">=3", - "yarn": ">=1.0" - } - }, - "node_modules/r2-shared-js/node_modules/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/r2-shared-js/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==" - }, - "node_modules/r2-utils-js": { - "version": "1.0.26", - "resolved": "https://registry.npmjs.org/r2-utils-js/-/r2-utils-js-1.0.26.tgz", - "integrity": "sha512-8t9JIafLP1IXtpCcEqRxSlLtHrGPai3qidAq3Xe3sQTCNv29WZtHPglGSZX95BPPFDhIQfM9CiVvkbgReFFZ4Q==", - "dependencies": { - "@types/xmldom": "^0.1.31", - "debug": "^4.3.2", - "filehound": "^1.17.4", - "node-stream-zip": "^1.14.0", - "reflect-metadata": "^0.1.13", - "request": "^2.88.2", - "request-promise-native": "^1.0.9", - "ta-json-x": "^2.5.3", - "tslib": "^2.3.1", - "unzipper": "^0.10.11", - "xpath": "^0.0.32", - "yauzl": "^2.10.0", - "yazl": "^2.5.1" - }, - "engines": { - "node": ">=6", - "npm": ">=3", - "yarn": ">=1.0" - } - }, - "node_modules/r2-utils-js/node_modules/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/r2-utils-js/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==" - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", - "dependencies": { - "bytes": "3.1.0", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "optional": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/reflect-metadata": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", - "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" - }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/request-promise-core": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", - "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", - "dependencies": { - "lodash": "^4.17.19" - }, - "engines": { - "node": ">=0.10.0" - }, - "peerDependencies": { - "request": "^2.34" - } - }, - "node_modules/request-promise-native": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", - "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", - "deprecated": "request-promise-native has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142", - "dependencies": { - "request-promise-core": "1.1.4", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" - }, - "engines": { - "node": ">=0.12.0" - }, - "peerDependencies": { - "request": "^2.34" - } - }, - "node_modules/request/node_modules/qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "optional": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/retry-request": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-4.2.2.tgz", - "integrity": "sha512-xA93uxUD/rogV7BV59agW/JHPGXeREMWiZc9jhcwY4YdZ7QOtC7qbomYg0n4wyk2lJhggjvKvhNX8wln/Aldhg==", - "optional": true, - "dependencies": { - "debug": "^4.1.1", - "extend": "^3.0.2" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/retry-request/node_modules/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "optional": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/retry-request/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==", - "optional": true - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", - "dependencies": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.7.2", - "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", - "range-parser": "~1.2.1", - "statuses": "~1.5.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "node_modules/send/node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" - }, - "node_modules/serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" - }, - "node_modules/setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/signal-exit": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.5.tgz", - "integrity": "sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ==", - "optional": true - }, - "node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/slugify": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.0.tgz", - "integrity": "sha512-FkMq+MQc5hzYgM86nLuHI98Acwi3p4wX+a5BO9Hhw4JdK4L7WueIiZ4tXEobImPqBz2sVcV0+Mu3GRB30IGang==", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/snakeize": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/snakeize/-/snakeize-0.1.0.tgz", - "integrity": "sha1-EMCI2LWOsHazIpu1oE4jLOEmQi0=", - "optional": true - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "node_modules/sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/stealthy-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stream-events": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz", - "integrity": "sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==", - "optional": true, - "dependencies": { - "stubs": "^3.0.0" - } - }, - "node_modules/stream-shift": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", - "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", - "optional": true - }, - "node_modules/streamsearch": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", - "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "optional": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string_decoder/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" - } - ], - "optional": true - }, - "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==", - "devOptional": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "devOptional": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=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==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/stubs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz", - "integrity": "sha1-6NK6H6nJBXAwPAMLaQD31fiavls=", - "optional": true - }, - "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, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ta-json-x": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/ta-json-x/-/ta-json-x-2.5.3.tgz", - "integrity": "sha512-zhn9oZJVUOj73/WmLFoLszp8+zl8RZAU995dTQWhZK/2eSvFiz2eZ3nN6Kk7B6lRg2GUWnW1v3S3IUhFNbwYQA==", - "dependencies": { - "reflect-metadata": "^0.1.13" - } - }, - "node_modules/table": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz", - "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==", - "dev": true, - "dependencies": { - "ajv": "^8.0.1", - "lodash.clonedeep": "^4.5.0", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/table/node_modules/ajv": { - "version": "8.6.3", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.3.tgz", - "integrity": "sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/table/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/teeny-request": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-7.1.3.tgz", - "integrity": "sha512-Ew3aoFzgQEatLA5OBIjdr1DWJUaC1xardG+qbPPo5k/y/3fMwXLxpjh5UB5dVfElktLaQbbMs80chkz53ByvSg==", - "optional": true, - "dependencies": { - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "node-fetch": "^2.6.1", - "stream-events": "^1.0.5", - "uuid": "^8.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/teeny-request/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==", - "optional": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "node_modules/toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" - }, - "node_modules/traverse": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", - "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=", - "engines": { - "node": "*" - } - }, - "node_modules/ts-fetch": { - "version": "0.1.0", - "resolved": "git+ssh://git@github.com/panaC/ts_fetch.git#7f585951111aa0e9cb7fe7f99bdd927a9261cd7b", - "integrity": "sha512-2/l4Nka27XgPGCK7PZL8DNFW1BYcf28uPaoYAmF05L94bmvgYx0vkqTAXVRWz2hle7AE5xdBRfk7/06w0nWikg==", - "license": "Apache-2.0", - "dependencies": { - "fetch-cookie": "^1.0.0", - "node-fetch": "^2.6.1", - "tough-cookie": "^4.0.0" - } - }, - "node_modules/ts-fetch/node_modules/tough-cookie": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", - "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", - "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.1.2" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "optional": true, - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, - "node_modules/unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "optional": true, - "dependencies": { - "crypto-random-string": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/unit-compare": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unit-compare/-/unit-compare-1.0.1.tgz", - "integrity": "sha1-DHRZ8OW/U2N+qHPKPO4Y3i7so4Y=", - "dependencies": { - "moment": "^2.14.1" - } - }, - "node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/unzipper": { - "version": "0.10.11", - "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.11.tgz", - "integrity": "sha512-+BrAq2oFqWod5IESRjL3S8baohbevGcVA+teAIOYWM3pDVdseogqbzhhvvmiyQrUNKFUnDMtELW3X8ykbyDCJw==", - "dependencies": { - "big-integer": "^1.6.17", - "binary": "~0.3.0", - "bluebird": "~3.4.1", - "buffer-indexof-polyfill": "~1.0.0", - "duplexer2": "~0.1.4", - "fstream": "^1.0.12", - "graceful-fs": "^4.2.2", - "listenercount": "~1.0.1", - "readable-stream": "~2.3.6", - "setimmediate": "~1.0.4" - } - }, - "node_modules/unzipper/node_modules/bluebird": { - "version": "3.4.7", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", - "integrity": "sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM=" - }, - "node_modules/unzipper/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==", - "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/unzipper/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==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/urijs": { - "version": "1.19.7", - "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.7.tgz", - "integrity": "sha512-Id+IKjdU0Hx+7Zx717jwLPsPeUqz7rAtuVBRLLs+qn+J2nf9NGITWVCxcijgYxBqe83C7sqsQPs6H1pyz3x9gA==" - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" + "lockfileVersion": 1, + "dependencies": { + "@ampproject/remapping": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.1.tgz", + "integrity": "sha512-Aolwjd7HSC2PyY0fDj/wA/EimQT4HfEnFYNp5s9CQlrdhyvWTtvZ5YzrUPu6R6/1jKiUlxu8bUhkdSnKHNAHMA==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.0" } }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" - }, - "node_modules/websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "dependencies": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" + "@assistant/conversation": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@assistant/conversation/-/conversation-3.8.1.tgz", + "integrity": "sha512-YEyQ33xD1VCkJP16GRdXiuG55Vklbds3yiPcGSSf0hj2dj7mprWybipEZvVA4qsgv/NHrLvXPBFTySJrUpV/7g==", + "requires": { + "@types/aws-lambda": "^0.0.33", + "@types/debug": "^0.0.30", + "@types/express": "^4.11.1", + "@types/node": "12.12.24", + "debug": "^3.1.0", + "google-auth-library": "^6.1.0" }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" + "@types/node": { + "version": "12.12.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.24.tgz", + "integrity": "sha512-1Ciqv9pqwVtW6FsIUKSZNB82E5Cu1I2bBTj1xuIHXLe/1zYLl3956Nbhg2MzSYHVfl9/rmanjbQIb7LibfCnug==" + }, + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "google-auth-library": { + "version": "6.1.6", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-6.1.6.tgz", + "integrity": "sha512-Q+ZjUEvLQj/lrVHF/IQwRo6p3s8Nc44Zk/DALsN+ac3T4HY/g/3rrufkgtl+nZ1TW7DNAw5cTChdVp4apUXVgQ==", + "requires": { + "arrify": "^2.0.0", + "base64-js": "^1.3.0", + "ecdsa-sig-formatter": "^1.0.11", + "fast-text-encoding": "^1.0.0", + "gaxios": "^4.0.0", + "gcp-metadata": "^4.2.0", + "gtoken": "^5.0.4", + "jws": "^4.0.0", + "lru-cache": "^6.0.0" + } + } } }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "optional": 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" + "requires": { + "@babel/highlight": "^7.16.7" } }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "optional": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } + "@babel/compat-data": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.0.tgz", + "integrity": "sha512-392byTlpGWXMv4FbyWw3sAZ/FrW/DrwqLGXpy0mbyNe9Taqv1mg9yON5/o0cnr8XYCkFTZbC1eV+c+LAROgrng==", + "dev": true }, - "node_modules/xdg-basedir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", - "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", - "optional": true, - "engines": { - "node": ">=8" + "@babel/core": { + "version": "7.17.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.2.tgz", + "integrity": "sha512-R3VH5G42VSDolRHyUO4V2cfag8WHcZyxdq5Z/m8Xyb92lW/Erm/6kM+XtRFGf3Mulre3mveni2NHfEUws8wSvw==", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.0.0", + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.0", + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helpers": "^7.17.2", + "@babel/parser": "^7.17.0", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.17.0", + "@babel/types": "^7.17.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0" + } + }, + "@babel/generator": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.0.tgz", + "integrity": "sha512-I3Omiv6FGOC29dtlZhkfXO6pgkmukJSlT26QjVvS1DGZe/NzSVCPG41X0tS21oZkJYlovfj9qDWgKP+Cn4bXxw==", + "dev": true, + "requires": { + "@babel/types": "^7.17.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" } }, - "node_modules/xmldom": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.6.0.tgz", - "integrity": "sha512-iAcin401y58LckRZ0TkI4k0VSM1Qg0KGSc3i8rU+xrxe19A/BN1zHyVSJY7uoutVlaTSzYyk/v5AmkewAP7jtg==", - "engines": { - "node": ">=10.0.0" + "@babel/helper-compilation-targets": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz", + "integrity": "sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.16.4", + "@babel/helper-validator-option": "^7.16.7", + "browserslist": "^4.17.5", + "semver": "^6.3.0" } }, - "node_modules/xpath": { - "version": "0.0.32", - "resolved": "https://registry.npmjs.org/xpath/-/xpath-0.0.32.tgz", - "integrity": "sha512-rxMJhSIoiO8vXcWvSifKqhvV96GjiD5wYb8/QHdoRyQvraTpp4IEv944nhGausZZ3u7dhQXteZuZbaqfpB7uYw==", - "engines": { - "node": ">=0.6.0" + "@babel/helper-environment-visitor": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", + "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" } }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "optional": true, - "engines": { - "node": ">=10" + "@babel/helper-function-name": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz", + "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/types": "^7.16.7" } }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "optional": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" + "@babel/helper-get-function-arity": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz", + "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" } }, - "node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "optional": true, - "engines": { - "node": ">=10" + "@babel/helper-hoist-variables": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", + "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" } }, - "node_modules/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", - "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" + "@babel/helper-module-imports": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", + "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" } }, - "node_modules/yazl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz", - "integrity": "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==", - "dependencies": { - "buffer-crc32": "~0.2.3" + "@babel/helper-module-transforms": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz", + "integrity": "sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-simple-access": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.7", + "@babel/types": "^7.16.7" } }, - "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==", - "optional": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - }, - "dependencies": { - "@assistant/conversation": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@assistant/conversation/-/conversation-3.8.1.tgz", - "integrity": "sha512-YEyQ33xD1VCkJP16GRdXiuG55Vklbds3yiPcGSSf0hj2dj7mprWybipEZvVA4qsgv/NHrLvXPBFTySJrUpV/7g==", + "@babel/helper-simple-access": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz", + "integrity": "sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g==", + "dev": true, "requires": { - "@types/aws-lambda": "^0.0.33", - "@types/debug": "^0.0.30", - "@types/express": "^4.11.1", - "@types/node": "12.12.24", - "debug": "^3.1.0", - "google-auth-library": "^6.1.0" + "@babel/types": "^7.16.7" } }, - "@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "@babel/helper-split-export-declaration": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", + "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", "dev": true, "requires": { - "@babel/highlight": "^7.10.4" + "@babel/types": "^7.16.7" } }, "@babel/helper-validator-identifier": { - "version": "7.15.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", - "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", + "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", "dev": true }, + "@babel/helpers": { + "version": "7.17.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.2.tgz", + "integrity": "sha512-0Qu7RLR1dILozr/6M0xgj+DFPmi6Bnulgm9M8BVa9ZCWxDqlSnqt3cf8IDPB5m45sVXUZ0kuQAgUrdSFFH79fQ==", + "dev": true, + "requires": { + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.17.0", + "@babel/types": "^7.17.0" + } + }, "@babel/highlight": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", - "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", + "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.14.5", + "@babel/helper-validator-identifier": "^7.16.7", "chalk": "^2.0.0", "js-tokens": "^4.0.0" }, @@ -4705,65 +290,117 @@ } } }, + "@babel/parser": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.0.tgz", + "integrity": "sha512-VKXSCQx5D8S04ej+Dqsr1CzYvvWgf20jIw2D+YhQCrIlr2UZGaDds23Y0xg75/skOxpLCRpUZvk/1EAVkGoDOw==", + "dev": true + }, + "@babel/runtime": { + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.3.tgz", + "integrity": "sha512-WBwekcqacdY2e9AF/Q7WLFUWmdJGJTkbjqTjoMDgXkVZ3ZRUvOPsLb5KdwISoQVsbP+DQzVZW4Zhci0DvpbNTQ==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/template": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", + "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/traverse": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.0.tgz", + "integrity": "sha512-fpFIXvqD6kC7c7PUNnZ0Z8cQXlarCLtCUpt2S1Dx7PjoRtCFffvOkHHSom+m5HIxMZn5bIBVb71lhabcmjEsqg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.0", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.17.0", + "@babel/types": "^7.17.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "dependencies": { + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + } + } + }, + "@babel/types": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", + "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + }, + "@cspotcode/source-map-consumer": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz", + "integrity": "sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==", + "dev": true + }, + "@cspotcode/source-map-support": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz", + "integrity": "sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==", + "dev": true, + "requires": { + "@cspotcode/source-map-consumer": "0.8.0" + } + }, + "@dsherret/to-absolute-glob": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@dsherret/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", + "integrity": "sha1-H2R13IvZdM6gei2vOGSzF7HdMyw=", + "dev": true, + "requires": { + "is-absolute": "^1.0.0", + "is-negated-glob": "^1.0.0" + } + }, "@eslint/eslintrc": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", - "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.4.tgz", + "integrity": "sha512-h8Vx6MdxwWI2WM8/zREHMoqdgLNXEL4QX3MWSVMdyNJGvXVOs+6lp+m2hc3FnuMHDc4poxFNI20vCk0OmI4G0Q==", "dev": true, "requires": { "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", + "debug": "^4.3.2", + "espree": "^9.0.0", "globals": "^13.9.0", "ignore": "^4.0.6", "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", + "js-yaml": "^4.1.0", "minimatch": "^3.0.4", "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + }, + "dependencies": { + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true } } }, - "@firebase/app": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.7.1.tgz", - "integrity": "sha512-B4z6E1EPQc0mOjF35IPKdDRCFnT/fNQIHfM+v7F9obB7ItPhGILK3LxaQfuampSQpF6GG6TPFDbrWK6myXAq+g==", - "peer": true, - "requires": { - "@firebase/component": "0.5.7", - "@firebase/logger": "0.3.0", - "@firebase/util": "1.4.0", - "tslib": "^2.1.0" - } - }, - "@firebase/app-compat": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.1.2.tgz", - "integrity": "sha512-kF1maoqA8bZqJ4v/ojVvA7kIyyXEPkJmL48otGrC8LIgdcen7xCx3JFDe0DGeQywg+qujvdkJz/TptFN1cvAgw==", - "peer": true, - "requires": { - "@firebase/app": "0.7.1", - "@firebase/component": "0.5.7", - "@firebase/logger": "0.3.0", - "@firebase/util": "1.4.0", - "tslib": "^2.1.0" - } - }, "@firebase/app-types": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.7.0.tgz", @@ -4772,8 +409,7 @@ "@firebase/auth-interop-types": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.1.6.tgz", - "integrity": "sha512-etIi92fW3CctsmR9e3sYM3Uqnoq861M0Id9mdOPF6PWIg38BXL5k4upCNBggGUpLIS0H1grMOvy/wn1xymwe2g==", - "requires": {} + "integrity": "sha512-etIi92fW3CctsmR9e3sYM3Uqnoq861M0Id9mdOPF6PWIg38BXL5k4upCNBggGUpLIS0H1grMOvy/wn1xymwe2g==" }, "@firebase/component": { "version": "0.5.7", @@ -4785,9 +421,9 @@ } }, "@firebase/database": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/@firebase/database/-/database-0.12.1.tgz", - "integrity": "sha512-Ethk0hc476qnkSKNBa+8Yc7iM8AO69HYWsaD+QUC983FZtnuMyNLHtEeSUbLQYvyHo7cOjcc52slop14WmfZeQ==", + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@firebase/database/-/database-0.12.2.tgz", + "integrity": "sha512-Y1LZR1LIQM8YKMkeUPpAq3/e53hcfcXO+JEZ6vCzBeD6xRawqmpw6B5/DzePdCNNvjcqheXzSaR7T39eRZo/wA==", "requires": { "@firebase/auth-interop-types": "0.1.6", "@firebase/component": "0.5.7", @@ -4798,12 +434,12 @@ } }, "@firebase/database-compat": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-0.1.1.tgz", - "integrity": "sha512-K3DFWiw0YkLZtlfA9TOGPw6zVXKu5dQ1XqIGztUufFVRYW8IizReXVxzSSmJNR4Adr2LiU9j66Wenc6e5UfwaQ==", + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-0.1.2.tgz", + "integrity": "sha512-sV32QIRSNIBj/6OYtpmPzA/SfQz1/NBZbhxg9dIhGaSt9e5HaMxXRuz2lImudX0Sd/v8DKdExrxa++K6rKrRtA==", "requires": { "@firebase/component": "0.5.7", - "@firebase/database": "0.12.1", + "@firebase/database": "0.12.2", "@firebase/database-types": "0.9.1", "@firebase/logger": "0.3.0", "@firebase/util": "1.4.0", @@ -4853,9 +489,9 @@ } }, "@google-cloud/common": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-3.7.2.tgz", - "integrity": "sha512-5Q9f74IbZaY6xAwJSNFy5SrGwbm1j7mpv+6A/r+K2dymjsXBH5UauB0tziaMwWoVVaMq1IQnZF9lgtfqqvxcUg==", + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-3.7.4.tgz", + "integrity": "sha512-JO4a8l/N6fkHZ+vWgNYgcNoZh1/m6kqv8F7+NpBkGqs7NzUtkmE9WdvHaNUwAOm1mIqbuX2wXKNfAZfqZr+vMg==", "optional": true, "requires": { "@google-cloud/projectify": "^2.0.0", @@ -4864,28 +500,9 @@ "duplexify": "^4.1.1", "ent": "^2.2.0", "extend": "^3.0.2", - "google-auth-library": "^7.0.2", + "google-auth-library": "^7.9.2", "retry-request": "^4.2.2", "teeny-request": "^7.0.0" - }, - "dependencies": { - "google-auth-library": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-7.10.0.tgz", - "integrity": "sha512-ICsqaU+lxMHVlDUzMrfVIEqnARw2AwBiZ/2KnNM6BcTf9Nott+Af87DTIzmlnW865p3REUP2MVL0xkPC3a61aQ==", - "optional": true, - "requires": { - "arrify": "^2.0.0", - "base64-js": "^1.3.0", - "ecdsa-sig-formatter": "^1.0.11", - "fast-text-encoding": "^1.0.0", - "gaxios": "^4.0.0", - "gcp-metadata": "^4.2.0", - "gtoken": "^5.0.4", - "jws": "^4.0.0", - "lru-cache": "^6.0.0" - } - } } }, "@google-cloud/firestore": { @@ -4923,12 +540,12 @@ "optional": true }, "@google-cloud/storage": { - "version": "5.14.4", - "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-5.14.4.tgz", - "integrity": "sha512-CjpGuk+ZZB7b3yMXPQrPb0TMIhXqbDzrGxngeSl2S2fItFp2pZDnYhvFuB0/8S73cA2T/4x3g1tl6PB1OuuaoQ==", + "version": "5.15.3", + "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-5.15.3.tgz", + "integrity": "sha512-a2Y+mvfbzznWorQiv6c+qdPDlBpe47tikV8tpQSnvYXz1Ed/rjin41k2nKUQUcAPGHtYeTzGfKnCNKC+lv8qRg==", "optional": true, "requires": { - "@google-cloud/common": "^3.7.0", + "@google-cloud/common": "^3.7.4", "@google-cloud/paginator": "^3.0.0", "@google-cloud/promisify": "^2.0.0", "arrify": "^2.0.0", @@ -4950,26 +567,19 @@ } }, "@grpc/grpc-js": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.3.7.tgz", - "integrity": "sha512-CKQVuwuSPh40tgOkR7c0ZisxYRiN05PcKPW72mQL5y++qd7CwBRoaJZvU5xfXnCJDFBmS3qZGQ71Frx6Ofo2XA==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.4.2.tgz", + "integrity": "sha512-aUN6oGk9un8rfYWz73nQgFxPCYJQYd8LpIGguZHBsNduBMyqG6EWANrsVBuTG+nl/l4dKb3x+qi1l9+oxDxqGg==", "optional": true, "requires": { + "@grpc/proto-loader": "^0.6.4", "@types/node": ">=12.12.47" - }, - "dependencies": { - "@types/node": { - "version": "16.10.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.10.2.tgz", - "integrity": "sha512-zCclL4/rx+W5SQTzFs9wyvvyCwoK9QtBpratqz2IYJ3O8Umrn0m3nsTv0wQBk9sRGpvUe9CwPDrQFB10f1FIjQ==", - "optional": true - } } }, "@grpc/proto-loader": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.6.5.tgz", - "integrity": "sha512-GZdzyVQI1Bln/kCzIYgTKu+rQJ5dno0gVrfmLe4jqQu7T2e7svSwJzpCBqVU5hhBSJP3peuPjOMWsj5GR61YmQ==", + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.6.6.tgz", + "integrity": "sha512-cdMaPZ8AiFz6ua6PUbP+LKbhwJbFXnrQ/mlnKGUyzDUZ3wp7vPLksnmLCBX6SHgSmjX7CbNVNLFYD5GmmjO4GQ==", "optional": true, "requires": { "@types/long": "^4.0.1", @@ -4980,39 +590,159 @@ } }, "@humanwhocodes/config-array": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", - "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.6.0.tgz", + "integrity": "sha512-JQlEKbcgEUjBFhLIF4iqM7u/9lwgHRBcpHrmUNCALK0Q3amXN6lxdoXLnF0sm11E9VqTmBALR87IlUg1bZ8A9A==", "dev": true, "requires": { "@humanwhocodes/object-schema": "^1.2.0", "debug": "^4.1.1", "minimatch": "^3.0.4" + } + }, + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "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" }, "dependencies": { - "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "requires": { - "ms": "2.1.2" + "sprintf-js": "~1.0.2" } }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true } } }, - "@humanwhocodes/object-schema": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", - "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", + "@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true + }, + "@jridgewell/resolve-uri": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz", + "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.11", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz", + "integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.4.tgz", + "integrity": "sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, "@panva/asn1.js": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@panva/asn1.js/-/asn1.js-1.0.0.tgz", @@ -5082,12 +812,71 @@ "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=", "optional": true }, + "@sinonjs/commons": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", + "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/fake-timers": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz", + "integrity": "sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0" + } + }, + "@sinonjs/samsam": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-6.1.1.tgz", + "integrity": "sha512-cZ7rKJTLiE7u7Wi/v9Hc2fs3Ucc3jrWeMgPHbbTCeVAB2S0wOBbYlkJVeNSL04i7fdhT8wIbDq1zhC/PXTD2SA==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.6.0", + "lodash.get": "^4.4.2", + "type-detect": "^4.0.8" + } + }, + "@sinonjs/text-encoding": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", + "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", + "dev": true + }, "@tootallnate/once": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", "optional": true }, + "@tsconfig/node10": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz", + "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==", + "dev": true + }, + "@tsconfig/node12": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz", + "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==", + "dev": true + }, + "@tsconfig/node14": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz", + "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==", + "dev": true + }, + "@tsconfig/node16": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz", + "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==", + "dev": true + }, "@types/aws-lambda": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-0.0.33.tgz", @@ -5102,6 +891,12 @@ "@types/node": "*" } }, + "@types/chai": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.0.tgz", + "integrity": "sha512-/ceqdqeRraGolFTcfoXNiqjyQhZzbINDngeoAq9GoHa8PPK1yNzTaxWjA6BFWp5Ua9JpXEMSS4s5i9tS0hOJtw==", + "dev": true + }, "@types/connect": { "version": "3.4.35", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", @@ -5158,10 +953,35 @@ "@types/express": "*" } }, + "@types/fs-extra": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.2.tgz", + "integrity": "sha512-SvSrYXfWSc7R4eqnOzbQF4TZmfpNSM9FrSWLU3EUnWBuyZqNBOrv1B1JA3byUDPUl9z4Ab3jeZG2eDdySlgNMg==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "dev": true, + "requires": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/json-schema": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "dev": true + }, "@types/lodash": { - "version": "4.14.175", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.175.tgz", - "integrity": "sha512-XmdEOrKQ8a1Y/yxQFOMbC47G/V2VDO1GvMRnl4O75M4GW/abC5tnfzadQYkqEveqRM1dEJGFFegfPNA2vvx2iw==", + "version": "4.14.176", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.176.tgz", + "integrity": "sha512-xZmuPTa3rlZoIbtDUyJKZQimJV3bxCmzMIO2c9Pz9afyDro6kr7R79GwcB6mRhuoPmV2p1Vb66WOJH7F886WKQ==", "dev": true }, "@types/long": { @@ -5175,10 +995,28 @@ "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" }, + "@types/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", + "dev": true + }, + "@types/mocha": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.0.0.tgz", + "integrity": "sha512-scN0hAWyLVAvLR9AyW7HoFF5sJZglyBsbPuHO4fv7JRvfmPBMfp1ozWqOf/e4wwPNxezBZXRfWzMb6iFLgEVRA==", + "dev": true + }, "@types/node": { - "version": "12.12.24", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.24.tgz", - "integrity": "sha512-1Ciqv9pqwVtW6FsIUKSZNB82E5Cu1I2bBTj1xuIHXLe/1zYLl3956Nbhg2MzSYHVfl9/rmanjbQIb7LibfCnug==" + "version": "16.11.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.6.tgz", + "integrity": "sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w==" + }, + "@types/proxyquire": { + "version": "1.3.28", + "resolved": "https://registry.npmjs.org/@types/proxyquire/-/proxyquire-1.3.28.tgz", + "integrity": "sha512-SQaNzWQ2YZSr7FqAyPPiA3FYpux2Lqh3HWMZQk47x3xbMCqgC/w0dY3dw9rGqlweDDkrySQBcaScXWeR+Yb11Q==", + "dev": true }, "@types/qs": { "version": "6.9.7", @@ -5199,10 +1037,135 @@ "@types/node": "*" } }, - "@types/xmldom": { - "version": "0.1.31", - "resolved": "https://registry.npmjs.org/@types/xmldom/-/xmldom-0.1.31.tgz", - "integrity": "sha512-bVy7s0nvaR5D1mT1a8ZkByHWNOGb6Vn4yi5TWhEdmyKlAG+08SA7Md6+jH+tYmMLueAwNeWvHHpeKrr6S4c4BA==" + "@types/sinon": { + "version": "10.0.9", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.9.tgz", + "integrity": "sha512-xGZVAe61omKnVGedBdTbAveuJ5QyI0LrMIcp0hc1LmVI5IEjs5qG4fM0sv9GIBA2JVoKuf7332IjQX4y5qqMMQ==", + "dev": true, + "requires": { + "@sinonjs/fake-timers": "^7.1.0" + } + }, + "@types/validator": { + "version": "13.7.1", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.7.1.tgz", + "integrity": "sha512-I6OUIZ5cYRk5lp14xSOAiXjWrfVoMZVjDuevBYgQDYzZIjsf2CAISpEcXOkFAtpAHbmWIDLcZObejqny/9xq5Q==" + }, + "@typescript-eslint/eslint-plugin": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.3.1.tgz", + "integrity": "sha512-cFImaoIr5Ojj358xI/SDhjog57OK2NqlpxwdcgyxDA3bJlZcJq5CPzUXtpD7CxI2Hm6ATU7w5fQnnkVnmwpHqw==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "5.3.1", + "@typescript-eslint/scope-manager": "5.3.1", + "debug": "^4.3.2", + "functional-red-black-tree": "^1.0.1", + "ignore": "^5.1.8", + "regexpp": "^3.2.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "dependencies": { + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@typescript-eslint/experimental-utils": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.3.1.tgz", + "integrity": "sha512-RgFn5asjZ5daUhbK5Sp0peq0SSMytqcrkNfU4pnDma2D8P3ElZ6JbYjY8IMSFfZAJ0f3x3tnO3vXHweYg0g59w==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.3.1", + "@typescript-eslint/types": "5.3.1", + "@typescript-eslint/typescript-estree": "5.3.1", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + } + }, + "@typescript-eslint/parser": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.3.1.tgz", + "integrity": "sha512-TD+ONlx5c+Qhk21x9gsJAMRohWAUMavSOmJgv3JGy9dgPhuBd5Wok0lmMClZDyJNLLZK1JRKiATzCKZNUmoyfw==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "5.3.1", + "@typescript-eslint/types": "5.3.1", + "@typescript-eslint/typescript-estree": "5.3.1", + "debug": "^4.3.2" + } + }, + "@typescript-eslint/scope-manager": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.3.1.tgz", + "integrity": "sha512-XksFVBgAq0Y9H40BDbuPOTUIp7dn4u8oOuhcgGq7EoDP50eqcafkMVGrypyVGvDYHzjhdUCUwuwVUK4JhkMAMg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.3.1", + "@typescript-eslint/visitor-keys": "5.3.1" + } + }, + "@typescript-eslint/types": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.3.1.tgz", + "integrity": "sha512-bG7HeBLolxKHtdHG54Uac750eXuQQPpdJfCYuw4ZI3bZ7+GgKClMWM8jExBtp7NSP4m8PmLRM8+lhzkYnSmSxQ==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.3.1.tgz", + "integrity": "sha512-PwFbh/PKDVo/Wct6N3w+E4rLZxUDgsoII/GrWM2A62ETOzJd4M6s0Mu7w4CWsZraTbaC5UQI+dLeyOIFF1PquQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.3.1", + "@typescript-eslint/visitor-keys": "5.3.1", + "debug": "^4.3.2", + "globby": "^11.0.4", + "is-glob": "^4.0.3", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "dependencies": { + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.3.1.tgz", + "integrity": "sha512-3cHUzUuVTuNHx0Gjjt5pEHa87+lzyqOiHXy/Gz+SJOCW1mpw9xQHIIEwnKn+Thph1mgWyZ90nboOcSuZr/jTTQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.3.1", + "eslint-visitor-keys": "^3.0.0" + } + }, + "@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 + }, + "@xmldom/xmldom": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.1.tgz", + "integrity": "sha512-4wOae+5N2RZ+CZXd9ZKwkaDi55IxrSTOjHpxTvQQ4fomtOJmqVxbmICA9jE1jvnqNhpfgz8cnfFagG86wV/xLQ==" }, "abort-controller": { "version": "3.0.0", @@ -5222,17 +1185,22 @@ } }, "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz", + "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==", "dev": true }, "acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} + "dev": true + }, + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true }, "agent-base": { "version": "6.0.2", @@ -5240,21 +1208,16 @@ "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "requires": { "debug": "4" - }, - "dependencies": { - "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } + } + }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" } }, "ajv": { @@ -5277,41 +1240,79 @@ "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "devOptional": true + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "devOptional": true, "requires": { "color-convert": "^2.0.1" } }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "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", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", + "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", "dev": true, "requires": { - "sprintf-js": "~1.0.2" + "default-require-extensions": "^3.0.0" } }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "dev": true + }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "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 + }, + "array-differ": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz", + "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==", + "dev": true + }, "array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, "arrify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==" }, "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", "requires": { "safer-buffer": "~2.1.0" } @@ -5321,10 +1322,10 @@ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" }, - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "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 }, "async-retry": { @@ -5370,9 +1371,9 @@ } }, "big-integer": { - "version": "1.6.49", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.49.tgz", - "integrity": "sha512-KJ7VhqH+f/BOt9a3yMwJNmcZjG53ijWMTjSAGMveQWyLwqIiwkjNP5PFgDob3Snnx86SjDj6I89fIbv0dkQeNw==" + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==" }, "bignumber.js": { "version": "9.0.1", @@ -5388,6 +1389,12 @@ "chainsaw": "~0.1.0" } }, + "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 + }, "bindings": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", @@ -5442,6 +1449,34 @@ "concat-map": "0.0.1" } }, + "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" + } + }, + "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 + }, + "browserslist": { + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz", + "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001286", + "electron-to-chromium": "^1.4.17", + "escalade": "^3.1.1", + "node-releases": "^2.0.1", + "picocolors": "^1.0.0" + } + }, "buffer-crc32": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", @@ -5467,17 +1502,56 @@ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" }, + "caching-transform": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", + "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", + "dev": true, + "requires": { + "hasha": "^5.0.0", + "make-dir": "^3.0.0", + "package-hash": "^4.0.0", + "write-file-atomic": "^3.0.0" + } + }, "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true }, + "camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30001312", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001312.tgz", + "integrity": "sha512-Wiz1Psk2MEK0pX3rUzWaunLTZzqS2JYZFzNKqAiJGiuxIjRPLgV6+VDPOg6lQOUxmDwhTlh198JsTTi8Hzw6aQ==", + "dev": true + }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" }, + "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", + "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" + } + }, "chainsaw": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", @@ -5496,22 +1570,69 @@ "supports-color": "^7.1.0" } }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", + "dev": true + }, + "chokidar": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.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" + } + }, + "class-transformer": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/class-transformer/-/class-transformer-0.4.0.tgz", + "integrity": "sha512-ETWD/H2TbWbKEi7m9N4Km5+cw1hNcqJSxlSYhsLsNjQzWWiZIYA1zafxpK9PwVfaZ6AqR5rrjPVUBGESm5tQUA==" + }, + "class-validator": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/class-validator/-/class-validator-0.13.1.tgz", + "integrity": "sha512-zWIeYFhUitvAHBwNhDdCRK09hWx+P0HUwFE8US8/CxFpMVzkUK8RJl7yOIE+BVu2lxyPNgeOaFv78tLE47jBIg==", + "requires": { + "@types/validator": "^13.1.3", + "libphonenumber-js": "^1.9.7", + "validator": "^13.5.2" + } + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "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==", - "optional": true, "requires": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", "wrap-ansi": "^7.0.0" } }, + "code-block-writer": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-10.1.1.tgz", + "integrity": "sha512-67ueh2IRGst/51p0n6FvPrnRjAGHY5F8xdjkgrYE7DDzpJe6qA07RYQ9VcoUeo5ATOjSOiWpSL3SWBRRbempMw==", + "dev": true + }, "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==", - "devOptional": true, "requires": { "color-name": "~1.1.4" } @@ -5519,8 +1640,7 @@ "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==", - "devOptional": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "combined-stream": { "version": "1.0.8", @@ -5530,6 +1650,18 @@ "delayed-stream": "~1.0.0" } }, + "commander": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", + "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, "compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", @@ -5564,6 +1696,13 @@ "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", "requires": { "safe-buffer": "5.1.2" + }, + "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==" + } } }, "content-type": { @@ -5571,6 +1710,23 @@ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" }, + "convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.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 + } + } + }, "cookie": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", @@ -5595,6 +1751,12 @@ "vary": "^1" } }, + "create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, "cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -5621,17 +1783,32 @@ } }, "date-and-time": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/date-and-time/-/date-and-time-2.0.0.tgz", - "integrity": "sha512-HJSzj25iPm8E01nt+rSmCIlwjsmjvKfUivG/kXBglpymcHF1FolWAqWwTEV4FvN1Lx5UjPf0J1W4H8yQsVBfFg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/date-and-time/-/date-and-time-2.0.1.tgz", + "integrity": "sha512-O7Xe5dLaqvY/aF/MFWArsAM1J4j7w1CSZlPCX9uHgmb+6SbkPd8Q4YOvfvH/cZGvFlJFfHOZKxQtmMUOoZhc/w==", "optional": true }, "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" + } + }, + "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": { - "ms": "^2.1.1" + "type-detect": "^4.0.0" } }, "deep-is": { @@ -5640,6 +1817,15 @@ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, + "default-require-extensions": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz", + "integrity": "sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==", + "dev": true, + "requires": { + "strip-bom": "^4.0.0" + } + }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -5663,6 +1849,21 @@ "streamsearch": "0.1.2" } }, + "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 + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, "doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -5703,6 +1904,11 @@ "util-deprecate": "~1.0.1" } }, + "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==" + }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -5747,11 +1953,16 @@ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, + "electron-to-chromium": { + "version": "1.4.68", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.68.tgz", + "integrity": "sha512-cId+QwWrV8R1UawO6b9BR1hnkJ4EJPCPAr4h315vliHUtVUJDk39Sg1PMNnaWKfj5x+93ssjeJ9LKL6r8LaMiA==", + "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==", - "devOptional": true + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "encodeurl": { "version": "1.0.2", @@ -5787,11 +1998,16 @@ "resolved": "https://registry.npmjs.org/err-code/-/err-code-1.1.2.tgz", "integrity": "sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA=" }, + "es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true + }, "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "optional": true + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" }, "escape-html": { "version": "1.0.3", @@ -5805,37 +2021,36 @@ "dev": true }, "eslint": { - "version": "7.32.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", - "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.2.0.tgz", + "integrity": "sha512-erw7XmM+CLxTOickrimJ1SiF55jiNlVSp2qqm0NuBWPtHYQCegD5ZMaW0c3i5ytPqL+SSLaCxdvQXFPLJn+ABw==", "dev": true, "requires": { - "@babel/code-frame": "7.12.11", - "@eslint/eslintrc": "^0.4.3", - "@humanwhocodes/config-array": "^0.5.0", + "@eslint/eslintrc": "^1.0.4", + "@humanwhocodes/config-array": "^0.6.0", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", - "debug": "^4.0.1", + "debug": "^4.3.2", "doctrine": "^3.0.0", "enquirer": "^2.3.5", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.1", + "eslint-scope": "^6.0.0", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.0.0", + "espree": "^9.0.0", "esquery": "^1.4.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.1.2", + "glob-parent": "^6.0.1", "globals": "^13.6.0", "ignore": "^4.0.6", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", + "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", @@ -5843,29 +2058,53 @@ "natural-compare": "^1.4.0", "optionator": "^0.9.1", "progress": "^2.0.0", - "regexpp": "^3.1.0", + "regexpp": "^3.2.0", "semver": "^7.2.1", - "strip-ansi": "^6.0.0", + "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", - "table": "^6.0.9", "text-table": "^0.2.0", "v8-compile-cache": "^2.0.3" }, "dependencies": { - "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "eslint-scope": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-6.0.0.tgz", + "integrity": "sha512-uRDL9MWmQCkaFus8RF5K9/L/2fn+80yoW3jkD53l4shjCh26fCtvJGasxjUqP5OT87SYTxCVA3BwTUzuELx9kA==", "dev": true, "requires": { - "ms": "2.1.2" + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" } }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } } } }, @@ -5873,8 +2112,7 @@ "version": "0.14.0", "resolved": "https://registry.npmjs.org/eslint-config-google/-/eslint-config-google-0.14.0.tgz", "integrity": "sha512-WsbX4WbjuMvTdeVL6+J3rK1RGhCTqjsFjX7UMSMgZiyxxaNLkoJENbrGExzERFeoTpGw3F3FypTiWAP9ZXzkEw==", - "dev": true, - "requires": {} + "dev": true }, "eslint-scope": { "version": "5.1.1", @@ -5887,45 +2125,37 @@ } }, "eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", "dev": true, "requires": { - "eslint-visitor-keys": "^1.1.0" + "eslint-visitor-keys": "^2.0.0" }, "dependencies": { "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", "dev": true } } }, "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.1.0.tgz", + "integrity": "sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA==", "dev": true }, "espree": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.0.0.tgz", + "integrity": "sha512-r5EQJcYZ2oaGbeR0jR0fFVijGOcwai07/690YRXLINuhmVeRY4UKSAsQPe/0BNuDgwP7Ophoc1PRsr2E3tkbdQ==", "dev": true, "requires": { - "acorn": "^7.4.0", + "acorn": "^8.5.0", "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - } + "eslint-visitor-keys": "^3.0.0" } }, "esprima": { @@ -5944,9 +2174,9 @@ }, "dependencies": { "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true } } @@ -5961,9 +2191,9 @@ }, "dependencies": { "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true } } @@ -6039,9 +2269,23 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "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==" } } }, + "express-request-mock": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/express-request-mock/-/express-request-mock-3.1.0.tgz", + "integrity": "sha512-Ep1uuqCRUc2nTjwAeaVuviDGPCOU2xIhyVHQoN6+xDc9ANJJY42auiAO0guJTvnyyHY/8Q3/hZWEjHf1eo6hSQ==", + "dev": true, + "requires": { + "node-mocks-http": "^1.9.0" + } + }, "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -6057,6 +2301,19 @@ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, + "fast-glob": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", + "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, "fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -6073,6 +2330,15 @@ "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.3.tgz", "integrity": "sha512-dtm4QZH9nZtcDt8qJiOH9fcQd1NAgi+K1O2DbE6GG1PPCK/BWfOH3idCTRQ4ImXRUOyopDEgDEnVEE7Y/2Wrig==" }, + "fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, "faye-websocket": { "version": "0.11.4", "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", @@ -6090,9 +2356,9 @@ } }, "fetch-cookie": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fetch-cookie/-/fetch-cookie-1.0.0.tgz", - "integrity": "sha512-SWcAhkDe4yVBFtwRqJNmot6k1XjjzI7tw3aRHepxXrK6FQp6obBhqcnsdm2aNUzrtE71607crNAYodtKMq3TjA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fetch-cookie/-/fetch-cookie-1.0.1.tgz", + "integrity": "sha512-gfQjp/UOsjHeuFzkOqjcYtJ20qhRzyhdK5fV2i7Qh+8bT0+HH2TKPl1ql+u39gsTcmehFX9vhvULZAsXACApgQ==", "requires": { "tough-cookie": "^2.3.3 || ^3.0.1 || ^4.0.0" } @@ -6134,6 +2400,25 @@ "unit-compare": "^1.0.1" } }, + "fill-keys": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/fill-keys/-/fill-keys-1.0.2.tgz", + "integrity": "sha1-mo+jb06K1jTjv2tPPIiCVRRS6yA=", + "dev": true, + "requires": { + "is-object": "~1.0.1", + "merge-descriptors": "~1.0.0" + } + }, + "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" + } + }, "finalhandler": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", @@ -6163,6 +2448,27 @@ } } }, + "find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "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", + "path-exists": "^4.0.0" + } + }, "firebase-admin": { "version": "9.12.0", "resolved": "https://registry.npmjs.org/firebase-admin/-/firebase-admin-9.12.0.tgz", @@ -6177,19 +2483,12 @@ "jsonwebtoken": "^8.5.1", "jwks-rsa": "^2.0.2", "node-forge": "^0.10.0" - }, - "dependencies": { - "@types/node": { - "version": "16.10.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.10.2.tgz", - "integrity": "sha512-zCclL4/rx+W5SQTzFs9wyvvyCwoK9QtBpratqz2IYJ3O8Umrn0m3nsTv0wQBk9sRGpvUe9CwPDrQFB10f1FIjQ==" - } } }, "firebase-functions": { - "version": "3.15.7", - "resolved": "https://registry.npmjs.org/firebase-functions/-/firebase-functions-3.15.7.tgz", - "integrity": "sha512-ZD7r8eoWWebgs+mTqfH8NLUT2C0f7/cyAvIA1RSUdBVQZN7MBBt3oSlN/rL3e+m6tdlJz6YbQ3hrOKOGjOVYvQ==", + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/firebase-functions/-/firebase-functions-3.16.0.tgz", + "integrity": "sha512-6ISOn0JckMtpA3aJ/+wCCGhThUhBUrpZD+tSkUeolx0Vr+NoYFXA0+2YzJZa/A2MDU8gotPzUtnauLSEQvfClQ==", "requires": { "@types/cors": "^2.8.5", "@types/express": "4.17.3", @@ -6220,6 +2519,12 @@ "lodash": "^4.17.5" } }, + "flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true + }, "flat-cache": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", @@ -6228,14 +2533,35 @@ "requires": { "flatted": "^3.1.0", "rimraf": "^3.0.2" + }, + "dependencies": { + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } } }, "flatted": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", - "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.4.tgz", + "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==", "dev": true }, + "foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" + } + }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -6261,11 +2587,35 @@ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" }, + "fromentries": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", + "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", + "dev": true + }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, + "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 + }, "fstream": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", @@ -6287,11 +2637,16 @@ } } }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, "functional-red-black-tree": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "devOptional": true + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" }, "gaxios": { "version": "4.3.2", @@ -6327,32 +2682,30 @@ "google-auth-library": "^7.0.0", "pumpify": "^2.0.0", "stream-events": "^1.0.4" - }, - "dependencies": { - "google-auth-library": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-7.10.0.tgz", - "integrity": "sha512-ICsqaU+lxMHVlDUzMrfVIEqnARw2AwBiZ/2KnNM6BcTf9Nott+Af87DTIzmlnW865p3REUP2MVL0xkPC3a61aQ==", - "optional": true, - "requires": { - "arrify": "^2.0.0", - "base64-js": "^1.3.0", - "ecdsa-sig-formatter": "^1.0.11", - "fast-text-encoding": "^1.0.0", - "gaxios": "^4.0.0", - "gcp-metadata": "^4.2.0", - "gtoken": "^5.0.4", - "jws": "^4.0.0", - "lru-cache": "^6.0.0" - } - } } }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true + }, "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==", - "optional": true + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", + "dev": true + }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true }, "get-stream": { "version": "6.0.1", @@ -6391,18 +2744,33 @@ } }, "globals": { - "version": "13.11.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz", - "integrity": "sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==", + "version": "13.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", + "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", "dev": true, "requires": { "type-fest": "^0.20.2" } }, + "globby": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", + "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + } + }, "google-auth-library": { - "version": "6.1.6", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-6.1.6.tgz", - "integrity": "sha512-Q+ZjUEvLQj/lrVHF/IQwRo6p3s8Nc44Zk/DALsN+ac3T4HY/g/3rrufkgtl+nZ1TW7DNAw5cTChdVp4apUXVgQ==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-7.10.1.tgz", + "integrity": "sha512-nQxgM1ZopUMcpMnu95kOSzI+9tJl4YDOZJomSTBGlRLpxfBopdwto7WvzoI87HuN0nQqVETgOsHi/C/po1rppA==", + "optional": true, "requires": { "arrify": "^2.0.0", "base64-js": "^1.3.0", @@ -6416,12 +2784,12 @@ } }, "google-gax": { - "version": "2.26.0", - "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-2.26.0.tgz", - "integrity": "sha512-D/8fjTydl9p3ejxuW3ZVHVZqKzz6zYaz5MMEucijsJonJ4RHqWAzHFKZMKSc7yyUiTEBGqG7nU2S8NUPUUYDEA==", + "version": "2.28.0", + "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-2.28.0.tgz", + "integrity": "sha512-kuqc8a4+CTCMBcF3tlOL7Sa74JWkTzcZxatAQTCVK35WToXkHnJ0qncFOJuegUv3EbV9IQY4j/+NZdFLv+lbTA==", "optional": true, "requires": { - "@grpc/grpc-js": "~1.3.0", + "@grpc/grpc-js": "~1.4.0", "@grpc/proto-loader": "^0.6.1", "@types/long": "^4.0.0", "abort-controller": "^3.0.0", @@ -6429,30 +2797,11 @@ "fast-text-encoding": "^1.0.3", "google-auth-library": "^7.6.1", "is-stream-ended": "^0.1.4", - "node-fetch": "^2.6.1", - "object-hash": "^2.1.1", - "proto3-json-serializer": "^0.1.1", - "protobufjs": "6.11.2", - "retry-request": "^4.0.0" - }, - "dependencies": { - "google-auth-library": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-7.10.0.tgz", - "integrity": "sha512-ICsqaU+lxMHVlDUzMrfVIEqnARw2AwBiZ/2KnNM6BcTf9Nott+Af87DTIzmlnW865p3REUP2MVL0xkPC3a61aQ==", - "optional": true, - "requires": { - "arrify": "^2.0.0", - "base64-js": "^1.3.0", - "ecdsa-sig-formatter": "^1.0.11", - "fast-text-encoding": "^1.0.0", - "gaxios": "^4.0.0", - "gcp-metadata": "^4.2.0", - "gtoken": "^5.0.4", - "jws": "^4.0.0", - "lru-cache": "^6.0.0" - } - } + "node-fetch": "^2.6.1", + "object-hash": "^2.1.1", + "proto3-json-serializer": "^0.1.1", + "protobufjs": "6.11.2", + "retry-request": "^4.0.0" } }, "google-p12-pem": { @@ -6468,6 +2817,12 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==" }, + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true + }, "gtoken": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-5.3.1.tgz", @@ -6492,6 +2847,15 @@ "har-schema": "^2.0.0" } }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -6504,6 +2868,35 @@ "integrity": "sha512-Gjzu0Xn7IagXVkSu9cSFuK1fqzwtLwFhNhVL8IFJijRNMgUttFbBSIAzKuSIrsFMO1+g1RlsoN49zPIbwPDMGQ==", "optional": true }, + "hasha": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", + "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", + "dev": true, + "requires": { + "is-stream": "^2.0.0", + "type-fest": "^0.8.0" + }, + "dependencies": { + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + } + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, "http-errors": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", @@ -6537,23 +2930,6 @@ "@tootallnate/once": "2", "agent-base": "6", "debug": "4" - }, - "dependencies": { - "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "optional": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "optional": true - } } }, "http-signature": { @@ -6573,21 +2949,14 @@ "requires": { "agent-base": "6", "debug": "4" - }, - "dependencies": { - "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } + } + }, + "i18next": { + "version": "21.5.3", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-21.5.3.tgz", + "integrity": "sha512-9R8127a0/N5okiD7eeo6XBPQsHgHsLr1GdQEa35Pcw305ArC9KZDLs9kbgdn3xuVUNYlVu8+gWzz73eVkna0gA==", + "requires": { + "@babel/runtime": "^7.12.0" } }, "iconv-lite": { @@ -6599,15 +2968,15 @@ } }, "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.9.tgz", + "integrity": "sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ==", "dev": true }, "image-size": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.0.0.tgz", - "integrity": "sha512-JLJ6OwBfO1KcA+TvJT+v8gbE6iWbj24LyDNFgFEN0lzegn6cC6a/p3NIDaepMsJjQjlUWqIC7wJv8lBFxPNjcw==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.0.1.tgz", + "integrity": "sha512-VAwkvNSNGClRw9mDHhc5Efax8PLlsOGcUTh0T/LIriC8vPA3U5PdqXWqkz406MoYHMKW8Uf9gWr05T/rYB44kQ==", "requires": { "queue": "6.0.2" } @@ -6625,8 +2994,13 @@ "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "devOptional": true + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true }, "inflight": { "version": "1.0.6", @@ -6647,6 +3021,34 @@ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" }, + "is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "dev": true, + "requires": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + } + }, + "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-core-module": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", + "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -6656,8 +3058,7 @@ "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==", - "devOptional": true + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, "is-glob": { "version": "4.0.3", @@ -6668,12 +3069,45 @@ "is-extglob": "^2.1.1" } }, + "is-negated-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", + "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=", + "dev": true + }, + "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-obj": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", "optional": true }, + "is-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.2.tgz", + "integrity": "sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==", + "dev": true + }, + "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-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dev": true, + "requires": { + "is-unc-path": "^1.0.0" + } + }, "is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", @@ -6690,6 +3124,27 @@ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, + "is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "dev": true, + "requires": { + "unc-path-regex": "^0.1.2" + } + }, + "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==", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -6706,6 +3161,96 @@ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" }, + "istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true + }, + "istanbul-lib-hook": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", + "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", + "dev": true, + "requires": { + "append-transform": "^2.0.0" + } + }, + "istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "requires": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + } + }, + "istanbul-lib-processinfo": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz", + "integrity": "sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw==", + "dev": true, + "requires": { + "archy": "^1.0.0", + "cross-spawn": "^7.0.0", + "istanbul-lib-coverage": "^3.0.0-alpha.1", + "make-dir": "^3.0.0", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "uuid": "^3.3.3" + }, + "dependencies": { + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + } + } + }, + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "istanbul-reports": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.4.tgz", + "integrity": "sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, "jose": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/jose/-/jose-2.0.5.tgz", @@ -6721,13 +3266,12 @@ "dev": true }, "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "argparse": "^2.0.1" } }, "jsbn": { @@ -6735,6 +3279,12 @@ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, "json-bigint": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", @@ -6744,9 +3294,9 @@ } }, "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" }, "json-schema-traverse": { "version": "0.4.1", @@ -6764,6 +3314,24 @@ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" }, + "json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, "jsonwebtoken": { "version": "8.5.1", "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", @@ -6808,16 +3376,22 @@ } }, "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", "requires": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", - "json-schema": "0.2.3", + "json-schema": "0.4.0", "verror": "1.10.0" } }, + "just-extend": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", + "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", + "dev": true + }, "jwa": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", @@ -6829,30 +3403,15 @@ } }, "jwks-rsa": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/jwks-rsa/-/jwks-rsa-2.0.4.tgz", - "integrity": "sha512-iJqVCECYZZ+3oPmY1qXv3Fq+3ywDtuNEVBvG41pPlaR0zyGxa12nC0beAOBBUhETJmc05puS50mRQN4NkCGhmg==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/jwks-rsa/-/jwks-rsa-2.0.5.tgz", + "integrity": "sha512-fliHfsiBRzEU0nXzSvwnh0hynzGB0WihF+CinKbSRlaqRxbqqKf2xbBPgwc8mzf18/WgwlG8e5eTpfSTBcU4DQ==", "requires": { "@types/express-jwt": "0.0.42", "debug": "^4.3.2", "jose": "^2.0.5", "limiter": "^1.1.5", "lru-memoizer": "^2.1.4" - }, - "dependencies": { - "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } } }, "jws": { @@ -6874,6 +3433,11 @@ "type-check": "~0.4.0" } }, + "libphonenumber-js": { + "version": "1.9.42", + "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.9.42.tgz", + "integrity": "sha512-UBtU0ylpZPKPT8NLIyQJWj/DToMFxmo3Fm5m6qDc0LATvf0SY0qUhaurCEvukAB9Fo+Ia2Anjzqwoupaa64fXg==" + }, "limiter": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", @@ -6884,6 +3448,15 @@ "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", "integrity": "sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc=" }, + "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", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", @@ -6900,6 +3473,18 @@ "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" }, + "lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", + "dev": true + }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", + "dev": true + }, "lodash.includes": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", @@ -6941,10 +3526,26 @@ "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" }, - "lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", + "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", + "is-unicode-supported": "^0.1.0" + } + }, + "loglevel": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.0.tgz", + "integrity": "sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA==", + "dev": true + }, + "loglevel-plugin-prefix": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/loglevel-plugin-prefix/-/loglevel-plugin-prefix-0.8.4.tgz", + "integrity": "sha512-WpG9CcFAOjz/FtNht+QJeGpvVl/cdR6P0z6OcXSkr8wFJOsV2GRj2j10JLfjuA4aYkcKCNIEqRGCyTife9R8/g==", "dev": true }, "long": { @@ -6953,6 +3554,15 @@ "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", "optional": true }, + "loupe": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.1.tgz", + "integrity": "sha512-EN1D3jyVmaX4tnajVlfbREU4axL647hLec1h/PXAb8CPDMJiYitcWF2UeLVNttRqaIqQs4x+mRvXf+d+TlDrCA==", + "dev": true, + "requires": { + "get-func-name": "^2.0.0" + } + }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -6990,19 +3600,16 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "optional": true, "requires": { "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "optional": true - } } }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -7013,11 +3620,27 @@ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, "mime": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", @@ -7027,22 +3650,14 @@ "mime-db": { "version": "1.50.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.50.0.tgz", - "integrity": "sha512-9tMZCDlYHqeERXEHO9f/hKfNXhre5dK2eE/krIvUjZbS2KPcqGDfNShIWS1uW9XOTKQKqK6qbeOci18rbfW77A==", - "optional": true + "integrity": "sha512-9tMZCDlYHqeERXEHO9f/hKfNXhre5dK2eE/krIvUjZbS2KPcqGDfNShIWS1uW9XOTKQKqK6qbeOci18rbfW77A==" }, "mime-types": { - "version": "2.1.32", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz", - "integrity": "sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==", + "version": "2.1.33", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.33.tgz", + "integrity": "sha512-plLElXp7pRDd0bNZHw+nMd52vRYjLwQjygaNg7ddJ2uJtTlmnTCjWuPKxVu6//AdaRuME84SvLW91sIkBqGT0g==", "requires": { - "mime-db": "1.49.0" - }, - "dependencies": { - "mime-db": { - "version": "1.49.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz", - "integrity": "sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==" - } + "mime-db": "1.50.0" } }, "minimatch": { @@ -7056,30 +3671,132 @@ "minimist": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true }, "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "requires": { - "minimist": "^1.2.5" + "minimist": "^1.2.6" + }, + "dependencies": { + "minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" + } + } + }, + "mocha": { + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.1.3.tgz", + "integrity": "sha512-Xcpl9FqXOAYqI3j79pEtHBBnQgVXIhpULjGQa7DVb0Po+VzmSIK9kanAiWLHoRR/dbZ2qpdPshuXr8l1VaHCzw==", + "dev": true, + "requires": { + "@ungap/promise-all-settled": "1.1.2", + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.2", + "debug": "4.3.2", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.1.7", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "3.0.4", + "ms": "2.1.3", + "nanoid": "3.1.25", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "which": "2.0.2", + "workerpool": "6.1.5", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "dependencies": { + "glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "dev": true, + "requires": { + "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" + } + }, + "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 + }, + "nanoid": { + "version": "3.1.25", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.25.tgz", + "integrity": "sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q==", + "dev": true + }, + "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" + } + }, + "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 + } } }, + "module-not-found-error": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/module-not-found-error/-/module-not-found-error-1.0.1.tgz", + "integrity": "sha1-z4tP9PKWQGdNbN0CsOO8UjwrvcA=", + "dev": true + }, "moment": { "version": "2.29.1", "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==" }, "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "multimatch": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-4.0.0.tgz", + "integrity": "sha512-lDmx79y1z6i7RNx0ZGCPq1bzJ6ZoDDKbvh7jxr9SJcWLkShMzXrHbYVpTdnhNM5MXpDUxCQ4DgqVttVXlBgiBQ==", + "dev": true, + "requires": { + "@types/minimatch": "^3.0.3", + "array-differ": "^3.0.0", + "array-union": "^2.1.0", + "arrify": "^2.0.1", + "minimatch": "^3.0.4" + } }, "nanoid": { - "version": "3.1.28", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.28.tgz", - "integrity": "sha512-gSu9VZ2HtmoKYe/lmyPFES5nknFrHa+/DT9muUFWFMi6Jh9E1I7bkvlQ8xxf1Kos9pi9o8lBnIOkatMhKX/YUw==" + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.2.tgz", + "integrity": "sha512-CuHBogktKwpm5g2sRgv83jEy2ijFzBwMoYA60orPDR7ynsLijJDqgsi4RDGj3OJpy3Ieb+LYwiRmIOGyytgITA==" }, "natural-compare": { "version": "1.4.0", @@ -7092,10 +3809,40 @@ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" }, + "nise": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.1.tgz", + "integrity": "sha512-yr5kW2THW1AkxVmCnKEh4nbYkJdB3I7LUkiUgOvEkOp414mc2UMaHMA7pjq1nYowhdoJZGwEKGaQVbxfpWj10A==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.8.3", + "@sinonjs/fake-timers": ">=5", + "@sinonjs/text-encoding": "^0.7.1", + "just-extend": "^4.0.2", + "path-to-regexp": "^1.7.0" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "dev": true, + "requires": { + "isarray": "0.0.1" + } + } + } + }, "node-fetch": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.5.tgz", - "integrity": "sha512-mmlIVHJEu5rnIxgEgez6b9GgWXbkZj5YZ7fx+2r94a2E+Uirsp6HsPTPlomfdHtpt/B0cdKviwkoaM6pyvUOpQ==", + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", "requires": { "whatwg-url": "^5.0.0" } @@ -7105,11 +3852,207 @@ "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==" }, + "node-mocks-http": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/node-mocks-http/-/node-mocks-http-1.11.0.tgz", + "integrity": "sha512-jS/WzSOcKbOeGrcgKbenZeNhxUNnP36Yw11+hL4TTxQXErGfqYZ+MaYNNvhaTiGIJlzNSqgQkk9j8dSu1YWSuw==", + "dev": true, + "requires": { + "accepts": "^1.3.7", + "content-disposition": "^0.5.3", + "depd": "^1.1.0", + "fresh": "^0.5.2", + "merge-descriptors": "^1.0.1", + "methods": "^1.1.2", + "mime": "^1.3.4", + "parseurl": "^1.3.3", + "range-parser": "^1.2.0", + "type-is": "^1.6.18" + }, + "dependencies": { + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + } + } + }, + "node-preload": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", + "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", + "dev": true, + "requires": { + "process-on-spawn": "^1.0.0" + } + }, + "node-releases": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", + "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==", + "dev": true + }, "node-stream-zip": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/node-stream-zip/-/node-stream-zip-1.15.0.tgz", "integrity": "sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw==" }, + "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", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", + "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", + "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", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "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", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, "oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", @@ -7143,16 +4086,15 @@ } }, "opds-fetcher-parser": { - "version": "git+ssh://git@github.com/panaC/opds_fetcher_parser.git#efec695f50b386071ccf935396f0a8ea4750c9ae", - "integrity": "sha512-vhOHEBu7Bs9y0XHgGo8u6ntgrjAtclGZE61cP11F1HBwBnF8s7w+Vlagc7MJq2xMy0RuMN45lzVoco8Rl9petQ==", - "from": "opds-fetcher-parser@github:panaC/opds_fetcher_parser#efec695f50b386071ccf935396f0a8ea4750c9ae", + "version": "git+https://github.com/edrlab/opds_fetcher_parser.git#be1b96f67499102675676b03a5aee4d267924972", + "from": "git+https://github.com/edrlab/opds_fetcher_parser.git#be1b96f67499102675676b03a5aee4d267924972", "requires": { "moment": "^2.29.1", "nanoid": "^3.1.23", "r2-lcp-js": "^1.0.30", "r2-opds-js": "^1.0.35", "r2-shared-js": "^1.0.51", - "ts-fetch": "github:panaC/ts_fetch#7f585951111aa0e9cb7fe7f99bdd927a9261cd7b" + "ts-fetch": "github:edrlab/ts_fetch#bdb3444e608e6ae894a01cd703805e06ec991d66" } }, "optionator": { @@ -7173,11 +4115,46 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "optional": true, "requires": { "yocto-queue": "^0.1.0" } }, + "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", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "package-hash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", + "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.15", + "hasha": "^5.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" + } + }, "parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -7192,6 +4169,12 @@ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" }, + "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", @@ -7203,11 +4186,29 @@ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, "path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true + }, "pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", @@ -7218,6 +4219,66 @@ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + } + } + }, "prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -7229,6 +4290,15 @@ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, + "process-on-spawn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", + "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", + "dev": true, + "requires": { + "fromentries": "^1.2.0" + } + }, "progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", @@ -7254,9 +4324,9 @@ } }, "proto3-json-serializer": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/proto3-json-serializer/-/proto3-json-serializer-0.1.4.tgz", - "integrity": "sha512-bFzdsKU/zaTobWrRxRniMZIzzcgKYlmBWL1gAcTXZ2M7TQTGPI0JoYYs6bN7tpWj59ZCfwg7Ii/A2e8BbQGYnQ==", + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/proto3-json-serializer/-/proto3-json-serializer-0.1.5.tgz", + "integrity": "sha512-G395jcZkgNXNeS+6FGqd09TsXeoCs9wmBWByDiwFy7Yd7HD8pyfyvf6q+rGh7PhT4AshRpG4NowzoKYUtkNjKg==", "optional": true }, "protobufjs": { @@ -7278,14 +4348,6 @@ "@types/long": "^4.0.1", "@types/node": ">=13.7.0", "long": "^4.0.0" - }, - "dependencies": { - "@types/node": { - "version": "16.10.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.10.2.tgz", - "integrity": "sha512-zCclL4/rx+W5SQTzFs9wyvvyCwoK9QtBpratqz2IYJ3O8Umrn0m3nsTv0wQBk9sRGpvUe9CwPDrQFB10f1FIjQ==", - "optional": true - } } }, "proxy-addr": { @@ -7297,6 +4359,17 @@ "ipaddr.js": "1.9.1" } }, + "proxyquire": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/proxyquire/-/proxyquire-2.1.3.tgz", + "integrity": "sha512-BQWfCqYM+QINd+yawJz23tbBM40VIGXOdDw3X344KcclI/gtBbdWF6SlQ4nK/bYhF9d27KYug9WzljHC6B9Ysg==", + "dev": true, + "requires": { + "fill-keys": "^1.0.2", + "module-not-found-error": "^1.0.1", + "resolve": "^1.11.1" + } + }, "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", @@ -7346,15 +4419,21 @@ "inherits": "~2.0.3" } }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, "r2-lcp-js": { - "version": "1.0.32", - "resolved": "https://registry.npmjs.org/r2-lcp-js/-/r2-lcp-js-1.0.32.tgz", - "integrity": "sha512-cNpOc9ZWatCe7WPMQxVfA7p1xtynrU7eWZ/Cw41+zkKRUsOU4b+CTtwq1APMut+dMhnEHNIjDVUqxGBnFUa7dw==", + "version": "1.0.35", + "resolved": "https://registry.npmjs.org/r2-lcp-js/-/r2-lcp-js-1.0.35.tgz", + "integrity": "sha512-e/mrvjhA4W3eRbZsVP3eUn66wncIlK9tTROQARwmtasd2B7Q1csmfpypdWkMTMlJR1u68dduYVNMU4BUkCcKsg==", "requires": { "bindings": "^1.5.0", - "debug": "^4.3.2", + "debug": "^4.3.3", "moment": "^2.29.1", - "r2-utils-js": "^1.0.26", + "r2-utils-js": "^1.0.31", "request": "^2.88.2", "request-promise-native": "^1.0.9", "ta-json-x": "^2.5.3", @@ -7363,93 +4442,91 @@ }, "dependencies": { "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "requires": { "ms": "2.1.2" } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" } } }, "r2-opds-js": { - "version": "1.0.36", - "resolved": "https://registry.npmjs.org/r2-opds-js/-/r2-opds-js-1.0.36.tgz", - "integrity": "sha512-JQB92qGzJWTO1l8NkZ3AhsQXm197Ny2pnU2NtakjWPnASnw60DJxs14yxXHKjTDZZzLI+XzsWYJJ6BKitIN55w==", - "requires": { - "debug": "^4.3.2", - "r2-lcp-js": "^1.0.31", - "r2-shared-js": "^1.0.52", - "r2-utils-js": "^1.0.26", + "version": "1.0.39", + "resolved": "https://registry.npmjs.org/r2-opds-js/-/r2-opds-js-1.0.39.tgz", + "integrity": "sha512-x7Ds5sY0w/N65DQ/OQAUy8wpBXTODklVEurHlt7peO0MeGki4PMYsnM9FUitrWxqJj0NQtNDOkS24GF8GbFPdA==", + "requires": { + "@xmldom/xmldom": "^0.8.0", + "debug": "^4.3.3", + "r2-lcp-js": "^1.0.34", + "r2-shared-js": "^1.0.55", + "r2-utils-js": "^1.0.30", "ta-json-x": "^2.5.3", - "tslib": "^2.3.1", - "xmldom": "^0.6.0" + "tslib": "^2.3.1" }, "dependencies": { "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "requires": { "ms": "2.1.2" } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" } } }, "r2-shared-js": { - "version": "1.0.52", - "resolved": "https://registry.npmjs.org/r2-shared-js/-/r2-shared-js-1.0.52.tgz", - "integrity": "sha512-GYPdqK7FPUSczC68ZHqz3gFL98VZU/UCQtlgknxvJdDrM7+2Pz805X6iMUMzr1mkL203/Wl8mm+O5BsjQnc8tw==", + "version": "1.0.59", + "resolved": "https://registry.npmjs.org/r2-shared-js/-/r2-shared-js-1.0.59.tgz", + "integrity": "sha512-hcSc9a00zWaETKSRcDk8qhAT9zUXfVGgnD1g+BLS/bMvUnl7wkn3JdowXGwMyYS1bb985tCSIwzq215LRhYhzQ==", "requires": { - "debug": "^4.3.2", + "@xmldom/xmldom": "^0.8.1", + "debug": "^4.3.4", "fast-deep-equal": "^3.1.3", - "image-size": "^1.0.0", - "mime-types": "^2.1.32", + "he": "^1.2.0", + "image-size": "^1.0.1", + "mime-types": "^2.1.35", "moment": "^2.29.1", - "r2-lcp-js": "^1.0.31", - "r2-utils-js": "^1.0.26", - "slugify": "^1.6.0", + "r2-lcp-js": "^1.0.35", + "r2-utils-js": "^1.0.31", + "slugify": "^1.6.5", "ta-json-x": "^2.5.3", "tslib": "^2.3.1", - "xmldom": "^0.6.0", "xpath": "^0.0.32", "yazl": "^2.5.1" }, "dependencies": { "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "requires": { "ms": "2.1.2" } }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "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" + } } } }, "r2-utils-js": { - "version": "1.0.26", - "resolved": "https://registry.npmjs.org/r2-utils-js/-/r2-utils-js-1.0.26.tgz", - "integrity": "sha512-8t9JIafLP1IXtpCcEqRxSlLtHrGPai3qidAq3Xe3sQTCNv29WZtHPglGSZX95BPPFDhIQfM9CiVvkbgReFFZ4Q==", + "version": "1.0.31", + "resolved": "https://registry.npmjs.org/r2-utils-js/-/r2-utils-js-1.0.31.tgz", + "integrity": "sha512-MUtInLoqkwxNFJa9s7vjY2uDpxz1+ei3/x6KVefbuOEDE7KYKtuSUIwPhXgn6uSizZeN/A+2hZK/zi7s5q9fpA==", "requires": { - "@types/xmldom": "^0.1.31", - "debug": "^4.3.2", - "filehound": "^1.17.4", - "node-stream-zip": "^1.14.0", + "debug": "^4.3.3", + "filehound": "^1.17.5", + "node-stream-zip": "^1.15.0", "reflect-metadata": "^0.1.13", "request": "^2.88.2", "request-promise-native": "^1.0.9", @@ -7462,20 +4539,24 @@ }, "dependencies": { "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "requires": { "ms": "2.1.2" } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" } } }, + "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" + } + }, "range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -7503,17 +4584,40 @@ "util-deprecate": "^1.0.1" } }, + "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" + } + }, "reflect-metadata": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" }, + "regenerator-runtime": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" + }, "regexpp": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true }, + "release-zalgo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", + "dev": true, + "requires": { + "es6-error": "^4.0.1" + } + }, "request": { "version": "2.88.2", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", @@ -7542,9 +4646,14 @@ }, "dependencies": { "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" } } }, @@ -7569,15 +4678,25 @@ "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "optional": true + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, + "resolve": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", + "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", + "dev": true, + "requires": { + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, "resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -7598,25 +4717,14 @@ "requires": { "debug": "^4.1.1", "extend": "^3.0.2" - }, - "dependencies": { - "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "optional": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "optional": true - } } }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, "rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -7626,10 +4734,19 @@ "glob": "^7.1.3" } }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, "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==" + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" }, "safer-buffer": { "version": "2.1.2", @@ -7637,13 +4754,9 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" }, "send": { "version": "0.17.1", @@ -7692,6 +4805,15 @@ } } }, + "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" + } + }, "serve-static": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", @@ -7703,6 +4825,12 @@ "send": "0.17.1" } }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, "setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", @@ -7731,24 +4859,43 @@ "signal-exit": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.5.tgz", - "integrity": "sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ==", - "optional": true + "integrity": "sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ==" }, - "slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "sinon": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-13.0.1.tgz", + "integrity": "sha512-8yx2wIvkBjIq/MGY1D9h1LMraYW+z1X0mb648KZnKSdvLasvDu7maa0dFaNYdTDczFgbjNw2tOmWdTk9saVfwQ==", "dev": true, "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" + "@sinonjs/commons": "^1.8.3", + "@sinonjs/fake-timers": "^9.0.0", + "@sinonjs/samsam": "^6.1.1", + "diff": "^5.0.0", + "nise": "^5.1.1", + "supports-color": "^7.2.0" + }, + "dependencies": { + "@sinonjs/fake-timers": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.0.0.tgz", + "integrity": "sha512-+shXA2X7KNP7H7qNbQTJ3SA+NQc0pZDSBrdvFSRwF8sAo/ohw+ZQFD8Moc+gnz51+1eRXtEQBpKWPiQ4jsRC/w==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0" + } + } } }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, "slugify": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.0.tgz", - "integrity": "sha512-FkMq+MQc5hzYgM86nLuHI98Acwi3p4wX+a5BO9Hhw4JdK4L7WueIiZ4tXEobImPqBz2sVcV0+Mu3GRB30IGang==" + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.5.tgz", + "integrity": "sha512-8mo9bslnBO3tr5PEVFzMPIWwWnipGS0xVbYf65zxDqfNwmzYn1LpiKNrR6DlClusuvo+hDHd1zKpmfAe83NQSQ==" }, "snakeize": { "version": "0.1.0", @@ -7756,6 +4903,26 @@ "integrity": "sha1-EMCI2LWOsHazIpu1oE4jLOEmQi0=", "optional": true }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "spawn-wrap": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", + "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", + "dev": true, + "requires": { + "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" + } + }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -7763,9 +4930,9 @@ "dev": true }, "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", "requires": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -7808,43 +4975,39 @@ "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=" }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "optional": true, - "requires": { - "safe-buffer": "~5.2.0" - }, - "dependencies": { - "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==", - "optional": true - } - } - }, "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==", - "devOptional": true, "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "optional": true, + "requires": { + "safe-buffer": "~5.2.0" + } + }, "strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "devOptional": true, "requires": { "ansi-regex": "^5.0.1" } }, + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true + }, "strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -7866,6 +5029,12 @@ "has-flag": "^4.0.0" } }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, "ta-json-x": { "version": "2.5.3", "resolved": "https://registry.npmjs.org/ta-json-x/-/ta-json-x-2.5.3.tgz", @@ -7874,40 +5043,6 @@ "reflect-metadata": "^0.1.13" } }, - "table": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz", - "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==", - "dev": true, - "requires": { - "ajv": "^8.0.1", - "lodash.clonedeep": "^4.5.0", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ajv": { - "version": "8.6.3", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.3.tgz", - "integrity": "sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - } - } - }, "teeny-request": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-7.1.3.tgz", @@ -7919,14 +5054,17 @@ "node-fetch": "^2.6.1", "stream-events": "^1.0.5", "uuid": "^8.0.0" - }, - "dependencies": { - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "optional": true - } + } + }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" } }, "text-table": { @@ -7935,6 +5073,21 @@ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "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" + } + }, "toidentifier": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", @@ -7960,12 +5113,11 @@ "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=" }, "ts-fetch": { - "version": "git+ssh://git@github.com/panaC/ts_fetch.git#7f585951111aa0e9cb7fe7f99bdd927a9261cd7b", - "integrity": "sha512-2/l4Nka27XgPGCK7PZL8DNFW1BYcf28uPaoYAmF05L94bmvgYx0vkqTAXVRWz2hle7AE5xdBRfk7/06w0nWikg==", - "from": "ts-fetch@github:panaC/ts_fetch#7f585951111aa0e9cb7fe7f99bdd927a9261cd7b", + "version": "github:edrlab/ts_fetch#bdb3444e608e6ae894a01cd703805e06ec991d66", + "from": "github:edrlab/ts_fetch#bdb3444e608e6ae894a01cd703805e06ec991d66", "requires": { "fetch-cookie": "^1.0.0", - "node-fetch": "^2.6.1", + "node-fetch": "^2.6.7", "tough-cookie": "^4.0.0" }, "dependencies": { @@ -7981,11 +5133,153 @@ } } }, + "ts-morph": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-4.3.3.tgz", + "integrity": "sha512-yauxRJM4Vo+KvpJFgL4Mp9PtFjwZVrt54eP3RkLIXnaaAY5TGVHTLqN2OnLGwf6YjyqkDLAKprZVOUTvVEz6ZQ==", + "dev": true, + "requires": { + "@dsherret/to-absolute-glob": "^2.0.2", + "chalk": "^2.4.2", + "code-block-writer": "^10.0.0", + "fs-extra": "^8.1.0", + "glob-parent": "^5.1.0", + "globby": "^10.0.1", + "is-negated-glob": "^1.0.0", + "multimatch": "^4.0.0", + "typescript": "3.0.1 - 3.6.4" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "globby": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", + "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.0.3", + "glob": "^7.1.3", + "ignore": "^5.1.1", + "merge2": "^1.2.3", + "slash": "^3.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "typescript": { + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.6.4.tgz", + "integrity": "sha512-unoCll1+l+YK4i4F8f22TaNVPRHcD9PA3yCuZ8g5e0qGqlVlJ/8FSateOLLSagn+Yg5+ZwuPkL8LFUc0Jcvksg==", + "dev": true + } + } + }, + "ts-node": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.4.0.tgz", + "integrity": "sha512-g0FlPvvCXSIO1JDF6S232P5jPYqBkRL9qly81ZgAOSU7rwI0stphCgd2kLiCrU9DjQCrJMWEqcNSjQL02s6d8A==", + "dev": true, + "requires": { + "@cspotcode/source-map-support": "0.7.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "yn": "3.1.1" + }, + "dependencies": { + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + } + } + }, "tslib": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" }, + "tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -8008,6 +5302,12 @@ "prelude-ls": "^1.2.1" } }, + "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 + }, "type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", @@ -8023,15 +5323,106 @@ "mime-types": "~2.1.24" } }, + "typed-i18next": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/typed-i18next/-/typed-i18next-0.1.2.tgz", + "integrity": "sha512-3Zn04Enaz55WSLKKxj31+pYSvWicYpFAMdIClcErtxLdwU6p1aZ9QU9vhMwYE0qrXSxBTIvViZSy5J54arhJqQ==", + "dev": true, + "requires": { + "@types/fs-extra": "^8.0.0", + "chalk": "^2.4.2", + "commander": "^3.0.2", + "fs-extra": "^8.1.0", + "loglevel": "^1.6.4", + "loglevel-plugin-prefix": "^0.8.4", + "ts-morph": "^4.2.0", + "upath": "^1.2.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, "typedarray-to-buffer": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "optional": true, "requires": { "is-typedarray": "^1.0.0" } }, + "typescript": { + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.4.tgz", + "integrity": "sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA==", + "dev": true + }, + "typescript-eslint": { + "version": "0.0.1-alpha.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-0.0.1-alpha.0.tgz", + "integrity": "sha512-1hNKM37dAWML/2ltRXupOq2uqcdRQyDFphl+341NTPXFLLLiDhErXx8VtaSLh3xP7SyHZdcCgpt9boYYVb3fQg==", + "dev": true + }, + "unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", + "dev": true + }, "unique-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", @@ -8095,6 +5486,11 @@ "util-deprecate": "~1.0.1" } }, + "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==" + }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -8105,6 +5501,12 @@ } } }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true + }, "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -8114,9 +5516,9 @@ } }, "urijs": { - "version": "1.19.7", - "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.7.tgz", - "integrity": "sha512-Id+IKjdU0Hx+7Zx717jwLPsPeUqz7rAtuVBRLLs+qn+J2nf9NGITWVCxcijgYxBqe83C7sqsQPs6H1pyz3x9gA==" + "version": "1.19.10", + "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.10.tgz", + "integrity": "sha512-EzauQlgKuJgsXOqoMrCiePBf4At5jVqRhXykF3Wfb8ZsOBMxPcfiVBcsHXug4Aepb/ICm2PIgqAUGMelgdrWEg==" }, "util-deprecate": { "version": "1.0.2", @@ -8129,9 +5531,10 @@ "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" }, "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "optional": true }, "v8-compile-cache": { "version": "2.3.0", @@ -8139,6 +5542,11 @@ "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", "dev": true }, + "validator": { + "version": "13.7.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", + "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==" + }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -8192,17 +5600,28 @@ "isexe": "^2.0.0" } }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", "dev": true }, + "workerpool": { + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.5.tgz", + "integrity": "sha512-XdKkCK0Zqc6w3iTxLckiuJ81tiD/o5rBE/m+nXpRCB+/Sq4DqkfXZ/x0jW02DG1tGsfUGXbTJyZDP+eu67haSw==", + "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==", - "optional": true, "requires": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -8218,7 +5637,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "optional": true, "requires": { "imurmurhash": "^0.1.4", "is-typedarray": "^1.0.0", @@ -8232,11 +5650,6 @@ "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", "optional": true }, - "xmldom": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.6.0.tgz", - "integrity": "sha512-iAcin401y58LckRZ0TkI4k0VSM1Qg0KGSc3i8rU+xrxe19A/BN1zHyVSJY7uoutVlaTSzYyk/v5AmkewAP7jtg==" - }, "xpath": { "version": "0.0.32", "resolved": "https://registry.npmjs.org/xpath/-/xpath-0.0.32.tgz", @@ -8245,8 +5658,7 @@ "y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "optional": true + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" }, "yallist": { "version": "4.0.0", @@ -8257,7 +5669,6 @@ "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "optional": true, "requires": { "cliui": "^7.0.2", "escalade": "^3.1.1", @@ -8271,8 +5682,19 @@ "yargs-parser": { "version": "20.2.9", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "optional": true + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==" + }, + "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", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + } }, "yauzl": { "version": "2.10.0", @@ -8291,11 +5713,16 @@ "buffer-crc32": "~0.2.3" } }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true + }, "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==", - "optional": true + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" } } } diff --git a/webhooks/functions/package.json b/webhooks/functions/package.json index 358c68f6..1ac1996a 100644 --- a/webhooks/functions/package.json +++ b/webhooks/functions/package.json @@ -1,29 +1,60 @@ { "name": "functions", - "version": "0.1.0", "description": "Cloud Functions for Firebase", "scripts": { - "lint": "eslint .", "serve": "firebase emulators:start --only functions", "shell": "firebase functions:shell", "start": "npm run shell", "deploy": "firebase deploy --only functions", - "logs": "firebase functions:log" + "logs": "firebase functions:log", + "build": "tsc", + "test:run": "mocha --recursive --require ts-node/register", + "test": "nyc npm run test:run -- src/**/*.test.ts", + "lint": "eslint src/**/*.ts", + "lint:fix": "eslint src/**/*.ts --fix", + "scene-typed": "echo \"// npm run scene-typed \n\n\nexport type TSdkScene = \"$(for I in `ls ../../sdk/custom/scenes | cut -d \".\" -f1`; do echo \"'$I' |\"; done) | sed 's/..$/;/' > src/typings/sdkScene.d.ts", + "handler-typed": "echo \"// npm run handler-typed \n\n\nexport type TSdkHandler = \"$(for I in `cat ../../sdk/webhooks/ActionsOnGoogleFulfillment.yaml | grep \"name:\" | cut -d' ' -s -f3`; do echo \"'$I' |\"; done) | sed 's/..$/;/' > src/typings/sdkHandler.d.ts", + "i18n-typed": "typed-i18next -i src/translation -o src/typings/i18n.d.ts", + "typed": "npm run i18n-typed && npm run handler-typed && npm run scene-typed" }, "engines": { - "node": "16" + "node": "14" }, - "main": "index.js", + "main": "build/index.js", "dependencies": { "@assistant/conversation": "^3.0.0", - "firebase-admin": "^9.11.1", - "firebase-functions": "^3.14.1", - "opds-fetcher-parser": "github:panaC/opds_fetcher_parser#efec695f50b386071ccf935396f0a8ea4750c9ae" + "class-transformer": "^0.4.0", + "class-validator": "^0.13.1", + "firebase-admin": "^9.8.0", + "firebase-functions": "^3.16.0", + "i18next": "^21.5.3", + "opds-fetcher-parser": "git+https://github.com/edrlab/opds_fetcher_parser.git#be1b96f67499102675676b03a5aee4d267924972", + "reflect-metadata": "^0.1.13", + "validator": "^13.7.0" }, "devDependencies": { - "eslint": "^7.6.0", + "@types/chai": "^4.3.0", + "@types/mocha": "^9.0.0", + "@types/proxyquire": "^1.3.28", + "@types/sinon": "^10.0.9", + "@types/validator": "^13.7.1", + "@typescript-eslint/eslint-plugin": "^5.3.1", + "@typescript-eslint/parser": "^5.3.1", + "chai": "^4.3.6", + "eslint": "^8.2.0", "eslint-config-google": "^0.14.0", - "firebase-functions-test": "^0.2.0" + "express-request-mock": "^3.1.0", + "firebase-functions-test": "^0.2.0", + "mocha": "^9.1.3", + "node-mocks-http": "^1.11.0", + "nyc": "^15.1.0", + "proxyquire": "^2.1.3", + "rimraf": "^3.0.2", + "sinon": "^13.0.1", + "ts-node": "^10.4.0", + "typed-i18next": "^0.1.2", + "typescript": "^4.4.4", + "typescript-eslint": "0.0.1-alpha.0" }, "private": true } diff --git a/webhooks/functions/src/constants.ts b/webhooks/functions/src/constants.ts new file mode 100644 index 00000000..0baf83ea --- /dev/null +++ b/webhooks/functions/src/constants.ts @@ -0,0 +1,31 @@ + +export let NAME = ""; +export const NAME_EN = "EDRLAB"; +export const NAME_FR = "EDRLAB"; +export const setName = (lang: TLang) => NAME = lang === 'fr' ? NAME_FR : NAME_EN; + +export const API_BASE_URL = "https://storage.googleapis.com/audiobook_edrlab/feed.json"; +export const EDRLAB_FUNCTION_URL = "https://storage.googleapis.com/audiobook_edrlab/feed.json"; +// export const ALL_PUBLICATION_LIST_URL = "https://storage.googleapis.com/audiobook_edrlab/navigation/all.json"; +export const BOOKSHELF_URL = 'https://storage.googleapis.com/audiobook_edrlab/groups/popular.json'; +export const SEARCH_URL = 'https://europe-west1-audiobooks-a6348.cloudfunctions.net/indexer?url=https://storage.googleapis.com/audiobook_edrlab/navigation/all.json&query={query}'; +export const SEARCH_URL_FN = (value: string) => SEARCH_URL.replace("{query}", value); +export const THEMATIC_LIST_URL = 'https://storage.googleapis.com/audiobook_edrlab/navigation/thematic_list.json'; +export const GENRE_LIST_URL = 'https://storage.googleapis.com/audiobook_edrlab/navigation/genre_list.json'; +export const DEFAULT_LANGUAGE: TDefaultLanguage = 'en'; + +export type TDefaultLanguage = Extract; + +export const PADDING_GROUP = 5; +export const PADDING_PUB = 3; +export const LAST_SEEN_THRESHOLD = 72; + +export const PROJECT_ID = 'edrlab-1'; + +export const TIMER = 8000; + +export type TLang = 'fr' | 'en'; + + +// init +setName(DEFAULT_LANGUAGE); diff --git a/webhooks/functions/src/controller/Assistant.ts b/webhooks/functions/src/controller/Assistant.ts new file mode 100644 index 00000000..b32684f3 --- /dev/null +++ b/webhooks/functions/src/controller/Assistant.ts @@ -0,0 +1,126 @@ +import {BaseApp, conversation, ConversationV3, ConversationV3App, OmniHandler} from '@assistant/conversation'; +import {OpdsFetcher} from 'opds-fetcher-parser'; +import {DEFAULT_LANGUAGE, PROJECT_ID, setName, TIMER, TLang} from '../constants'; +import {StorageModel} from '../model/storage.model'; +import {THandlerFn} from '../type'; +import {TSdkHandler} from '../typings/sdkHandler'; +import {TSdkScene} from '../typings/sdkScene'; +import {enter as selectionEnter} from './handler/selection'; +import {Machine} from './Machine'; +import {ok} from 'assert'; +import {WebpubError} from '../error'; +import {AccountLinkingStatus} from '@assistant/conversation/dist/api/schema'; + +export class Assistant { + private _app: OmniHandler & BaseApp & ConversationV3App; + private _storageModel: StorageModel | undefined; + private _fetcher: OpdsFetcher | undefined; + private _locale: TLang; + + constructor({ + storageModel, + fetcher, + }: { + storageModel?: StorageModel, + fetcher?: OpdsFetcher, + }) { + this._app = conversation({ + verification: process.env['NODE_ENV'] === 'PRODUCTION' ? PROJECT_ID : undefined, + debug: process.env['NODE_ENV'] === 'development' ? true : false, + }); + + this._locale = DEFAULT_LANGUAGE; + + this._app.catch((conv, error) => { + console.error('APP CATCH ERROR', error); + + if (conv.scene.next) { + conv.scene.next.name = 'actions.scene.END_CONVERSATION'; + } + + // error instanceOf WebpubError !== True ?! why? + if ((error as WebpubError).code === 401) { + console.log('WEBPUB ERROR code 401'); + + if (this._locale === 'en') { + conv.add('Sorry, it is not possible to go further. Please unlink your EDRLAB account from your assistant, then link them again.'); + } else if (this._locale === 'fr') { + conv.add('Désolé, impossible d\'aller plus loin : dissociez votre compte CAÉB de votre assistant puis ré-associez les.'); + } + } else { + if (this._locale === 'en') { + conv.add('Oops, something went wrong. I will exit the app. Feel free to reopen it as soon as possible.'); + } else if (this._locale === 'fr') { + conv.add('Oups, quelque chose s\'est mal passé.'); + } + } + }); + + if (storageModel) { + this._storageModel = storageModel; + } + + if (fetcher) { + this._fetcher = fetcher; + } + + // app.middleware((_conv, _framework) => {}); + } + + public handle = (path: TSdkHandler, fn: THandlerFn) => { + this._app.handle(path, async (conv) => { + const timerP = new Promise((_, rej) => setTimeout(() => rej(new Error('TIMEOUT')), TIMER)); + const machine = new Machine(conv); + + const locale = (conv.user.locale || '').split('-')[0]; + console.log('LOCALE=', locale); + ok(locale === 'fr' || locale === 'en', 'locale not known ' + locale); + setName(locale); + this._locale = locale; + + await machine.setLanguage(locale); + + const sceneName = conv.scene.name; + const linkingStatus = conv.user.accountLinkingStatus; + const linked = linkingStatus === AccountLinkingStatus.Linked; + const notLinked = !linked; + const bearerToken = linked ? conv.user.params.bearerToken : undefined; + + console.info('ASSISTANT:', path); + console.info('scene.name=', sceneName); + console.info('linkingStatus', linkingStatus); + ok(sceneName, 'scene name not found'); + ok(linkingStatus, 'linking status not found'); + + const sceneWhereYouHaveToBeAuthenticated: TSdkScene[] = [ + 'collections', 'home_user', 'player', 'player_prequel', 'search', 'selection', + ]; + const linkedScene = sceneWhereYouHaveToBeAuthenticated.findIndex((v) => v === sceneName) > -1; + if (notLinked && linkedScene) { + machine.say('error.noBearerTokenInLinkedScene'); + + console.error('NOT_LINKED IN LINKED_SCENE', linkingStatus, bearerToken, sceneName, path); + machine.nextScene = 'actions.scene.END_CONVERSATION'; + return; + } + + await machine.begin({bearerToken, storageModel: this._storageModel, fetcher: this._fetcher, path}); + + await Promise.race([timerP, Promise.resolve(fn(machine))]); + + // HACK + // google actions platform doesn't allow to set the same next scene name than the actual in the 'on_enter' handler scene + // it's a platform limitation for a basic infinite loop I think + if (path === 'selection__intent__selects_book' && conv.scene.next?.name as TSdkScene === 'selection' && machine.getSessionState('selection') === 'FINISH') { + await Promise.race([timerP, Promise.resolve(selectionEnter(machine))]); + } + + await machine.end(); + }); + }; + + public get app() { + return this._app; + } +} + diff --git a/webhooks/functions/src/controller/Machine.ts b/webhooks/functions/src/controller/Machine.ts new file mode 100644 index 00000000..2386688f --- /dev/null +++ b/webhooks/functions/src/controller/Machine.ts @@ -0,0 +1,736 @@ +import {ok} from 'assert'; +import {AuthenticationStorage, http as httpOpdsFetcherParser, OpdsFetcher} from 'opds-fetcher-parser'; +import {API_BASE_URL, DEFAULT_LANGUAGE, EDRLAB_FUNCTION_URL, LAST_SEEN_THRESHOLD, PADDING_GROUP, PADDING_PUB, TLang} from '../constants'; +import {ISessionScene, TKeySessionScene, TKindSelection, TStateAuthentication} from '../model/storage.interface'; +import {StorageModel} from '../model/storage.model'; +import {i18n, TI18n, TI18nKey} from '../translation'; +import {IConversationV3, TSdkScene2} from '../type'; +import {resetSelection} from './handler/selection.helper'; +import validator from 'validator'; +import {Media} from '@assistant/conversation'; +import {MediaType, OptionalMediaControl} from '@assistant/conversation/dist/api/schema'; +import {IOpdsPublicationView, IOpdsResultView} from 'opds-fetcher-parser/build/src/interface/opds'; +import {TSdkHandler} from '../typings/sdkHandler'; +import {WebpubError} from '../error'; +import {stall} from '../tools'; +import {IWebPubView} from 'opds-fetcher-parser/build/src/interface/webpub'; + +export class Machine { + private _conv: IConversationV3; + private _i18n: TI18n; + private _model: StorageModel | undefined; + private _fetcher: OpdsFetcher | undefined; + private _locale: TLang; + + private _sayAcc: string; + + constructor(conv: IConversationV3) { + ok(conv); + + this._i18n = i18n; + this._model = undefined; + this._fetcher = undefined; + this._conv = conv; + + this._sayAcc = ''; + this._locale = DEFAULT_LANGUAGE; + } + + public async begin({ + storageModel, + bearerToken, + fetcher, + path, + }: { + storageModel?: StorageModel, + bearerToken?: string, + fetcher?: OpdsFetcher; + path: TSdkHandler; + }) { + console.info('Machine BEGIN'); + + if (storageModel) { + this._model = storageModel; + } else { + if (typeof bearerToken === 'string') { + const Reset = '\x1b[0m'; + const FgRed = '\x1b[31m'; + + console.log(`${FgRed}BEARER=${bearerToken}${Reset}`); + + this._model = await StorageModel.create(bearerToken); + } else { + console.info('No Bearer Token Available'); + } + } + + if (fetcher) { + this._fetcher = fetcher; + } else { + if (typeof bearerToken === 'string') { + const authenticationStorage = new AuthenticationStorage(); + authenticationStorage.setAuthenticationToken({ + accessToken: bearerToken, + authenticationUrl: API_BASE_URL, + }); + authenticationStorage.setAuthenticationToken({ + accessToken: bearerToken, + authenticationUrl: EDRLAB_FUNCTION_URL, + }); + const http = new httpOpdsFetcherParser(undefined, authenticationStorage, this._locale); + this._fetcher = new OpdsFetcher(http); + } + } + + // check new Session and keep or remove the data session + this.removeSessionDataWhenNewUserSession(path); + } + + public async end() { + console.info('Machine END'); + + if (this._model) { + await this._model.save(); + } + + if (this._sayAcc) { + if (/.*<.*>.*<\/.*>.*/.test(this._sayAcc)) { + this._sayAcc = '' + this._sayAcc + ''; + } + console.info('SAY: ', this._sayAcc); + this._conv.add(this._sayAcc); + } + } + + public say(key: TI18nKey, options?: object) { + this._sayAcc += this._i18n.t(key, options) + '\n'; + } + + public t(key: TI18nKey, options?: object) { + ok(this._i18n); + return this._i18n.t(key, options); + } + + public saidSomething(): boolean { + return !!this._sayAcc; + } + + public get isLinked() { + return this._conv.user.accountLinkingStatus; + } + + public setLanguage(locale: TLang) { + this._locale = locale; + return this._i18n.changeLanguage(locale); + } + + public set nextScene(scene: TSdkScene2) { + const obj = this._conv.scene; + + if (!obj.next) { + obj.next = {}; + } + obj.next.name = scene; + } + + public getSessionState(scene: TKeySessionScene) { + ok(this._model); + return this._model.store.session.scene[scene].state; + } + + public set authenticationState(s: TStateAuthentication) { + ok(this._model); + this._model.store.user.authentication = s; + } + + public get authenticationState() { + ok(this._model); + return this._model.store.user.authentication; + } + + public get isARegularUser() { + const lastSeenTime = this._conv.user.lastSeenTime; + if (lastSeenTime) { + const currentDate = new Date().getTime() / 1000 / 60; + const lastSeenDate = Date.parse(lastSeenTime) / 1000 / 60; + + const hours = currentDate - lastSeenDate; + + if (hours <= LAST_SEEN_THRESHOLD) { + return true; + } + } + + return false; + } + + public setSessionState(scene: T, state: ISessionScene[T]['state']) { + ok(this._model); + this._model.store.session.scene[scene].state = state; + } + + + public get playingNumber() { + ok(this._model); + return this._model.store.player.history.size; + } + + public get playingHistorySortByDate() { + ok(this._model); + return new Map( + [...this._model.store.player.history] + .sort(([, {date: dateA}], [, {date: dateB}]) => dateB.getTime() - dateA.getTime()), + ); + } + + public async getCurrentPlayingInfo(cur = this._model?.store.player.current) { + ok(this._model); + ok(cur); + const url = cur.url || ''; + const chapter = (cur.index || 0) + 1; + const {title, author, description} = await this.getInfoFromOpdsPub(url); + + return {chapter, title, author, description}; + } + + public async getInfoFromOpdsPub(opdsPubUrl: string) { + if (!this.isValidHttpUrl(opdsPubUrl)) { + throw new Error('not a valid opdsPubUrl in getInfoFromOpdsPub'); + } + const {publications} = await this.feedRequest(opdsPubUrl); + + const pub = Array.isArray(publications) ? publications[0] : undefined; + const title: string = pub?.title || this.t('noTitle'); + const author: string = ((pub && Array.isArray(pub?.authors)) ? pub?.authors : [])[0]?.name || ''; + const description: string = (pub?.description) || ''; + return {title, author, description}; + } + + public debugSelectionSession() { + ok(this._model); + console.info(this._model.store.session.scene.selection); + } + + public get selectionSession() { + ok(this._model); + return this._model.store.session.scene.selection; + } + + public set selectionSession(d: ISessionScene['selection']) { + ok(this._model); + this._model.store.session.scene.selection = d; + } + + public get playerPrequelSession() { + ok(this._model); + return this._model.store.session.scene.player_prequel; + } + + public set playerPrequelSession(d: ISessionScene['player_prequel']) { + ok(this._model); + this._model.store.session.scene.player_prequel = d; + } + + public get searchSession() { + ok(this._model); + return this._model.store.session.scene.search; + } + + public set searchSession(d: ISessionScene['search']) { + ok(this._model); + this._model.store.session.scene.search = d; + } + + public isCurrentlyPlaying(c = this.playerCurrent) { + const {url, time, index} = c; + // if (!playing) { + // return false; // @TODO: need to define the use of this boolean + // } + if (url === undefined || time === undefined || index === undefined) { + return false; + } + if (!this.isValidHttpUrl(url)) { + throw new Error('not valid playing url'); + } + if (time === 0 && index === 0) { + return false; + } + return true; + } + + public isPlayingAvailableInPlayer() { + return !!this.playerCurrent.url; + } + + public isPlayingAvailableInPlayerPrequelSession() { + return !!this.playerPrequelSession.player.url; + } + + public isCurrentlyPlayingInPlayerPrequelSession() { + return this.isCurrentlyPlaying(this.playerPrequelSession.player); + } + + public get playerCurrent() { + ok(this._model); + return this._model.store.player.current; + } + + public initAndGoToSelectionSession({ + kind, from, url, + }: { + kind: TKindSelection, + from: TSdkHandler, + url: string, + }) { + // @ts-ignore + if (!this.isValidHttpUrl(url) && !url.startsWith('data://')) { // data:// for recent books + throw new Error('not a valid url'); + } + this.selectionSession = { + from, kind, url, nextUrlCounter: 0, state: 'RUNNING', nbChoice: 0, + }; + this.nextScene = 'selection'; + } + + public async selectGroup(url: string, number: number) { + ok(this._model); + if (!this.isValidHttpUrl(url)) { + throw new Error('url not valid'); + } + + const group = await this.getGroupFromNumberInSelectionWithUrl(url, number); + if (group) { + const groupUrl = group.groupUrl; + if (!this.isValidHttpUrl(groupUrl)) { + throw new Error('group url not valid'); + } + this.selectionSession.url = group.groupUrl; + this.selectionSession.kind = 'PUBLICATION'; // set to publication mode + this.selectionSession.nextUrlCounter = 0; // reset + this.selectionSession.state = 'RUNNING'; + this.selectionSession.nbChoice = 0; // reset + + this.debugSelectionSession(); + + return true; + } + return false; + } + + public async selectPublication(url: string, number: number) { + ok(this._model); + // @ts-ignore + if (!this.isValidHttpUrl(url) && !url.startsWith('data://')) { // recent books + throw new Error('url not valid'); + } + + let pub: { + title: string; + author: string; + opdsPubUrl: string; + } | undefined; + + if (url.startsWith('data://')) { + const dataStr = url.substring('data://'.length); + const data = JSON.parse(dataStr); + ok(Array.isArray(data)); + + const urlFromData = data[number - 1]; + if (this.isValidHttpUrl(urlFromData)) { + const {publications} = await this.feedRequest(urlFromData); + const publication = Array.isArray(publications) ? publications[0] : undefined; + const author: string = ((publication && Array.isArray(publication?.authors)) ? publication?.authors : [])[0]?.name || ''; + pub = { + title: publication?.title || this.t('noTitle'), + author, + opdsPubUrl: urlFromData, + }; + } + } else { + pub = await this.getPublicationFromNumberInSelectionWithUrl(url, number); + } + + if (pub) { + const {opdsPubUrl} = pub; + this.initPlayerInPlayerPrequelSession(opdsPubUrl); + + return true; + } + return false; + } + + public resetSelectionSession() { + this.selectionSession.state = 'DEFAULT'; + this.selectionSession.from = 'main'; + this.selectionSession.url = ''; + this.selectionSession.nbChoice = 0; // reset + this.selectionSession.nextUrlCounter = 0; // reset + } + + public initPlayerInPlayerPrequelSession(opdsPubUrl: string) { + ok(this._model); + const pubFromHistory = this._model.store.player.history.get(opdsPubUrl); + this.playerPrequelSession.player = { + url: opdsPubUrl, + index: pubFromHistory?.index ?? 0, + time: pubFromHistory?.time ?? 0, + }; + } + + public resetPlayerInPLayerPrequelSession() { + this.playerPrequelSession.player = {}; + } + + public initPlayerCurrentWithPlayerPrequelSession() { + const {index, time, url} = this.playerPrequelSession.player; + this.playerCurrent.index = index; + this.playerCurrent.time = time; + this.playerCurrent.url = url; + } + + public async getPublicationFromNumberInSelectionWithUrl(url: string, number: number) { + const {publication} = await this.getPublicationFromFeed(url); + + const pub = publication[number - 1]; + if (pub) { + return pub; + } + return undefined; + } + + public async getGroupFromNumberInSelectionWithUrl(url: string, number: number) { + const {groups} = await this.getGroupsFromFeed(url); + + const group = groups[number - 1]; + if (group) { + return group; + } + return undefined; + } + + public get selectBookNumber() { + try { + const v = this._conv.intent.params?.number.resolved; + if (v && typeof v === 'number') { + return v; + } + } catch {} + return undefined; + } + + public get querySearch() { + try { + const v = this._conv.intent.params?.query?.resolved; + if (v && typeof v === 'string') { + return v; + } + } catch {} + return undefined; + } + + public setQuerySearch(scene: TSdkHandler = 'main') { + const query = this.querySearch; + if (!query) { + this.searchSession = { + query: '', + state: 'RUNNING', + from: scene, + }; + } else { + this.searchSession = { + query, + state: 'FINISH', + from: scene, + }; + } + } + + public async getNexLinkPublicationWithUrl(url: string) { + const feed = await this.feedRequest(url); + const nextUrl = (feed.links?.next || [])[0]?.url; + + if (this.isValidHttpUrl(nextUrl) && await this.isPublicationAvailable(nextUrl)) { + return nextUrl; + } + return undefined; + } + + public async getNexLinkGroupWithUrl(url: string) { + const feed = await this.feedRequest(url); + const nextUrl = (feed.links?.next || [])[0]?.url; + if (this.isValidHttpUrl(nextUrl) && await this.isGroupAvailable(nextUrl)) { + return nextUrl; + } + return undefined; + } + + public async isPublicationAvailable(url: string) { + const {publication} = await this.getPublicationFromFeed(url); + if (publication.length) { + return true; + } + return false; + } + + public async getPublicationFromFeed(url: string) { + const feed = await this.feedRequest(url); + + const list = (feed.publications || []) + .filter(({entryLinks: l}) => { + return Array.isArray(l) && l[0]?.url && this.isValidHttpUrl(l[0].url); + }) + .filter(({openAccessLinks: l}) => { + return Array.isArray(l) && l[0]?.url && this.isValidHttpUrl(l[0].url); + }) + .slice(0, PADDING_PUB) + .map(({title, authors, entryLinks}) => ({ + title: title, + author: Array.isArray(authors) && authors.length ? authors[0].name : '', + opdsPubUrl: entryLinks ? entryLinks[0].url : '', + })); + + return {publication: list, length: feed.metadata?.numberOfItems || list.length}; + } + + public async isGroupAvailable(url: string) { + const {groups} = await this.getGroupsFromFeed(url); + if (groups.length) { + return true; + } + return false; + } + + public async getGroupsFromFeed(url: string) { + const feed = await this.feedRequest(url); + + const list = (feed.groups || []) + .filter(({selfLink: l}) /* : l is IOpdsLinkView[]*/ => { + return l?.title && l?.url && this.isValidHttpUrl(l.url); + }) + .slice(0, PADDING_GROUP) + .map(({selfLink: {title, url}}) => ({ + title: title, + groupUrl: url, + })); + return {groups: list, length: feed.metadata?.numberOfItems || list.length}; + } + + public async getGroupSizeWithUrl(url: string) { + const feed = await this.feedRequest(url); + const size = feed.groups?.length; + return size; + } + + public async getPublicationSizeWithUrl(url: string) { + const feed = await this.feedRequest(url); + const size = feed.publications?.length; + return size; + } + + public persistMediaPlayer(finished: boolean = false) { + if (!this._conv.request.context?.media) { + return; + } + + ok(this._model); + const _progress = this._conv.context.media?.progress || '0'; + const progress = finished ? 0 : parseInt(_progress, 10); + const index = finished ? 0 : (this._conv.request.context?.media?.index || 0); + const url = this._model.store.player.current.url; + if (!this.isValidHttpUrl(url)) { + return; + } + + this._model.store.player.current.index = index; + this._model.store.player.current.time = progress; + + this._model.store.player.history.set(url, { + index, + time: progress, + date: new Date(), + }); + + console.info(`PERSIST MEDIA PLAYER - URL= ${url}, T=${progress}, I=${index}`); + } + + public mediaPlayerAck() { + this._conv.add(new Media({ + mediaType: MediaType.MediaStatusACK, + })); + } + + public get currentPlayingUrl() { + ok(this._model); + const url = this._model.store.player.current.url; + if (url && validator.isURL(url)) { + return url; + } + return undefined; + } + + public async player() { + ok(this._model); + const url = this.currentPlayingUrl; + if (!this.isValidHttpUrl(url)) { + throw new Error('no opdsPublication url'); + } + + const {publications} = await this.feedRequest(url); + const webpubUrl: string = (Array.isArray(publications) && Array.isArray(publications[0]?.openAccessLinks)) ? publications[0].openAccessLinks[0]?.url : ''; + + if (!this.isValidHttpUrl(webpubUrl)) { + throw new Error('no webpub url'); + } + + const startIndexRaw = this._model.store.player.current.index; + const startTimeRaw = this._model.store.player.current.time; + + const webpub = await this.webpubRequest(webpubUrl); + + let startIndex = (startIndexRaw && startIndexRaw > -1 && startIndexRaw <= webpub.readingOrders.length) ? + startIndexRaw : + 0; + + const startTime = (startTimeRaw && startTimeRaw > -1) ? + startTimeRaw <= (webpub.readingOrders[startIndex].duration || Infinity) ? + startTimeRaw : + (startIndex += 1, startTimeRaw) : + 0; + + startIndex = startIndex <= webpub.readingOrders.length ? + startIndex : + 0; + + const mediaObjects = webpub.readingOrders + .map((v, i) => ({ + name: `${webpub.title || ''} - ${i + 1}`, + url: v.url, + image: { + large: { + alt: webpub.title, + url: webpub.cover || '', + }, + }, + })); + + console.log('Media list'); + console.log(mediaObjects); + console.log('Start Index = ', startIndex, ' Start Time = ', startTime, ' Start Time'); + + this._conv.add( + new Media({ + mediaObjects: mediaObjects, + mediaType: MediaType.Audio, + optionalMediaControls: [OptionalMediaControl.Paused, OptionalMediaControl.Stopped], + startOffset: `${startTime}s`, + firstMediaObjectIndex: startIndex, + }), + ); + } + + private webpubRequest: (url: string) => Promise = stall(async (url: string) => { + if (!validator.isURL(url)) { + throw new Error('url not valid : ' + url); + } + if (!this._fetcher) { + throw new Error('no fetcher available !'); + } + try { + const webpub = await this._fetcher.webpubRequest(url); + return webpub; + } catch (e) { + const error = new WebpubError(`${e?.toString ? e.toString() : e}`); + error.code = 401; + throw error; + } + }); + + private feedRequest: (url: string) => Promise = stall(async (url: string) => { + if (!this._fetcher) { + throw new Error('no fetcher available !'); + } + + // recent books hack + if (url.startsWith('data://')) { + const dataStr = url.substring('data://'.length); + const data: string[] = JSON.parse(dataStr); + ok(Array.isArray(data)); + + const dataFiltered = data + .filter((v) => typeof v === 'string' && this.isValidHttpUrl(v)) + .slice(0, PADDING_PUB); // FIXME: Little Hacky : need to add pagination instead of slicing 3 items + const feedResultP = dataFiltered.map((url) => this._fetcher!.feedRequest(url)); + const feedResult = await Promise.all(feedResultP); + const publications = feedResult + .map(({publications}) => Array.isArray(publications) ? publications[0] : undefined) + .filter((v) => !!v) as IOpdsPublicationView[]; + + const feed: IOpdsResultView = { + title: 'recent books', + publications, + }; + + return feed; + } + + if (!validator.isURL(url)) { + throw new Error('url not valid : ' + url); + } + let feed: IOpdsResultView = { + title: '', + publications: [], + }; + try { + feed = await this._fetcher.feedRequest(url); + } catch (e) { + console.error('FETCHER ERROR START'); + console.error(e); + console.error('FETCHER ERROR END'); + } + return feed; + }); + + private removeSessionDataWhenNewUserSession(p: TSdkHandler) { + if (!this._model) { + return; + } + + // the sessionId from google is not regular when a user session is in progress + // if homeUserScene then reset the session + + if (p === 'home_user__on_enter') { + const id = this._conv.session.id; + + // reset session ! + console.info('MIDDLEWARE :: new SESSION'); + this._model.store.session = { + scene: { + 'home_user': { + state: 'DEFAULT', + }, + 'selection': resetSelection(), + 'search': { + state: 'DEFAULT', + query: '', + from: 'main', + }, + 'player_prequel': { + state: 'DEFAULT', + from: 'main', + player: {}, + }, + }, + }; + this._model.store.user.sessionId = id || 'no ID'; + } + } + + private isValidHttpUrl(url: string | undefined): url is string { + if (url && validator.isURL(url, { + protocols: ['https', 'http'], + })) { + return true; + } + return false; + } +} diff --git a/webhooks/functions/src/controller/handler/collections.ts b/webhooks/functions/src/controller/handler/collections.ts new file mode 100644 index 00000000..cd943459 --- /dev/null +++ b/webhooks/functions/src/controller/handler/collections.ts @@ -0,0 +1,56 @@ +import { BOOKSHELF_URL, GENRE_LIST_URL, NAME, THEMATIC_LIST_URL } from "../../constants"; +import { THandlerFn } from "../../type"; +import { Assistant } from "../Assistant"; +import { missing } from "./void"; + +export const collections = (app: Assistant) => { + + app.handle("collections__on_enter", enter); + app.handle("collections__intent__bookshelf", bookshelf); + app.handle("collections__intent__by_genre", genre); + app.handle("collections__intent__by_theme", theme); + app.handle("collections__intent__fallback", help); + app.handle("collections__intent__fallback_end", missing); + app.handle("collections__intent__help", help); + app.handle("collections__intent__silence", help); + app.handle("collections__intent__silence_end", missing); + +} + +const enter: THandlerFn = (m) => { + m.say('collections.enter.1'); +} + +const bookshelf: THandlerFn = (m) => { + + m.initAndGoToSelectionSession({ + kind: 'PUBLICATION', + url: BOOKSHELF_URL, + from: 'collections__intent__bookshelf', + }); +} + +const genre: THandlerFn = (m) => { + + m.initAndGoToSelectionSession({ + kind: 'GROUP', + url: GENRE_LIST_URL, + from: 'collections__intent__by_genre', + }); +} + +const theme: THandlerFn = (m) => { + + m.initAndGoToSelectionSession({ + kind: 'GROUP', + url: THEMATIC_LIST_URL, + from: 'collections__intent__by_theme', + }); +} + +const help: THandlerFn = (m) => { + + m.say('collections.help.1'); + + m.nextScene = "collections"; +} diff --git a/webhooks/functions/src/controller/handler/home_new_user.ts b/webhooks/functions/src/controller/handler/home_new_user.ts new file mode 100644 index 00000000..3a82e3ea --- /dev/null +++ b/webhooks/functions/src/controller/handler/home_new_user.ts @@ -0,0 +1,63 @@ +import { NAME } from "../../constants"; +import { THandlerFn } from "../../type"; +import { Assistant } from "../Assistant"; +import { missing } from "./void"; + +export const home_new_user = (app: Assistant) => { + + app.handle("home_new_user__on_enter", enter); + app.handle("home_new_user__intent__fallback", help); + app.handle("home_new_user__intent__fallback_end", missing); + app.handle("home_new_user__intent__help", help); + app.handle("home_new_user__intent__maybe_later", maybeLater); + app.handle("home_new_user__intent__no", no); + app.handle("home_new_user__intent__repeat", repeat); + app.handle("home_new_user__intent__silence", help); + app.handle("home_new_user__intent__silence_end", missing); + app.handle("home_new_user__intent__yes", yes); + +} + +const enter: THandlerFn = (m) => { + + // m.say("home_new_user.enter.first.1", { name: NAME }); + // m.say("home_new_user.enter.first.2", { name: NAME }); + + m.say("home_new_user.help.1", {name: NAME}); + m.say("home_new_user.help.2", {name: NAME}); +} + +const help: THandlerFn = (m) => { + + // m.say("home_new_user.help.1", {name: NAME}); + // m.say("home_new_user.help.2", {name: NAME}); + + m.nextScene = "home_new_user"; +} + +const maybeLater: THandlerFn = (m) => { + + // m.say("home_new_user.maybeLater.1", {name: NAME}); + // m.say("home_new_user.maybeLater.2") + + m.nextScene = "home_new_user_maybe_later"; +} + +const yes: THandlerFn = (m) => { + + // do nothing + +} + +const no: THandlerFn = (m) => { + + // m.say("home_new_user.no.1", {name: NAME}); + // m.say("home_new_user.no.2", {name: NAME}); + + m.nextScene = "home_new_user_no"; +} + +const repeat: THandlerFn = (m) => { + + m.nextScene = "home_new_user"; +} \ No newline at end of file diff --git a/webhooks/functions/src/controller/handler/home_new_user_maybe_later.ts b/webhooks/functions/src/controller/handler/home_new_user_maybe_later.ts new file mode 100644 index 00000000..bbe07ff2 --- /dev/null +++ b/webhooks/functions/src/controller/handler/home_new_user_maybe_later.ts @@ -0,0 +1,49 @@ +import { NAME } from "../../constants"; +import { THandlerFn } from "../../type"; +import { Assistant } from "../Assistant"; +import { missing } from "./void"; + +export const home_new_user_maybe_later = (app: Assistant) => { + + app.handle("home_new_user_maybe_later__on_enter", enter); + app.handle("home_new_user_maybe_later__intent__fallback", help); + app.handle("home_new_user_maybe_later__intent__fallback_end", missing); + app.handle("home_new_user_maybe_later__intent__help", help); + app.handle("home_new_user_maybe_later__intent__repeat", repeat); + app.handle("home_new_user_maybe_later__intent__silence", help); + app.handle("home_new_user_maybe_later__intent__silence_end", missing); + app.handle("home_new_user_maybe_later__intent__link_account", linkAccount); + app.handle("home_new_user_maybe_later__intent__learn_more", learnMore); + +} + +const enter: THandlerFn = (m) => { + // m.say("home_new_user.maybeLater.1", { name: NAME }); + // m.say("home_new_user.maybeLater.2", { name: NAME }); + + m.say("home_new_user_maybe_later.help.1", {name: NAME}); +} + +const linkAccount: THandlerFn = (m) => { + + m.nextScene = "home_new_user_AccountLinking"; +} + +const help: THandlerFn = (m) => { + + // m.say("home_new_user_maybe_later.help.1", {name: NAME}); + + m.nextScene = "home_new_user_maybe_later"; +} + +const repeat: THandlerFn = (m) => { + + m.nextScene = "home_new_user_maybe_later"; +} + +const learnMore: THandlerFn = (m) => { + + // m.say("info.about.1", { name: NAME }); + + m.nextScene = "info"; +} \ No newline at end of file diff --git a/webhooks/functions/src/controller/handler/home_new_user_no.ts b/webhooks/functions/src/controller/handler/home_new_user_no.ts new file mode 100644 index 00000000..c7809ee6 --- /dev/null +++ b/webhooks/functions/src/controller/handler/home_new_user_no.ts @@ -0,0 +1,47 @@ +import { NAME } from "../../constants"; +import { THandlerFn } from "../../type"; +import { Assistant } from "../Assistant"; +import { missing } from "./void"; + +export const home_new_user_no = (app: Assistant) => { + + app.handle("home_new_user_no__on_enter", enter); + app.handle("home_new_user_no__intent__fallback", help); + app.handle("home_new_user_no__intent__fallback_end", missing); + app.handle("home_new_user_no__intent__help", help); + app.handle("home_new_user_no__intent__no", no); + app.handle("home_new_user_no__intent__repeat", repeat); + app.handle("home_new_user_no__intent__silence", help); + app.handle("home_new_user_no__intent__silence_end", missing); + app.handle("home_new_user_no__intent__yes", yes); + +} + +const enter: THandlerFn = (m) => { + m.say('home_new_user.no.1', {name: NAME}); + m.say('home_new_user.no.2', {name: NAME}); +} + +const help: THandlerFn = (m) => { + + m.say("home_new_user_no.help.1", {name: NAME}); + + m.nextScene = "home_new_user_no"; +} + +const yes: THandlerFn = (m) => { + + // m.say("info.about.1", {name: NAME}); + + m.nextScene = "info"; +} + +const no: THandlerFn = (m) => { + + m.nextScene = "actions.scene.END_CONVERSATION"; +} + +const repeat: THandlerFn = (m) => { + + m.nextScene = "home_new_user_no"; +} \ No newline at end of file diff --git a/webhooks/functions/src/controller/handler/home_user.ts b/webhooks/functions/src/controller/handler/home_user.ts new file mode 100644 index 00000000..4532a0a5 --- /dev/null +++ b/webhooks/functions/src/controller/handler/home_user.ts @@ -0,0 +1,138 @@ +import { BOOKSHELF_URL, GENRE_LIST_URL, NAME, PADDING_PUB } from "../../constants"; +import { THandlerFn } from "../../type"; +import { Assistant } from "../Assistant"; +import { missing } from "./void"; + +export const home_user = (app: Assistant) => { + + app.handle("home_user__intent__search", search); + app.handle("home_user__intent__collections", collections); + app.handle("home_user__intent__bookshelf", bookshelf); + app.handle("home_user__on_enter", enter); + app.handle("home_user__intent__fallback", help); + app.handle("home_user__intent__fallback_end", missing); + app.handle("home_user__intent__help", help); + app.handle("home_user__intent__repeat", repeat); + app.handle("home_user__intent__silence", help); + app.handle("home_user__intent__silence_end", missing); + app.handle("home_user__intent__recent_books", recentBooks); + app.handle("home_user__intent__current_book", currentBook); + +} + +const enter: THandlerFn = async (m) => { + + const state = m.getSessionState("home_user"); + const newlyLinked = m.authenticationState === "NEWLY_LINKED"; + const playing = m.isPlayingAvailableInPlayer(); + const regularUser = m.isARegularUser; + + if (state === "SESSION") { + // aka there is a session : the user discovered the app + + // "What would you like to do?" + // m.say("home_user.enter.regular.1"); + + // "Would you like to search for a specific book or author, get a recommendation or would you prefer starting a book from your selection ?" + m.say("home_user.enter.newlyUser.2"); + + } else if (state === "REPEAT") { + + m.say("home_user.help.1"); + m.say("home_user.help.2"); + + m.setSessionState("home_user", "SESSION"); + + } else if (newlyLinked) { + + m.say("home_user.enter.newlyUser.1", { name: NAME }); + m.say("home_user.enter.newlyUser.2", { name: NAME }); + + } else if (playing) { + + const {title, chapter, author} = await m.getCurrentPlayingInfo(); + const readingNumber = m.playingNumber - 1; + + m.say("home_user.enter.playing.1", {chapterNumber: chapter, titleAndAuthor: `${title}${author ? `, ${author}` : ''}`}); + if (readingNumber > 0) { + m.say("home_user.enter.playing.2", {readingNumber: readingNumber}); + } + m.say("home_user.enter.playing.3"); + m.say("home_user.enter.regular.1"); + m.say("home_user.enter.regular.2"); + + } else if (regularUser) { + // regularUser + + m.say("home_user.enter.regular.1"); + m.say("home_user.enter.regular.2"); + } else { + // occasionalUser + + // "Would you like to search for a specific book or author, get a recommendation or would you prefer starting a book from your selection ?" + m.say("home_user.enter.newlyUser.2"); + } + + m.setSessionState("home_user", "SESSION"); + + // "Would you like to search for a specific book or author, get a recommendation or would you prefer starting a book from your selection ?" + // m.say("home_user.enter.newlyUser.2"); +} + +const search: THandlerFn = (m) => { + + // query from search intent + m.setQuerySearch(); + m.nextScene = "search"; +} + +const collections: THandlerFn = (m) => { + m.nextScene = "collections"; +} + +const bookshelf: THandlerFn = (m) => { + + m.initAndGoToSelectionSession({ + kind: 'PUBLICATION', + from: "home_user__intent__bookshelf", + url: BOOKSHELF_URL, + }); +} + +const recentBooks: THandlerFn = (m) => { + + const history = m.playingHistorySortByDate; + const urls = [...history.keys()]; + m.initAndGoToSelectionSession({ + kind: 'PUBLICATION', + from: "home_user__intent__recent_books", + url: 'data://' + JSON.stringify(urls.slice(0, PADDING_PUB)), // data url with an array of webpub links + }) +} + +const currentBook: THandlerFn = (m) => { + + const isPlaying = !!m.currentPlayingUrl; + if (isPlaying) { + + m.playerPrequelSession.from = "home_user__intent__current_book"; + m.nextScene = 'player_prequel'; + } else { + + m.say('home_user.currentBook.1'); + m.nextScene = 'home_user'; + } +} + +const help: THandlerFn = (m) => { + + m.setSessionState("home_user", "REPEAT"); + + m.nextScene = "home_user"; +} + +const repeat: THandlerFn = (m) => { + + m.setSessionState("home_user", "REPEAT"); + m.nextScene = "home_user"; +} diff --git a/webhooks/functions/src/controller/handler/index.ts b/webhooks/functions/src/controller/handler/index.ts new file mode 100644 index 00000000..18547590 --- /dev/null +++ b/webhooks/functions/src/controller/handler/index.ts @@ -0,0 +1,67 @@ +import { NAME } from "../../constants"; +import { Assistant } from "../Assistant"; +import { collections } from "./collections"; +import { home_new_user } from "./home_new_user"; +import { home_new_user_maybe_later } from "./home_new_user_maybe_later"; +import { home_new_user_no } from "./home_new_user_no"; +import { home_user } from "./home_user"; +import { info } from "./info"; +import { main } from "./main"; +import { player } from "./player"; +import { player_prequel } from "./player_prequel"; +import { search } from "./search"; +import { selection } from "./selection"; + +export const handler = (app = new Assistant({})) => { + + app.handle('main', main); + + app.handle('cancel', (m) => { + + m.persistMediaPlayer(); + m.say('bye.1', {name: NAME}); + }); + + app.handle('fallback_1', (m) => { + + m.persistMediaPlayer(); + m.say('fallback.1'); + }); + + app.handle('fallback_2', (m) => { + m.say('fallback.2'); + }); + + app.handle('fallback_end', (m) => { + + m.persistMediaPlayer(); + m.say('bye.1', {name: NAME}); + }); + + app.handle('silence_1', (m) => { + + m.persistMediaPlayer(); + m.say('silence.1'); + }); + + app.handle('silence_2', (m) => { + m.say('silence.2'); + }); + + app.handle('silence_end', (m) => { + + m.persistMediaPlayer(); + m.say('bye.1', {name: NAME}); + }); + + home_user(app); + home_new_user(app); + home_new_user_no(app); + home_new_user_maybe_later(app); + info(app); + selection(app); + player(app); + search(app); + collections(app); + player_prequel(app); +} diff --git a/webhooks/functions/src/controller/handler/info.ts b/webhooks/functions/src/controller/handler/info.ts new file mode 100644 index 00000000..da547507 --- /dev/null +++ b/webhooks/functions/src/controller/handler/info.ts @@ -0,0 +1,47 @@ +import { NAME } from "../../constants"; +import { THandlerFn } from "../../type"; +import { Assistant } from "../Assistant"; +import { missing } from "./void"; + +export const info = (app: Assistant) => { + + app.handle("info__on_enter", enter); + app.handle("info__intent__yes", membership); + app.handle("info__intent__no", no); + app.handle("info__intent__fallback", help); + app.handle("info__intent__fallback_end", missing); + app.handle("info__intent__help", help); + app.handle("info__intent__repeat", repeat); + app.handle("info__intent__silence", help); + app.handle("info__intent__silence_end", missing); + +} + +const enter: THandlerFn = (m) => { + m.say('info.about.1', {name: NAME}); +} + +const membership: THandlerFn = (m) => { + + m.say('info.yesOrMembership.1', {name: NAME}); + + m.nextScene = "actions.scene.END_CONVERSATION"; +}; + +const no: THandlerFn = (m) => { + + m.say("bye.1"); + + m.nextScene = "actions.scene.END_CONVERSATION"; +}; + +const help: THandlerFn = (m) => { + + // m.say('info.help.1', {name: NAME}); + + m.nextScene = "info"; +} + +const repeat: THandlerFn = (m) => { + m.nextScene = 'info'; +}; diff --git a/webhooks/functions/src/controller/handler/main.ts b/webhooks/functions/src/controller/handler/main.ts new file mode 100644 index 00000000..69ecce06 --- /dev/null +++ b/webhooks/functions/src/controller/handler/main.ts @@ -0,0 +1,28 @@ +import { AccountLinkingStatus } from "@assistant/conversation/dist/api/schema"; +import { NAME } from "../../constants"; +import { TMachine } from "../../type"; + +export const main = (machine: TMachine) => { + + const isLinked = machine.isLinked; + + if (isLinked === AccountLinkingStatus.Linked) { + + machine.say("main.welcome.linked.1", { name: NAME}); + + if (machine.authenticationState === "NO_LINKED") { + machine.authenticationState = "NEWLY_LINKED"; + } else if (machine.authenticationState === "NEWLY_LINKED") { + machine.authenticationState = "LINKED"; + } // authenticationState === LINKED raise the end of the state machine + + machine.nextScene = "home_user"; + } else { + + machine.say("main.welcome.noLinked.1", { name: NAME}); + + // machine.authenticationState = "NO_LINKED"; + + machine.nextScene = "home_new_user"; + } +} \ No newline at end of file diff --git a/webhooks/functions/src/controller/handler/player.ts b/webhooks/functions/src/controller/handler/player.ts new file mode 100644 index 00000000..f51eb862 --- /dev/null +++ b/webhooks/functions/src/controller/handler/player.ts @@ -0,0 +1,44 @@ +import { THandlerFn } from "../../type"; +import { Assistant } from "../Assistant"; + +export const player = (app: Assistant) => { + + app.handle("player__on_enter", enter); + app.handle("player__intent__media_status_stopped", stopped); + app.handle("player__intent__media_status_finished", finished); + app.handle("player__intent__media_status_paused", paused); + app.handle("player__intent__media_status_failed", failed); + +} + +const enter: THandlerFn = async (m) => { + + await m.player(); +} + +const stopped: THandlerFn = async (m) => { + + m.persistMediaPlayer(); + m.mediaPlayerAck(); + + m.nextScene = "actions.scene.END_CONVERSATION"; +} + +const paused: THandlerFn = async (m) => { + + m.persistMediaPlayer(); + m.mediaPlayerAck(); +} + +const failed: THandlerFn = async (m) => { + + m.say("error.1"); + m.nextScene = "home_user"; +} + +const finished: THandlerFn = async (m) => { + + m.persistMediaPlayer(true); + + m.nextScene = "home_user"; +}; diff --git a/webhooks/functions/src/controller/handler/player_prequel.ts b/webhooks/functions/src/controller/handler/player_prequel.ts new file mode 100644 index 00000000..c5212bda --- /dev/null +++ b/webhooks/functions/src/controller/handler/player_prequel.ts @@ -0,0 +1,139 @@ +import { t } from "i18next"; +import { THandlerFn, TMachine } from "../../type"; +import { TSdkScene } from "../../typings/sdkScene"; +import { Assistant } from "../Assistant"; +import { missing } from "./void"; + +export const player_prequel = (app: Assistant) => { + + app.handle("player_prequel__on_enter", enter); + app.handle("player_prequel__intent__player_prequel_summary", summary); + app.handle("player_prequel__intent__player_prequel_back", back); + app.handle("player_prequel__intent__player_prequel_resume", resume); + app.handle("player_prequel__intent__player_prequel_start", start); + app.handle("player_prequel__intent__help", help); + app.handle("player_prequel__intent__repeat", repeat); + app.handle("player_prequel__fallback", help); + app.handle("player_prequel__fallback_end", missing); + app.handle("player_prequel__silence", help); + app.handle("player_prequel__silence_end", help); + +} + +const enter: THandlerFn = async (m) => { + + const from = m.playerPrequelSession.from; + // const fromScene = from.split("__")[0] as TSdkScene; + // const state = m.getSessionState('player_prequel'); + + if (from === "home_user__intent__current_book") { + + // from home user last book + + // go to player direct + // check if playing available + + m.playerPrequelSession.player = m.playerCurrent; + const isPlayingAvailable = m.isPlayingAvailableInPlayerPrequelSession(); + + if (isPlayingAvailable) { + m.playerPrequelSession.from = "main"; + + await startPlaying(m); + return ; + } + } + + // from selection + + // > vous avez choisi + const { title } = await m.getCurrentPlayingInfo(m.playerPrequelSession.player); + + const isPlaying = m.isCurrentlyPlayingInPlayerPrequelSession(); + if (isPlaying) { + m.say("player_prequel.enter.1", { title, resume: m.t('player_prequel.enter.1-continue') }); + m.say("player_prequel.enter.2", { resumeOrStart: m.t('player_prequel.enter.2-continue') }); + + } else { + + m.say("player_prequel.enter.1", { title, resume: m.t('player_prequel.enter.1-begin') }); + m.say("player_prequel.enter.2", { resumeOrStart: m.t('player_prequel.enter.2-begin') }); + } + +} + +// help scene +// player_prequel.help + +// +// A tout moment vous pouvez demandé le lecture du résumé du livre, +// demandé qui l'as écrit, obtenir le temps d'écoute du livre, +// ou tout simplement naviguer dans la table des matiere. + +const startPlaying = async (m: TMachine) => { + + const isRegular = m.isARegularUser; + if (!isRegular) { + m.say("player.explain"); + } + + m.initPlayerCurrentWithPlayerPrequelSession(); + const { title } = await m.getCurrentPlayingInfo(); + const resume = m.isCurrentlyPlaying(); + if (resume) { + m.say("player.start2", { title }); + } else { + m.say("player.start", { title }); + } + m.nextScene = "player"; + + m.resetPlayerInPLayerPrequelSession(); + m.resetSelectionSession(); +} + +const back: THandlerFn = async (m) => { + + m.resetPlayerInPLayerPrequelSession(); + m.selectionSession.state = "RUNNING"; + m.selectionSession.nbChoice = 0; + m.nextScene = 'selection'; +}; + +const resume: THandlerFn = async (m) => { + + await startPlaying(m); +}; + +const start: THandlerFn = async (m) => { + + await startPlaying(m); +}; + +const repeat: THandlerFn = async (m) => { + + m.nextScene = "player_prequel"; +} + +const help: THandlerFn = async (m) => { + + // help message + m.say("player_prequel.help.1"); +} + +const summary: THandlerFn = async (m) => { + + const {description} = await m.getCurrentPlayingInfo(m.playerPrequelSession.player); + + if (!description) { + + // no description + m.say("player_prequel.noSummary"); + } else { + m.say("player_prequel.summarize", {summary: description}); + } + + m.say("player_prequel.summary.1"); + + // loop + // m.nextScene = 'player_prequel'; +}; \ No newline at end of file diff --git a/webhooks/functions/src/controller/handler/search.ts b/webhooks/functions/src/controller/handler/search.ts new file mode 100644 index 00000000..47a4eba3 --- /dev/null +++ b/webhooks/functions/src/controller/handler/search.ts @@ -0,0 +1,53 @@ +import { SEARCH_URL_FN } from "../../constants"; +import { THandlerFn } from "../../type"; +import { Assistant } from "../Assistant"; + +export const search = (app: Assistant) => { + + app.handle("search__on_enter", enter); + app.handle("search__intent__search", query); + app.handle("search__intent__search_query", query); +} + +const enter: THandlerFn = (m) => { + + const { state, query, from } = m.searchSession; + + if (state === "RUNNING") { + if (from === "selection__on_enter") { + m.say("search.enter.2"); + m.searchSession.from = 'main'; // reset + m.nextScene = "home_user"; // FIX: avoid infinite loop in gactions + } else { + m.say('search.enter.1'); + } + // wait intent search query + + } else if (state === "FINISH") { + + if (!query) { + m.searchSession.state = "RUNNING"; + // m.nextScene = "search"; + m.say('search.enter.1'); + return ; + } + + m.initAndGoToSelectionSession({ + kind: 'PUBLICATION', + url: SEARCH_URL_FN(encodeURIComponent(query)), + from: 'search__on_enter', + }); + + } else { + throw new Error("invalid search state"); + } +} + +const query: THandlerFn = (m) => { + + // query from search intent + // query from search intent and search_query intent + // same intent but search_query as a free text parsing + m.setQuerySearch(); + m.nextScene = "search"; +} diff --git a/webhooks/functions/src/controller/handler/selection.helper.ts b/webhooks/functions/src/controller/handler/selection.helper.ts new file mode 100644 index 00000000..8a280c8f --- /dev/null +++ b/webhooks/functions/src/controller/handler/selection.helper.ts @@ -0,0 +1,19 @@ +import { IStorageSession } from "../../model/storage.interface"; + +export const resetSelection = (): IStorageSession["scene"]["selection"] => ({ + from: 'main', + kind: 'GROUP', + nextUrlCounter: 0, + state: "DEFAULT", + url: "", + nbChoice: 0, +}); +export const resetSessionsSelection = (session: IStorageSession) => { + + session.scene.selection.from = 'main'; + session.scene.selection.kind = 'GROUP'; + session.scene.selection.nextUrlCounter = 0; + session.scene.selection.state = "DEFAULT"; + session.scene.selection.url = ""; + session.scene.selection.nbChoice = 0; +} \ No newline at end of file diff --git a/webhooks/functions/src/controller/handler/selection.ts b/webhooks/functions/src/controller/handler/selection.ts new file mode 100644 index 00000000..982099e3 --- /dev/null +++ b/webhooks/functions/src/controller/handler/selection.ts @@ -0,0 +1,212 @@ +import { NAME, PADDING_GROUP, PADDING_PUB } from "../../constants"; +import { THandlerFn } from "../../type"; +import { Assistant } from "../Assistant"; +import { missing } from "./void"; + +export const selection = (app: Assistant) => { + + app.handle("selection__on_enter", enter); + app.handle("selection__intent__another_one", anotherOne); + app.handle("selection__intent__selects_book", selectBook); + app.handle("selection__intent__fallback", help); + app.handle("selection__intent__fallback_end", missing); + app.handle("selection__intent__help", help); + app.handle("selection__intent__repeat", repeat); + app.handle("selection__intent__silence", help); + app.handle("selection__intent__silence_end", missing); + +} + +export const enter: THandlerFn = async (m) => { + + const { state, url, nbChoice } = m.selectionSession; + const kind = m.selectionSession.kind; + const handler = m.selectionSession.from; + + m.debugSelectionSession(); + + if (state === "RUNNING") { + + const isAvailable = kind === "GROUP" ? await m.isGroupAvailable(url) : await m.isPublicationAvailable(url); + const isEmpty = !isAvailable; + if (isEmpty) { + if (handler === "search__on_enter") { + m.say("search.empty.1", {name: NAME}); + m.nextScene = "home_user"; // FIX GACTIONS ISSUE : INFINE LOOP CONTROL + m.searchSession.query = ''; + m.searchSession.state = 'RUNNING'; + m.searchSession.from = "selection__on_enter"; + } else { + m.say('selection.enter.empty.1'); + m.nextScene = "home_user"; + } + return ; + } + + // @TODO + // handle only one group or publication + // redirect to nextScene 'selection' for group + // or 'player-prequel' for a publication + + const nextLink = kind === "GROUP" ? await m.getNexLinkGroupWithUrl(url) : await m.getNexLinkPublicationWithUrl(url); + const nextPageBool = !!nextLink; + if (m.selectionSession.nextUrlCounter) { + if (!nextLink) { + if (kind === "GROUP") { + m.say("selection.enter.lastPage.group"); + } else { + m.say("selection.enter.lastPage.publication"); + } + } + } else { + + // intro + if (handler === "home_user__intent__bookshelf") { + const {publication} = await m.getPublicationFromFeed(url); // @TODO fix it .. twice call to api + m.say('selection.enter.bookshelf.first', {number: publication.length}); + } else if (handler === "search__on_enter") { + const {length} = await m.getPublicationFromFeed(url); // @TODO fix it .. twice call to api + m.say('selection.enter.search', {number: length}); + } + } + + // @TODO handle collection group or publication + + // list groups or publication + m.say('selection.enter.common.1'); + if (nextPageBool) { + m.say('selection.enter.nextPage.1'); + } + const list = kind === "GROUP" + ? (await m.getGroupsFromFeed(url)).groups.map(({title}) => title) + : (await m.getPublicationFromFeed(url)).publication.map(({title}) => title); + list.forEach((title, i) => m.say('selection.enter.common.2', {symbol: i + 1, title})); + m.say('selection.enter.common.3'); + + + // outro + if (handler === "home_user__intent__bookshelf") { + m.say('selection.enter.bookshelf.second'); + } + + } else if (state === "FINISH") { + + const valid = kind === "GROUP" ? await m.selectGroup(url, nbChoice) : await m.selectPublication(url, nbChoice); + + if (valid) { + // select OK + + const { state, kind } = m.selectionSession; + console.log("FINISH VALID STATE: ", state, kind); + + if (kind === "GROUP" && state === "RUNNING") { + console.log("RUN GROUPS"); + // group requested + m.nextScene = "selection"; + } else if (kind === "PUBLICATION" && state === "RUNNING") { + console.log("RUN PUBLICATIONS"); + + m.nextScene = "selection"; + } else if (state === "FINISH" && m.isPlayingAvailableInPlayerPrequelSession()) { + console.log("RUN PLAYER"); + + m.nextScene = "player_prequel"; + } else { + throw new Error("indalid finish state " + state); + } + + } else { + + // KO + // help message + m.say("selection.help.1"); + // m.nextScene = "selection"; + } + } else { + throw new Error("undefined selection state"); + // @TODO + // reset selection session + // move to home user + } + // m.nextScene = "selection"; + +} + +const selectBook: THandlerFn = async (m) => { + + const nb = m.selectBookNumber; + const kind = m.selectionSession.kind; + const padding = kind === "GROUP" ? PADDING_GROUP : PADDING_PUB; + const url = m.selectionSession.url; + + const size = kind === "GROUP" ? await m.getGroupSizeWithUrl(url) : await m.getPublicationSizeWithUrl(url); + + console.info("SELECT BOOK INTENT", nb, url, size); + + if (m.selectionSession.state === "DEFAULT") { + console.info("DEFAULT -> returns"); + m.selectionSession.nbChoice = 0; + + } else if (!nb) { + m.selectionSession.nbChoice = 0; + console.info("number from intent not defined"); + + } else if (!size) { + m.selectionSession.nbChoice = 0; + console.info("size from feed request undefined .. the url has failed? " + url); + + } else if (nb < 1) { + m.selectionSession.nbChoice = 0; + console.info("number from intent lower than 1"); + // m.say('selection.help.1'); + + } else if (nb > padding || nb > size) { + m.selectionSession.nbChoice = 0; + console.info("number from intent upper than padding or size"); + // m.say('selection.help.1'); + + } else { + // ok let's go + m.selectionSession.nbChoice = nb; + m.selectionSession.state = "FINISH"; + } + + m.nextScene = 'selection'; +} + +const anotherOne: THandlerFn = async (m) => { + + const { state, url } = m.selectionSession; + + if (state === "DEFAULT") { + throw new Error("DEFAULT mode not allowed with another one intent"); + } + + if (state === "RUNNING") { + + const kind = m.selectionSession.kind; + const nextUrl = kind === "GROUP" ? await m.getNexLinkGroupWithUrl(url) : await m.getNexLinkPublicationWithUrl(url); + + if (nextUrl) { + m.selectionSession.url = nextUrl; + m.selectionSession.nextUrlCounter++; + } else { + m.say("selection.enter.lastPage.notAvailable"); + } + } + + m.nextScene = 'selection'; +} + +const help: THandlerFn = (m) => { + + m.say("selection.help.1"); + // m.say("selection.help.2"); + + // m.nextScene = "selection"; +} + +const repeat: THandlerFn = (m) => { + + m.nextScene = "selection"; +} \ No newline at end of file diff --git a/webhooks/functions/src/controller/handler/void.ts b/webhooks/functions/src/controller/handler/void.ts new file mode 100644 index 00000000..b9e8c207 --- /dev/null +++ b/webhooks/functions/src/controller/handler/void.ts @@ -0,0 +1,5 @@ +import { THandlerFn } from "../../type"; + +export const missing: THandlerFn = (m) => { + m.say("void"); +} \ No newline at end of file diff --git a/webhooks/functions/src/error.ts b/webhooks/functions/src/error.ts new file mode 100644 index 00000000..f9beba84 --- /dev/null +++ b/webhooks/functions/src/error.ts @@ -0,0 +1,5 @@ + +export class WebpubError extends Error { + + code: number; +} \ No newline at end of file diff --git a/webhooks/functions/src/index.ts b/webhooks/functions/src/index.ts new file mode 100644 index 00000000..1580af4e --- /dev/null +++ b/webhooks/functions/src/index.ts @@ -0,0 +1,18 @@ + +// class-transformer +import 'reflect-metadata'; + +import * as functions from "firebase-functions"; +import { Assistant } from "./controller/Assistant"; +import { handler } from "./controller/handler"; +// import { writeFileSync} from 'fs'; + +exports.ActionsOnGoogleFulfillment = functions.https.onRequest(async (req, res) => { + + const app = new Assistant({}); + + handler(app); + + app.app(req, res); + +}); diff --git a/webhooks/functions/src/model/data.model.test.ts b/webhooks/functions/src/model/data.model.test.ts new file mode 100644 index 00000000..f15d500c --- /dev/null +++ b/webhooks/functions/src/model/data.model.test.ts @@ -0,0 +1,82 @@ +import {IStorage} from './storage.interface'; + +export const freshDataClone = () => Object.assign({ + dbVersion: 1, + bearerToken: 'test', + player: { + current: { + + }, + history: { + + }, + }, + session: { + scene: { + home_user: { + state: 'DEFAULT', + }, + selection: { + state: 'DEFAULT', + kind: 'GROUP', + url: '', + nextUrlCounter: 0, + nbChoice: 0, + from: 'main', + }, + search: { + state: 'DEFAULT', + query: '', + from: 'main', + }, + player_prequel: { + state: 'DEFAULT', + from: 'main', + player: {}, + }, + }, + }, + user: { + authentication: 'NO_LINKED', + // sessionId: 'test', + }, +}, {}); + +export const parsedDataClone = (): IStorage => Object.assign({ + bearerToken: 'test', + player: { + current: { + + }, + history: new Map(), + }, + session: { + scene: { + home_user: { + state: 'DEFAULT', + }, + selection: { + state: 'DEFAULT', + kind: 'GROUP', + url: '', + nextUrlCounter: 0, + from: 'main', + nbChoice: 0, + }, + search: { + state: 'DEFAULT', + query: '', + from: 'main', + }, + player_prequel: { + state: 'DEFAULT', + from: 'main', + player: {}, + }, + }, + }, + user: { + authentication: 'NO_LINKED', + sessionId: 'test', + }, +}, {}) as IStorage; diff --git a/webhooks/functions/src/model/database/firestore.ts b/webhooks/functions/src/model/database/firestore.ts new file mode 100644 index 00000000..c1681a2c --- /dev/null +++ b/webhooks/functions/src/model/database/firestore.ts @@ -0,0 +1,37 @@ +import * as admin from 'firebase-admin'; +import {Timestamp} from '@google-cloud/firestore'; + +admin.initializeApp(); + +const db = admin.firestore(); + +export const push = async (key: string, value: FirebaseFirestore.DocumentData) => { + const docRef = db.collection('user-storage').doc(key); + await docRef.set(value); +}; + + +// replace Timestamp object from firestore to Date native instance +// but why Firestore return a Timestamp object !? +const convertTimestampRecurs = (obj: {[str:string]:any}) => { + const ret = Object.entries(obj).reduce((pv, [k, v]) => { + return { + ...pv, + [k]: v instanceof Timestamp ? + v.toDate() : + typeof v === 'object' ? + convertTimestampRecurs(v) : + v, + }; + }, {}); + + return ret; +}; + +export const pull = async (key: string): Promise<{[str:string]:any}> => { + const docRef = db.collection('user-storage').doc(key); + const doc = await docRef.get(); + const data = doc.exists ? doc.data() : undefined; + const newData = data ? convertTimestampRecurs(data) : data; + return newData; +}; diff --git a/webhooks/functions/src/model/database/index.ts b/webhooks/functions/src/model/database/index.ts new file mode 100644 index 00000000..cd1069f3 --- /dev/null +++ b/webhooks/functions/src/model/database/index.ts @@ -0,0 +1,6 @@ +import {push, pull} from './firestore'; + +export { + push, + pull, +}; diff --git a/webhooks/functions/src/model/storage.dto.ts b/webhooks/functions/src/model/storage.dto.ts new file mode 100644 index 00000000..138eb6c2 --- /dev/null +++ b/webhooks/functions/src/model/storage.dto.ts @@ -0,0 +1,197 @@ +import * as util from 'util'; +import {ISessionScene, IStorage, IStoragePlayer, IStoragePlayerCurrent, IStoragePlayerHistory, IStorageSession, IStorageUser, TStateAuthentication} from './storage.interface'; +import {classToPlain, Exclude, plainToClass, Transform, TransformationType, Type} from 'class-transformer'; +import {Equals, IsDate, IsNotEmpty, IsNumber, IsObject, IsOptional, IsString, IsUrl, Min, ValidateNested, validateSync} from 'class-validator'; +import {resetSelection} from '../controller/handler/selection.helper'; + +const DB_VERSION = 1; + +class StoragePlayerHistoryDto implements IStoragePlayerHistory { + @Min(0) + @IsNumber() + index: number; + + @Min(0) + @IsNumber() + time: number; + + @IsDate() + date: Date; + + // set(data: IStoragePlayerHistory) { + // this.date = data.date; + // this.index = data.index; + // this.time = data.time; + // } +} + +class StoragePlayerCurrentDto implements IStoragePlayerCurrent { + @IsNumber() + @Min(0) + @IsOptional() + index?: number; + + @IsNumber() + @Min(0) + @IsOptional() + time?: number; + + @IsUrl() + @IsString() + @IsOptional() + url?: string; + + // @IsBoolean() + // playing: boolean; + + // set(data: IStoragePlayerCurrent) { + // this.index = data.index; + // this.time = data.time; + // this.url = data.url; + // this.playing = data.playing; + // } + + constructor() { + // this.playing = false; + } +} + +class StoragePlayerDto implements IStoragePlayer { + @IsObject() + @IsNotEmpty() + @Type(() => StoragePlayerCurrentDto) + @ValidateNested() + current: StoragePlayerCurrentDto; + + @IsNotEmpty() + @Type(() => StoragePlayerHistoryDto) + @Transform(({value, type}) => { // transform new Map() to plain and from plain + if (type === TransformationType.PLAIN_TO_CLASS) { + return new Map(typeof value === 'object' ? Object.entries(value) : []); + } + if (type === TransformationType.CLASS_TO_PLAIN && typeof value === 'object' && value.entries) { + return Array.from<Array<any>>(value.entries()).reduce((pv, [key, value]) => ({...pv, [key]: value}), {}); + } + }) + @ValidateNested({ + each: true, + }) + history: Map<string, StoragePlayerHistoryDto>; + + constructor() { + this.current = new StoragePlayerCurrentDto(); + this.history = new Map<string, StoragePlayerHistoryDto>(); + } +} + +class StorageSessionDto implements IStorageSession { + @IsObject() + @IsNotEmpty() + scene: ISessionScene; + + constructor() { + this.scene = { + 'home_user': { + state: 'DEFAULT', + }, + 'selection': resetSelection(), + 'search': { + state: 'DEFAULT', + query: '', + from: 'main', + }, + 'player_prequel': { + state: 'DEFAULT', + from: 'main', + player: {}, + }, + }; + } +} + +class StorageUserDto implements IStorageUser { + @IsNotEmpty() + authentication: TStateAuthentication; + + @IsOptional() + @IsString() + sessionId: string; + + constructor() { + this.authentication = 'NO_LINKED'; + } +} + +export class StorageDto implements IStorage { + @IsNumber() + @Equals(DB_VERSION) + dbVersion: number; + + @IsNotEmpty() + bearerToken: string; + + @IsObject() + @IsNotEmpty() + @Type(() => StoragePlayerDto) + @ValidateNested() + player: StoragePlayerDto; + + @IsObject() + @IsNotEmpty() + @Type(() => StorageSessionDto) + @ValidateNested() + session: StorageSessionDto; + + @IsObject() + @IsNotEmpty() + @Type(() => StorageUserDto) + @ValidateNested() + user: StorageUserDto; + + @Exclude() + snapshot: IStorage; + + constructor(bearerToken: string) { + this.dbVersion = DB_VERSION; + this.bearerToken = bearerToken; + this.player = new StoragePlayerDto(); + this.snapshot = classToPlain(this) as IStorage; + this.session = new StorageSessionDto(); + this.user = new StorageUserDto(); + } + + @Exclude() + static create(bearerToken: string, data?: Record<string, any>): StorageDto { + if (!data && bearerToken) { + return new StorageDto(bearerToken); + } + + const storage = plainToClass(StorageDto, data); + const errors = validateSync(storage); + + if (errors.length > 0) { + throw new Error(JSON.stringify(errors, null, 4)); + } + if (storage.bearerToken !== bearerToken) { + throw new Error('the bearerToken doesn\'t match beetween the key and value'); + } + + storage.snapshot = classToPlain(this) as IStorage; + return storage; + } + + @Exclude() + public extract(): Record<string, any> { + const errors = validateSync(this); + + if (errors.length) { + console.error('storage DTO \'extract\' errors', util.inspect(errors, {depth: 8})); + console.error('return the last snapshot', this.snapshot); + + return this.snapshot; + } + + const storage = classToPlain(this, {exposeUnsetFields: false}); + return storage; + } +} diff --git a/webhooks/functions/src/model/storage.interface.ts b/webhooks/functions/src/model/storage.interface.ts new file mode 100644 index 00000000..5a7bca6a --- /dev/null +++ b/webhooks/functions/src/model/storage.interface.ts @@ -0,0 +1,69 @@ +import {TSdkHandler} from '../typings/sdkHandler'; + +export interface IStoragePlayerHistory { + index: number; + time: number; + date: Date; +} + +export interface IStoragePlayerCurrent { + index?: number; + time?: number; + url?: string; + // playing: boolean; +} + +export interface IStoragePlayer { + current: IStoragePlayerCurrent; + history: Map<string, IStoragePlayerHistory>; +} + +export type TStateDefault = 'DEFAULT' +export type TStateAuthentication = 'NO_LINKED' | 'NEWLY_LINKED' | 'LINKED' | TStateDefault; +export type TStateHomeUser = 'SESSION' | 'REPEAT' | TStateDefault; +export type TStateSelection = 'RUNNING' | 'FINISH' | TStateDefault; +export type TKindSelection = 'PUBLICATION' | 'GROUP'; +export type TStateSearch = 'RUNNING' | 'FINISH' | TStateDefault; +export type TStatePlayerPrequel = TStateDefault; + +export interface ISessionScene { + 'home_user': { + state: TStateHomeUser, + }, + 'selection': { + state: TStateSelection, + kind: TKindSelection, + url: string, + nextUrlCounter: number, + from: TSdkHandler, + nbChoice: number, + }, + 'search': { + state: TStateSearch, + query: string, + from: TSdkHandler, + }, + 'player_prequel': { + state: TStatePlayerPrequel, + from: TSdkHandler, + player: IStoragePlayerCurrent, + } +} +export type TKeySessionScene = keyof ISessionScene; + +export interface IStorageSession { + scene: ISessionScene; +} + +export interface IStorageUser { + authentication: TStateAuthentication; + sessionId?: string; +} + +export interface IStorage { + bearerToken: string; + player: IStoragePlayer; + session: IStorageSession; + user: IStorageUser; +} + diff --git a/webhooks/functions/src/model/storage.model.ts b/webhooks/functions/src/model/storage.model.ts new file mode 100644 index 00000000..554d7606 --- /dev/null +++ b/webhooks/functions/src/model/storage.model.ts @@ -0,0 +1,41 @@ +import {ok} from 'assert'; +import {pull, push} from './database'; +import {StorageDto} from './storage.dto'; + +let storageModel: StorageModel | undefined; + +export class StorageModel { + private _bearer: string; + private _storage: StorageDto; + + constructor(bearerToken: string, store: StorageDto) { + ok(bearerToken); + this._bearer = bearerToken; + + ok(store instanceof StorageDto); + this._storage = store; + } + + public static async create(bearerToken: string) { + const data = await pull(bearerToken); + + const store = StorageDto.create(bearerToken, data); + + // let's to cascading the storage errors accross storage -> storageModel -> Machine -> Assistant + if (storageModel) { + console.info('storageModel already instancied'); + return storageModel; + } + storageModel = new StorageModel(bearerToken, store); + return storageModel; + } + + public async save() { + const data = this.store.extract(); + await push(this._bearer, data); + } + + get store() { + return this._storage; + } +} diff --git a/webhooks/functions/src/model/storage.test.ts b/webhooks/functions/src/model/storage.test.ts new file mode 100644 index 00000000..814f85d7 --- /dev/null +++ b/webhooks/functions/src/model/storage.test.ts @@ -0,0 +1,180 @@ +import 'reflect-metadata'; +import {StorageDto} from './storage.dto'; +import * as assert from 'assert'; +import {classToPlain} from 'class-transformer'; +import {inspect} from 'util'; +import * as chai from 'chai'; +// import { StorageModel } from './storage.model'; +import * as sinon from 'sinon'; + +import {StorageModel} from './storage.model'; +import {storageModelMocked} from '../test/utils.test'; +import {freshDataClone} from './data.model.test'; + +let freshData = freshDataClone(); + +describe('storage DTO', () => { + beforeEach(() => { + freshData = freshDataClone(); + }); + + it('create storage object without bearerToken', () => { + const obj = { + dbVersion: 1, + bearerToken: undefined, + player: { + current: { + + playing: false, + }, + history: { + + }, + }, + }; + + chai.expect(() => StorageDto.create('', obj)).to.throw(); + }); + + it('create storage object failed dbversion', () => { + const obj = { + dbVersion: 2, + bearerToken: 'test', + player: { + current: { + + playing: false, + }, + history: { + + }, + }, + }; + + chai.expect(() => StorageDto.create('test', obj)).to.throw(); + }); + + it('create storage object failed dbversion and bearer', () => { + const obj = { + dbVersion: 2, + bearerToken: undefined, + player: { + current: { + + playing: false, + }, + history: { + + }, + }, + }; + + chai.expect(() => StorageDto.create('test', obj)).to.throw(); + }); + + it('undefined storage', () => { + const instance = StorageDto.create('test', undefined); + + chai.expect(instance.bearerToken).to.be.eq('test'); + }); + + it('bad validation extract', () => { + const instance = StorageDto.create('test'); + + instance.player.current.index = -34; + + const extr = instance.extract(); + + const instance2 = StorageDto.create('test', extr); + + chai.expect(instance2.player.current.index).to.be.undefined; + }); + + it('create error', () => { + const date = new Date(); + + const obj = freshData; + // @ts-ignore + obj.player.history.test = { + index: 0, + time: 0, + date: date, + }; + const instance = StorageDto.create('test', obj); + + assert.deepEqual(instance.player.history.get('test'), { + index: 0, + time: 0, + date: date, + }); + + instance.player.history.set('test2', { + index: 0, + time: 0, + date: date, + }); + + const extr = classToPlain(instance); + + assert.deepEqual({ + test2: { + index: 0, + time: 0, + date: date, + }, + test: { + index: 0, + time: 0, + date: date, + }, + }, extr.player.history); + + console.log(inspect(extr, {depth: 7})); + console.log(new Date()); + + const instance2 = StorageDto.create('test', extr); + + assert.deepEqual(instance2.player.history.get('test2'), { + index: 0, + time: 0, + date: date, + }); + }); +}); + + +describe('storage Model', () => { + chai.should(); + + beforeEach(() => { + freshData = freshDataClone(); + }); + + // @ts-ignore + let {data, push, pull}: { + data: StorageModel; + pull: sinon.SinonStub<any[], any>; + push: sinon.SinonStub<any[], any>; + } = {}; + + beforeEach(async () => { + ({data, push, pull} = await storageModelMocked()); + }); + + it('create a storeModel', async () => { + console.log(JSON.stringify(data.store.extract(), null, 4)); + + assert.deepEqual(data.store.extract(), freshData); + + data.store.should.instanceOf(StorageDto); + data.store.extract().should.to.deep.eq(freshData); + pull.calledOnce.should.eq(true); + }); + + it('push store', async () => { + data.save(); + + push.calledOnce.should.eq(true); + push.args.should.to.deep.equal([['test', freshData]]); + }); +}); diff --git a/webhooks/functions/src/sdk/collections.test.ts b/webhooks/functions/src/sdk/collections.test.ts new file mode 100644 index 00000000..ec15252e --- /dev/null +++ b/webhooks/functions/src/sdk/collections.test.ts @@ -0,0 +1,182 @@ +import {expressMocked, shell, storageModelMocked} from '../test/utils.test'; +import * as chai from 'chai'; +// import * as sinon from 'sinon'; +import {headers, body} from './conv.test'; +import {parsedDataClone} from '../model/data.model.test'; +import {BOOKSHELF_URL, GENRE_LIST_URL, THEMATIC_LIST_URL} from '../constants'; + + +chai.should(); + +const scene = 'collections'; + +const yaml = `intentEvents: +- handler: + webhookHandler: collections__intent__bookshelf + intent: bookshelf +- handler: + webhookHandler: collections__intent__by_genre + intent: by_genre +- handler: + webhookHandler: collections__intent__by_theme + intent: by_theme +- handler: + webhookHandler: collections__intent__help + intent: help +- handler: + webhookHandler: collections__intent__fallback + intent: actions.intent.NO_MATCH_1 +- handler: + webhookHandler: collections__intent__fallback + intent: actions.intent.NO_MATCH_2 +- handler: + webhookHandler: collections__intent__fallback_end + intent: actions.intent.NO_MATCH_FINAL +- handler: + webhookHandler: collections__intent__silence + intent: actions.intent.NO_INPUT_1 +- handler: + webhookHandler: collections__intent__silence + intent: actions.intent.NO_INPUT_2 +- handler: + webhookHandler: collections__intent__silence_end + intent: actions.intent.NO_INPUT_FINAL +onEnter: + webhookHandler: collections__on_enter +`; + +describe(scene + ' handler', () => { + describe('sdk', () => { + it('check main scene', (done) => { + shell(`cat custom/scenes/${scene}.yaml`, (stdout) => { + stdout.should.to.be.eq(yaml); + }, done); + }); + }); + + describe('app', () => { + it('on enter', async () => { + body.handler.name = 'collections__on_enter'; + body.scene.name = scene; + + const message = `Okay, would you prefer to get a choice of collections by theme or by genre?\n`; + + const data = await expressMocked(body, headers); + + data.prompt.firstSimple.speech.should.to.be.eq(message); + }); + + it('by genre', async () => { + body.handler.name = 'collections__intent__by_genre'; + body.scene.name = scene; + + const pullData = parsedDataClone(); + const model = await storageModelMocked(pullData); + + const data = await expressMocked(body, headers, undefined, undefined, undefined, model.data); + + model.data.store.session.scene.selection.from.should.to.be.eq('collections__intent__by_genre'); + model.data.store.session.scene.selection.kind.should.to.be.eq('GROUP'); + model.data.store.session.scene.selection.nbChoice.should.to.be.eq(0); + model.data.store.session.scene.selection.nextUrlCounter.should.to.be.eq(0); + model.data.store.session.scene.selection.state.should.to.be.eq('RUNNING'); + model.data.store.session.scene.selection.url.should.to.be.eq(GENRE_LIST_URL); + + data.scene.next.name.should.to.be.eq('selection'); + }); + it('by theme', async () => { + body.handler.name = 'collections__intent__by_theme'; + body.scene.name = scene; + + const pullData = parsedDataClone(); + const model = await storageModelMocked(pullData); + + const data = await expressMocked(body, headers, undefined, undefined, undefined, model.data); + + model.data.store.session.scene.selection.from.should.to.be.eq('collections__intent__by_theme'); + model.data.store.session.scene.selection.kind.should.to.be.eq('GROUP'); + model.data.store.session.scene.selection.nbChoice.should.to.be.eq(0); + model.data.store.session.scene.selection.nextUrlCounter.should.to.be.eq(0); + model.data.store.session.scene.selection.state.should.to.be.eq('RUNNING'); + model.data.store.session.scene.selection.url.should.to.be.eq(THEMATIC_LIST_URL); + + data.scene.next.name.should.to.be.eq('selection'); + }); + it('bookshelf', async () => { + body.handler.name = 'collections__intent__bookshelf'; + body.scene.name = scene; + + const pullData = parsedDataClone(); + const model = await storageModelMocked(pullData); + + const data = await expressMocked(body, headers, undefined, undefined, undefined, model.data); + + model.data.store.session.scene.selection.from.should.to.be.eq('collections__intent__bookshelf'); + model.data.store.session.scene.selection.kind.should.to.be.eq('PUBLICATION'); + model.data.store.session.scene.selection.nbChoice.should.to.be.eq(0); + model.data.store.session.scene.selection.nextUrlCounter.should.to.be.eq(0); + model.data.store.session.scene.selection.state.should.to.be.eq('RUNNING'); + model.data.store.session.scene.selection.url.should.to.be.eq(BOOKSHELF_URL); + + data.scene.next.name.should.to.be.eq('selection'); + }); + + const help = `To hear an overview of available themes, say 'by theme'. For an overview of available genres, say 'by genre'.\n`; + + it('help', async () => { + body.handler.name = 'collections__intent__help'; + body.scene.name = scene; + + + const data = await expressMocked(body, headers); + + data.prompt.firstSimple.speech.should.to.be.eq(help); + + data.scene.next.name.should.to.be.eq('collections'); + }); + + it('fallback 1 and 2', async () => { + body.handler.name = 'collections__intent__help'; + body.scene.name = scene; + + const data = await expressMocked(body, headers); + + data.prompt.firstSimple.speech.should.to.be.eq(help); + + data.scene.next.name.should.to.be.eq('collections'); + }); + + it('fallback 3', async () => { + body.handler.name = 'collections__intent__fallback_end'; + body.scene.name = scene; + + const data = await expressMocked(body, headers); + + data.prompt.firstSimple.speech.should.to.be.eq('Bye!\n'); + + // data.scene.next.name.should.to.be.eq('home_new_user'); + }); + + it('silence 1 and 2', async () => { + body.handler.name = 'collections__intent__silence'; + body.scene.name = scene; + + const data = await expressMocked(body, headers); + + data.prompt.firstSimple.speech.should.to.be.eq(help); + + data.scene.next.name.should.to.be.eq('collections'); + }); + + it('silence 3', async () => { + body.handler.name = 'collections__intent__fallback_end'; + body.scene.name = scene; + + const data = await expressMocked(body, headers); + + data.prompt.firstSimple.speech.should.to.be.eq('Bye!\n'); + + // data.scene.next.name.should.to.be.eq('home_new_user'); + }); + }); +}); diff --git a/webhooks/functions/src/sdk/conv.test.ts b/webhooks/functions/src/sdk/conv.test.ts new file mode 100644 index 00000000..823cc348 --- /dev/null +++ b/webhooks/functions/src/sdk/conv.test.ts @@ -0,0 +1,224 @@ + +export const headers = { + 'host': 'fb9b-89-90-221-249.ngrok.io', + 'user-agent': 'Google-ActionsOnGoogle/1.0', + 'content-length': '755', + 'accept-encoding': 'gzip, deflate, br', + 'content-type': 'application/json;charset=UTF-8', + 'google-actions-api-version': '3', + 'google-assistant-signature': 'eyJhbGciOiJSUzI1NiIsImtpZCI6IjllYWEwMjZmNjM1MTU3ZGZhZDUzMmU0MTgzYTZiODIzZDc1MmFkMWQiLCJ0eXAiOiJKV1QifQ.eyJpc3MiOiJodHRwczovL2FjY291bnRzLmdvb2dsZS5jb20iLCJhdWQiOiJlZHJsYWItMSIsIm5iZiI6MTY0MzkwNTY0OSwiaWF0IjoxNjQzOTA1OTQ5LCJleHAiOjE2NDM5MDYwNjksImp0aSI6ImQwMzQ1NmU3NDk5MWUxNGY0NjAwYjZhZWIxMWUzMzdkZDc2ODJkYjIifQ.gJ3hcEEw0qfUGf7z4WBFee4D9kdxV9kQzjbbhmL17K_nSTnrMISJZyj1DlmmcPragmp6EXWbJ14zTIzmrKPoDbEyx8H4PYG3h6vSGo4tlyB_H69hr0QKRU8fCc5lBQXVMGViuJBAMI9jWP28H2nt7hV0p-_AHayJnEvwSju5ojcd9wAalpTYcJagfdTkT2kvJEh_GeyooZvPZEOnx0vc3laTvrQqdxgP6Sh4wHbJnptj4bUiUirONuFp63C9Y92zkQPDD6tiQ8an475EjI9cys_-KDtXBhfx4Ojo3M0_9jBgpN67aDVk0vOnHYtnXzBg_fZhiM0sLaZRbe49LucHHw', + 'x-forwarded-for': '66.249.81.244', + 'x-forwarded-proto': 'https', + 'connection': 'close', +}; + +export let body: ReturnType<typeof bodyCopy>; + + +// beforeEach save my life ! +// thanks you mocha +beforeEach(() => { + body = bodyCopy(); +}); + +const bodyCopy = () => Object.assign({}, { + 'handler': { + 'name': 'main', + }, + 'intent': { + 'name': 'actions.intent.MAIN', + 'params': {}, + 'query': 'Parler avec dev EDRLAB', + }, + 'scene': { + 'name': 'actions.scene.START_CONVERSATION', + 'slotFillingStatus': 'UNSPECIFIED', + 'slots': {}, + }, + 'session': { + 'id': 'test', // remove id token but @todo need to test this part .. remove session when session id changed + 'params': {}, + 'typeOverrides': [], + 'languageCode': '', + }, + 'user': { + 'locale': 'en-US', + 'params': { + 'bearerToken': '', + }, + 'accountLinkingStatus': 'LINKED', + 'verificationStatus': 'VERIFIED', + 'packageEntitlements': [], + 'gaiamint': '', + 'permissions': [], + 'lastSeenTime': '2022-02-03T16:15:10Z', + }, + 'home': { + 'params': {}, + }, + 'device': { + 'capabilities': [ + 'SPEECH', + 'RICH_RESPONSE', + 'LONG_FORM_AUDIO', + ], + 'timeZone': { + 'id': 'Europe/Paris', + 'version': '', + }, + }, + 'context': { + 'media': { + progress: '0s', + index: 0, + }, + }, +}); + +export const convRequestInHandle = { + 'overwrite': true, + 'digested': false, + 'request': { + 'handler': { + 'name': 'main', + }, + 'intent': { + 'name': 'actions.intent.MAIN', + 'params': {}, + 'query': 'Parler avec dev EDRLAB', + }, + 'scene': { + 'name': 'actions.scene.START_CONVERSATION', + 'slotFillingStatus': 'UNSPECIFIED', + 'slots': {}, + }, + 'session': { + 'id': 'ABwppHEDTsgFwQdV_QSp5YvBdnevHBjuyCHzGH-6VPE-IOTt9RmVZieVouqECeLyyO4g29pOHPA', + 'params': {}, + 'typeOverrides': [], + 'languageCode': '', + }, + 'user': { + 'locale': 'fr-CA', + 'params': { + 'bearerToken': 'bearer token not defined', + }, + 'accountLinkingStatus': 'LINKED', + 'verificationStatus': 'VERIFIED', + 'packageEntitlements': [], + 'gaiamint': '', + 'permissions': [], + 'lastSeenTime': '2022-02-03T16:03:22Z', + }, + 'home': { + 'params': {}, + }, + 'device': { + 'capabilities': [ + 'SPEECH', + 'RICH_RESPONSE', + 'LONG_FORM_AUDIO', + ], + 'timeZone': { + 'id': 'Europe/Paris', + 'version': '', + }, + }, + }, + 'headers': { + 'host': 'fb9b-89-90-221-249.ngrok.io', + 'user-agent': 'Google-ActionsOnGoogle/1.0', + 'content-length': '755', + 'accept-encoding': 'gzip, deflate, br', + 'content-type': 'application/json;charset=UTF-8', + 'google-actions-api-version': '3', + 'google-assistant-signature': 'eyJhbGciOiJSUzI1NiIsImtpZCI6IjllYWEwMjZmNjM1MTU3ZGZhZDUzMmU0MTgzYTZiODIzZDc1MmFkMWQiLCJ0eXAiOiJKV1QifQ.eyJpc3MiOiJodHRwczovL2FjY291bnRzLmdvb2dsZS5jb20iLCJhdWQiOiJlZHJsYWItMSIsIm5iZiI6MTY0MzkwMzkwNywiaWF0IjoxNjQzOTA0MjA3LCJleHAiOjE2NDM5MDQzMjcsImp0aSI6ImI2OGJkNDM1YjNmNWM1YWVmZmE3OTIwYjNlY2EwMjU0MTkzYjhiOGMifQ.AMiXPH_4OAjSAD9P1dQ0tHGxgdPp0yiHnPeNlH1h1Lmw2fP4URdKiUz7X8fvgFuhgAkffAo9XPKRPeS5JpCCUmQCvjfE4cej45vyHqCjovEBJxuVFwpbmFcilKAIE2JmGoSlDsbyAJvV0c70HiaOjXtVikPll_mprwveXXU3x6OG4pu0Hqqn9RrsQFIyqQ-p9dU1sVjMvIK-Qhg6KRBKfrirEKIz6dCxVZRdj76jYuPZPsmVeLRfwjt8J0GtFHBlAasJxv02Al8WMw0j6GUeN0GkFnVs_0dupgLV1-v2Zhr5BDiCgjHLbwVWIGsh-_4Jay7kjJ2ouh7ZJNTyfc80kg', + 'x-forwarded-for': '66.249.81.235', + 'x-forwarded-proto': 'https', + 'connection': 'close', + }, + 'handler': { + 'name': 'main', + }, + 'intent': { + 'name': 'actions.intent.MAIN', + 'query': 'Parler avec dev EDRLAB', + 'params': {}, + }, + 'scene': { + 'name': 'actions.scene.START_CONVERSATION', + 'slotFillingStatus': 'UNSPECIFIED', + 'slots': {}, + 'next': {}, + }, + 'session': { + 'id': 'ABwppHEDTsgFwQdV_QSp5YvBdnevHBjuyCHzGH-6VPE-IOTt9RmVZieVouqECeLyyO4g29pOHPA', + 'params': {}, + 'typeOverrides': [], + 'languageCode': '', + }, + 'user': { + 'locale': 'fr-CA', + 'params': { + 'bearerToken': 'bearer token not defined', + }, + 'accountLinkingStatus': 'ACCOUNT_LINKING_STATUS_UNSPECIFIED', + 'verificationStatus': 'VERIFIED', + 'packageEntitlements': [], + 'gaiamint': '', + 'permissions': [], + 'lastSeenTime': '2022-02-03T16:03:22Z', + }, + 'device': { + 'capabilities': [ + 'SPEECH', + 'RICH_RESPONSE', + 'LONG_FORM_AUDIO', + ], + 'currentLocation': {}, + 'timeZone': { + 'id': 'Europe/Paris', + 'version': '', + }, + }, + 'home': { + 'params': {}, + }, + 'expected': {}, + 'context': {}, + 'prompt': { + 'override': false, + }, + // "_internal": { + // "promptSet": false, + // "orig": { + // "scene": { + // "name": "actions.scene.START_CONVERSATION", + // "slotFillingStatus": "UNSPECIFIED", + // "slots": {}, + // "next": {} + // }, + // "session": { + // "id": "ABwppHEDTsgFwQdV_QSp5YvBdnevHBjuyCHzGH-6VPE-IOTt9RmVZieVouqECeLyyO4g29pOHPA", + // "params": {}, + // "typeOverrides": [], + // "languageCode": "" + // }, + // "user": { + // "locale": "fr-CA", + // "params": { + // "bearerToken": "bearer token not defined" + // }, + // "accountLinkingStatus": "ACCOUNT_LINKING_STATUS_UNSPECIFIED", + // "verificationStatus": "VERIFIED", + // "packageEntitlements": [], + // "gaiamint": "", + // "permissions": [], + // "lastSeenTime": "2022-02-03T16:03:22Z" + // }, + // "home": { + // "params": {} + // } + // } + // } +}; diff --git a/webhooks/functions/src/sdk/home_new_user.test.ts b/webhooks/functions/src/sdk/home_new_user.test.ts new file mode 100644 index 00000000..72ca157c --- /dev/null +++ b/webhooks/functions/src/sdk/home_new_user.test.ts @@ -0,0 +1,170 @@ +import {expressMocked, shell} from '../test/utils.test'; +import * as chai from 'chai'; +// import * as sinon from 'sinon'; +import {headers, body} from './conv.test'; + + +chai.should(); + +const scene = 'home_new_user'; + +const yaml = `intentEvents: +- handler: + webhookHandler: home_new_user__intent__help + intent: help +- handler: + webhookHandler: home_new_user__intent__maybe_later + intent: maybe_later +- handler: + webhookHandler: home_new_user__intent__no + intent: "no" +- handler: + webhookHandler: home_new_user__intent__repeat + intent: repeat +- handler: + webhookHandler: home_new_user__intent__yes + intent: "yes" + transitionToScene: home_new_user_AccountLinking +- handler: + webhookHandler: home_new_user__intent__fallback + intent: actions.intent.NO_MATCH_1 +- handler: + webhookHandler: home_new_user__intent__fallback + intent: actions.intent.NO_MATCH_2 +- handler: + webhookHandler: home_new_user__intent__fallback_end + intent: actions.intent.NO_MATCH_FINAL +- handler: + webhookHandler: home_new_user__intent__silence + intent: actions.intent.NO_INPUT_1 +- handler: + webhookHandler: home_new_user__intent__silence_end + intent: actions.intent.NO_INPUT_FINAL +onEnter: + webhookHandler: home_new_user__on_enter +`; + +describe('home_new_user handler', () => { + describe('sdk', () => { + it('check main scene', (done) => { + shell(`cat custom/scenes/${scene}.yaml`, (stdout) => { + stdout.should.to.be.eq(yaml); + }, done); + }); + }); + + describe('app', () => { + it('on enter', async () => { + body.handler.name = 'home_new_user__on_enter'; + body.scene.name = scene; + + // const message = `To fully enjoy your audiobooks and access your personal bookshelf, you will need to link your EDRLAB account.\nWould you like to do so now ?\n`; + const data = await expressMocked(body, headers); + + data.prompt.firstSimple.speech.should.to.be.eq('To fully experience EDRLAB Library, and enjoy your favorite audiobooks via Google, you\'ll need to connect your EDRLAB account. To do so, answer \'yes\' when prompted and follow the instructions. I will then send a connection link, that you will find into the Google Home application. You will have to log in to your EDRLAB account. You\'ll only have to do this once, and you\'ll be all set to start enjoying the wonderful world of EDRLAB books for hours on end!\n' + + 'Would you like to link your account right now?\n'); + }); + it('repeat', async () => { + body.handler.name = 'home_new_user__intent__repeat'; + body.scene.name = scene; + + const data = await expressMocked(body, headers); + + data.scene.next.name.should.to.be.eq('home_new_user'); + }); + it('yes', async () => { + body.handler.name = 'home_new_user__intent__yes'; + body.scene.name = scene; + + await expressMocked(body, headers); + + // expect authentication + // automatic transition to account linking + }); + + it('no', async () => { + body.handler.name = 'home_new_user__intent__no'; + body.scene.name = scene; + + const data = await expressMocked(body, headers); + + console.log(data.prompt.firstSimple); + + // const message = `In order to read books using the EDRLAB Library via Google, you need to be a registered EDRLAB member and link your account.\nWould you like to learn more about EDRLAB?\n`; + // data.prompt.firstSimple.speech.should.to.be.eq(message); + + data.scene.next.name.should.to.be.eq('home_new_user_no'); + }); + + it('maybeLater', async () => { + body.handler.name = 'home_new_user__intent__maybe_later'; + body.scene.name = scene; + + // const message = `Of course! you can learn more about EDRLAB or quit for now.\nWhat would you like to do?\n`; + + const data = await expressMocked(body, headers); + + // data.prompt.firstSimple.speech.should.to.be.eq(message); + + data.scene.next.name.should.to.be.eq('home_new_user_maybe_later'); + }); + + // const help = `To fully experience EDRLAB Library, and enjoy your favorite audiobooks via Google, you'll need to connect your EDRLAB account. To do so, answer 'yes' when prompted and follow the instructions. I will then send a connection link, that you will find into the Google Home application. You will have to log in to your EDRLAB account. You'll only have to do this once, and you'll be all set to start enjoying the wonderful world of EDRLAB books for hours on end!\nWould you like to link your account right now?\n`; + + it('help', async () => { + body.handler.name = 'home_new_user__intent__help'; + body.scene.name = scene; + + + const data = await expressMocked(body, headers); + + // data.prompt.firstSimple.speech.should.to.be.eq(help); + + data.scene.next.name.should.to.be.eq('home_new_user'); + }); + + it('fallback 1 and 2', async () => { + body.handler.name = 'home_new_user__intent__help'; + body.scene.name = scene; + + const data = await expressMocked(body, headers); + + // data.prompt.firstSimple.speech.should.to.be.eq(help); + + data.scene.next.name.should.to.be.eq('home_new_user'); + }); + + it('fallback 3', async () => { + body.handler.name = 'home_new_user__intent__fallback_end'; + body.scene.name = scene; + + const data = await expressMocked(body, headers); + + data.prompt.firstSimple.speech.should.to.be.eq('Bye!\n'); + + // data.scene.next.name.should.to.be.eq('home_new_user'); + }); + + it('silence 1 and 2', async () => { + body.handler.name = 'home_new_user__intent__silence'; + body.scene.name = scene; + + const data = await expressMocked(body, headers); + + // data.prompt.firstSimple.speech.should.to.be.eq(help); + + data.scene.next.name.should.to.be.eq('home_new_user'); + }); + + it('silence 3', async () => { + body.handler.name = 'home_new_user__intent__fallback_end'; + body.scene.name = scene; + + const data = await expressMocked(body, headers); + + data.prompt.firstSimple.speech.should.to.be.eq('Bye!\n'); + + // data.scene.next.name.should.to.be.eq('home_new_user'); + }); + }); +}); diff --git a/webhooks/functions/src/sdk/home_new_user_maybe_later.test.ts b/webhooks/functions/src/sdk/home_new_user_maybe_later.test.ts new file mode 100644 index 00000000..13e57160 --- /dev/null +++ b/webhooks/functions/src/sdk/home_new_user_maybe_later.test.ts @@ -0,0 +1,154 @@ +import {expressMocked, shell} from '../test/utils.test'; +import * as chai from 'chai'; +// import * as sinon from 'sinon'; +import {headers, body} from './conv.test'; + + +chai.should(); + +const scene = 'home_new_user_maybe_later'; + +const yaml = `intentEvents: +- handler: + webhookHandler: home_new_user_maybe_later__intent__learn_more + intent: learn_more +- handler: + webhookHandler: home_new_user_maybe_later__intent__repeat + intent: repeat +- handler: + webhookHandler: home_new_user_maybe_later__intent__link_account + intent: link_account +- handler: + webhookHandler: home_new_user_maybe_later__intent__help + intent: help +- handler: + webhookHandler: home_new_user_maybe_later__intent__fallback + intent: actions.intent.NO_MATCH_1 +- handler: + webhookHandler: home_new_user_maybe_later__intent__fallback + intent: actions.intent.NO_MATCH_2 +- handler: + webhookHandler: home_new_user_maybe_later__intent__fallback_end + intent: actions.intent.NO_MATCH_FINAL +- handler: + webhookHandler: home_new_user_maybe_later__intent__silence + intent: actions.intent.NO_INPUT_1 +- handler: + webhookHandler: home_new_user_maybe_later__intent__silence + intent: actions.intent.NO_INPUT_2 +- handler: + webhookHandler: home_new_user_maybe_later__intent__silence_end + intent: actions.intent.NO_INPUT_FINAL +onEnter: + webhookHandler: home_new_user_maybe_later__on_enter +`; + +describe('home_new_user_maybe_later handler', () => { + describe('sdk', () => { + it('check main scene', (done) => { + shell(`cat custom/scenes/${scene}.yaml`, (stdout) => { + stdout.should.to.be.eq(yaml); + }, done); + }); + }); + + describe('app', () => { + it('on enter', async () => { + body.handler.name = 'home_new_user_maybe_later__on_enter'; + body.scene.name = scene; + + const message = `You can ask me to link your account, or learn more about the EDRLAB Library. You can also exit this application, by simply saying 'stop'. What is your decision?\n`; + + const data = await expressMocked(body, headers); + + data.prompt.firstSimple.speech.should.to.be.eq(message); + }); + it('link account', async () => { + body.handler.name = 'home_new_user_maybe_later__intent__link_account'; + body.scene.name = scene; + + const data = await expressMocked(body, headers); + + data.scene.next.name.should.to.be.eq('home_new_user_AccountLinking'); + }); + + it('learn more', async () => { + body.handler.name = 'home_new_user_maybe_later__intent__learn_more'; + body.scene.name = scene; + + const data = await expressMocked(body, headers); + + // const message = `EDRLAB about text. Would you like to find out more about EDRLAB membership, or would you prefer to exit this skill?\n`; + // data.prompt.firstSimple.speech.should.to.be.eq(message); + + data.scene.next.name.should.to.be.eq('info'); + }); + + it('repeat', async () => { + body.handler.name = 'home_new_user_maybe_later__intent__repeat'; + body.scene.name = scene; + + // const data = await expressMocked(body, headers); + + // data.scene.next.name.should.to.be.eq('home_new_user_maybe_later'); + }); + + // const help = `You can ask me to link your account, or to learn more about EDRLAB. You can also exit this skill, by simply saying 'stop'. What would you like to do?\n`; + + it('help', async () => { + body.handler.name = 'home_new_user_maybe_later__intent__help'; + body.scene.name = scene; + + + const data = await expressMocked(body, headers); + + // data.prompt.firstSimple.speech.should.to.be.eq(help); + + data.scene.next.name.should.to.be.eq('home_new_user_maybe_later'); + }); + + it('fallback 1 and 2', async () => { + body.handler.name = 'home_new_user_maybe_later__intent__help'; + body.scene.name = scene; + + const data = await expressMocked(body, headers); + + // data.prompt.firstSimple.speech.should.to.be.eq(help); + + data.scene.next.name.should.to.be.eq('home_new_user_maybe_later'); + }); + + it('fallback 3', async () => { + body.handler.name = 'home_new_user_maybe_later__intent__fallback_end'; + body.scene.name = scene; + + const data = await expressMocked(body, headers); + + data.prompt.firstSimple.speech.should.to.be.eq('Bye!\n'); + + // data.scene.next.name.should.to.be.eq('home_new_user'); + }); + + it('silence 1 and 2', async () => { + body.handler.name = 'home_new_user_maybe_later__intent__silence'; + body.scene.name = scene; + + const data = await expressMocked(body, headers); + + // data.prompt.firstSimple.speech.should.to.be.eq(help); + + data.scene.next.name.should.to.be.eq('home_new_user_maybe_later'); + }); + + it('silence 3', async () => { + body.handler.name = 'home_new_user_maybe_later__intent__fallback_end'; + body.scene.name = scene; + + const data = await expressMocked(body, headers); + + data.prompt.firstSimple.speech.should.to.be.eq('Bye!\n'); + + // data.scene.next.name.should.to.be.eq('home_new_user'); + }); + }); +}); diff --git a/webhooks/functions/src/sdk/home_new_user_no.test.ts b/webhooks/functions/src/sdk/home_new_user_no.test.ts new file mode 100644 index 00000000..b6628c93 --- /dev/null +++ b/webhooks/functions/src/sdk/home_new_user_no.test.ts @@ -0,0 +1,153 @@ +import {expressMocked, shell} from '../test/utils.test'; +import * as chai from 'chai'; +// import * as sinon from 'sinon'; +import {headers, body} from './conv.test'; + + +chai.should(); + +const scene = 'home_new_user_no'; + +const yaml = `intentEvents: +- handler: + webhookHandler: home_new_user_no__intent__yes + intent: "yes" +- handler: + webhookHandler: home_new_user_no__intent__no + intent: "no" +- handler: + webhookHandler: home_new_user_no__intent__repeat + intent: repeat +- handler: + webhookHandler: home_new_user_no__intent__help + intent: help +- handler: + webhookHandler: home_new_user_no__intent__fallback + intent: actions.intent.NO_MATCH_1 +- handler: + webhookHandler: home_new_user_no__intent__fallback + intent: actions.intent.NO_MATCH_2 +- handler: + webhookHandler: home_new_user_no__intent__fallback_end + intent: actions.intent.NO_MATCH_FINAL +- handler: + webhookHandler: home_new_user_no__intent__silence + intent: actions.intent.NO_INPUT_1 +- handler: + webhookHandler: home_new_user_no__intent__silence + intent: actions.intent.NO_INPUT_2 +- handler: + webhookHandler: home_new_user_no__intent__silence_end + intent: actions.intent.NO_INPUT_FINAL +onEnter: + webhookHandler: home_new_user_no__on_enter +`; + +describe(scene + ' handler', () => { + describe('sdk', () => { + it('check main scene', (done) => { + shell(`cat custom/scenes/${scene}.yaml`, (stdout) => { + stdout.should.to.be.eq(yaml); + }, done); + }); + }); + + describe('app', () => { + it('on enter', async () => { + body.handler.name = 'home_new_user_no__on_enter'; + body.scene.name = scene; + + const message = `In order to read books using the EDRLAB Library via Google, you need to be a registered EDRLAB member and link your account.\nWould you like to learn more about registering on the EDRLAB Library?\n`; + const data = await expressMocked(body, headers); + + data.prompt.firstSimple.speech.should.to.be.eq(message); + }); + it('yes', async () => { + body.handler.name = 'home_new_user_no__intent__yes'; + body.scene.name = scene; + + const data = await expressMocked(body, headers); + + // const message = `EDRLAB is a national non-profit organization established by Canadian public libraries to champion the fundamental right of Canadians with print disabilities to access media and reading materials in the format of their choice, including audio, braille, e-text and descriptive video. Would you like to find out more about EDRLAB membership, or would you prefer to exit this skill?\n`; + // data.prompt.firstSimple.speech.should.to.be.eq(message); + + data.scene.next.name.should.to.be.eq('info'); + }); + + it('no', async () => { + body.handler.name = 'home_new_user_no__intent__no'; + body.scene.name = scene; + + const data = await expressMocked(body, headers); + + data.scene.next.name.should.to.be.eq('actions.scene.END_CONVERSATION'); + }); + + it('repeat', async () => { + body.handler.name = 'home_new_user_no__intent__repeat'; + body.scene.name = scene; + + const data = await expressMocked(body, headers); + + data.scene.next.name.should.to.be.eq('home_new_user_no'); + }); + + const help = `In order to use the EDRLAB library via your Google Home, you must be a registered member of the library and link your account. Would you like to learn more about the EDRLAB Library?\n`; + + it('help', async () => { + body.handler.name = 'home_new_user_no__intent__help'; + body.scene.name = scene; + + + const data = await expressMocked(body, headers); + + data.prompt.firstSimple.speech.should.to.be.eq(help); + + data.scene.next.name.should.to.be.eq('home_new_user_no'); + }); + + it('fallback 1 and 2', async () => { + body.handler.name = 'home_new_user_no__intent__help'; + body.scene.name = scene; + + const data = await expressMocked(body, headers); + + data.prompt.firstSimple.speech.should.to.be.eq(help); + + data.scene.next.name.should.to.be.eq('home_new_user_no'); + }); + + it('fallback 3', async () => { + body.handler.name = 'home_new_user_no__intent__fallback_end'; + body.scene.name = scene; + + const data = await expressMocked(body, headers); + + data.prompt.firstSimple.speech.should.to.be.eq('Bye!\n'); + + // data.scene.next.name.should.to.be.eq('home_new_user_no'); + }); + + it('silence 1 and 2', async () => { + body.handler.name = 'home_new_user_no__intent__silence'; + body.scene.name = scene; + + const data = await expressMocked(body, headers); + + data.prompt.firstSimple.speech.should.to.be.eq(help); + + data.scene.next.name.should.to.be.eq('home_new_user_no'); + }); + + it('silence 3', async () => { + body.handler.name = 'home_new_user_no__intent__fallback_end'; + body.scene.name = scene; + + const data = await expressMocked(body, headers); + + data.prompt.firstSimple.speech.should.to.be.eq('Bye!\n'); + + // data.scene.next.name.should.to.be.eq('home_new_user_no'); + }); + }); +}); diff --git a/webhooks/functions/src/sdk/home_user.test.ts b/webhooks/functions/src/sdk/home_user.test.ts new file mode 100644 index 00000000..6663998f --- /dev/null +++ b/webhooks/functions/src/sdk/home_user.test.ts @@ -0,0 +1,408 @@ +import {expressMocked, shell, storageModelMocked} from '../test/utils.test'; +import * as chai from 'chai'; +// import * as sinon from 'sinon'; +import {headers, body} from './conv.test'; +import {parsedDataClone} from '../model/data.model.test'; +import {IWebPubView} from 'opds-fetcher-parser/build/src/interface/webpub'; +import {BOOKSHELF_URL} from '../constants'; + + +chai.should(); + +const scene = 'home_user'; + +const yaml = `intentEvents: +- handler: + webhookHandler: home_user__intent__help + intent: help +- handler: + webhookHandler: home_user__intent__repeat + intent: repeat +- handler: + webhookHandler: home_user__intent__bookshelf + intent: bookshelf +- handler: + webhookHandler: home_user__intent__collections + intent: collections +- handler: + webhookHandler: home_user__intent__search + intent: search +- handler: + webhookHandler: home_user__intent__recent_books + intent: recent_books +- handler: + webhookHandler: home_user__intent__current_book + intent: current_book +- handler: + webhookHandler: home_user__intent__fallback + intent: actions.intent.NO_MATCH_1 +- handler: + webhookHandler: home_user__intent__fallback + intent: actions.intent.NO_MATCH_2 +- handler: + webhookHandler: home_user__intent__fallback_end + intent: actions.intent.NO_MATCH_FINAL +- handler: + webhookHandler: home_user__intent__silence + intent: actions.intent.NO_INPUT_1 +- handler: + webhookHandler: home_user__intent__silence + intent: actions.intent.NO_INPUT_2 +- handler: + webhookHandler: home_user__intent__silence_end + intent: actions.intent.NO_INPUT_FINAL +onEnter: + webhookHandler: home_user__on_enter +`; + +describe('home_user handler', () => { + describe('sdk', () => { + it('check main scene', (done) => { + shell(`cat custom/scenes/${scene}.yaml`, (stdout) => { + stdout.should.to.be.eq(yaml); + }, done); + }); + }); + + describe('app', () => { + it('on enter', async () => { + body.handler.name = 'home_user__on_enter'; + body.scene.name = scene; + body.session.id = 'on enter'; // new session + + const message = 'Would you like to consult your bookshelf, or browse our collections? You can also search for a book by saying search for. Followed by a book title or an author.\n'; + const data = await expressMocked(body, headers); + + data.prompt.firstSimple.speech.should.to.be.eq(message); + }); + it('on enter with session state but new session', async () => { + body.handler.name = 'home_user__on_enter'; + body.scene.name = scene; + body.session.id = 'id'; // new session + + const message = 'Would you like to consult your bookshelf, or browse our collections? You can also search for a book by saying search for. Followed by a book title or an author.\n'; + const pullData = parsedDataClone(); + const model = await storageModelMocked(pullData); + + const data = await expressMocked(body, headers, undefined, undefined, undefined, model.data); + model.data.store.session.scene.home_user.state.should.to.be.eq('SESSION'); + data.prompt.firstSimple.speech.should.to.be.eq(message); + }); + it('on enter with session state but new session undefined so the session data is not removed', async () => { + body.handler.name = 'home_user__on_enter'; + body.scene.name = scene; + body.session.id = 'on enter with session state but new session undefined so the session data is not removed'; // new session + + const message = 'Would you like to consult your bookshelf, or browse our collections? You can also search for a book by saying search for. Followed by a book title or an author.\n'; + const pullData = parsedDataClone(); + const model = await storageModelMocked(pullData); + + const data = await expressMocked(body, headers, undefined, undefined, undefined, model.data); + model.data.store.session.scene.home_user.state.should.to.be.eq('SESSION'); + data.prompt.firstSimple.speech.should.to.be.eq(message); + }); + it('on enter with session state', async () => { + body.handler.name = 'home_user__on_enter'; + body.scene.name = scene; + body.session.id = 'test'; + + const message = 'Would you like to consult your bookshelf, or browse our collections? You can also search for a book by saying search for. Followed by a book title or an author.\n'; + const pullData = parsedDataClone(); + const model = await storageModelMocked(pullData); + + const data = await expressMocked(body, headers, undefined, undefined, undefined, model.data); + model.data.store.session.scene.home_user.state.should.to.be.eq('SESSION'); + data.prompt.firstSimple.speech.should.to.be.eq(message); + }); + it('on enter with a current playing no history', async () => { + body.handler.name = 'home_user__on_enter'; + body.scene.name = scene; + body.session.id = 'on enter with a current playing no history'; + + const pullData = parsedDataClone(); + pullData.player.current.index = 9; + pullData.player.current.url = 'https://my.url'; + pullData.player.current.time = 0; + + const feed: Partial<any> = { + publications: [ + { + entryLinks: [{url: 'http://self.link'}], + openAccessLinks: [{url: 'http://webpub.link'}], + title: 'my title', + authors: [ + { + name: 'hello', + }, + ], + }, + ], + }; + const webpub: Partial<IWebPubView> = { + title: 'my title', + authors: [ + 'hello', + 'world', + ], + }; + + const data = await expressMocked(body, headers, pullData, feed, webpub); + console.log(JSON.stringify(data, null, 4)); + + data.prompt.firstSimple.speech.should.to.be.eq('You are listening to the 10 chapter of my title, hello, which you can now pick up.\n' + + 'And, of course, \n' + + 'You can consult your bookshelf, or browse our collections. You can also search for a book by saying search followed by a book title or an author.\n' + + 'Resume reading. Recent books. Bookshelf. Collections. Search for a specific book: what do you want to do?\n'); + }); + it('on enter with a current playing and history', async () => { + body.handler.name = 'home_user__on_enter'; + body.scene.name = scene; + body.session.id = 'on enter with a current playing and history'; + + const pullData = parsedDataClone(); + pullData.player.current.index = 9; + pullData.player.current.url = 'https://my.url'; + pullData.player.current.time = 0; + + pullData.player.history = { + // @ts-ignore + 1: {index: 0, time: 0, date: new Date()}, + 2: {index: 0, time: 0, date: new Date()}, + 3: {index: 0, time: 0, date: new Date()}, + 4: {index: 0, time: 0, date: new Date()}, + }; + // pullData.player.history.set("1", {index: 0, time: 0, date: new Date()}); + // pullData.player.history.set("2", {index: 0, time: 0, date: new Date()}); + // pullData.player.history.set("3", {index: 0, time: 0, date: new Date()}); + // pullData.player.history.set("4", {index: 0, time: 0, date: new Date()}); + + const feed: Partial<any> = { + publications: [ + { + entryLinks: [{url: 'http://self.link'}], + openAccessLinks: [{url: 'http://webpub.link'}], + title: 'my title', + authors: [ + { + name: 'hello', + }, + ], + }, + ], + }; + const webpub: Partial<IWebPubView> = { + title: 'my title', + authors: [ + 'hello', + 'world', + ], + }; + + const data = await expressMocked(body, headers, pullData, feed, webpub); + console.log(JSON.stringify(data, null, 4)); + + data.prompt.firstSimple.speech.should.to.be.eq('You are listening to the 10 chapter of my title, hello, which you can now pick up.\n' + + 'You are also reading 3 other recent books, which you can choose from.\n' + + 'And, of course, \n' + + 'You can consult your bookshelf, or browse our collections. You can also search for a book by saying search followed by a book title or an author.\n' + + 'Resume reading. Recent books. Bookshelf. Collections. Search for a specific book: what do you want to do?\n'); + }); + + it('repeat', async () => { + body.handler.name = 'home_user__intent__repeat'; + body.scene.name = scene; + + const pullData = parsedDataClone(); + const model = await storageModelMocked(pullData); + + const data = await expressMocked(body, headers, undefined, undefined, undefined, model.data); + model.data.store.session.scene.home_user.state.should.to.be.eq('REPEAT'); + + data.scene.next.name.should.to.be.eq('home_user'); + }); + it('search', async () => { + body.handler.name = 'home_user__intent__search'; + body.scene.name = scene; + + const data = await expressMocked(body, headers); + + data.scene.next.name.should.to.be.eq('search'); + }); + it('search with query', async () => { + body.handler.name = 'home_user__intent__search'; + body.scene.name = scene; + body.intent.params = { + query: { + original: 'my query', + resolved: 'my query', + }, + }; + + // parse query and state = FINISH + + const pullData = parsedDataClone(); + + pullData.session.scene.search.query = ''; + pullData.session.scene.search.state = 'DEFAULT'; + + const model = await storageModelMocked(pullData); + + const data = await expressMocked(body, headers, undefined, undefined, undefined, model.data); + + model.data.store.session.scene.search.state.should.to.be.eq('FINISH'); + model.data.store.session.scene.search.query.should.to.be.eq('my query'); + data.scene.next.name.should.to.be.eq('search'); + }); + + it('recents book', async () => { + body.handler.name = 'home_user__intent__recent_books'; + body.scene.name = scene; + + const pullData = parsedDataClone(); + pullData.player.current.index = 9; + pullData.player.current.url = 'https://my.url'; + pullData.player.current.time = 0; + + pullData.player.history = { + // @ts-ignore + 1: {index: 0, time: 0, date: new Date()}, + 2: {index: 0, time: 0, date: new Date()}, + 3: {index: 0, time: 0, date: new Date()}, + 4: {index: 0, time: 0, date: new Date()}, + }; + // pullData.player.history.set("1", {index: 0, time: 0, date: new Date()}); + // pullData.player.history.set("2", {index: 0, time: 0, date: new Date()}); + // pullData.player.history.set("3", {index: 0, time: 0, date: new Date()}); + // pullData.player.history.set("4", {index: 0, time: 0, date: new Date()}); + const model = await storageModelMocked(pullData); + + const webpub: Partial<IWebPubView> = { + title: 'my title', + authors: [ + 'hello', + 'world', + ], + }; + + const data = await expressMocked(body, headers, undefined, undefined, webpub, model.data); + + data.scene.next.name.should.to.be.eq('selection'); + model.data.store.session.scene.selection.url.should.to.be.eq('data://["1","2","3"]'); + model.data.store.session.scene.selection.kind.should.to.be.eq('PUBLICATION'); + model.data.store.session.scene.selection.state.should.to.be.eq('RUNNING'); + }); + + it('current book available', async () => { + body.handler.name = 'home_user__intent__current_book'; + body.scene.name = scene; + + const pullData = parsedDataClone(); + pullData.player.current.index = 9; + pullData.player.current.url = 'https://my.url'; + pullData.player.current.time = 0; + + const model = await storageModelMocked(pullData); + const data = await expressMocked(body, headers, undefined, undefined, undefined, model.data); + + data.scene.next.name.should.to.be.eq('player_prequel'); + }); + + it('current book not available', async () => { + body.handler.name = 'home_user__intent__current_book'; + body.scene.name = scene; + + const pullData = parsedDataClone(); + + const model = await storageModelMocked(pullData); + const data = await expressMocked(body, headers, undefined, undefined, undefined, model.data); + + data.scene.next.name.should.to.be.eq('home_user'); + data.prompt.firstSimple.speech.should.to.be.eq('Uh Oh! Nothing to read here quite yet.\n'); + }); + + it('browse collections', async () => { + body.handler.name = 'home_user__intent__collections'; + body.scene.name = scene; + + const data = await expressMocked(body, headers); + + data.scene.next.name.should.to.be.eq('collections'); + }); + + it('bookshelf', async () => { + body.handler.name = 'home_user__intent__bookshelf'; + body.scene.name = scene; + + const pullData = parsedDataClone(); + const model = await storageModelMocked(pullData); + + const data = await expressMocked(body, headers, undefined, undefined, undefined, model.data); + + model.data.store.session.scene.selection.from.should.to.be.eq('home_user__intent__bookshelf'); + model.data.store.session.scene.selection.kind.should.to.be.eq('PUBLICATION'); + model.data.store.session.scene.selection.nbChoice.should.to.be.eq(0); + model.data.store.session.scene.selection.nextUrlCounter.should.to.be.eq(0); + model.data.store.session.scene.selection.state.should.to.be.eq('RUNNING'); + model.data.store.session.scene.selection.url.should.to.be.eq(BOOKSHELF_URL); + + data.scene.next.name.should.to.be.eq('selection'); + }); + + // const help = `You can search for a specific book by title or author, browse our collections or check your bookshelf to start reading one of your preselected books.\nWhat would you like to do?\n`; + + it('help', async () => { + body.handler.name = 'home_user__intent__help'; + body.scene.name = scene; + + const data = await expressMocked(body, headers); + + // data.prompt.firstSimple.speech.should.to.be.eq(help); + + data.scene.next.name.should.to.be.eq('home_user'); + }); + + it('fallback 1 and 2', async () => { + body.handler.name = 'home_user__intent__help'; + body.scene.name = scene; + + const data = await expressMocked(body, headers); + + // data.prompt.firstSimple.speech.should.to.be.eq(help); + + data.scene.next.name.should.to.be.eq('home_user'); + }); + + it('fallback 3', async () => { + body.handler.name = 'home_user__intent__fallback_end'; + body.scene.name = scene; + + const data = await expressMocked(body, headers); + + data.prompt.firstSimple.speech.should.to.be.eq('Bye!\n'); + + // data.scene.next.name.should.to.be.eq('home_user'); + }); + + it('silence 1 and 2', async () => { + body.handler.name = 'home_user__intent__silence'; + body.scene.name = scene; + + const data = await expressMocked(body, headers); + + // data.prompt.firstSimple.speech.should.to.be.eq(help); + + data.scene.next.name.should.to.be.eq('home_user'); + }); + + it('silence 3', async () => { + body.handler.name = 'home_user__intent__fallback_end'; + body.scene.name = scene; + + const data = await expressMocked(body, headers); + + data.prompt.firstSimple.speech.should.to.be.eq('Bye!\n'); + + // data.scene.next.name.should.to.be.eq('home_user'); + }); + }); +}); diff --git a/webhooks/functions/src/sdk/info.test.ts b/webhooks/functions/src/sdk/info.test.ts new file mode 100644 index 00000000..60e28abf --- /dev/null +++ b/webhooks/functions/src/sdk/info.test.ts @@ -0,0 +1,161 @@ +import {expressMocked, shell} from '../test/utils.test'; +import * as chai from 'chai'; +// import * as sinon from 'sinon'; +import {headers, body} from './conv.test'; + + +chai.should(); + +const scene = 'info'; + +const yaml = `intentEvents: +- handler: + webhookHandler: info__intent__yes + intent: "yes" + transitionToScene: actions.scene.END_CONVERSATION +- handler: + webhookHandler: info__intent__help + intent: help +- handler: + webhookHandler: info__intent__repeat + intent: repeat +- handler: + webhookHandler: info__intent__yes + intent: membership + transitionToScene: actions.scene.END_CONVERSATION +- handler: + webhookHandler: info__intent__no + intent: "no" +- handler: + webhookHandler: info__intent__fallback + intent: actions.intent.NO_MATCH_1 +- handler: + webhookHandler: info__intent__fallback + intent: actions.intent.NO_MATCH_2 +- handler: + webhookHandler: info__intent__fallback_end + intent: actions.intent.NO_MATCH_FINAL +- handler: + webhookHandler: info__intent__silence + intent: actions.intent.NO_INPUT_1 +- handler: + webhookHandler: info__intent__silence + intent: actions.intent.NO_INPUT_2 +- handler: + webhookHandler: info__intent__silence_end + intent: actions.intent.NO_INPUT_FINAL +onEnter: + webhookHandler: info__on_enter +`; + +describe(scene + ' handler', () => { + describe('sdk', () => { + it('check main scene', (done) => { + shell(`cat custom/scenes/${scene}.yaml`, (stdout) => { + stdout.should.to.be.eq(yaml); + }, done); + }); + }); + + describe('app', () => { + it('on enter', async () => { + body.handler.name = 'info__on_enter'; + body.scene.name = scene; + + // const message = `EDRLAB about text. Would you like to find out more about EDRLAB membership, or would you prefer to exit this skill?\n`; + + await expressMocked(body, headers); + + // data.prompt.firstSimple.speech.should.to.be.eq(message); + }); + it('yes or membership', async () => { + body.handler.name = 'info__intent__yes'; + body.scene.name = scene; + + const data = await expressMocked(body, headers); + + const message = `<speak>Signing up is easy, you can head on over to the EDRLAB online platform at <sub alias="cela library">celalibrary</sub> dot <say-as interpret-as="characters">ca</say-as>. Keep the name of your local library and your library or SQLA number handy, that's all you'll need. You can also ask for help at your local library. As soon as your membership is activated, you can come back to start using the EDRLAB library via Google Assistant, by saying Hey Google, launch Accessible reading Canada.\n</speak>`; + data.prompt.firstSimple.speech.should.to.be.eq(message); + + data.scene.next.name.should.to.be.eq('actions.scene.END_CONVERSATION'); + }); + + it('no', async () => { + body.handler.name = 'info__intent__yes'; + body.scene.name = scene; + + const data = await expressMocked(body, headers); + + // data.prompt.firstSimple.speech.should.to.be.eq(message); + + data.scene.next.name.should.to.be.eq('actions.scene.END_CONVERSATION'); + }); + + it('repeat', async () => { + body.handler.name = 'info__intent__repeat'; + body.scene.name = scene; + + const data = await expressMocked(body, headers); + + data.scene.next.name.should.to.be.eq('info'); + }); + + // const help = `If you'd like to learn more about EDRLAB membership - you can ask me by saying 'membership', or simply say 'stop' to exit this skill. If you have any other questions, we recommend reaching out to your local library for support. I'm listening?\n`; + + it('help', async () => { + body.handler.name = 'info__intent__help'; + body.scene.name = scene; + + + const data = await expressMocked(body, headers); + + // data.prompt.firstSimple.speech.should.to.be.eq(help); + + data.scene.next.name.should.to.be.eq('info'); + }); + + it('fallback 1 and 2', async () => { + body.handler.name = 'info__intent__help'; + body.scene.name = scene; + + const data = await expressMocked(body, headers); + + // data.prompt.firstSimple.speech.should.to.be.eq(help); + + data.scene.next.name.should.to.be.eq('info'); + }); + + it('fallback 3', async () => { + body.handler.name = 'info__intent__fallback_end'; + body.scene.name = scene; + + const data = await expressMocked(body, headers); + + data.prompt.firstSimple.speech.should.to.be.eq('Bye!\n'); + + // data.scene.next.name.should.to.be.eq('home_new_user'); + }); + + it('silence 1 and 2', async () => { + body.handler.name = 'info__intent__silence'; + body.scene.name = scene; + + const data = await expressMocked(body, headers); + + // data.prompt.firstSimple.speech.should.to.be.eq(help); + + data.scene.next.name.should.to.be.eq('info'); + }); + + it('silence 3', async () => { + body.handler.name = 'info__intent__fallback_end'; + body.scene.name = scene; + + const data = await expressMocked(body, headers); + + data.prompt.firstSimple.speech.should.to.be.eq('Bye!\n'); + + // data.scene.next.name.should.to.be.eq('home_new_user'); + }); + }); +}); diff --git a/webhooks/functions/src/sdk/main.test.ts b/webhooks/functions/src/sdk/main.test.ts new file mode 100644 index 00000000..ebaa610c --- /dev/null +++ b/webhooks/functions/src/sdk/main.test.ts @@ -0,0 +1,71 @@ +import {expressMocked, shell, storageModelMocked} from '../test/utils.test'; +import * as chai from 'chai'; +// import * as sinon from 'sinon'; +import {headers, body} from './conv.test'; +import {parsedDataClone} from '../model/data.model.test'; + +chai.should(); + +describe('main handler', () => { + describe('sdk', () => { + it('check main scene', (done) => { + shell('cat custom/global/actions.intent.MAIN.yaml | grep "webhookHandler: main"', (stdout) => { + stdout.should.to.be.eq(' webhookHandler: main\n'); + }, done); + }); + }); + + describe('app', () => { + it('main new user unspecified', async () => { + body.user.accountLinkingStatus = 'ACCOUNT_LINKING_STATUS_UNSPECIFIED'; + const data = await expressMocked(body, headers); + + const welcomeNewUser = 'Welcome to EDRLAB Library, where you can easily access your favorite audio books.\n'; + + data.prompt.firstSimple.speech.should.to.be.eq(welcomeNewUser); + + data.scene.next.name.should.to.be.eq('home_new_user'); + }); + + it('main new user not linked', async () => { + body.user.accountLinkingStatus = 'NO_LINKED'; + const data = await expressMocked(body, headers); + + const welcomeNewUser = 'Welcome to EDRLAB Library, where you can easily access your favorite audio books.\n'; + + data.prompt.firstSimple.speech.should.to.be.eq(welcomeNewUser); + + data.scene.next.name.should.to.be.eq('home_new_user'); + }); + + it('main new user linked', async () => { + body.user.accountLinkingStatus = 'LINKED'; + + const pullData = parsedDataClone(); + const model = await storageModelMocked(pullData); + const data = await expressMocked(body, headers, undefined, undefined, undefined, model.data); + + const welcomeUser = 'Welcome back to your EDRLAB Library! Remember, you can ask for help at any time.\n'; + + data.prompt.firstSimple.speech.should.to.be.eq(welcomeUser); + + model.data.store.user.authentication.should.to.be.eq('NEWLY_LINKED'); + data.scene.next.name.should.to.be.eq('home_user'); + }); + it('main user linked', async () => { + body.user.accountLinkingStatus = 'LINKED'; + + const pullData = parsedDataClone(); + const model = await storageModelMocked(pullData); + model.data.store.user.authentication = 'NEWLY_LINKED'; + const data = await expressMocked(body, headers, undefined, undefined, undefined, model.data); + + const welcomeUser = 'Welcome back to your EDRLAB Library! Remember, you can ask for help at any time.\n'; + + data.prompt.firstSimple.speech.should.to.be.eq(welcomeUser); + + model.data.store.user.authentication.should.to.be.eq('LINKED'); + data.scene.next.name.should.to.be.eq('home_user'); + }); + }); +}); diff --git a/webhooks/functions/src/sdk/player.test.ts b/webhooks/functions/src/sdk/player.test.ts new file mode 100644 index 00000000..bfc40655 --- /dev/null +++ b/webhooks/functions/src/sdk/player.test.ts @@ -0,0 +1,93 @@ +import {expressMocked, shell, storageModelMocked} from '../test/utils.test'; +import * as chai from 'chai'; +// import * as sinon from 'sinon'; +import {headers, body} from './conv.test'; +import {parsedDataClone} from '../model/data.model.test'; + +/* eslint-disable no-unused-vars */ + +chai.should(); + +const scene = 'player'; + +const yaml = `intentEvents: +- handler: + webhookHandler: player__intent__media_status_finished + intent: actions.intent.MEDIA_STATUS_FINISHED +- handler: + webhookHandler: player__intent__media_status_paused + intent: actions.intent.MEDIA_STATUS_PAUSED +- handler: + webhookHandler: player__intent__media_status_stopped + intent: actions.intent.MEDIA_STATUS_STOPPED +- handler: + webhookHandler: player__intent__media_status_failed + intent: actions.intent.MEDIA_STATUS_FAILED +onEnter: + webhookHandler: player__on_enter +`; + +describe(scene + ' handler', () => { + describe('sdk', () => { + it('check main scene', (done) => { + shell(`cat custom/scenes/${scene}.yaml`, (stdout) => { + stdout.should.to.be.eq(yaml); + }, done); + }); + }); + + describe('app', () => { + it('on enter with no playing url', async () => { + body.handler.name = 'player__on_enter'; + body.scene.name = scene; + + const data = await expressMocked(body, headers); + + const message = 'Oops, something went wrong. I will exit the app. Feel free to reopen it as soon as possible.'; + + data.prompt.firstSimple.speech.should.to.be.eq(message); + + // catch trap + + data.scene.next.name.should.to.be.eq('actions.scene.END_CONVERSATION'); + }); + it('media status finished', async () => { + body.handler.name = 'player__intent__media_status_finished'; + body.scene.name = scene; + body.context.media.index = 2; + body.context.media.progress = '40s'; + + const pullData = parsedDataClone(); + pullData.player.current.index = 0; + pullData.player.current.time = 0; + pullData.player.current.url = 'http://my.url'; + const model = await storageModelMocked(pullData); + + const webpub = undefined; + + const data = await expressMocked(body, headers, undefined, undefined, webpub, model.data); + + model.data.store.player.current.index = 2; + model.data.store.player.current.time?.should.to.be.eq(0); + model.data.store.player.current.url?.should.to.be.eq('http://my.url'); + }); + it('media status stopped', async () => { + body.handler.name = 'player__intent__media_status_stopped'; + body.scene.name = scene; + + const data = await expressMocked(body, headers); + }); + it('media status paused', async () => { + body.handler.name = 'player__intent__media_status_stopped'; + body.scene.name = scene; + + const data = await expressMocked(body, headers); + }); + it('media status failed', async () => { + body.handler.name = 'player__intent__media_status_failed'; + body.scene.name = scene; + + const data = await expressMocked(body, headers); + }); + }); +}); diff --git a/webhooks/functions/src/sdk/player_prequel.test.ts b/webhooks/functions/src/sdk/player_prequel.test.ts new file mode 100644 index 00000000..19f5dcb3 --- /dev/null +++ b/webhooks/functions/src/sdk/player_prequel.test.ts @@ -0,0 +1,373 @@ +import {expressMocked, shell, storageModelMocked} from '../test/utils.test'; +import * as chai from 'chai'; +// import * as sinon from 'sinon'; +import {headers, body} from './conv.test'; +import {parsedDataClone} from '../model/data.model.test'; +import {IWebPubView} from 'opds-fetcher-parser/build/src/interface/webpub'; + + +chai.should(); + +const scene = 'player_prequel'; + +const yaml = `intentEvents: +- handler: + webhookHandler: player_prequel__intent__help + intent: help +- handler: + webhookHandler: player_prequel__intent__repeat + intent: repeat +- handler: + webhookHandler: player_prequel__intent__player_prequel_back + intent: player_prequel_back +- handler: + webhookHandler: player_prequel__intent__player_prequel_resume + intent: player_prequel_resume +- handler: + webhookHandler: player_prequel__intent__player_prequel_start + intent: player_prequel_start +- handler: + webhookHandler: player_prequel__intent__player_prequel_summary + intent: player_prequel_summary +- handler: + webhookHandler: player_prequel__fallback + intent: actions.intent.NO_MATCH_1 +- handler: + webhookHandler: player_prequel__fallback + intent: actions.intent.NO_MATCH_2 +- handler: + webhookHandler: player_prequel__fallback_end + intent: actions.intent.NO_MATCH_FINAL +- handler: + webhookHandler: player_prequel__silence + intent: actions.intent.NO_INPUT_1 +- handler: + webhookHandler: player_prequel__silence + intent: actions.intent.NO_INPUT_2 +- handler: + webhookHandler: player_prequel__silence_end + intent: actions.intent.NO_INPUT_FINAL +onEnter: + webhookHandler: player_prequel__on_enter +`; + +describe(scene + ' handler', () => { + describe('sdk', () => { + it('check main scene', (done) => { + shell(`cat custom/scenes/${scene}.yaml`, (stdout) => { + stdout.should.to.be.eq(yaml); + }, done); + }); + }); + + describe('app', () => { + it('on enter - bad url', async () => { + body.handler.name = 'player_prequel__on_enter'; + body.scene.name = scene; + + const pullData = parsedDataClone(); + + const message = `Oops, something went wrong. I will exit the app. Feel free to reopen it as soon as possible.`; + + const model = await storageModelMocked(pullData); + const data = await expressMocked(body, headers, undefined, undefined, undefined, model.data); + + data.prompt.firstSimple.speech.should.to.be.eq(message); + data.scene.next.name.should.to.be.eq('actions.scene.END_CONVERSATION'); + }); + it('on enter - home_user_current_book', async () => { + body.handler.name = 'player_prequel__on_enter'; + body.scene.name = scene; + + const pullData = parsedDataClone(); + pullData.player.current.index = 0; + pullData.player.current.time = 0; + pullData.player.current.url = 'http://my.url'; + + const feed: Partial<any> = { + publications: [ + { + entryLinks: [{url: 'http://self.link'}], + openAccessLinks: [{url: 'http://webpub.link'}], + title: 'my title', + }, + ], + }; + + const webpub: Partial<IWebPubView> = { + title: 'my title', + authors: [ + 'hello', + 'world', + ], + }; + + pullData.session.scene.player_prequel.from = 'home_user__intent__current_book'; + + const model = await storageModelMocked(pullData); + const data = await expressMocked(body, headers, undefined, feed, webpub, model.data); + + data.scene.next.name.should.to.be.eq('player'); + + model.data.store.session.scene.player_prequel.from.should.to.be.eq('main'); + model.data.store.session.scene.player_prequel.player.should.to.be.deep.eq({}); ; + model.data.store.player.current.should.to.be.deep.eq(pullData.player.current); + }); + it('on enter - from selection and playing', async () => { + body.handler.name = 'player_prequel__on_enter'; + body.scene.name = scene; + + const pullData = parsedDataClone(); + pullData.session.scene.player_prequel.player.index = 2; + pullData.session.scene.player_prequel.player.time = 330; + pullData.session.scene.player_prequel.player.url = 'https://my.url'; + + pullData.session.scene.player_prequel.from = 'selection__on_enter'; + const feed: Partial<any> = { + publications: [ + { + entryLinks: [{url: 'http://self.link'}], + openAccessLinks: [{url: 'http://webpub.link'}], + title: 'my title', + }, + ], + }; + const webpub: Partial<IWebPubView> = { + title: 'my title', + authors: [ + 'hello', + 'world', + ], + }; + + const model = await storageModelMocked(pullData); + const data = await expressMocked(body, headers, undefined, feed, webpub, model.data); + + (typeof model.data.store.player.current.index).should.be.eq('undefined'); + (typeof model.data.store.player.current.time).should.be.eq('undefined'); + (typeof model.data.store.player.current.url).should.be.eq('undefined'); + + model.data.store.session.scene.player_prequel.player.index?.should.be.eq(2); + model.data.store.session.scene.player_prequel.player.time?.should.be.eq(330); + model.data.store.session.scene.player_prequel.player.url?.should.be.eq('https://my.url'); + model.data.store.session.scene.player_prequel.from.should.be.eq('selection__on_enter'); + + data.prompt.firstSimple.speech.should.to.be.eq('You\'ve chosen my title, that you have already started.\n' + + 'Do you want to resume reading, listen the summary or come back to the list?\n'); + }); + it('on enter - from selection and no playing', async () => { + body.handler.name = 'player_prequel__on_enter'; + body.scene.name = scene; + + const pullData = parsedDataClone(); + pullData.session.scene.player_prequel.player.index = 0; + pullData.session.scene.player_prequel.player.time = 0; + pullData.session.scene.player_prequel.player.url = 'https://my.url'; + + pullData.session.scene.player_prequel.from = 'selection__on_enter'; + + + const feed: Partial<any> = { + publications: [ + { + entryLinks: [{url: 'http://self.link'}], + openAccessLinks: [{url: 'http://webpub.link'}], + title: 'my title', + }, + ], + }; + const webpub: Partial<IWebPubView> = { + title: 'my title', + authors: [ + 'hello', + 'world', + ], + }; + + const model = await storageModelMocked(pullData); + const data = await expressMocked(body, headers, undefined, feed, webpub, model.data); + + (typeof model.data.store.player.current.index).should.be.eq('undefined'); + (typeof model.data.store.player.current.time).should.be.eq('undefined'); + (typeof model.data.store.player.current.url).should.be.eq('undefined'); + + // @ts-ignore + model.data.store.session.scene.player_prequel.player.index.should.be.eq(0); + // @ts-ignore + model.data.store.session.scene.player_prequel.player.time.should.be.eq(0); + // @ts-ignore + model.data.store.session.scene.player_prequel.player.url.should.be.eq('https://my.url'); + model.data.store.session.scene.player_prequel.from.should.be.eq('selection__on_enter'); + + data.prompt.firstSimple.speech.should.to.be.eq('You\'ve chosen my title.\n' + + 'Do you want to start reading, listen the summary or come back to the list?\n'); + }); + + it('back', async () => { + body.handler.name = 'player_prequel__intent__player_prequel_back'; + body.scene.name = scene; + + const pullData = parsedDataClone(); + pullData.session.scene.player_prequel.player.index = 0; + pullData.session.scene.player_prequel.player.time = 0; + pullData.session.scene.player_prequel.player.url = 'https://my.url'; + + pullData.session.scene.player_prequel.from = 'selection__on_enter'; + const feed: Partial<any> = { + publications: [ + { + entryLinks: [{url: 'http://self.link'}], + openAccessLinks: [{url: 'http://webpub.link'}], + title: 'my title', + }, + ], + }; + const webpub: Partial<IWebPubView> = { + title: 'my title', + authors: [ + 'hello', + 'world', + ], + }; + + const model = await storageModelMocked(pullData); + const data = await expressMocked(body, headers, undefined, feed, webpub, model.data); + + (typeof model.data.store.session.scene.player_prequel.player.index).should.be.eq('undefined'); + (typeof model.data.store.session.scene.player_prequel.player.time).should.be.eq('undefined'); + (typeof model.data.store.session.scene.player_prequel.player.url).should.be.eq('undefined'); + model.data.store.session.scene.player_prequel.from.should.be.eq('selection__on_enter'); + + data.scene.next.name.should.to.be.eq('selection'); + }); + + it('start', async () => { + body.handler.name = 'player_prequel__intent__player_prequel_start'; + body.scene.name = scene; + + const pullData = parsedDataClone(); + pullData.session.scene.player_prequel.player.index = 0; + pullData.session.scene.player_prequel.player.time = 0; + pullData.session.scene.player_prequel.player.url = 'https://my.url'; + + pullData.session.scene.player_prequel.from = 'selection__on_enter'; + const feed: Partial<any> = { + publications: [ + { + entryLinks: [{url: 'http://self.link'}], + openAccessLinks: [{url: 'http://webpub.link'}], + title: 'my title', + + }, + ], + }; + const webpub: Partial<IWebPubView> = { + title: 'my title', + authors: [ + 'hello', + 'world', + ], + }; + + const model = await storageModelMocked(pullData); + const data = await expressMocked(body, headers, undefined, feed, webpub, model.data); + + (typeof model.data.store.session.scene.player_prequel.player.index).should.be.eq('undefined'); + (typeof model.data.store.session.scene.player_prequel.player.time).should.be.eq('undefined'); + (typeof model.data.store.session.scene.player_prequel.player.url).should.be.eq('undefined'); + model.data.store.session.scene.player_prequel.from.should.be.eq('selection__on_enter'); + + // @ts-ignore + model.data.store.player.current.index.should.be.eq(0); + // @ts-ignore + model.data.store.player.current.time.should.be.eq(0); + // @ts-ignore + model.data.store.player.current.url.should.be.eq('https://my.url'); + + data.scene.next.name.should.to.be.eq('player'); + + data.prompt.firstSimple.speech.should.to.be.eq('Great choice! Before we start, let me remind you how this reader works. You can put your read on hold at any time by saying \'Hey Google, Pause\'. \'Hey Google, Resume\' will let you pick up your reading where you last left it. You can also navigate between chapters by saying \'Hey Google, next\' or \'Hey Google, previous\' at any time.\n' + + 'Let\'s start reading my title.\n'); + }); + it('resume', async () => { + body.handler.name = 'player_prequel__intent__player_prequel_start'; + body.scene.name = scene; + + const pullData = parsedDataClone(); + pullData.session.scene.player_prequel.player.index = 234; + pullData.session.scene.player_prequel.player.time = 435; + pullData.session.scene.player_prequel.player.url = 'https://my.url'; + + pullData.session.scene.player_prequel.from = 'selection__on_enter'; + const feed: Partial<any> = { + publications: [ + { + entryLinks: [{url: 'http://self.link'}], + openAccessLinks: [{url: 'http://webpub.link'}], + title: 'my title', + }, + ], + }; + const webpub: Partial<IWebPubView> = { + title: 'my title', + authors: [ + 'hello', + 'world', + ], + }; + + const model = await storageModelMocked(pullData); + const data = await expressMocked(body, headers, undefined, feed, webpub, model.data); + + (typeof model.data.store.session.scene.player_prequel.player.index).should.be.eq('undefined'); + (typeof model.data.store.session.scene.player_prequel.player.time).should.be.eq('undefined'); + (typeof model.data.store.session.scene.player_prequel.player.url).should.be.eq('undefined'); + model.data.store.session.scene.player_prequel.from.should.be.eq('selection__on_enter'); + + // @ts-ignore + model.data.store.player.current.index.should.be.eq(234); + // @ts-ignore + model.data.store.player.current.time.should.be.eq(435); + // @ts-ignore + model.data.store.player.current.url.should.be.eq('https://my.url'); + + data.scene.next.name.should.to.be.eq('player'); + + data.prompt.firstSimple.speech.should.to.be.eq('Great choice! Before we start, let me remind you how this reader works. You can put your read on hold at any time by saying \'Hey Google, Pause\'. \'Hey Google, Resume\' will let you pick up your reading where you last left it. You can also navigate between chapters by saying \'Hey Google, next\' or \'Hey Google, previous\' at any time.\n' + + 'Let\'s continue reading my title.\n'); + }); + it('summary', async () => { + body.handler.name = 'player_prequel__intent__player_prequel_summary'; + body.scene.name = scene; + + const pullData = parsedDataClone(); + pullData.session.scene.player_prequel.player.index = 234; + pullData.session.scene.player_prequel.player.time = 435; + pullData.session.scene.player_prequel.player.url = 'https://my.url'; + + pullData.session.scene.player_prequel.from = 'selection__on_enter'; + const feed: Partial<any> = { + publications: [ + { + entryLinks: [{url: 'http://self.link'}], + openAccessLinks: [{url: 'http://webpub.link'}], + description: 'this is the world in feed', + }, + ], + }; + const webpub: Partial<IWebPubView> = { + title: 'my title', + authors: [ + 'hello', + 'world', + ], + description: 'this is the world', + }; + + const model = await storageModelMocked(pullData); + const data = await expressMocked(body, headers, undefined, feed, webpub, model.data); + + data.prompt.firstSimple.speech.should.to.be.eq('Here is the summary: this is the world in feed.\nDo you want to start reading or go back to the list?\n'); + }); + }); +}); diff --git a/webhooks/functions/src/sdk/search.test.ts b/webhooks/functions/src/sdk/search.test.ts new file mode 100644 index 00000000..a3da91b9 --- /dev/null +++ b/webhooks/functions/src/sdk/search.test.ts @@ -0,0 +1,161 @@ +import {expressMocked, shell, storageModelMocked} from '../test/utils.test'; +import * as chai from 'chai'; +// import * as sinon from 'sinon'; +import {headers, body} from './conv.test'; +import {parsedDataClone} from '../model/data.model.test'; +import {SEARCH_URL_FN} from '../constants'; + + +chai.should(); + +const scene = 'search'; + +const yaml = `intentEvents: +- handler: + webhookHandler: search__intent__search_query + intent: search_query +- handler: + webhookHandler: search__intent__search + intent: search +onEnter: + webhookHandler: search__on_enter +`; + +describe(scene + ' handler', () => { + describe('sdk', () => { + it('check main scene', (done) => { + shell(`cat custom/scenes/${scene}.yaml`, (stdout) => { + stdout.should.to.be.eq(yaml); + }, done); + }); + }); + + describe('app', () => { + it('on enter default state', async () => { + body.handler.name = 'search__on_enter'; + body.scene.name = scene; + + const pullData = parsedDataClone(); + + pullData.session.scene.search.query = ''; + pullData.session.scene.search.state = 'DEFAULT'; + + const message = `Oops, something went wrong. I will exit the app. Feel free to reopen it as soon as possible.`; + + const model = await storageModelMocked(pullData); + const data = await expressMocked(body, headers, undefined, undefined, undefined, model.data); + + data.prompt.firstSimple.speech.should.to.be.eq(message); + data.scene.next.name.should.to.be.eq('actions.scene.END_CONVERSATION'); + }); + it('on enter no query available and running', async () => { + body.handler.name = 'search__on_enter'; + body.scene.name = scene; + + const message = `What book or author are you looking for ?\n`; + + const pullData = parsedDataClone(); + + pullData.session.scene.search.query = ''; + pullData.session.scene.search.state = 'RUNNING'; + + const model = await storageModelMocked(pullData); + const data = await expressMocked(body, headers, undefined, undefined, undefined, model.data); + + data.prompt.firstSimple.speech.should.to.be.eq(message); + }); + it('on enter no query available and running', async () => { + body.handler.name = 'search__on_enter'; + body.scene.name = scene; + + const message = `In the meanwhile, is there another title or author you'd like to search for?\n`; + + const pullData = parsedDataClone(); + + pullData.session.scene.search.query = ''; + pullData.session.scene.search.state = 'RUNNING'; + pullData.session.scene.search.from = 'selection__on_enter'; + + const model = await storageModelMocked(pullData); + const data = await expressMocked(body, headers, undefined, undefined, undefined, model.data); + + data.prompt.firstSimple.speech.should.to.be.eq(message); + model.data.store.session.scene.search.from.should.to.be.eq('main'); + }); + it('on enter query and finish state', async () => { + body.handler.name = 'search__on_enter'; + body.scene.name = scene; + + const pullData = parsedDataClone(); + + pullData.session.scene.search.query = 'my query'; + pullData.session.scene.search.state = 'FINISH'; + + const model = await storageModelMocked(pullData); + + const data = await expressMocked(body, headers, undefined, undefined, undefined, model.data); + + model.data.store.session.scene.selection.from.should.to.be.eq('search__on_enter'); + model.data.store.session.scene.selection.kind.should.to.be.eq('PUBLICATION'); + model.data.store.session.scene.selection.nbChoice.should.to.be.eq(0); + model.data.store.session.scene.selection.nextUrlCounter.should.to.be.eq(0); + model.data.store.session.scene.selection.state.should.to.be.eq('RUNNING'); + model.data.store.session.scene.selection.url.should.to.be.eq(SEARCH_URL_FN('my%20query')); // @TODO check url encoding + + // request url with query + // and set nextScene to selections + + data.scene.next.name.should.to.be.eq('selection'); + }); + it('search', async () => { + body.handler.name = 'search__intent__search'; + body.scene.name = scene; + body.intent.params = { + query: { + original: 'my query', + resolved: 'my query', + }, + }; + + // parse query and state = FINISH + + const pullData = parsedDataClone(); + + pullData.session.scene.search.query = ''; + pullData.session.scene.search.state = 'RUNNING'; + + const model = await storageModelMocked(pullData); + + const data = await expressMocked(body, headers, undefined, undefined, undefined, model.data); + + model.data.store.session.scene.search.state.should.to.be.eq('FINISH'); + model.data.store.session.scene.search.query.should.to.be.eq('my query'); + data.scene.next.name.should.to.be.eq('search'); + }); + it('query search', async () => { + body.handler.name = 'search__intent__search_query'; + body.scene.name = scene; + body.intent.params = { + query: { + original: 'my query', + resolved: 'my query', + }, + }; + + // parse query and state = FINISH + + const pullData = parsedDataClone(); + + pullData.session.scene.search.query = ''; + pullData.session.scene.search.state = 'RUNNING'; + + const model = await storageModelMocked(pullData); + + const data = await expressMocked(body, headers, undefined, undefined, undefined, model.data); + + model.data.store.session.scene.search.state.should.to.be.eq('FINISH'); + model.data.store.session.scene.search.query.should.to.be.eq('my query'); + data.scene.next.name.should.to.be.eq('search'); + }); + }); +}); diff --git a/webhooks/functions/src/sdk/selection.test.ts b/webhooks/functions/src/sdk/selection.test.ts new file mode 100644 index 00000000..7e8363b2 --- /dev/null +++ b/webhooks/functions/src/sdk/selection.test.ts @@ -0,0 +1,1125 @@ +import {expressMocked, shell, storageModelMocked} from '../test/utils.test'; +import * as chai from 'chai'; +// import * as sinon from 'sinon'; +import {headers, body} from './conv.test'; +import {parsedDataClone} from '../model/data.model.test'; +import {IOpdsResultView} from 'opds-fetcher-parser/build/src/interface/opds'; +import {IWebPubView} from 'opds-fetcher-parser/build/src/interface/webpub'; + +chai.should(); + +const scene = 'selection'; + +const yaml = `intentEvents: +- handler: + webhookHandler: selection__intent__selects_book + intent: selects_book +- handler: + webhookHandler: selection__intent__repeat + intent: repeat +- handler: + webhookHandler: selection__intent__another_one + intent: another_one +- handler: + webhookHandler: selection__intent__help + intent: help +- handler: + webhookHandler: selection__intent__fallback + intent: actions.intent.NO_MATCH_1 +- handler: + webhookHandler: selection__intent__fallback + intent: actions.intent.NO_MATCH_2 +- handler: + webhookHandler: selection__intent__fallback_end + intent: actions.intent.NO_MATCH_FINAL +- handler: + webhookHandler: selection__intent__silence + intent: actions.intent.NO_INPUT_1 +- handler: + webhookHandler: selection__intent__silence + intent: actions.intent.NO_INPUT_2 +- handler: + webhookHandler: selection__intent__silence_end + intent: actions.intent.NO_INPUT_FINAL +onEnter: + webhookHandler: selection__on_enter +`; + +describe(scene + ' handler', () => { + describe('sdk', () => { + it('check main scene', (done) => { + shell(`cat custom/scenes/${scene}.yaml`, (stdout) => { + stdout.should.to.be.eq(yaml); + }, done); + }); + }); + + const messageHelpers = (number: number, it: Array<[nb: number, title: string]>, nextPage = false) => { + const a = 'Pick one of these by requesting the corresponding number.\n' + (nextPage ? 'Or ask for the next set.\n' : ''); + const b = it.reduce((pv, [nb, title]) => pv + `${nb}. ${title}\n`, ''); + const c = 'Which number do you choose?\n'; + return a + b + c; + }; + + const help = 'At this stage, you must choose a title among the proposed set, by mentioning its number, for example number 1. You can request other titles by using the Next or Previous commands.\n'; + + describe('app', () => { + it('on enter', async () => { + body.handler.name = 'selection__on_enter'; + body.scene.name = scene; + + + // TODO + // LOT of Code here because all messages will be in on-enter + + // test si state === "running" sinon forward vers la bonne scene + // tant que state !=== 'finish' dire à l'utilisateur les resultats + // soit de groupes ou soit de publications puis demander le numéro + // lorsque le numéro est vérifier dans select book intent + // vérifier le numéro dans la state machine et afficher la proposition + // lorsque cela est la derniere page afficher la page en cours et dire un message + // + // ici ce trouve la machine a état de selection + // nécéssite surement d'étoffer les états .. au lieu de les morcelés + + // state === running + // 1) check url + // 2) check page + // 3) if (last page) ->say + // 4) afficher resultat + + // state === finish + // 1) check url + // 2) check page ((else an error happen (reset ? ))) + // 3) routing table with from handler + + // 1) state === running + // 2) vérifier url + // 3) vérifier page + // 4) afficher utilisateur + // 5) attendre numéro + // 6) checker ce numéro + // 7) afficher utilisateur + // 8) attendre num + // 9) check num + // 10) last page -> say user + // 11) afficher user + // 12) good choice user + // 13) machine finish + // 15) table de routage prochaine scene en fonction de sceneFrom + + const message = `Oops, something went wrong. I will exit the app. Feel free to reopen it as soon as possible.`; + + const pullData = parsedDataClone(); + + // DEFAULT : trigger an error + // pullData.session.scene.selection.state = 'DEFAULT'; + const data = await expressMocked(body, headers, pullData); + + data.prompt.firstSimple.speech.should.to.be.eq(message); + + // must redirect to home_user when the state machine not initialized + data.scene.next.name.should.to.be.eq('actions.scene.END_CONVERSATION'); + }); + + it('on enter - state running - no url', async () => { + body.handler.name = 'selection__on_enter'; + body.scene.name = scene; + + const pullData = parsedDataClone(); + pullData.session.scene.selection.state = 'RUNNING'; + const data = await expressMocked(body, headers, pullData); + + const message = `Oops, something went wrong. I will exit the app. Feel free to reopen it as soon as possible.`; + data.prompt.firstSimple.speech.should.to.be.eq(message); + data.scene.next.name.should.to.be.eq('actions.scene.END_CONVERSATION'); + }); + + const newFeed = (): Partial<IOpdsResultView> => ({ + publications: [ + { + openAccessLinks: [ + { + url: 'http://pub.url', + }, + ], + entryLinks: [ + { + url: 'http://self.url', + }, + ], + baseUrl: 'http://base.url', + title: 'first publication', + authors: [], + numberOfPages: 0, + }, + { + openAccessLinks: [ + { + url: 'http://pub.url', + }, + ], + entryLinks: [ + { + url: 'http://self.url', + }, + ], + baseUrl: 'http://base.url', + title: 'second publication', + authors: [], + numberOfPages: 0, + }, + ], + groups: [ + { + selfLink: { + title: 'first group', + url: 'http://group.url', + }, + }, + { + selfLink: { + title: 'second group', + url: 'http://group.url', + }, + }, + // { + // selfLink: { + // title: 'third group', + // url: '', + // } + // }, + ], + // @ts-ignore + links: { + next: [ + { + url: 'http://next.link', + }, + ], + }, + }); + + const testStateRunningPublication = (n = false) => { + const pullData = parsedDataClone(); + pullData.session.scene.selection.state = 'RUNNING'; + pullData.session.scene.selection.url = 'http://my.url'; + pullData.session.scene.selection.kind = 'PUBLICATION'; + + const feed: Partial<IOpdsResultView> = { + publications: [ + { + entryLinks: [ + { + url: 'http://webpub.url', + }, + ], + openAccessLinks: [ + { + url: 'http://pub.url', + }, + ], + title: 'first publication', + baseUrl: '', + authors: [], + numberOfPages: 0, + }, + { + entryLinks: [ + { + url: 'http://webpub.url', + }, + ], + openAccessLinks: [ + { + url: 'http://pub.url', + }, + ], + title: 'second publication', + baseUrl: '', + authors: [], + numberOfPages: 0, + }, + { + entryLinks: [ + { + url: 'http://webpub.url', + }, + ], + openAccessLinks: [ + { + url: 'http://pub.url', + }, + ], + title: 'third publication', + baseUrl: '', + authors: [], + numberOfPages: 0, + }, + ], + }; + const message = messageHelpers(3, [ + [1, 'first publication.'], + [2, 'second publication.'], + [3, 'third publication.'], + ], n); + + console.log(message); + + + return {pullData, feed, message}; + }; + const testStateRunningGroup = (n = false) => { + const pullData = parsedDataClone(); + pullData.session.scene.selection.state = 'RUNNING'; + pullData.session.scene.selection.url = 'http://my.url'; + pullData.session.scene.selection.kind = 'GROUP'; + + const feed: Partial<IOpdsResultView> = { + groups: [ + { + selfLink: { + title: 'first group', + url: 'http://my.url', + }, + }, + { + selfLink: { + title: 'second group', + url: 'http://my.url', + }, + }, + { + selfLink: { + title: 'third group', + url: 'http://my.url', + }, + }, + ], + }; + const message = messageHelpers(3, [ + [1, 'first group.'], + [2, 'second group.'], + [3, 'third group.'], + ], n); + + return {pullData, feed, message}; + }; + + it('on enter - state running - publication empty', async () => { + body.handler.name = 'selection__on_enter'; + body.scene.name = scene; + + let {pullData, feed, message} = testStateRunningPublication(); + pullData.session.scene.selection.nextUrlCounter = 0; + + // @ts-ignore + feed.publications = []; + + message = 'Uh Oh! Nothing to read here quite yet. Not to worry though, we can fix that right away! Would you like to browse our collections? Or perhaps you\'d like to search for a specific book by author or book title?\n'; + + const data = await expressMocked(body, headers, pullData, feed); + + data.prompt.firstSimple.speech.should.to.be.eq(message); + // data.scene.next.name.should.to.be.eq('selection'); + }); + it('on enter - state running - group empty', async () => { + body.handler.name = 'selection__on_enter'; + body.scene.name = scene; + + let {pullData, feed, message} = testStateRunningGroup(); + pullData.session.scene.selection.nextUrlCounter = 0; + + // @ts-ignore + feed.groups = []; + + message = 'Uh Oh! Nothing to read here quite yet. Not to worry though, we can fix that right away! Would you like to browse our collections? Or perhaps you\'d like to search for a specific book by author or book title?\n'; + + const data = await expressMocked(body, headers, pullData, feed); + + data.prompt.firstSimple.speech.should.to.be.eq(message); + // data.scene.next.name.should.to.be.eq('selection'); + }); + it('on enter - state running - publication empty - from search', async () => { + body.handler.name = 'selection__on_enter'; + body.scene.name = scene; + + let {pullData, feed, message} = testStateRunningPublication(); + pullData.session.scene.selection.nextUrlCounter = 0; + pullData.session.scene.selection.from = 'search__on_enter'; + const model = await storageModelMocked(pullData); + + // @ts-ignore + feed.publications = []; + + message = 'It seems like the book you are looking for is currently unavailable in the EDRLAB Library.\n'; + + const data = await expressMocked(body, headers, undefined, feed, undefined, model.data); + + data.prompt.firstSimple.speech.should.to.be.eq(message); + model.data.store.session.scene.search.from.should.to.be.eq('selection__on_enter'); + model.data.store.session.scene.search.query.should.to.be.eq(''); + model.data.store.session.scene.search.state.should.to.be.eq('RUNNING'); + data.scene.next.name.should.to.be.eq('home_user'); + }); + + it('on enter - state running - publication list first page with no next link', async () => { + body.handler.name = 'selection__on_enter'; + body.scene.name = scene; + + const {pullData, feed, message} = testStateRunningPublication(); + pullData.session.scene.selection.nextUrlCounter = 0; + + // @ts-ignore + feed.links = {}; + + const data = await expressMocked(body, headers, pullData, feed); + + data.prompt.firstSimple.speech.should.to.be.eq(message); + // data.scene.next.name.should.to.be.eq('selection'); + }); + + it('on enter - state running - group list first page with no next link', async () => { + body.handler.name = 'selection__on_enter'; + body.scene.name = scene; + + const {pullData, feed, message} = testStateRunningGroup(); + const data = await expressMocked(body, headers, pullData, feed); + // @ts-ignore + feed.links = {}; + + // must say the first page + data.prompt.firstSimple.speech.should.to.be.eq(message); + // data.scene.next.name.should.to.be.eq('selection'); + }); + + it('on enter - state running - publication list last page', async () => { + body.handler.name = 'selection__on_enter'; + body.scene.name = scene; + + const {pullData, feed, message} = testStateRunningPublication(); + pullData.session.scene.selection.nextUrlCounter = 3; + // @ts-ignore + feed.links = {}; + const data = await expressMocked(body, headers, pullData, feed); + + data.prompt.firstSimple.speech.should.to.be.eq('Here\'s the last available books.\n' + message); + // data.scene.next.name.should.to.be.eq('selection'); + }); + + it('on enter - state running - group list last page', async () => { + body.handler.name = 'selection__on_enter'; + body.scene.name = scene; + + const {pullData, feed, message} = testStateRunningGroup(); + pullData.session.scene.selection.nextUrlCounter = 3; + // @ts-ignore + feed.links = {}; + const data = await expressMocked(body, headers, pullData, feed); + + // must say the first page + data.prompt.firstSimple.speech.should.to.be.eq('Here\'s the last available groups.\n' + message); + // data.scene.next.name.should.to.be.eq('selection'); + }); + + it('on enter - state running - publication list page > 0', async () => { + body.handler.name = 'selection__on_enter'; + body.scene.name = scene; + + const {pullData, feed, message} = testStateRunningPublication(true); + pullData.session.scene.selection.nextUrlCounter = 3; + // @ts-ignore + feed.links = { + next: [ + { + url: 'http://my.url', + }, + ], + }; + const data = await expressMocked(body, headers, pullData, feed); + + data.prompt.firstSimple.speech.should.to.be.eq(message); + // data.scene.next.name.should.to.be.eq('selection'); + }); + + it('on enter - state running - group list last page > 0', async () => { + body.handler.name = 'selection__on_enter'; + body.scene.name = scene; + + const {pullData, feed, message} = testStateRunningGroup(true); + pullData.session.scene.selection.nextUrlCounter = 3; + // @ts-ignore + feed.links = { + next: [ + { + url: 'http://my.url', + }, + ], + }; + const data = await expressMocked(body, headers, pullData, feed); + + // must say the first page + data.prompt.firstSimple.speech.should.to.be.eq(message); + // data.scene.next.name.should.to.be.eq('selection'); + }); + + it('on enter - state running - publication list with next page - from bookshelf', async () => { + body.handler.name = 'selection__on_enter'; + body.scene.name = scene; + + const {pullData, feed, message} = testStateRunningPublication(true); + pullData.session.scene.selection.nextUrlCounter = 0; + pullData.session.scene.selection.from = 'home_user__intent__bookshelf'; + // @ts-ignore + feed.links = { + next: [ + { + url: 'http://my.url', + }, + ], + }; + const data = await expressMocked(body, headers, pullData, feed); + + const message2 = 'Here are the first 3 titles on your bookshelf:\n' + message + 'Or perhaps you\'d like to explore the other titles on your bookshelf?\n'; + + data.prompt.firstSimple.speech.should.to.be.eq(message2); + // data.scene.next.name.should.to.be.eq('selection'); + }); + + it('on enter - state running - recent books', async () => { + body.handler.name = 'selection__on_enter'; + body.scene.name = scene; + + const {pullData, feed} = testStateRunningPublication(); + pullData.session.scene.selection.nextUrlCounter = 0; + pullData.session.scene.selection.state = 'RUNNING'; + pullData.session.scene.selection.kind = 'PUBLICATION'; + pullData.session.scene.selection.url = 'data://["https://my.url","https://my.url","https://my.url"]'; + pullData.session.scene.selection.from = 'home_user__intent__recent_books'; + + // @ts-ignore + feed.publications[0].title = 'my test title'; + + // USELESS NOW ! + const webpub: Partial<IWebPubView> = { + title: 'my test title', + authors: ['author'], + }; + + const data = await expressMocked(body, headers, pullData, feed, webpub); + + data.prompt.firstSimple.speech.should.to.be.eq('Pick one of these by requesting the corresponding number.\n' + + '1. my test title.\n' + + '2. my test title.\n' + + '3. my test title.\n' + + 'Which number do you choose?\n'); + // data.scene.next.name.should.to.be.eq('selection'); + }); + it('on_enter - groups - state == DEFAULT should throw', async () => { + body.handler.name = 'selection__on_enter'; + body.scene.name = scene; + // body.intent.params = { + // number: { + // original: '3', + // resolved: 3, + // }, + // }; + + const pullData = parsedDataClone(); + const model = await storageModelMocked(pullData); + model.data.store.session.scene.selection.kind = 'GROUP'; + model.data.store.session.scene.selection.url = 'http://my.url'; + model.data.store.session.scene.selection.nbChoice = 3; + const feed = newFeed(); + feed.publications?.length.should.to.be.eq(2); + const data = await expressMocked(body, headers, undefined, feed, undefined, model.data); + + // THROWS !! + + data.scene.next.name.should.to.be.eq('actions.scene.END_CONVERSATION'); + model.data.store.session.scene.selection.state.should.to.be.eq('DEFAULT'); + model.data.store.session.scene.selection.nbChoice.should.to.be.eq(3); + data.prompt.firstSimple.speech.should.to.be.eq('Oops, something went wrong. I will exit the app. Feel free to reopen it as soon as possible.'); + }); + + it('on_enter - pub - state == DEFAULT should throw', async () => { + body.handler.name = 'selection__on_enter'; + body.scene.name = scene; + // body.intent.params = { + // number: { + // original: '3', + // resolved: 3, + // }, + // }; + + const pullData = parsedDataClone(); + const model = await storageModelMocked(pullData); + model.data.store.session.scene.selection.kind = 'PUBLICATION'; + model.data.store.session.scene.selection.url = 'http://my.url'; + model.data.store.session.scene.selection.nbChoice = 0; + const feed = newFeed(); + feed.publications?.length.should.to.be.eq(2); + const data = await expressMocked(body, headers, undefined, feed, undefined, model.data); + + // THROWS !! + + data.scene.next.name.should.to.be.eq('actions.scene.END_CONVERSATION'); + model.data.store.session.scene.selection.state.should.to.be.eq('DEFAULT'); + model.data.store.session.scene.selection.nbChoice.should.to.be.eq(0); + data.prompt.firstSimple.speech.should.to.be.eq('Oops, something went wrong. I will exit the app. Feel free to reopen it as soon as possible.'); + }); + + + // @TODO + // complete the test from handler + // it('on enter - state running - group list last with next page - from collection', async () => { + + // body.handler.name = 'selection__on_enter'; + // body.scene.name = scene; + + // const {pullData, feed, message} = testStateRunningGroup(); + // pullData.session.scene.selection.nextUrlCounter = 3; + // // @ts-ignore + // feed.links = { + // next: [ + // { + // url: "http://my.url" + // } + // ] + // }; + // const data = await expressMocked(body, headers, pullData, feed); + + // // must say the first page + // data.prompt.firstSimple.speech.should.to.be.eq(message); + // data.scene.next.name.should.to.be.eq('selection'); + + // }); + it('select book - number 1', async () => { + body.handler.name = 'selection__intent__selects_book'; + body.scene.name = scene; + body.intent.params = { + number: { + original: '1', + resolved: 1, + }, + }; + + const pullData = parsedDataClone(); + const model = await storageModelMocked(pullData); + model.data.store.session.scene.selection.kind = 'PUBLICATION'; + model.data.store.session.scene.selection.state = 'RUNNING'; + model.data.store.session.scene.selection.url = 'http://my.url'; + const feed = newFeed(); + feed.publications?.length.should.to.be.eq(2); + + const data = await expressMocked(body, headers, undefined, feed, undefined, model.data); + + data.scene.next.name.should.to.be.eq('player_prequel'); + model.data.store.session.scene.selection.state.should.to.be.eq('FINISH'); + model.data.store.session.scene.selection.url.should.to.be.eq('http://my.url'); + model.data.store.session.scene.selection.nbChoice.should.to.be.eq(1); + model.data.store.session.scene.selection.nextUrlCounter.should.to.be.eq(0); + model.data.store.session.scene.selection.from.should.to.be.eq('main'); + }); + it('select book - number 2 ', async () => { + body.handler.name = 'selection__intent__selects_book'; + body.scene.name = scene; + body.intent.params = { + number: { + original: '2', + resolved: 2, + }, + }; + + const pullData = parsedDataClone(); + const model = await storageModelMocked(pullData); + model.data.store.session.scene.selection.kind = 'PUBLICATION'; + model.data.store.session.scene.selection.state = 'RUNNING'; + model.data.store.session.scene.selection.url = 'http://my.url'; + const feed = newFeed(); + feed.publications?.length.should.to.be.eq(2); + const data = await expressMocked(body, headers, undefined, feed, undefined, model.data); + + data.scene.next.name.should.to.be.eq('player_prequel'); + model.data.store.session.scene.selection.state.should.to.be.eq('FINISH'); + model.data.store.session.scene.selection.url.should.to.be.eq('http://my.url'); + model.data.store.session.scene.selection.nbChoice.should.to.be.eq(2); + model.data.store.session.scene.selection.nextUrlCounter.should.to.be.eq(0); + model.data.store.session.scene.selection.from.should.to.be.eq('main'); + }); + + it('select book - number 3 with only 2 pub available', async () => { + body.handler.name = 'selection__intent__selects_book'; + body.scene.name = scene; + body.intent.params = { + number: { + original: '3', + resolved: 3, + }, + }; + + const pullData = parsedDataClone(); + const model = await storageModelMocked(pullData); + model.data.store.session.scene.selection.kind = 'PUBLICATION'; + model.data.store.session.scene.selection.state = 'RUNNING'; + model.data.store.session.scene.selection.url = 'http://my.url'; + const feed = newFeed(); + feed.publications?.length.should.to.be.eq(2); + const data = await expressMocked(body, headers, undefined, feed, undefined, model.data); + + data.scene.next.name.should.to.be.eq('selection'); + model.data.store.session.scene.selection.state.should.to.be.eq('RUNNING'); + model.data.store.session.scene.selection.nbChoice.should.to.be.eq(0); + (typeof data.prompt.firstSimple).should.to.be.eq('undefined'); + }); + + it('select book - state == DEFAULT should throw in on_enter instead of select_books', async () => { + body.handler.name = 'selection__intent__selects_book'; + body.scene.name = scene; + body.intent.params = { + number: { + original: '3', + resolved: 3, + }, + }; + + const pullData = parsedDataClone(); + const model = await storageModelMocked(pullData); + model.data.store.session.scene.selection.kind = 'PUBLICATION'; + model.data.store.session.scene.selection.url = 'http://my.url'; + const feed = newFeed(); + feed.publications?.length.should.to.be.eq(2); + const data = await expressMocked(body, headers, undefined, feed, undefined, model.data); + + // THROWS !! + + data.scene.next.name.should.to.be.eq('selection'); + model.data.store.session.scene.selection.state.should.to.be.eq('DEFAULT'); + model.data.store.session.scene.selection.nbChoice.should.to.be.eq(0); + // data.prompt.firstSimple.speech.should.to.be.eq('Oops, something went wrong. I will exit the app. Feel free to reopen it as soon as possible.'); + (typeof data.prompt.firstSimple).should.to.be.eq('undefined'); + }); + + it('select book - number 10', async () => { + body.handler.name = 'selection__intent__selects_book'; + body.scene.name = scene; + body.intent.params = { + number: { + original: '10', + resolved: 10, + }, + }; + + const pullData = parsedDataClone(); + const model = await storageModelMocked(pullData); + model.data.store.session.scene.selection.url = 'http://my.url'; + model.data.store.session.scene.selection.state = 'RUNNING'; + model.data.store.session.scene.selection.kind = 'PUBLICATION'; + const feed = newFeed(); + const data = await expressMocked(body, headers, undefined, feed, undefined, model.data); + + data.scene.next.name.should.to.be.eq('selection'); + // must be set in selection__on_enter not here : return all logics to on_enter + (typeof data.prompt.firstSimple).should.to.be.eq('undefined'); + model.data.store.session.scene.selection.state.should.to.be.eq('RUNNING'); // equals to original state + model.data.store.session.scene.selection.nbChoice.should.to.be.eq(0); // reset + // or + // say the fallback message if type is incorrect + // need to check with google data + }); + it('select book - group - number 1', async () => { + body.handler.name = 'selection__intent__selects_book'; + body.scene.name = scene; + body.intent.params = { + number: { + original: '1', + resolved: 1, + }, + }; + + const pullData = parsedDataClone(); + const model = await storageModelMocked(pullData); + model.data.store.session.scene.selection.kind = 'GROUP'; + model.data.store.session.scene.selection.state = 'RUNNING'; + model.data.store.session.scene.selection.url = 'http://my.url'; + const feed = newFeed(); + feed.publications?.length.should.to.be.eq(2); + + const data = await expressMocked(body, headers, undefined, feed, undefined, model.data); + + data.scene.next.name.should.to.be.eq('selection'); + model.data.store.session.scene.selection.state.should.to.be.eq('RUNNING'); + model.data.store.session.scene.selection.url.should.to.be.eq('http://group.url'); + model.data.store.session.scene.selection.kind.should.to.be.eq('PUBLICATION'); + model.data.store.session.scene.selection.nbChoice.should.to.be.eq(0); + }); + it('select book - group - number 2', async () => { + body.handler.name = 'selection__intent__selects_book'; + body.scene.name = scene; + body.intent.params = { + number: { + original: '2', + resolved: 2, + }, + }; + + const pullData = parsedDataClone(); + const model = await storageModelMocked(pullData); + model.data.store.session.scene.selection.kind = 'GROUP'; + model.data.store.session.scene.selection.state = 'RUNNING'; + model.data.store.session.scene.selection.url = 'http://my.url'; + const feed = newFeed(); + feed.publications?.length.should.to.be.eq(2); + const data = await expressMocked(body, headers, undefined, feed, undefined, model.data); + + data.scene.next.name.should.to.be.eq('selection'); + model.data.store.session.scene.selection.state.should.to.be.eq('RUNNING'); + model.data.store.session.scene.selection.url.should.to.be.eq('http://group.url'); + model.data.store.session.scene.selection.kind.should.to.be.eq('PUBLICATION'); + model.data.store.session.scene.selection.nbChoice.should.to.be.eq(0); + }); + + it('select book - group - number 3 with only 2 pub available', async () => { + body.handler.name = 'selection__intent__selects_book'; + body.scene.name = scene; + body.intent.params = { + number: { + original: '3', + resolved: 3, + }, + }; + + const pullData = parsedDataClone(); + const model = await storageModelMocked(pullData); + model.data.store.session.scene.selection.kind = 'GROUP'; + model.data.store.session.scene.selection.state = 'RUNNING'; + model.data.store.session.scene.selection.url = 'http://my.url'; + const feed = newFeed(); + feed.publications?.length.should.to.be.eq(2); + const data = await expressMocked(body, headers, undefined, feed, undefined, model.data); + + data.scene.next.name.should.to.be.eq('selection'); + + // must be set in selection__on_enter not here : return all logics to on_enter + (typeof data.prompt.firstSimple).should.to.be.eq('undefined'); + // data.prompt.firstSimple.speech.should.to.be.eq('Pick one out of 3 titles by mentioning their numbers. You can also ask for \'another one\'.\n' + + // 'Pick one of these by saying their numbers.\n' + + // '1. first group.\n' + + // '2. second group.\n' + + // 'Which one would you like to start reading?\n'); + model.data.store.session.scene.selection.state.should.to.be.eq('RUNNING'); // equals to original state + model.data.store.session.scene.selection.nbChoice.should.to.be.eq(0); // reset + }); + it('select book - group - state == DEFAULT should throw on selection on_enter not in select_books', async () => { + body.handler.name = 'selection__intent__selects_book'; + body.scene.name = scene; + body.intent.params = { + number: { + original: '3', + resolved: 3, + }, + }; + + const pullData = parsedDataClone(); + const model = await storageModelMocked(pullData); + model.data.store.session.scene.selection.kind = 'GROUP'; + model.data.store.session.scene.selection.url = 'http://my.url'; + const feed = newFeed(); + feed.publications?.length.should.to.be.eq(2); + const data = await expressMocked(body, headers, undefined, feed, undefined, model.data); + + // THROWS !! + + data.scene.next.name.should.to.be.eq('selection'); + model.data.store.session.scene.selection.state.should.to.be.eq('DEFAULT'); + model.data.store.session.scene.selection.nbChoice.should.to.be.eq(0); + // data.prompt.firstSimple.speech.should.to.be.eq('Oops, something went wrong. I will exit the app. Feel free to reopen it as soon as possible.'); + (typeof data.prompt.firstSimple).should.to.be.eq('undefined'); + }); + + it('select book - group - number 10', async () => { + body.handler.name = 'selection__intent__selects_book'; + body.scene.name = scene; + body.intent.params = { + number: { + original: '10', + resolved: 10, + }, + }; + + const pullData = parsedDataClone(); + const model = await storageModelMocked(pullData); + model.data.store.session.scene.selection.url = 'http://my.url'; + model.data.store.session.scene.selection.state = 'RUNNING'; + model.data.store.session.scene.selection.kind = 'GROUP'; + const feed = newFeed(); + const data = await expressMocked(body, headers, undefined, feed, undefined, model.data); + + data.scene.next.name.should.to.be.eq('selection'); + // must be set in selection__on_enter not here : return all logics to on_enter + (typeof data.prompt.firstSimple).should.to.be.eq('undefined'); + // data.prompt.firstSimple.speech.should.to.be.eq('Pick one out of 3 titles by mentioning their numbers. You can also ask for \'another one\'.\n' + + // 'Pick one of these by saying their numbers.\n' + + // '1. first group.\n' + + // '2. second group.\n' + + // 'Which one would you like to start reading?\n'); + model.data.store.session.scene.selection.state.should.to.be.eq('RUNNING'); // equals to original state + model.data.store.session.scene.selection.nbChoice.should.to.be.eq(0); // reset + // or + // say the fallback message if type is incorrect + // need to check with google data + }); + + it('another one with machine not running', async () => { + body.handler.name = 'selection__intent__another_one'; + body.scene.name = scene; + + const pullData = parsedDataClone(); + const model = await storageModelMocked(pullData); + const data = await expressMocked(body, headers, undefined, undefined, undefined, model.data); + + model.data.store.session.scene.selection.state.should.to.be.eq('DEFAULT'); // equals to original state + model.data.store.session.scene.selection.nextUrlCounter.should.to.be.eq(0); // stay at 0 + model.data.store.session.scene.selection.url.should.to.be.eq(''); // reset + + // catch trap + const message = 'Oops, something went wrong. I will exit the app. Feel free to reopen it as soon as possible.'; + data.prompt.firstSimple.speech.should.to.be.eq(message); + + data.scene.next.name.should.to.be.eq('actions.scene.END_CONVERSATION'); + }); + + it('another one with machine running but next link url is good with no publication available', async () => { + body.handler.name = 'selection__intent__another_one'; + body.scene.name = scene; + + const pullData = parsedDataClone(); + pullData.session.scene.selection.state = 'RUNNING'; + pullData.session.scene.selection.url = 'http://my.url'; + pullData.session.scene.selection.nextUrlCounter = 3; + pullData.session.scene.selection.kind = 'PUBLICATION'; + const model = await storageModelMocked(pullData); + const feed: Partial<IOpdsResultView> = {}; + // @ts-ignore + feed.links = { + next: [ + { + url: 'http://my.url.next', + }, + ], + }; + const data = await expressMocked(body, headers, undefined, feed, undefined, model.data); + + model.data.store.session.scene.selection.state.should.to.be.eq('RUNNING'); // equals to original state + model.data.store.session.scene.selection.nextUrlCounter.should.to.be.eq(3); // +1 + model.data.store.session.scene.selection.url.should.to.be.eq('http://my.url'); // reset + + data.scene.next.name.should.to.be.eq('selection'); + }); + + it('another one with machine running but next link url is good with no groups available', async () => { + body.handler.name = 'selection__intent__another_one'; + body.scene.name = scene; + + const pullData = parsedDataClone(); + pullData.session.scene.selection.state = 'RUNNING'; + pullData.session.scene.selection.url = 'http://my.url'; + pullData.session.scene.selection.nextUrlCounter = 3; + const model = await storageModelMocked(pullData); + const feed: Partial<IOpdsResultView> = {}; + // @ts-ignore + feed.links = { + next: [ + { + url: 'http://my.url.next', + }, + ], + }; + const data = await expressMocked(body, headers, undefined, feed, undefined, model.data); + + model.data.store.session.scene.selection.state.should.to.be.eq('RUNNING'); // equals to original state + model.data.store.session.scene.selection.nextUrlCounter.should.to.be.eq(3); // +1 + model.data.store.session.scene.selection.url.should.to.be.eq('http://my.url'); // reset + + data.scene.next.name.should.to.be.eq('selection'); + }); + + it('another one with machine running - publication', async () => { + body.handler.name = 'selection__intent__another_one'; + body.scene.name = scene; + + const pullData = parsedDataClone(); + pullData.session.scene.selection.state = 'RUNNING'; + pullData.session.scene.selection.url = 'http://my.url'; + pullData.session.scene.selection.nextUrlCounter = 3; + pullData.session.scene.selection.kind = 'PUBLICATION'; + const model = await storageModelMocked(pullData); + const feed: Partial<IOpdsResultView> = newFeed(); + // @ts-ignore + feed.links = { + next: [ + { + url: 'http://my.url.next', + }, + ], + }; + const data = await expressMocked(body, headers, undefined, feed, undefined, model.data); + + model.data.store.session.scene.selection.state.should.to.be.eq('RUNNING'); // equals to original state + model.data.store.session.scene.selection.url.should.to.be.eq('http://my.url.next'); // reset + model.data.store.session.scene.selection.nextUrlCounter.should.to.be.eq(4); // +1 + + data.scene.next.name.should.to.be.eq('selection'); + }); + + it('another one with machine running - group', async () => { + body.handler.name = 'selection__intent__another_one'; + body.scene.name = scene; + + const pullData = parsedDataClone(); + pullData.session.scene.selection.state = 'RUNNING'; + pullData.session.scene.selection.url = 'http://my.url'; + pullData.session.scene.selection.nextUrlCounter = 3; + pullData.session.scene.selection.kind = 'GROUP'; + const model = await storageModelMocked(pullData); + const feed: Partial<IOpdsResultView> = newFeed(); + // @ts-ignore + feed.links = { + next: [ + { + url: 'http://my.url.next', + }, + ], + }; + const data = await expressMocked(body, headers, undefined, feed, undefined, model.data); + + model.data.store.session.scene.selection.state.should.to.be.eq('RUNNING'); // equals to original state + model.data.store.session.scene.selection.url.should.to.be.eq('http://my.url.next'); // reset + model.data.store.session.scene.selection.nextUrlCounter.should.to.be.eq(4); // +1 + + data.scene.next.name.should.to.be.eq('selection'); + }); + + it('another one with machine running and no next link available - publication', async () => { + body.handler.name = 'selection__intent__another_one'; + body.scene.name = scene; + + const pullData = parsedDataClone(); + pullData.session.scene.selection.state = 'RUNNING'; + pullData.session.scene.selection.url = 'http://my.url'; + pullData.session.scene.selection.nextUrlCounter = 3; + pullData.session.scene.selection.kind = 'PUBLICATION'; + const model = await storageModelMocked(pullData); + const feed: Partial<IOpdsResultView> = newFeed(); + // @ts-ignore + feed.links = { + next: [ + {url: ''}, + ], + }; + const data = await expressMocked(body, headers, undefined, feed, undefined, model.data); + + model.data.store.session.scene.selection.state.should.to.be.eq('RUNNING'); // equals to original state + model.data.store.session.scene.selection.nextUrlCounter.should.to.be.eq(3); // 3 + model.data.store.session.scene.selection.url.should.to.be.eq('http://my.url'); // reset + + const message = 'no another results available.\n'; + data.prompt.firstSimple.speech.should.to.be.eq(message); + + data.scene.next.name.should.to.be.eq('selection'); + }); + + it('another one with machine running and no next link available - group', async () => { + body.handler.name = 'selection__intent__another_one'; + body.scene.name = scene; + + const pullData = parsedDataClone(); + pullData.session.scene.selection.state = 'RUNNING'; + pullData.session.scene.selection.url = 'http://my.url'; + pullData.session.scene.selection.nextUrlCounter = 3; + pullData.session.scene.selection.kind = 'GROUP'; + const model = await storageModelMocked(pullData); + const feed: Partial<IOpdsResultView> = newFeed(); + // @ts-ignore + feed.links = { + next: [ + {url: ''}, + ], + }; + const data = await expressMocked(body, headers, undefined, feed, undefined, model.data); + + model.data.store.session.scene.selection.state.should.to.be.eq('RUNNING'); // equals to original state + model.data.store.session.scene.selection.nextUrlCounter.should.to.be.eq(3); // 3 + model.data.store.session.scene.selection.url.should.to.be.eq('http://my.url'); // reset + + const message = 'no another results available.\n'; + data.prompt.firstSimple.speech.should.to.be.eq(message); + + data.scene.next.name.should.to.be.eq('selection'); + }); + + it('repeat', async () => { + body.handler.name = 'selection__intent__repeat'; + body.scene.name = scene; + + const data = await expressMocked(body, headers); + + data.scene.next.name.should.to.be.eq('selection'); + }); + + it('help', async () => { + body.handler.name = 'selection__intent__help'; + body.scene.name = scene; + + const data = await expressMocked(body, headers); + + data.prompt.firstSimple.speech.should.to.be.eq(help); + + // data.scene.next.name.should.to.be.eq('selection'); + }); + + it('fallback 1 and 2', async () => { + body.handler.name = 'selection__intent__fallback'; + body.scene.name = scene; + + const data = await expressMocked(body, headers); + + data.prompt.firstSimple.speech.should.to.be.eq(help); + + // data.scene.next.name.should.to.be.eq('selection'); + }); + + it('fallback 3', async () => { + body.handler.name = 'selection__intent__fallback_end'; + body.scene.name = scene; + + const data = await expressMocked(body, headers); + + data.prompt.firstSimple.speech.should.to.be.eq('Bye!\n'); + + // data.scene.next.name.should.to.be.eq('home_new_user'); + }); + + it('silence 1 and 2', async () => { + body.handler.name = 'selection__intent__silence'; + body.scene.name = scene; + + const data = await expressMocked(body, headers); + + data.prompt.firstSimple.speech.should.to.be.eq(help); + + // data.scene.next.name.should.to.be.eq('selection'); + }); + + it('silence 3', async () => { + body.handler.name = 'selection__intent__silence_end'; + body.scene.name = scene; + + const data = await expressMocked(body, headers); + + data.prompt.firstSimple.speech.should.to.be.eq('Bye!\n'); + + // data.scene.next.name.should.to.be.eq('home_new_user'); + }); + }); +}); diff --git a/webhooks/functions/src/test/utils.test.ts b/webhooks/functions/src/test/utils.test.ts new file mode 100644 index 00000000..552a851d --- /dev/null +++ b/webhooks/functions/src/test/utils.test.ts @@ -0,0 +1,103 @@ +import * as sinon from 'sinon'; +import * as proxyquire from 'proxyquire'; +import {StorageModel} from '../model/storage.model'; + +// class-transformer +import 'reflect-metadata'; +import {exec} from 'child_process'; +import {JsonObject} from '@assistant/conversation'; +import {Assistant} from '../controller/Assistant'; +import {handler} from '../controller/handler'; +export const SDK_PATH = '../../sdk'; + +import * as httpMocks from 'node-mocks-http'; +import {IStorage} from '../model/storage.interface'; +import {OpdsFetcher} from 'opds-fetcher-parser'; +import {IWebPubView} from 'opds-fetcher-parser/build/src/interface/webpub'; +import {IOpdsResultView} from 'opds-fetcher-parser/build/src/interface/opds'; + +export const defaults = { + cwd: process.env.PWD + '/' + SDK_PATH, + env: process.env, +}; + +export const shell = (s: string, fn: (s: string) => void, done: (...a: any[]) => any) => { + exec(s, defaults, (err, stdout) => { + fn(stdout); + + done(err); + }); +}; + +export const storageModelMocked = async (pullData: IStorage | undefined = undefined) => { + const pull = sinon.stub().resolves(pullData); + const push = sinon.stub(); + + const {StorageModel: _storageModel} = proxyquire('../model/storage.model', { + './database': { + pull, + push, + }, + }) as { StorageModel: StorageModel & { create: typeof StorageModel.create } }; + + const data = await _storageModel.create('test'); + + return { + // @ts-ignore + data, + pull, + push, + }; +}; + +export const fetcherMocked = (feed?: Partial<IOpdsResultView>, webpub?: Partial<IWebPubView>) => { + const fetcher = sinon.createStubInstance(OpdsFetcher, { + // @ts-ignore + feedRequest: sinon.stub().returns(Promise.resolve(feed)), + // @ts-ignore + webpubRequest: sinon.stub().returns(Promise.resolve(webpub)), + }); + + return fetcher; +}; + +export const expressMocked = async (body: JsonObject, headers: JsonObject, pullData: IStorage | undefined = undefined, feed: Partial<IOpdsResultView> | undefined = undefined, webpub: Partial<IWebPubView> | undefined = undefined, data: StorageModel | undefined = undefined) => { + if (!data) { + console.log('NO DATA MOCKED YET'); + + ({data /* , push, pull*/} = await storageModelMocked(pullData)); + } else { + console.log('DATA MOCKED'); + } + const fetcher = fetcherMocked(feed, webpub) as unknown as OpdsFetcher; + + const assistant = new Assistant({storageModel: data, fetcher}); + + handler(assistant); + + const req = httpMocks.createRequest({ + body, + headers, + method: 'POST', + }); + + const res = httpMocks.createResponse({ + eventEmitter: require('events').EventEmitter, + }); + + const promise = new Promise<JsonObject>((resolve, reject) => res.on('end', () => { + const data = res._getData(); + + console.info('DATA RETURNED TO GOOGLE ASSISTANT: ', data); + + if (data.error) { + reject(data.error); + } + + resolve(data); + })); + + assistant.app(req, res); + + return promise; +}; diff --git a/webhooks/functions/src/tools.ts b/webhooks/functions/src/tools.ts new file mode 100644 index 00000000..e02192ea --- /dev/null +++ b/webhooks/functions/src/tools.ts @@ -0,0 +1,16 @@ + + +export const stall = <T>(fn: (v: string) => Promise<T>) => { + const store = new Map<string, T>(); + + return async (k: string) => { + const ret = store.get(k); + if (ret) { + return ret; + } + const value = await fn(k); + store.set(k, value); + + return value; + }; +} \ No newline at end of file diff --git a/webhooks/functions/src/translation/en/en.json b/webhooks/functions/src/translation/en/en.json new file mode 100644 index 00000000..a4341dc5 --- /dev/null +++ b/webhooks/functions/src/translation/en/en.json @@ -0,0 +1,167 @@ +{ + "main": { + "welcome": { + "noLinked": { + "1": "Welcome to {{- name}} Library, where you can easily access your favorite audio books." + }, + "linked": { + "1": "Welcome back to your {{- name}} Library! Remember, you can ask for help at any time." + } + } + }, + "home_new_user": { + "enter": { + "first": { + "1": "To fully enjoy your audiobooks and access your personal bookshelf, you will need to link your {{- name}} account.", + "2": "Would you like to do so now?" + } + }, + "no": { + "1": "In order to read books using the {{- name}} Library via Google, you need to be a registered {{- name}} member and link your account.", + "2": "Would you like to learn more about registering on the {{- name}} Library?" + }, + "help": { + "1": "To fully experience {{- name}} Library, and enjoy your favorite audiobooks via Google, you'll need to connect your {{- name}} account. To do so, answer 'yes' when prompted and follow the instructions. I will then send a connection link, that you will find into the Google Home application. You will have to log in to your {{- name}} account. You'll only have to do this once, and you'll be all set to start enjoying the wonderful world of {{- name}} books for hours on end!", + "2": "Would you like to link your account right now?" + }, + "maybeLater": { + "1": "In order to use the {{- name}} Library via your Google Home, you must be a registered member of {{- name}} and link your account. In the meanwhile, you can learn more about {{- name}} or quit for now.", + "2": "What would you like to do?" + } + }, + "home_new_user_maybe_later": { + "help": { + "1": "You can ask me to link your account, or learn more about the {{- name}} Library. You can also exit this application, by simply saying 'stop'. What is your decision?" + } + }, + "home_new_user_no": { + "help": { + "1": "In order to use the {{- name}} library via your Google Home, you must be a registered member of the library and link your account. Would you like to learn more about the {{- name}} Library?" + } + }, + "info": { + "about": { + "1": "{{- name}} is a national non-profit organization established by Canadian public libraries to champion the fundamental right of Canadians with print disabilities to access media and reading materials in the format of their choice, including audio, braille, e-text and descriptive video. Would you like to find out more about the {{- name}} membership?" + }, + "help": { + "1": "If you'd like to learn more about {{- name}} membership, you can ask me by simply saying Yes, or Stop to exit this google application. If you have any other questions, we recommend reaching out to your local library for support. I'm listening?" + }, + "yesOrMembership": { + "1": "Signing up is easy, you can head on over to the EDRLAB online platform at <sub alias=\"cela library\">celalibrary</sub> dot <say-as interpret-as=\"characters\">ca</say-as>. Keep the name of your local library and your library or SQLA number handy, that's all you'll need. You can also ask for help at your local library. As soon as your membership is activated, you can come back to start using the {{- name}} library via Google Assistant, by saying Hey Google, launch Accessible reading Canada." + } + }, + "home_user": { + "enter": { + "newlyUser": { + "1": "Congratulations! You have succesfully linked your account and can now access all of your favorite books! Remember, you can ask for help at any time.", + "2": "Would you like to consult your bookshelf, or browse our collections? You can also search for a book by saying search for. Followed by a book title or an author." + }, + "playing": { + "1": "You are listening to the {{- chapterNumber}} chapter of {{- titleAndAuthor}}, which you can now pick up.", + "2": "You are also reading {{- readingNumber}} other recent books, which you can choose from.", + "3": "And, of course, " + }, + "regular": { + "1": "You can consult your bookshelf, or browse our collections. You can also search for a book by saying search followed by a book title or an author.", + "2": "Resume reading. Recent books. Bookshelf. Collections. Search for a specific book: what do you want to do?" + } + }, + "currentBook": { + "1": "Uh Oh! Nothing to read here quite yet." + }, + "help": { + "1": "At this stage, you can resume your last book with Resume Reading command or pick any books you recently listened to with the Recent Books command. You can also check the list of books you have selected with the help of a librarian by the command Bookshelf; browse our predefined collections by the command Collections. Finally, you can search for a book by saying Search followed by a title or part of a title, an author, or both.", + "2": "What do you prefer: Resume reading. Recent books. Bookshelf. Collections or Search?" + } + }, + "search": { + "enter": { + "1": "What book or author are you looking for ?", + "2": "In the meanwhile, is there another title or author you'd like to search for?" + }, + "empty": { + "1": "It seems like the book you are looking for is currently unavailable in the {{- name}} Library.", + "2": "You can suggest books for us to add at {{- website}}." + } + }, + "selection": { + "enter": { + "bookshelf": { + "first": "Here are the first {{- number}} titles on your bookshelf:", + "second": "Or perhaps you'd like to explore the other titles on your bookshelf?" + }, + "search": "I found {{- number}} books with that title.", + "collection": { + "publication": "I found {{- number}} books.", + "group": "I found {{- number}} groups." + }, + "lastPage": { + "publication": "Here's the last available books.", + "group": "Here's the last available groups.", + "notAvailable": "no another results available." + }, + "common": { + "1": "Pick one of these by requesting the corresponding number.", + "2": "{{- symbol}}. {{- title}}.", + "3": "Which number do you choose?" + }, + "nextPage": { + "1": "Or ask for the next set." + }, + "empty": { + "1": "Uh Oh! Nothing to read here quite yet. Not to worry though, we can fix that right away! Would you like to browse our collections? Or perhaps you'd like to search for a specific book by author or book title?" + } + }, + "help": { + "1": "At this stage, you must choose a title among the proposed set, by mentioning its number, for example number 1. You can request other titles by using the Next or Previous commands." + } + }, + "player_prequel": { + "summarize": "Here is the summary: {{- summary}}.", + "noSummary": "No summary is available, sorry.", + "help": { + "1": "At any time you can ask for the summary of the book, ask for the author or get the remaining listening time." + }, + "enter": { + "1": "You've chosen {{- title}}{{- resume}}", + "1-continue": ", that you have already started.", + "1-begin": ".", + "2": "{{- resumeOrStart}}, listen the summary or come back to the list?", + "2-continue": "Do you want to resume reading", + "2-begin": "Do you want to start reading" + }, + "summary": { + "1": "Do you want to start reading or go back to the list?" + } + }, + "player": { + "explain": "Great choice! Before we start, let me remind you how this reader works. You can put your read on hold at any time by saying 'Hey Google, Pause'. 'Hey Google, Resume' will let you pick up your reading where you last left it. You can also navigate between chapters by saying 'Hey Google, next' or 'Hey Google, previous' at any time.", + "start": "Let's start reading {{- title}}.", + "start2": "Let's continue reading {{- title}}." + }, + "collections": { + "enter": { + "1": "Okay, would you prefer to get a choice of collections by theme or by genre?" + }, + "help": { + "1": "To hear an overview of available themes, say 'by theme'. For an overview of available genres, say 'by genre'." + } + }, + "void": "Bye!", + "bye": { + "1": "Good bye! Remember, if you need help using the Accessible Reading Canada application, our librarians are here to help. We hope you will come back soon to enjoy your favourite audio books." + }, + "fallback": { + "1": "I did not understand, what would you like to do?", + "2": "Sorry, I really did not understand. Can you please try one more time?" + }, + "silence": { + "1": "I did not hear anything.", + "2": "Sorry, I really don't hear well." + }, + "error": { + "1": "Oops, something went wrong. I will send you back to the home menu.", + "noBearerTokenInLinkedScene": "An issue occured during authentication, please retry later." + }, + "noTitle": "No title available" +} diff --git a/webhooks/functions/src/translation/fr/fr.json b/webhooks/functions/src/translation/fr/fr.json new file mode 100644 index 00000000..a50f2ae8 --- /dev/null +++ b/webhooks/functions/src/translation/fr/fr.json @@ -0,0 +1,167 @@ +{ + "main": { + "welcome": { + "noLinked": { + "1": "Bienvenue dans la bibliothèque {{- name}}, où vous pouvez accéder facilement à vos livres favoris. " + }, + "linked": { + "1": "Bienvenue dans votre bibliothèque {{- name}} !" + } + } + }, + "home_new_user": { + "enter": { + "first": { + "1": "Pour profiter de vos livres et accéder à votre liste personnelle, vous devez lier votre compte {{- name}}.", + "2": "Voulez-vous le faire maintenant ?" + } + }, + "no": { + "1": "Afin de lire des livres à l'aide de la bibliothèque {{- name}} via Google, vous devez être un membre enregistré de la bibliothèque {{- name}} et vous devez lier votre compte.", + "2": "Voulez-vous en savoir plus sur l'adhésion à {{- name}} ?" + }, + "help": { + "1": "Pour découvrir la bibliothèque {{- name}} et profiter de vos livres préférés via Google, vous devez connecter votre compte {{- name}}. Pour ce faire, répondez \" oui \" lorsque vous y êtes invité et suivez les instructions. Je vous enverrai alors un lien de connexion, que vous retrouverez dans l'application Google Home. Vous devrez vous connecter à votre compte {{- name}}. Vous n'aurez à le faire qu'une seule fois, et vous pourrez profiter du monde merveilleux des livres de {{- name}} pendant des heures !", + "2": "Voulez-vous lier votre compte maintenant ?" + }, + "maybeLater": { + "1": "Afin d'utiliser la bibliothèque {{- name}} via votre Google Home, vous devez être un membre enregistré de cette bibliothèque et lier votre compte. En attendant, vous pouvez en savoir plus sur la bibliothèque {{- name}} ou quitter l'application pour le moment.", + "2": "Que préférez-vous faire ?" + } + }, + "home_new_user_maybe_later": { + "help": { + "1": "Vous pouvez me demander de lier votre compte, ou en apprendre plus sur la bibliothèque {{- name}}. Vous pouvez également quitter cette application en disant simplement \"Quitter\". Que décidez-vous ?" + } + }, + "home_new_user_no": { + "help": { + "1": "Afin d'utiliser la bibliothèque {{- name}} via votre Google Home, vous devez être un membre enregistré de cette bibliothèque et lier votre compte. Voulez-vous en savoir plus sur la bibliothèque {{- name}} ?" + } + }, + "info": { + "about": { + "1": "La bibliothèque {{- name}} est une organisation nationale sans but lucratif créée par les bibliothèques publiques canadiennes pour défendre le droit fondamental des Canadiens souffrant de difficultés de lecture sur des supports imprimés. Ces personnes peuvent accéder à des publications numériques dans le format de leur choix, y compris l'audio, le braille, le texte électronique et la vidéo descriptive - maintenant aussi disponible via Alexa et Google Home ! Souhaitez-vous en savoir plus sur les possibilité d'inscription à la bibliothèque {{- name}} ?" + }, + "help": { + "1": "Si vous voulez en savoir plus sur les possibilités d'adhésion à la bibliothèque {{- name}}, vous pouvez le me demander en disant simplement Oui, ou bien Quitter pour quitter cette application. Si vous avez d'autres questions, nous vous recommandons de vous adresser à votre bibliothèque locale pour obtenir de l'aide." + }, + "yesOrMembership": { + "1": "L'inscription est facile, vous pouvez vous rendre sur la plateforme en ligne de la bibliothèque {{- name}} à l'adresse <sub alias=\"biblio cahèb\">bibliocaeb</sub> point <say-as interpret-as=\"characters\">ca</say-as>. Gardez à portée de main le nom de votre bibliothèque locale et votre numéro de bibliothèque ou de SQLA, c'est tout ce dont vous aurez besoin. Vous pouvez également demander de l'aide à votre bibliothèque locale. Dès que votre adhésion est activée, vous pouvez revenir pour commencer à utiliser la bibliothèque {{- name}} via Google Assistant, en disant Hey Google, je veux parler à Lecture Accessible Canada." + } + }, + "home_user": { + "enter": { + "newlyUser": { + "1": "Félicitations ! Vous avez réussi à connecter votre compte et vous pouvez maintenant accéder à tous vos livres préférés ! Rappelez-vous, vous pouvez demander de l'aide à tout instant.", + "2": "Souhaitez-vous consulter votre liste personnelle, ou naviguer dans nos collections ? Vous pouvez également rechercher un livre en prononçant cherche suivi d'un titre de livre ou d'un auteur." + }, + "playing": { + "1": "Vous êtes en train d'écouter le chapitre {{- chapterNumber}} de {{- titleAndAuthor}}, que vous pouvez reprendre maintenant.", + "2": "Vous avez également {{- readingNumber}} autres livres récents, que je peux lister.", + "3": "Et bien entendu, " + }, + "regular": { + "1": "Vous pouvez consulter votre liste personnelle, ou naviguer dans nos collections. Vous pouvez également rechercher un livre en prononçant cherche suivi d'un titre de livre ou d'un auteur.", + "2": "Reprendre la lecture. Livres récents. Liste personnelle. Collections. Chercher un livre : que désirez-vous faire ?" + } + }, + "currentBook": { + "1": "Il n'y a rien à lire" + }, + "help": { + "1": "A cette étape, Vous pouvez reprendre la lecture du livre en cours par la commande Reprendre la lecture, ou consulter les livres récemment écoutés par la commande Mes livres récents. Vous pouvez également consulter la liste des livres que vous avez sélectionnés avec l'aide d'un bibliothécaire par la commande Liste personnelle, naviguer dans nos collections prédéfinies par la commande collections. Vous pouvez enfin rechercher un livre en prononçant Cherche suivi d'un titre ou d'une partie du titre, d'un auteur, ou bien les deux.", + "2": "Que préférez-vous faire : Reprendre la lecture. Livres récents. Liste personnelle. Collections ou Chercher ?" + } + }, + "search": { + "enter": { + "1": "Quel titre ou auteur recherchez-vous ?", + "2": "En attendant, y a-t-il un autre titre ou auteur que vous aimeriez rechercher ?" + }, + "empty": { + "1": "Il semble que le livre que vous recherchez soit actuellement indisponible dans la bibliothèque {{- name}}.", + "2": "Vous pouvez nous suggérer des livres à ajouter à {{- website}}." + } + }, + "selection": { + "enter": { + "bookshelf": { + "first": "Voici les {{- number}} premiers titres de votre liste personnelle :", + "second": "Ou peut-être souhaitez-vous explorer les autres titres de votre liste personnelle ?" + }, + "search": "J'ai trouvé {{- number}} livres avec ce titre.", + "collection": { + "publication": "J'ai trouvé {{- number}} livres.", + "group": "J'ai trouvé {{- number}} groupes." + }, + "lastPage": { + "publication": "Voici les derniers livres disponibles:", + "group": "Voici les derniers groupes disponibles:", + "notAvailable": "Aucun autre résultat disponible." + }, + "common": { + "1": "Choisissez l'un de ces éléments en donnant son numéro.", + "2": "Numéro {{- symbol}} : {{- title}}.", + "3": "Quel numéro choisissez-vous ?" + }, + "nextPage": { + "1": "Ou demandez la page suivante." + }, + "empty": { + "1": "En fait, il n'y a rien à lire ici pour le moment. Mais ne vous inquiétez pas, nous pouvons arranger ça tout de suite !" + } + }, + "help": { + "1": "A cette étape, vous devez choisir un titre parmi ceux proposés, en mentionnant son numéro, par exemple numéro 1. Vous pouvez aussi demander d'autres titres par les commandes Suivants ou Précédents." + } + }, + "player_prequel": { + "summarize": "Voici le résumé: {{- summary}}.", + "noSummary": "Aucun résumé n'est disponible, j'en suis désolé.", + "help": { + "1": "A tout moment vous pouvez demander la lecture du résumé du livre , demander son auteur ou obtenir le temps d'écoute restant." + }, + "enter": { + "1": "Vous avez choisi {{- title}}{{- resume}}", + "1-continue": " que vous aviez déja commencé.", + "1-begin": ".", + "2": "{{- resumeOrStart}}, écouter le résumé, ou revenir à la liste précédente ?", + "2-continue": "Voulez-vous reprendre la lecture", + "2-begin": "Voulez-vous commencer la lecture" + }, + "summary": { + "1": "Voulez-vous commencer la lecture ou revenir à la liste précédente ?" + } + }, + "player": { + "explain": "Excellent choix ! Avant de commencer, laissez-moi vous rappeler comment fonctionne ce lecteur. Vous pouvez mettre votre lecture en attente à tout moment en disant 'Google, Pause'. 'Google, Lecture' vous permettra de reprendre votre lecture là où vous l'avez pausée. Vous pouvez également naviguer entre les chapitres en disant 'Hey Google, suivant' ou 'Hey Google, précédent' à tout moment.", + "start": "Voici donc {{- title}}.", + "start2": "Reprenons la lecture de {{- title}}." + }, + "collections": { + "enter": { + "1": "Très bien. Préférez-vous obtenir une sélection de livres par thème ou par genre ?" + }, + "help": { + "1": "Pour entendre un aperçu des thèmes disponibles, dites par thème. Pour un aperçu des genres disponibles, dites par genre." + } + }, + "void": "au revoir!", + "bye": { + "1": "Très bien. Souvenez-vous : si vous avez besoin d'aide pour utiliser l'application Lecture Accessible Canada, nos bibliothécaires sont à votre service. Nous espérons que vous reviendrez bientôt pour profiter de vos livres préférés." + }, + "fallback": { + "1": "Je n'ai pas compris, que désirez-vous faire ?", + "2": "Désolé, je n'ai vraiment pas compris. Pouvez-vous tenter un dernière fois s'il vous plait ?" + }, + "silence": { + "1": "Je n'ai pas entendu.", + "2": "Désolé, je n'entends vraiment pas bien." + }, + "error": { + "1": "Oups, quelque chose s'est mal passé. Je vous renvoie au menu d'accueil.", + "noBearerTokenInLinkedScene": "Un problème est survenu lors de l'authentification, veuillez réessayer plus tard." + }, + "noTitle": "Aucun titre disponible" +} diff --git a/webhooks/functions/src/translation/index.ts b/webhooks/functions/src/translation/index.ts new file mode 100644 index 00000000..7e6d8547 --- /dev/null +++ b/webhooks/functions/src/translation/index.ts @@ -0,0 +1,22 @@ +import * as i18next from 'i18next'; +import * as frTranslation from './fr/fr.json'; +import * as enTranslation from './en/en.json'; +import {Translations} from './../typings/i18n'; +import {DEFAULT_LANGUAGE} from '../constants'; + +i18next.init({ + resources: { + 'fr': { + translation: frTranslation, + }, + 'en': { + translation: enTranslation, + }, + }, + fallbackLng: DEFAULT_LANGUAGE, +}); + +export type TI18nKey = Translations['keys'][typeof DEFAULT_LANGUAGE]; + +export type TI18n = typeof i18next & {t: (key: TI18nKey, options? : object) => any}; +export const i18n: TI18n = i18next; diff --git a/webhooks/functions/src/type.ts b/webhooks/functions/src/type.ts new file mode 100644 index 00000000..674d5025 --- /dev/null +++ b/webhooks/functions/src/type.ts @@ -0,0 +1,34 @@ +import { ConversationV3, ConversationV3App } from "@assistant/conversation"; +import { Media } from "@assistant/conversation/dist/api/schema"; +import { Machine } from "./controller/Machine"; +import { TI18nKey } from "./translation"; +import { TSdkScene } from "./typings/sdkScene"; + +export enum MediaType { + Audio = 'AUDIO', + MediaStatusACK = 'MEDIA_STATUS_ACK', + MediaTypeUnspecified = 'MEDIA_TYPE_UNSPECIFIED', +} + +export enum OptionalMediaControl { + OptionalMediaControlsUnspecified = 'OPTIONAL_MEDIA_CONTROLS_UNSPECIFIED', + Paused = 'PAUSED', + Stopped = 'STOPPED', +} + +export type TPromptItem = TI18nKey | {[k: string]: any} | Media; //PromtItem type from @assistant/conversation + +export interface IConversationV3 extends ConversationV3 { +} + +export interface IConversationWithParams extends IConversationV3 { +} + +export interface IConversationV3App extends ConversationV3App<IConversationWithParams> { +} + +export type TMachine = Machine; + +export type THandlerFn = (machine: TMachine) => TMachine | undefined | void | Promise<void>; + +export type TSdkScene2 = TSdkScene | "actions.scene.END_CONVERSATION"; \ No newline at end of file diff --git a/webhooks/functions/src/typings/i18n.d.ts b/webhooks/functions/src/typings/i18n.d.ts new file mode 100644 index 00000000..c0a01188 --- /dev/null +++ b/webhooks/functions/src/typings/i18n.d.ts @@ -0,0 +1,13 @@ +/* eslint-disable */ +// DO NOT EDIT! This file is generated with "typed-18next" tool. + +export interface Translations { + keys: { + "en": "main.welcome.noLinked.1" | "main.welcome.linked.1" | "home_new_user.enter.first.1" | "home_new_user.enter.first.2" | "home_new_user.no.1" | "home_new_user.no.2" | "home_new_user.help.1" | "home_new_user.help.2" | "home_new_user.maybeLater.1" | "home_new_user.maybeLater.2" | "home_new_user_maybe_later.help.1" | "home_new_user_no.help.1" | "info.about.1" | "info.help.1" | "info.yesOrMembership.1" | "home_user.enter.newlyUser.1" | "home_user.enter.newlyUser.2" | "home_user.enter.playing.1" | "home_user.enter.playing.2" | "home_user.enter.playing.3" | "home_user.enter.regular.1" | "home_user.enter.regular.2" | "home_user.currentBook.1" | "home_user.help.1" | "home_user.help.2" | "search.enter.1" | "search.enter.2" | "search.empty.1" | "search.empty.2" | "selection.enter.bookshelf.first" | "selection.enter.bookshelf.second" | "selection.enter.search" | "selection.enter.collection.publication" | "selection.enter.collection.group" | "selection.enter.lastPage.publication" | "selection.enter.lastPage.group" | "selection.enter.lastPage.notAvailable" | "selection.enter.common.1" | "selection.enter.common.2" | "selection.enter.common.3" | "selection.enter.nextPage.1" | "selection.enter.empty.1" | "selection.help.1" | "player_prequel.summarize" | "player_prequel.noSummary" | "player_prequel.help.1" | "player_prequel.enter.1" | "player_prequel.enter.2" | "player_prequel.enter.1-continue" | "player_prequel.enter.1-begin" | "player_prequel.enter.2-continue" | "player_prequel.enter.2-begin" | "player_prequel.summary.1" | "player.explain" | "player.start" | "player.start2" | "collections.enter.1" | "collections.help.1" | "void" | "bye.1" | "fallback.1" | "fallback.2" | "silence.1" | "silence.2" | "error.1" | "error.noBearerTokenInLinkedScene" | "noTitle", + "fr": "main.welcome.noLinked.1" | "main.welcome.linked.1" | "home_new_user.enter.first.1" | "home_new_user.enter.first.2" | "home_new_user.no.1" | "home_new_user.no.2" | "home_new_user.help.1" | "home_new_user.help.2" | "home_new_user.maybeLater.1" | "home_new_user.maybeLater.2" | "home_new_user_maybe_later.help.1" | "home_new_user_no.help.1" | "info.about.1" | "info.help.1" | "info.yesOrMembership.1" | "home_user.enter.newlyUser.1" | "home_user.enter.newlyUser.2" | "home_user.enter.playing.1" | "home_user.enter.playing.2" | "home_user.enter.playing.3" | "home_user.enter.regular.1" | "home_user.enter.regular.2" | "home_user.currentBook.1" | "home_user.help.1" | "home_user.help.2" | "search.enter.1" | "search.enter.2" | "search.empty.1" | "search.empty.2" | "selection.enter.bookshelf.first" | "selection.enter.bookshelf.second" | "selection.enter.search" | "selection.enter.collection.publication" | "selection.enter.collection.group" | "selection.enter.lastPage.publication" | "selection.enter.lastPage.group" | "selection.enter.lastPage.notAvailable" | "selection.enter.common.1" | "selection.enter.common.2" | "selection.enter.common.3" | "selection.enter.nextPage.1" | "selection.enter.empty.1" | "selection.help.1" | "player_prequel.summarize" | "player_prequel.noSummary" | "player_prequel.help.1" | "player_prequel.enter.1" | "player_prequel.enter.2" | "player_prequel.enter.1-continue" | "player_prequel.enter.1-begin" | "player_prequel.enter.2-continue" | "player_prequel.enter.2-begin" | "player_prequel.summary.1" | "player.explain" | "player.start" | "player.start2" | "collections.enter.1" | "collections.help.1" | "void" | "bye.1" | "fallback.1" | "fallback.2" | "silence.1" | "silence.2" | "error.1" | "error.noBearerTokenInLinkedScene" | "noTitle" + }; + keysWithNS: { + "en": "en:main.welcome.noLinked.1" | "en:main.welcome.linked.1" | "en:home_new_user.enter.first.1" | "en:home_new_user.enter.first.2" | "en:home_new_user.no.1" | "en:home_new_user.no.2" | "en:home_new_user.help.1" | "en:home_new_user.help.2" | "en:home_new_user.maybeLater.1" | "en:home_new_user.maybeLater.2" | "en:home_new_user_maybe_later.help.1" | "en:home_new_user_no.help.1" | "en:info.about.1" | "en:info.help.1" | "en:info.yesOrMembership.1" | "en:home_user.enter.newlyUser.1" | "en:home_user.enter.newlyUser.2" | "en:home_user.enter.playing.1" | "en:home_user.enter.playing.2" | "en:home_user.enter.playing.3" | "en:home_user.enter.regular.1" | "en:home_user.enter.regular.2" | "en:home_user.currentBook.1" | "en:home_user.help.1" | "en:home_user.help.2" | "en:search.enter.1" | "en:search.enter.2" | "en:search.empty.1" | "en:search.empty.2" | "en:selection.enter.bookshelf.first" | "en:selection.enter.bookshelf.second" | "en:selection.enter.search" | "en:selection.enter.collection.publication" | "en:selection.enter.collection.group" | "en:selection.enter.lastPage.publication" | "en:selection.enter.lastPage.group" | "en:selection.enter.lastPage.notAvailable" | "en:selection.enter.common.1" | "en:selection.enter.common.2" | "en:selection.enter.common.3" | "en:selection.enter.nextPage.1" | "en:selection.enter.empty.1" | "en:selection.help.1" | "en:player_prequel.summarize" | "en:player_prequel.noSummary" | "en:player_prequel.help.1" | "en:player_prequel.enter.1" | "en:player_prequel.enter.2" | "en:player_prequel.enter.1-continue" | "en:player_prequel.enter.1-begin" | "en:player_prequel.enter.2-continue" | "en:player_prequel.enter.2-begin" | "en:player_prequel.summary.1" | "en:player.explain" | "en:player.start" | "en:player.start2" | "en:collections.enter.1" | "en:collections.help.1" | "en:void" | "en:bye.1" | "en:fallback.1" | "en:fallback.2" | "en:silence.1" | "en:silence.2" | "en:error.1" | "en:error.noBearerTokenInLinkedScene" | "en:noTitle", + "fr": "fr:main.welcome.noLinked.1" | "fr:main.welcome.linked.1" | "fr:home_new_user.enter.first.1" | "fr:home_new_user.enter.first.2" | "fr:home_new_user.no.1" | "fr:home_new_user.no.2" | "fr:home_new_user.help.1" | "fr:home_new_user.help.2" | "fr:home_new_user.maybeLater.1" | "fr:home_new_user.maybeLater.2" | "fr:home_new_user_maybe_later.help.1" | "fr:home_new_user_no.help.1" | "fr:info.about.1" | "fr:info.help.1" | "fr:info.yesOrMembership.1" | "fr:home_user.enter.newlyUser.1" | "fr:home_user.enter.newlyUser.2" | "fr:home_user.enter.playing.1" | "fr:home_user.enter.playing.2" | "fr:home_user.enter.playing.3" | "fr:home_user.enter.regular.1" | "fr:home_user.enter.regular.2" | "fr:home_user.currentBook.1" | "fr:home_user.help.1" | "fr:home_user.help.2" | "fr:search.enter.1" | "fr:search.enter.2" | "fr:search.empty.1" | "fr:search.empty.2" | "fr:selection.enter.bookshelf.first" | "fr:selection.enter.bookshelf.second" | "fr:selection.enter.search" | "fr:selection.enter.collection.publication" | "fr:selection.enter.collection.group" | "fr:selection.enter.lastPage.publication" | "fr:selection.enter.lastPage.group" | "fr:selection.enter.lastPage.notAvailable" | "fr:selection.enter.common.1" | "fr:selection.enter.common.2" | "fr:selection.enter.common.3" | "fr:selection.enter.nextPage.1" | "fr:selection.enter.empty.1" | "fr:selection.help.1" | "fr:player_prequel.summarize" | "fr:player_prequel.noSummary" | "fr:player_prequel.help.1" | "fr:player_prequel.enter.1" | "fr:player_prequel.enter.2" | "fr:player_prequel.enter.1-continue" | "fr:player_prequel.enter.1-begin" | "fr:player_prequel.enter.2-continue" | "fr:player_prequel.enter.2-begin" | "fr:player_prequel.summary.1" | "fr:player.explain" | "fr:player.start" | "fr:player.start2" | "fr:collections.enter.1" | "fr:collections.help.1" | "fr:void" | "fr:bye.1" | "fr:fallback.1" | "fr:fallback.2" | "fr:silence.1" | "fr:silence.2" | "fr:error.1" | "fr:error.noBearerTokenInLinkedScene" | "fr:noTitle" + }; +} diff --git a/webhooks/functions/src/typings/sdkHandler.d.ts b/webhooks/functions/src/typings/sdkHandler.d.ts new file mode 100644 index 00000000..12fd2aed --- /dev/null +++ b/webhooks/functions/src/typings/sdkHandler.d.ts @@ -0,0 +1,4 @@ +// npm run handler-typed ; + + +export type TSdkHandler = 'main' | 'home_new_user__intent__help' | 'home_new_user__intent__maybe_later' | 'home_new_user__intent__no' | 'home_new_user__intent__repeat' | 'home_new_user__intent__yes' | 'home_new_user__intent__fallback' | 'home_new_user__intent__fallback_end' | 'home_new_user__intent__silence' | 'home_new_user__intent__silence_end' | 'home_new_user_maybe_later__intent__learn_more' | 'home_new_user_maybe_later__intent__repeat' | 'home_new_user_maybe_later__intent__link_account' | 'home_new_user_maybe_later__intent__help' | 'home_new_user_maybe_later__intent__fallback' | 'home_new_user_maybe_later__intent__fallback_end' | 'home_new_user_maybe_later__intent__silence' | 'home_new_user_maybe_later__intent__silence_end' | 'info__intent__yes' | 'info__intent__help' | 'info__intent__repeat' | 'info__intent__fallback' | 'info__intent__fallback_end' | 'info__intent__silence' | 'info__intent__silence_end' | 'home_new_user_no__intent__yes' | 'home_new_user_no__intent__no' | 'home_new_user_no__intent__repeat' | 'home_new_user_no__intent__help' | 'home_new_user_no__intent__fallback' | 'home_new_user_no__intent__fallback_end' | 'home_new_user_no__intent__silence' | 'home_new_user_no__intent__silence_end' | 'cancel' | 'home_new_user__on_enter' | 'home_new_user_no__on_enter' | 'home_new_user_maybe_later__on_enter' | 'info__on_enter' | 'home_user__on_enter' | 'home_user__intent__help' | 'home_user__intent__repeat' | 'home_user__intent__bookshelf' | 'home_user__intent__collections' | 'home_user__intent__search' | 'home_user__intent__fallback' | 'home_user__intent__fallback_end' | 'home_user__intent__silence' | 'home_user__intent__silence_end' | 'selection__on_enter' | 'selection__intent__selects_book' | 'selection__intent__repeat' | 'selection__intent__another_one' | 'selection__intent__help' | 'selection__intent__fallback' | 'selection__intent__fallback_end' | 'selection__intent__silence' | 'selection__intent__silence_end' | 'fallback_1' | 'fallback_2' | 'fallback_end' | 'silence_1' | 'silence_2' | 'silence_end' | 'player__on_enter' | 'player__intent__media_status_finished' | 'player__intent__media_status_paused' | 'player__intent__media_status_stopped' | 'player__intent__media_status_failed' | 'search__on_enter' | 'search__intent__search_query' | 'search__intent__search' | 'collections__on_enter' | 'collections__intent__bookshelf' | 'collections__intent__by_genre' | 'collections__intent__by_theme' | 'collections__intent__help' | 'collections__intent__fallback' | 'collections__intent__fallback_end' | 'collections__intent__silence' | 'collections__intent__silence_end' | 'player_prequel__on_enter' | 'home_user__intent__recent_books' | 'info__intent__no' | 'home_user__intent__current_book' | 'player_prequel__intent__help' | 'player_prequel__intent__repeat' | 'player_prequel__intent__player_prequel_back' | 'player_prequel__intent__player_prequel_resume' | 'player_prequel__intent__player_prequel_start' | 'player_prequel__intent__player_prequel_summary' | 'player_prequel__fallback' | 'player_prequel__fallback_end' | 'player_prequel__silence' | 'player_prequel__silence_end'; diff --git a/webhooks/functions/src/typings/sdkScene.d.ts b/webhooks/functions/src/typings/sdkScene.d.ts new file mode 100644 index 00000000..472d63f2 --- /dev/null +++ b/webhooks/functions/src/typings/sdkScene.d.ts @@ -0,0 +1,4 @@ +// npm run scene-typed ; + + +export type TSdkScene = 'collections' | 'home_new_user' | 'home_new_user_AccountLinking' | 'home_new_user_maybe_later' | 'home_new_user_no' | 'home_user' | 'info' | 'player' | 'player_prequel' | 'search' | 'selection'; diff --git a/webhooks/functions/tsconfig.json b/webhooks/functions/tsconfig.json new file mode 100644 index 00000000..95c910cc --- /dev/null +++ b/webhooks/functions/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "noImplicitAny": false, + "noEmitOnError": true, + "removeComments": false, + "sourceMap": true, + "target": "ES5", + "lib": ["ES2020"], + "moduleResolution": "node", + "outDir": "build", + "experimentalDecorators": true, + "strictNullChecks": true, + "resolveJsonModule": true, + "downlevelIteration": true + }, + "include": [ + "src/**/*" + ] +} +